diff -Nru gmime-2.6.22+dfsg2/aclocal.m4 gmime-3.0.1/aclocal.m4 --- gmime-2.6.22+dfsg2/aclocal.m4 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/aclocal.m4 2017-05-21 16:31:25.000000000 +0000 @@ -0,0 +1,1715 @@ +# generated automatically by aclocal 1.15 -*- Autoconf -*- + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. + +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, +[m4_warning([this file was generated for autoconf 2.69. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) + +# Configure paths for GLIB +# Owen Taylor 1997-2001 + +dnl AM_PATH_GLIB_2_0([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]]) +dnl Test for GLIB, and define GLIB_CFLAGS and GLIB_LIBS, if gmodule, gobject, +dnl gthread, or gio is specified in MODULES, pass to pkg-config +dnl +AC_DEFUN([AM_PATH_GLIB_2_0], +[dnl +dnl Get the cflags and libraries from pkg-config +dnl +AC_ARG_ENABLE(glibtest, [ --disable-glibtest do not try to compile and run a test GLIB program], + , enable_glibtest=yes) + + pkg_config_args=glib-2.0 + for module in . $4 + do + case "$module" in + gmodule) + pkg_config_args="$pkg_config_args gmodule-2.0" + ;; + gmodule-no-export) + pkg_config_args="$pkg_config_args gmodule-no-export-2.0" + ;; + gobject) + pkg_config_args="$pkg_config_args gobject-2.0" + ;; + gthread) + pkg_config_args="$pkg_config_args gthread-2.0" + ;; + gio*) + pkg_config_args="$pkg_config_args $module-2.0" + ;; + esac + done + + PKG_PROG_PKG_CONFIG([0.16]) + + no_glib="" + + if test "x$PKG_CONFIG" = x ; then + no_glib=yes + PKG_CONFIG=no + fi + + min_glib_version=ifelse([$1], ,2.0.0,$1) + AC_MSG_CHECKING(for GLIB - version >= $min_glib_version) + + if test x$PKG_CONFIG != xno ; then + ## don't try to run the test against uninstalled libtool libs + if $PKG_CONFIG --uninstalled $pkg_config_args; then + echo "Will use uninstalled version of GLib found in PKG_CONFIG_PATH" + enable_glibtest=no + fi + + if $PKG_CONFIG --atleast-version $min_glib_version $pkg_config_args; then + : + else + no_glib=yes + fi + fi + + if test x"$no_glib" = x ; then + GLIB_GENMARSHAL=`$PKG_CONFIG --variable=glib_genmarshal glib-2.0` + GOBJECT_QUERY=`$PKG_CONFIG --variable=gobject_query glib-2.0` + GLIB_MKENUMS=`$PKG_CONFIG --variable=glib_mkenums glib-2.0` + GLIB_COMPILE_RESOURCES=`$PKG_CONFIG --variable=glib_compile_resources gio-2.0` + + GLIB_CFLAGS=`$PKG_CONFIG --cflags $pkg_config_args` + GLIB_LIBS=`$PKG_CONFIG --libs $pkg_config_args` + glib_config_major_version=`$PKG_CONFIG --modversion glib-2.0 | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + glib_config_minor_version=`$PKG_CONFIG --modversion glib-2.0 | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + glib_config_micro_version=`$PKG_CONFIG --modversion glib-2.0 | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test "x$enable_glibtest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $GLIB_CFLAGS" + LIBS="$GLIB_LIBS $LIBS" +dnl +dnl Now check if the installed GLIB is sufficiently new. (Also sanity +dnl checks the results of pkg-config to some extent) +dnl + rm -f conf.glibtest + AC_TRY_RUN([ +#include +#include +#include + +int +main () +{ + unsigned int major, minor, micro; + + fclose (fopen ("conf.glibtest", "w")); + + if (sscanf("$min_glib_version", "%u.%u.%u", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_glib_version"); + exit(1); + } + + if ((glib_major_version != $glib_config_major_version) || + (glib_minor_version != $glib_config_minor_version) || + (glib_micro_version != $glib_config_micro_version)) + { + printf("\n*** 'pkg-config --modversion glib-2.0' returned %d.%d.%d, but GLIB (%d.%d.%d)\n", + $glib_config_major_version, $glib_config_minor_version, $glib_config_micro_version, + glib_major_version, glib_minor_version, glib_micro_version); + printf ("*** was found! If pkg-config was correct, then it is best\n"); + printf ("*** to remove the old version of GLib. You may also be able to fix the error\n"); + printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); + printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); + printf("*** required on your system.\n"); + printf("*** If pkg-config was wrong, set the environment variable PKG_CONFIG_PATH\n"); + printf("*** to point to the correct configuration files\n"); + } + else if ((glib_major_version != GLIB_MAJOR_VERSION) || + (glib_minor_version != GLIB_MINOR_VERSION) || + (glib_micro_version != GLIB_MICRO_VERSION)) + { + printf("*** GLIB header files (version %d.%d.%d) do not match\n", + GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION); + printf("*** library (version %d.%d.%d)\n", + glib_major_version, glib_minor_version, glib_micro_version); + } + else + { + if ((glib_major_version > major) || + ((glib_major_version == major) && (glib_minor_version > minor)) || + ((glib_major_version == major) && (glib_minor_version == minor) && (glib_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** An old version of GLIB (%u.%u.%u) was found.\n", + glib_major_version, glib_minor_version, glib_micro_version); + printf("*** You need a version of GLIB newer than %u.%u.%u. The latest version of\n", + major, minor, micro); + printf("*** GLIB is always available from ftp://ftp.gtk.org.\n"); + printf("***\n"); + printf("*** If you have already installed a sufficiently new version, this error\n"); + printf("*** probably means that the wrong copy of the pkg-config shell script is\n"); + printf("*** being found. The easiest way to fix this is to remove the old version\n"); + printf("*** of GLIB, but you can also set the PKG_CONFIG environment to point to the\n"); + printf("*** correct copy of pkg-config. (In this case, you will have to\n"); + printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); + printf("*** so that the correct libraries are found at run-time))\n"); + } + } + return 1; +} +],, no_glib=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_glib" = x ; then + AC_MSG_RESULT(yes (version $glib_config_major_version.$glib_config_minor_version.$glib_config_micro_version)) + ifelse([$2], , :, [$2]) + else + AC_MSG_RESULT(no) + if test "$PKG_CONFIG" = "no" ; then + echo "*** A new enough version of pkg-config was not found." + echo "*** See http://www.freedesktop.org/software/pkgconfig/" + else + if test -f conf.glibtest ; then + : + else + echo "*** Could not run GLIB test program, checking why..." + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $GLIB_CFLAGS" + LIBS="$LIBS $GLIB_LIBS" + AC_TRY_LINK([ +#include +#include +], [ return ((glib_major_version) || (glib_minor_version) || (glib_micro_version)); ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding GLIB or finding the wrong" + echo "*** version of GLIB. If it is not finding GLIB, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" ], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means GLIB is incorrectly installed."]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + GLIB_CFLAGS="" + GLIB_LIBS="" + GLIB_GENMARSHAL="" + GOBJECT_QUERY="" + GLIB_MKENUMS="" + GLIB_COMPILE_RESOURCES="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(GLIB_CFLAGS) + AC_SUBST(GLIB_LIBS) + AC_SUBST(GLIB_GENMARSHAL) + AC_SUBST(GOBJECT_QUERY) + AC_SUBST(GLIB_MKENUMS) + AC_SUBST(GLIB_COMPILE_RESOURCES) + rm -f conf.glibtest +]) + +dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +dnl serial 11 (pkg-config-0.29.1) +dnl +dnl Copyright © 2004 Scott James Remnant . +dnl Copyright © 2012-2015 Dan Nicholson +dnl +dnl This program is free software; you can redistribute it and/or modify +dnl it under the terms of the GNU General Public License as published by +dnl the Free Software Foundation; either version 2 of the License, or +dnl (at your option) any later version. +dnl +dnl This program is distributed in the hope that it will be useful, but +dnl WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl General Public License for more details. +dnl +dnl You should have received a copy of the GNU General Public License +dnl along with this program; if not, write to the Free Software +dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +dnl 02111-1307, USA. +dnl +dnl As a special exception to the GNU General Public License, if you +dnl distribute this file as part of a program that contains a +dnl configuration script generated by Autoconf, you may include it under +dnl the same distribution terms that you use for the rest of that +dnl program. + +dnl PKG_PREREQ(MIN-VERSION) +dnl ----------------------- +dnl Since: 0.29 +dnl +dnl Verify that the version of the pkg-config macros are at least +dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's +dnl installed version of pkg-config, this checks the developer's version +dnl of pkg.m4 when generating configure. +dnl +dnl To ensure that this macro is defined, also add: +dnl m4_ifndef([PKG_PREREQ], +dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) +dnl +dnl See the "Since" comment for each macro you use to see what version +dnl of the macros you require. +m4_defun([PKG_PREREQ], +[m4_define([PKG_MACROS_VERSION], [0.29.1]) +m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, + [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) +])dnl PKG_PREREQ + +dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) +dnl ---------------------------------- +dnl Since: 0.16 +dnl +dnl Search for the pkg-config tool and set the PKG_CONFIG variable to +dnl first found in the path. Checks that the version of pkg-config found +dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is +dnl used since that's the first version where most current features of +dnl pkg-config existed. +AC_DEFUN([PKG_PROG_PKG_CONFIG], +[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) +m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) +m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) +AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) +AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=m4_default([$1], [0.9.0]) + AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + PKG_CONFIG="" + fi +fi[]dnl +])dnl PKG_PROG_PKG_CONFIG + +dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------------------------------- +dnl Since: 0.18 +dnl +dnl Check to see whether a particular set of modules exists. Similar to +dnl PKG_CHECK_MODULES(), but does not set variables or print errors. +dnl +dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +dnl only at the first occurence in configure.ac, so if the first place +dnl it's called might be skipped (such as if it is within an "if", you +dnl have to call PKG_CHECK_EXISTS manually +AC_DEFUN([PKG_CHECK_EXISTS], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +if test -n "$PKG_CONFIG" && \ + AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then + m4_default([$2], [:]) +m4_ifvaln([$3], [else + $3])dnl +fi]) + +dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) +dnl --------------------------------------------- +dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting +dnl pkg_failed based on the result. +m4_define([_PKG_CONFIG], +[if test -n "$$1"; then + pkg_cv_[]$1="$$1" + elif test -n "$PKG_CONFIG"; then + PKG_CHECK_EXISTS([$3], + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes ], + [pkg_failed=yes]) + else + pkg_failed=untried +fi[]dnl +])dnl _PKG_CONFIG + +dnl _PKG_SHORT_ERRORS_SUPPORTED +dnl --------------------------- +dnl Internal check to see if pkg-config supports short errors. +AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi[]dnl +])dnl _PKG_SHORT_ERRORS_SUPPORTED + + +dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl -------------------------------------------------------------- +dnl Since: 0.4.0 +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES might not happen, you should be sure to include an +dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac +AC_DEFUN([PKG_CHECK_MODULES], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl +AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl + +pkg_failed=no +AC_MSG_CHECKING([for $1]) + +_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) +_PKG_CONFIG([$1][_LIBS], [libs], [$2]) + +m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS +and $1[]_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details.]) + +if test $pkg_failed = yes; then + AC_MSG_RESULT([no]) + _PKG_SHORT_ERRORS_SUPPORTED + if test $_pkg_short_errors_supported = yes; then + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` + else + $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD + + m4_default([$4], [AC_MSG_ERROR( +[Package requirements ($2) were not met: + +$$1_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +_PKG_TEXT])[]dnl + ]) +elif test $pkg_failed = untried; then + AC_MSG_RESULT([no]) + m4_default([$4], [AC_MSG_FAILURE( +[The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +_PKG_TEXT + +To get pkg-config, see .])[]dnl + ]) +else + $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS + $1[]_LIBS=$pkg_cv_[]$1[]_LIBS + AC_MSG_RESULT([yes]) + $3 +fi[]dnl +])dnl PKG_CHECK_MODULES + + +dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl --------------------------------------------------------------------- +dnl Since: 0.29 +dnl +dnl Checks for existence of MODULES and gathers its build flags with +dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags +dnl and VARIABLE-PREFIX_LIBS from --libs. +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to +dnl include an explicit call to PKG_PROG_PKG_CONFIG in your +dnl configure.ac. +AC_DEFUN([PKG_CHECK_MODULES_STATIC], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +_save_PKG_CONFIG=$PKG_CONFIG +PKG_CONFIG="$PKG_CONFIG --static" +PKG_CHECK_MODULES($@) +PKG_CONFIG=$_save_PKG_CONFIG[]dnl +])dnl PKG_CHECK_MODULES_STATIC + + +dnl PKG_INSTALLDIR([DIRECTORY]) +dnl ------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable pkgconfigdir as the location where a module +dnl should install pkg-config .pc files. By default the directory is +dnl $libdir/pkgconfig, but the default can be changed by passing +dnl DIRECTORY. The user can override through the --with-pkgconfigdir +dnl parameter. +AC_DEFUN([PKG_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([pkgconfigdir], + [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, + [with_pkgconfigdir=]pkg_default) +AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +])dnl PKG_INSTALLDIR + + +dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) +dnl -------------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable noarch_pkgconfigdir as the location where a +dnl module should install arch-independent pkg-config .pc files. By +dnl default the directory is $datadir/pkgconfig, but the default can be +dnl changed by passing DIRECTORY. The user can override through the +dnl --with-noarch-pkgconfigdir parameter. +AC_DEFUN([PKG_NOARCH_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([noarch-pkgconfigdir], + [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, + [with_noarch_pkgconfigdir=]pkg_default) +AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +])dnl PKG_NOARCH_INSTALLDIR + + +dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, +dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------- +dnl Since: 0.28 +dnl +dnl Retrieves the value of the pkg-config variable for the given module. +AC_DEFUN([PKG_CHECK_VAR], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl + +_PKG_CONFIG([$1], [variable="][$3]["], [$2]) +AS_VAR_COPY([$1], [pkg_cv_][$1]) + +AS_VAR_IF([$1], [""], [$5], [$4])dnl +])dnl PKG_CHECK_VAR + +# Copyright (C) 2002-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.15' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.15], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.15])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to +# '$srcdir', '$srcdir/..', or '$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is '.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ([2.52])dnl + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], + [$1], [UPC], [depcc="$UPC" am_compiler_list=], + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each '.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.65])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if( + m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl +]) +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. +]) + +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST([install_sh])]) + +# Copyright (C) 2003-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Add --enable-maintainer-mode option to configure. -*- Autoconf -*- +# From Jim Meyering + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAINTAINER_MODE([DEFAULT-MODE]) +# ---------------------------------- +# Control maintainer-specific portions of Makefiles. +# Default is to disable them, unless 'enable' is passed literally. +# For symmetry, 'disable' may be passed as well. Anyway, the user +# can override the default with the --enable/--disable switch. +AC_DEFUN([AM_MAINTAINER_MODE], +[m4_case(m4_default([$1], [disable]), + [enable], [m4_define([am_maintainer_other], [disable])], + [disable], [m4_define([am_maintainer_other], [enable])], + [m4_define([am_maintainer_other], [enable]) + m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) +AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) + dnl maintainer-mode's default is 'disable' unless 'enable' is passed + AC_ARG_ENABLE([maintainer-mode], + [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], + am_maintainer_other[ make rules and dependencies not useful + (and sometimes confusing) to the casual installer])], + [USE_MAINTAINER_MODE=$enableval], + [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) + AC_MSG_RESULT([$USE_MAINTAINER_MODE]) + AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) + MAINT=$MAINTAINER_MODE_TRUE + AC_SUBST([MAINT])dnl +] +) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + AC_MSG_WARN(['missing' script is too old or missing]) +fi +]) + +# -*- Autoconf -*- +# Obsolete and "removed" macros, that must however still report explicit +# error messages when used, to smooth transition. +# +# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +AC_DEFUN([AM_CONFIG_HEADER], +[AC_DIAGNOSE([obsolete], +['$0': this macro is obsolete. +You should use the 'AC][_CONFIG_HEADERS' macro instead.])dnl +AC_CONFIG_HEADERS($@)]) + +AC_DEFUN([AM_PROG_CC_STDC], +[AC_PROG_CC +am_cv_prog_cc_stdc=$ac_cv_prog_cc_stdc +AC_DIAGNOSE([obsolete], +['$0': this macro is obsolete. +You should simply use the 'AC][_PROG_CC' macro instead. +Also, your code should no longer depend upon 'am_cv_prog_cc_stdc', +but upon 'ac_cv_prog_cc_stdc'.])]) + +AC_DEFUN([AM_C_PROTOTYPES], + [AC_FATAL([automatic de-ANSI-fication support has been removed])]) +AU_DEFUN([fp_C_PROTOTYPES], [AM_C_PROTOTYPES]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# -------------------- +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) + +# _AM_SET_OPTIONS(OPTIONS) +# ------------------------ +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) + +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken + alias in your environment]) + fi + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT([yes]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) + +# Copyright (C) 2009-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor 'install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in "make install-strip", and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# -------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of 'v7', 'ustar', or 'pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +# +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' + +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi + done + rm -rf conftest.dir + + AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) + AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([m4/gpgme.m4]) +m4_include([m4/gtk-doc.m4]) +m4_include([m4/introspection.m4]) +m4_include([m4/libtool.m4]) +m4_include([m4/ltoptions.m4]) +m4_include([m4/ltsugar.m4]) +m4_include([m4/ltversion.m4]) +m4_include([m4/lt~obsolete.m4]) +m4_include([m4/vapigen.m4]) +m4_include([acinclude.m4]) diff -Nru gmime-2.6.22+dfsg2/build/Makefile.in gmime-3.0.1/build/Makefile.in --- gmime-2.6.22+dfsg2/build/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/build/Makefile.in 2017-05-21 16:38:02.000000000 +0000 @@ -0,0 +1,689 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = build +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gpgme.m4 \ + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/introspection.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/vapigen.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DB2HTML = @DB2HTML@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DOLT_BASH = @DOLT_BASH@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMIME_API_VERSION = @GMIME_API_VERSION@ +GMIME_BINARY_AGE = @GMIME_BINARY_AGE@ +GMIME_CFLAGS = @GMIME_CFLAGS@ +GMIME_INCLUDEDIR = @GMIME_INCLUDEDIR@ +GMIME_INTERFACE_AGE = @GMIME_INTERFACE_AGE@ +GMIME_LIBDIR = @GMIME_LIBDIR@ +GMIME_LIBS = @GMIME_LIBS@ +GMIME_LIBS_PRIVATE = @GMIME_LIBS_PRIVATE@ +GMIME_MAJOR_VERSION = @GMIME_MAJOR_VERSION@ +GMIME_MICRO_VERSION = @GMIME_MICRO_VERSION@ +GMIME_MINOR_VERSION = @GMIME_MINOR_VERSION@ +GMIME_VERSION = @GMIME_VERSION@ +GOBJECT_QUERY = @GOBJECT_QUERY@ +GPGME_CONFIG = @GPGME_CONFIG@ +GPGME_PTHREAD_CFLAGS = @GPGME_PTHREAD_CFLAGS@ +GPGME_PTHREAD_LIBS = @GPGME_PTHREAD_LIBS@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBIDN_CFLAGS = @LIBIDN_CFLAGS@ +LIBIDN_LIBS = @LIBIDN_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTCOMPILE = @LTCOMPILE@ +LTCXXCOMPILE = @LTCXXCOMPILE@ +LTLIBOBJS = @LTLIBOBJS@ +LTP = @LTP@ +LTP_GENHTML = @LTP_GENHTML@ +LT_AGE = @LT_AGE@ +LT_CURRENT = @LT_CURRENT@ +LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@ +LT_RELEASE = @LT_RELEASE@ +LT_REVISION = @LT_REVISION@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MV = @MV@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM = @RM@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHTOOL = @SHTOOL@ +STRIP = @STRIP@ +TAR = @TAR@ +VAPIGEN = @VAPIGEN@ +VAPIGEN_MAKEFILE = @VAPIGEN_MAKEFILE@ +VAPIGEN_VAPIDIR = @VAPIGEN_VAPIDIR@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = vs2008 vs2010 +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu build/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu build/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(am__recursive_targets) install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-am clean clean-generic clean-libtool cscopelist-am ctags \ + ctags-am distclean distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff -Nru gmime-2.6.22+dfsg2/build/vs2008/config-win32.h gmime-3.0.1/build/vs2008/config-win32.h --- gmime-2.6.22+dfsg2/build/vs2008/config-win32.h 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/build/vs2008/config-win32.h 2017-05-21 16:38:13.000000000 +0000 @@ -0,0 +1,193 @@ +/* config.h. Generated from config.h.in by configure. */ +/* config.h.in. Generated from configure.in by autoheader. */ + +/* Define if GMime should enable warning output. */ +/* #undef ENABLE_WARNINGS */ + +/* Define to the GMime version */ +#define GMIME_VERSION "3.0.1" + +/* Define if libc defines an altzone variable */ +/* #undef HAVE_ALTZONE */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_DLFCN_H */ + +/* Define to 1 if you have the `fsync' function. */ +/* #undef HAVE_FSYNC */ + +/* Define to 1 if you have the `getaddrinfo' function. */ +#define HAVE_GETADDRINFO 1 + +/* Define to 1 if you have the `getdomainname' function. */ +/* #undef HAVE_GETDOMAINNAME */ + +/* Define to 1 if you have the `gethostname' function. */ +#define HAVE_GETHOSTNAME 1 + +/* Define to 1 if you have the header with the GNU `getopt_long' + function. */ +/* #undef HAVE_GETOPT_H */ + +/* Define to 1 if you have the `getpagesize' function. */ +/* #undef HAVE_GETPAGESIZE */ + +/* Define to 1 if you have the `gmtime_r' function. */ +/* #undef HAVE_GMTIME_R */ + +/* Define to 1 if you have the `gmtime_s' function. */ +#define HAVE_GMTIME_S 1 + +/* Define if you have the iconv() function and it works. */ +#define HAVE_ICONV 1 + +/* Define to 1 to use auto-detected iconv-friendly charset names. */ +/* #undef HAVE_ICONV_DETECT_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_INTTYPES_H */ + +/* Define to 1 if you have the `localtime' function. */ +#define HAVE_LOCALTIME 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have a working `mmap' system call. */ +/* #undef HAVE_MMAP */ + +/* Define to 1 if you have the `msync' function. */ +/* #undef HAVE_MSYNC */ + +/* Define to 1 if you have the `munmap' function. */ +/* #undef HAVE_MUNMAP */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_NETDB_H */ + +/* Define to 1 if you have the `poll' function. */ +/* #undef HAVE_POLL */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_POLL_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_REGEX_H */ + +/* Define to 1 if you have the `select' function. */ +#define HAVE_SELECT 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_STDINT_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strftime' function. */ +#define HAVE_STRFTIME 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_STRINGS_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_MMAN_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_PARAM_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define if libc defines a timezone variable */ +/* #undef HAVE_TIMEZONE */ + +/* Define to 1 if you have the header file. */ +#define HAVE_TIME_H 1 + +/* Define if struct tm has a tm_gmtoff member */ +/* #undef HAVE_TM_GMTOFF */ + +/* Define if struct utsname has a domainname member */ +/* #undef HAVE_UTSNAME_DOMAINNAME */ + +/* Define to 1 if you have the header file. */ +#define HAVE_WINSOCK2_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_ZLIB_H 1 + +/* Define if libc defines a _timezone variable */ +/* #undef HAVE__TIMEZONE */ + +/* Define as const if the declaration of iconv() needs const. */ +#define ICONV_CONST + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +/* #undef LT_OBJDIR */ + +/* Define with a value if your does not define MAXHOSTNAMELEN */ +/* #undef MAXHOSTNAMELEN */ + +/* Define to 0 if your system does not have the O_LARGEFILE flag */ +/* #undef O_LARGEFILE */ + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "http://bugzilla.gnome.org/enter_bug.cgi?product=gmime" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "gmime" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "gmime 3.0.1" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "gmime" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "3.0.1" + +/* The size of `off_t', as computed by sizeof. */ +#define SIZEOF_OFF_T 4 + +/* The size of `size_t', as computed by sizeof. */ +#define SIZEOF_SIZE_T 4 + +/* The size of `ssize_t', as computed by sizeof. */ +#define SIZEOF_SSIZE_T 4 + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Number of bits in a file offset, on hosts where this is settable. */ +/* #undef _FILE_OFFSET_BITS */ + +/* Define for large files, on AIX-style hosts. */ +/* #undef _LARGE_FILES */ + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +/* #undef inline */ +#endif + +/* Define to `int' if does not define. */ +#define mode_t int + +/* Define to `unsigned long int' if does not define. */ +#define nfds_t unsigned long int + +/* Define to `long int' if does not define. */ +/* #undef off_t */ + +/* Define to `unsigned int' if does not define. */ +/* #undef size_t */ + +/* Define to `int' if does not define. */ +#define ssize_t int diff -Nru gmime-2.6.22+dfsg2/build/vs2008/Makefile.in gmime-3.0.1/build/vs2008/Makefile.in --- gmime-2.6.22+dfsg2/build/vs2008/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/build/vs2008/Makefile.in 2017-05-21 16:38:02.000000000 +0000 @@ -0,0 +1,527 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = build/vs2008 +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gpgme.m4 \ + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/introspection.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/vapigen.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = config-win32.h +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config-win32.h.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DB2HTML = @DB2HTML@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DOLT_BASH = @DOLT_BASH@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMIME_API_VERSION = @GMIME_API_VERSION@ +GMIME_BINARY_AGE = @GMIME_BINARY_AGE@ +GMIME_CFLAGS = @GMIME_CFLAGS@ +GMIME_INCLUDEDIR = @GMIME_INCLUDEDIR@ +GMIME_INTERFACE_AGE = @GMIME_INTERFACE_AGE@ +GMIME_LIBDIR = @GMIME_LIBDIR@ +GMIME_LIBS = @GMIME_LIBS@ +GMIME_LIBS_PRIVATE = @GMIME_LIBS_PRIVATE@ +GMIME_MAJOR_VERSION = @GMIME_MAJOR_VERSION@ +GMIME_MICRO_VERSION = @GMIME_MICRO_VERSION@ +GMIME_MINOR_VERSION = @GMIME_MINOR_VERSION@ +GMIME_VERSION = @GMIME_VERSION@ +GOBJECT_QUERY = @GOBJECT_QUERY@ +GPGME_CONFIG = @GPGME_CONFIG@ +GPGME_PTHREAD_CFLAGS = @GPGME_PTHREAD_CFLAGS@ +GPGME_PTHREAD_LIBS = @GPGME_PTHREAD_LIBS@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBIDN_CFLAGS = @LIBIDN_CFLAGS@ +LIBIDN_LIBS = @LIBIDN_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTCOMPILE = @LTCOMPILE@ +LTCXXCOMPILE = @LTCXXCOMPILE@ +LTLIBOBJS = @LTLIBOBJS@ +LTP = @LTP@ +LTP_GENHTML = @LTP_GENHTML@ +LT_AGE = @LT_AGE@ +LT_CURRENT = @LT_CURRENT@ +LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@ +LT_RELEASE = @LT_RELEASE@ +LT_REVISION = @LT_REVISION@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MV = @MV@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM = @RM@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHTOOL = @SHTOOL@ +STRIP = @STRIP@ +TAR = @TAR@ +VAPIGEN = @VAPIGEN@ +VAPIGEN_MAKEFILE = @VAPIGEN_MAKEFILE@ +VAPIGEN_VAPIDIR = @VAPIGEN_VAPIDIR@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +EXTRA_DIST = \ + config-win32.h.in \ + config-win32.h \ + gmime.vcproj \ + uuencode.vcproj \ + uudecode.vcproj \ + gmime.sln \ + basic-example.vcproj \ + imap-example.vcproj \ + test-headers.vcproj \ + test-streams.vcproj \ + test-iconv.vcproj \ + test-mime.vcproj \ + test-mbox.vcproj \ + test-cat.vcproj \ + unistd.h + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu build/vs2008/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu build/vs2008/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +config-win32.h: $(top_builddir)/config.status $(srcdir)/config-win32.h.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff -Nru gmime-2.6.22+dfsg2/build/vs2010/config-win32.h gmime-3.0.1/build/vs2010/config-win32.h --- gmime-2.6.22+dfsg2/build/vs2010/config-win32.h 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/build/vs2010/config-win32.h 2017-05-21 16:38:13.000000000 +0000 @@ -0,0 +1,193 @@ +/* config.h. Generated from config.h.in by configure. */ +/* config.h.in. Generated from configure.in by autoheader. */ + +/* Define if GMime should enable warning output. */ +/* #undef ENABLE_WARNINGS */ + +/* Define to the GMime version */ +#define GMIME_VERSION "3.0.1" + +/* Define if libc defines an altzone variable */ +/* #undef HAVE_ALTZONE */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_DLFCN_H */ + +/* Define to 1 if you have the `fsync' function. */ +/* #undef HAVE_FSYNC */ + +/* Define to 1 if you have the `getaddrinfo' function. */ +#define HAVE_GETADDRINFO 1 + +/* Define to 1 if you have the `getdomainname' function. */ +/* #undef HAVE_GETDOMAINNAME */ + +/* Define to 1 if you have the `gethostname' function. */ +#define HAVE_GETHOSTNAME 1 + +/* Define to 1 if you have the header with the GNU `getopt_long' + function. */ +/* #undef HAVE_GETOPT_H */ + +/* Define to 1 if you have the `getpagesize' function. */ +/* #undef HAVE_GETPAGESIZE */ + +/* Define to 1 if you have the `gmtime_r' function. */ +/* #undef HAVE_GMTIME_R */ + +/* Define to 1 if you have the `gmtime_s' function. */ +#define HAVE_GMTIME_S 1 + +/* Define if you have the iconv() function and it works. */ +#define HAVE_ICONV 1 + +/* Define to 1 to use auto-detected iconv-friendly charset names. */ +/* #undef HAVE_ICONV_DETECT_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_INTTYPES_H */ + +/* Define to 1 if you have the `localtime' function. */ +#define HAVE_LOCALTIME 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have a working `mmap' system call. */ +/* #undef HAVE_MMAP */ + +/* Define to 1 if you have the `msync' function. */ +/* #undef HAVE_MSYNC */ + +/* Define to 1 if you have the `munmap' function. */ +/* #undef HAVE_MUNMAP */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_NETDB_H */ + +/* Define to 1 if you have the `poll' function. */ +/* #undef HAVE_POLL */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_POLL_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_REGEX_H */ + +/* Define to 1 if you have the `select' function. */ +#define HAVE_SELECT 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_STDINT_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strftime' function. */ +#define HAVE_STRFTIME 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_STRINGS_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_MMAN_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_PARAM_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define if libc defines a timezone variable */ +/* #undef HAVE_TIMEZONE */ + +/* Define to 1 if you have the header file. */ +#define HAVE_TIME_H 1 + +/* Define if struct tm has a tm_gmtoff member */ +/* #undef HAVE_TM_GMTOFF */ + +/* Define if struct utsname has a domainname member */ +/* #undef HAVE_UTSNAME_DOMAINNAME */ + +/* Define to 1 if you have the header file. */ +#define HAVE_WINSOCK2_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_ZLIB_H 1 + +/* Define if libc defines a _timezone variable */ +/* #undef HAVE__TIMEZONE */ + +/* Define as const if the declaration of iconv() needs const. */ +#define ICONV_CONST + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +/* #undef LT_OBJDIR */ + +/* Define with a value if your does not define MAXHOSTNAMELEN */ +/* #undef MAXHOSTNAMELEN */ + +/* Define to 0 if your system does not have the O_LARGEFILE flag */ +/* #undef O_LARGEFILE */ + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "http://bugzilla.gnome.org/enter_bug.cgi?product=gmime" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "gmime" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "gmime 3.0.1" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "gmime" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "3.0.1" + +/* The size of `off_t', as computed by sizeof. */ +#define SIZEOF_OFF_T 4 + +/* The size of `size_t', as computed by sizeof. */ +#define SIZEOF_SIZE_T 4 + +/* The size of `ssize_t', as computed by sizeof. */ +#define SIZEOF_SSIZE_T 4 + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Number of bits in a file offset, on hosts where this is settable. */ +/* #undef _FILE_OFFSET_BITS */ + +/* Define for large files, on AIX-style hosts. */ +/* #undef _LARGE_FILES */ + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +/* #undef inline */ +#endif + +/* Define to `int' if does not define. */ +#define mode_t int + +/* Define to `unsigned long int' if does not define. */ +#define nfds_t unsigned long int + +/* Define to `long int' if does not define. */ +/* #undef off_t */ + +/* Define to `unsigned int' if does not define. */ +/* #undef size_t */ + +/* Define to `int' if does not define. */ +#define ssize_t int diff -Nru gmime-2.6.22+dfsg2/build/vs2010/gmime.vcxproj gmime-3.0.1/build/vs2010/gmime.vcxproj --- gmime-2.6.22+dfsg2/build/vs2010/gmime.vcxproj 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/build/vs2010/gmime.vcxproj 2017-03-28 23:46:25.000000000 +0000 @@ -1,4 +1,4 @@ - + @@ -102,7 +102,7 @@ CompileAsC - $(OutDir)$(ProjectName)-2.6.lib + $(OutDir)$(ProjectName)-3.0.lib @@ -135,7 +135,7 @@ CompileAsC - $(OutDir)$(ProjectName)-2.6.lib + $(OutDir)$(ProjectName)-3.0.lib @@ -162,7 +162,7 @@ CompileAsC - $(OutDir)$(ProjectName)-2.6.lib + $(OutDir)$(ProjectName)-3.0.lib @@ -192,11 +192,14 @@ CompileAsC - $(OutDir)$(ProjectName)-2.6.lib + $(OutDir)$(ProjectName)-3.0.lib - + + + + @@ -212,18 +215,24 @@ + + + + + + @@ -233,8 +242,11 @@ + + + @@ -243,20 +255,22 @@ + + + - - - - - + + + + @@ -270,15 +284,20 @@ + + + + + @@ -291,7 +310,9 @@ + + @@ -301,20 +322,17 @@ + + - - - - - @@ -322,10 +340,10 @@ - + - \ No newline at end of file + diff -Nru gmime-2.6.22+dfsg2/build/vs2010/Makefile.in gmime-3.0.1/build/vs2010/Makefile.in --- gmime-2.6.22+dfsg2/build/vs2010/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/build/vs2010/Makefile.in 2017-05-21 16:38:02.000000000 +0000 @@ -0,0 +1,527 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = build/vs2010 +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gpgme.m4 \ + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/introspection.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/vapigen.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = config-win32.h +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config-win32.h.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DB2HTML = @DB2HTML@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DOLT_BASH = @DOLT_BASH@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMIME_API_VERSION = @GMIME_API_VERSION@ +GMIME_BINARY_AGE = @GMIME_BINARY_AGE@ +GMIME_CFLAGS = @GMIME_CFLAGS@ +GMIME_INCLUDEDIR = @GMIME_INCLUDEDIR@ +GMIME_INTERFACE_AGE = @GMIME_INTERFACE_AGE@ +GMIME_LIBDIR = @GMIME_LIBDIR@ +GMIME_LIBS = @GMIME_LIBS@ +GMIME_LIBS_PRIVATE = @GMIME_LIBS_PRIVATE@ +GMIME_MAJOR_VERSION = @GMIME_MAJOR_VERSION@ +GMIME_MICRO_VERSION = @GMIME_MICRO_VERSION@ +GMIME_MINOR_VERSION = @GMIME_MINOR_VERSION@ +GMIME_VERSION = @GMIME_VERSION@ +GOBJECT_QUERY = @GOBJECT_QUERY@ +GPGME_CONFIG = @GPGME_CONFIG@ +GPGME_PTHREAD_CFLAGS = @GPGME_PTHREAD_CFLAGS@ +GPGME_PTHREAD_LIBS = @GPGME_PTHREAD_LIBS@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBIDN_CFLAGS = @LIBIDN_CFLAGS@ +LIBIDN_LIBS = @LIBIDN_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTCOMPILE = @LTCOMPILE@ +LTCXXCOMPILE = @LTCXXCOMPILE@ +LTLIBOBJS = @LTLIBOBJS@ +LTP = @LTP@ +LTP_GENHTML = @LTP_GENHTML@ +LT_AGE = @LT_AGE@ +LT_CURRENT = @LT_CURRENT@ +LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@ +LT_RELEASE = @LT_RELEASE@ +LT_REVISION = @LT_REVISION@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MV = @MV@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM = @RM@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHTOOL = @SHTOOL@ +STRIP = @STRIP@ +TAR = @TAR@ +VAPIGEN = @VAPIGEN@ +VAPIGEN_MAKEFILE = @VAPIGEN_MAKEFILE@ +VAPIGEN_VAPIDIR = @VAPIGEN_VAPIDIR@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +EXTRA_DIST = \ + config-win32.h.in \ + config-win32.h \ + gmime.vcxproj \ + uuencode.vcxproj \ + uudecode.vcxproj \ + gmime.sln \ + basic-example.vcxproj \ + imap-example.vcxproj \ + test-headers.vcxproj \ + test-streams.vcxproj \ + test-iconv.vcxproj \ + test-mime.vcxproj \ + test-mbox.vcxproj \ + test-cat.vcxproj \ + unistd.h + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu build/vs2010/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu build/vs2010/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +config-win32.h: $(top_builddir)/config.status $(srcdir)/config-win32.h.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff -Nru gmime-2.6.22+dfsg2/ChangeLog gmime-3.0.1/ChangeLog --- gmime-2.6.22+dfsg2/ChangeLog 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/ChangeLog 2017-05-21 16:37:50.000000000 +0000 @@ -1,9446 +0,0 @@ -2016-12-17 Jeffrey Stedfast - - * README: Bumped version - - * configure.ac: Bumped version to 2.6.22 - -2016-12-12 Jeffrey Stedfast - - * mono/gmime-api.raw: Updated Mono bindings. - -2016-12-11 Jeffrey Stedfast - - * README: Bumped version - - * configure.ac: Bumped version to 2.6.21 - -2016-12-10 Jeffrey Stedfast - - * gmime/gmime-gpg-context.c (gpg_ctx_get_argv): Don't pass --yes, ever. - -2016-12-10 Jeffrey Stedfast - - * gmime/gmime-gpg-context.c (gpg_ctx_get_argv): Add back --batch - and --yes to fix the unit tests for GnuPG 1.4.x. - (gpg_ctx_get_argv): Now also takes a path argument to gpg to use - as the first argument instead of hard-coding "gpg". - (g_mime_gpg_context_new): Updated to query the GnuPG version in - case we need that information (turns out we don't at the moment). - -2016-12-09 Jeffrey Stedfast - - * gmime/gmime-crypto-context.c (g_mime_crypto_context_set_retrieve_session_key): - Moved here from GMimeGpgContext. - (g_mime_crypto_context_get_retrieve_session_key): Same. - - Thanks to Daniel Kahn Gillmor for this patch. - -2016-12-05 Jeffrey Stedfast - - * gmime/gmime-multipart-encrypted.c - (g_mime_multipart_encrypted_decrypt_session): New function to - decrypt a multipart/encrypted using a session_key. - - * gmime/gmime-crypto-context.c (g_mime_crypto_context_decrypt_session): New - function to decrypt a MIME part using a session_key. - - * gmime/gmime-gpg-context.c (gpg_ctx_get_argv): Added support for - --override-session-key-id for the new decrypt_session() method. - (gpg_ctx_op_start): Updated to create the secret_fd when passing a session_key - as well. - (gpg_ctx_write_session_key): New function to write the session_key to gpg. - (gpg_decrypt_session): New function to decrypt a MIME part using a session_key. - - Thanks to Daniel Kahn Gillmor for this patch. - -2016-12-05 Jeffrey Stedfast - - * gmime/gmime-gpg-context.c (gpg_ctx_parse_status): Advance over the SESSION_KEY - identifier before calling next_token() so that next_token() actually gets the - sesstion key token that we want. Also fixed to free any existing session_key - if gpg somehow sends us multiple SESSION_KEY responses. - - Thanks to Daniel Kahn Gillmor for this patch. - -2016-12-03 Jeffrey Stedfast - - * gmime/gmime-gpg-context.c (next_token): Now takes a 'secret' argument to - determine if it will overwrite the token within the buffer with '*' to - prevent leaking of the secret token. - (gpg_ctx_parse_status): Pass TRUE to next_token() when reading the - SESSION_KEY token. - -2016-12-02 Jeffrey Stedfast - - * gmime/gmime-gpg-context.c (gpg_ctx_free): Free the session_key. - (gpg_ctx_get_argv): Pass --show-session-key to gpg if requested. - (gpg_ctx_parse_status): Decode the session-key sent by gpg. - (gpg_decrypt): Set the session_key on the decrypt result. - (g_mime_gpg_context_get_retrieve_session_key): Added. - (g_mime_gpg_context_set_retrieve_session_key): Added. - - * gmime/gmime-crypto-context.c (g_mime_decrypt_result_set_session_key): Added. - (g_mime_decryption_result_get_session_key): Added. - - Thanks to Daniel Kahn Gillmor for this patch. - -2016-12-02 Jeffrey Stedfast - - * gmime/gmime-gpg-context.c (g_mime_gpg_context_new): Allow NULL for the gpg path - in order to use the default gpg path (i.e. "gpg"). - - * tests/test-pgp*.c: Updated unit tests to pass NULL for the gpg path so that - running the unit tests don't depend on a specific location of gpg. - - Thanks to Daniel Kahn Gillmor for this patch. - -2016-08-30 Jeffrey Stedfast - - * gmime/gmime-multipart.c (read_random_pool): Only initialized srand() once. - -2016-07-19 Jeffrey Stedfast - - * gmime/gmime-gpg-context.c (gpg_ctx_get_argv): Always use --batch mode and - don't pass --yes. - -2016-07-14 Jeffrey Stedfast - - * gmime/gmime-parser.c (parser_construct_part): When parsing individual - mime parts, do not treat them as top-level mime parts of a message. - - When decrypting mime parts, for example, we need all headers of the - decrypted mime part to be included in the GMimeObject returned, - otherwise we end up losing data. - -2016-03-03 Jeffrey Stedfast - - * gmime/gmime-utils.c (header_fold_tokens): Fixed folding logic to add a - space between two consecutive encoded-word tokens when they will fit on - a single line. Thanks to Jaroslav Gratz for discovering this bug. - - Fixes bug #761263 - -2016-03-03 Jeffrey Stedfast - - * gmime/gmime-multipart-signed.c (g_mime_multipart_signed_verify): Fixed - a memory leak when verifying S/MIME signatures. Thanks to Minaev Mike for - discovering this bug. - - Fixes bug #760681 - -2016-01-13 Jeffrey STedfast - - * gmime/gmime-pkcs7-context.c (key_list_free): Fixed the logic for freeing - a list of keys. Thanks to foudfou for this patch. - - Fixes bug #760573 - -2015-10-08 Jeffrey Stedfast - - * gmime/internet-address.c (decode_route): Make sure to free the route - in error cases to avoid a memory leak. - - Fixes bug #756270 - -2015-04-11 Jeffrey Stedfast - - * util/url-scanner.c (url_scanner_table_init): Treat all character - values >= 128 as url-safe. Fixes bug #738583. - -2014-07-18 Jeffrey Stedfast - - * gmime/gmime-header.c (g_mime_header_list_register_writer): - g_hash_table_remove() will g_free() the key for us, so don't do it - ourselves (will result in a double-free). - -2014-07-17 Jeffrey Stedfast - - * gmime/gmime-table-private.h: Increased GMIME_FOLD_LEN to 78. - -2014-05-24 Jeffrey Stedfast - - * gmime/gmime-part.c (g_mime_part_is_attachment): New function to - determine if a MIME part is an attachment or not. - - * gmime/gmime-disposition.c (g_mime_content_disposition_is_attachment): - New function to determine if the Content-Disposition value matches - "attachment". - -2014-02-19 Jeffrey Stedfast - - * README: Bumped version - - * configure.ac: Bumped version to 2.6.20 - -2014-02-19 Jeffrey Stedfast - - * gmime/gmime-parser.c (parser_scan_content): Improved performance - by using a SIMD hack when scanning for the end of a line. - -2014-02-19 Jeffrey Stedfast - - * gmime/gmime-message.c (message_remove_header): Don't clear the - mime_part header stream unless we actually remove a header. - (message_write_to_stream): Only add nwritten to the total if we've - written a MIME-Version header. - -2013-12-29 Jeffrey Stedfast - - * gmime/gmime-object.c - (g_mime_object_set_content_disposition_parameter): Unref the - disposition. Thanks to Mario Theodoridis for this patch. - -2013-11-02 Jeffrey Stedfast - - * gmime/gmime-message.c (write_references): Don't write out 2 - spaces between the ':' and the first message-id. Fixes bug - #711305. - -2013-10-19 Jeffrey Stedfast - - * README: Bumped version - - * configure.ac: Bumped version to 2.6.19 - -2013-09-29 Jeffrey Stedfast - - * gmime/gmime-message.c (write_references): Custom writer for - References headers so that individual msgid tokens do not get - folded. Fixes bug #709031. - -2013-09-26 Jeffrey Stedfast - - * gmime/gmime.c (g_mime_init): Initialize the mutexes - earlier. Fixes bug #708818. - -2013-09-15 Jeffrey Stedfast - - * README: Bumped version - - * configure.ac: Bumped version to 2.6.18 - -2013-08-21 Jeffrey Stedfast - - * gmime/gmime-part.c (write_content): Reset the content stream - after writing it. - -2013-08-14 Jeffrey Stedfast - - * gmime/gmime-filter-html.c (citation_depth): Fixed an ABR by - passing in an inend parameter. - -2013-08-12 Jeffrey Stedfast - - * gmime/gmime-stream-file.c (g_mime_stream_file_new_for_path): New - convenience function that handles opening the file for you. - - * gmime/gmime-stream-fs.c (g_mime_stream_fs_new_for_path): New - convenience function that handles opening the file for you. - -2013-08-11 Jeffrey Stedfast - - * gmime/gmime-message.c (g_mime_message_set_reply_to): Fixed this - function to parse the reply_to string just like - g_mime_message_set_sender() does so that the reply_to field can be - guaranteed to be in UTF-8. - - * gmime/*.c: Updated API documentation for functions taking or - returning strings to clarify whether the strings should be in - UTF-8 or not. - -2013-08-10 Jeffrey Stedfast - - * mono/GMime.metadata: Various fixups to get rid of warnings. - - * gmime/gmime.c (g_mime_init): Don't call g_type_init() if glib >= - 2.35.1 - -2013-08-08 Jeffrey Stedfast - - * gmime/internet-address.c (decode_address): Properly deal with - obsolete routing information. - -2013-08-08 Jeffrey Stedfast - - * README: Bumped version - - * configure.ac: Bumped version to 2.6.17 - -2013-08-08 Jeffrey Stedfast - - * gmime/gmime-parser.c (parser_content_type): If no Content-Type - header exists and the parent is a multipart/digest, default to - message/rfc822 instead of text/plain. - (parser_construct_leaf_part): If the Content-Type header didn't - exist, use the default content-type values instead of assuming - text/plain. - -2013-08-07 Jeffrey Stedfast - - According to Rfc2046 Section 5.1.1, boundary markers may optionally - be followed by lwsp. - - * gmime/gmime-parser.c (is_boundary): New convenience function to - check that the text matches a boundary, possibly followed by lwsp. - (check_boundary): Use is_boundary(). - (found_immediate_boundary): Use is_boundary(). - - Fixes bug #705612 - -2013-07-02 Jeffrey Stedfast - - * gmime/gmime-stream-cat.c (stream_substream): Fixed to properly - handle a 0-byte substream at the end of the very last source - stream. Fixes bug #701572. - -2013-06-30 Jeffrey Stedfast - - * README: Bumped version - - * configure.ac: Bumped version to 2.6.16 - -2013-06-30 Jeffrey Stedfast - - * gmime/gmime-gpg-context.c (gpg_ctx_set_mode): - GPG_CTX_MODE_SIGN_ENCRYPT also requires a passphrase. - -2013-05-05 Jeffrey Stedfast - - * gmime/gmime-filter-best.c (filter_filter): Reset the linelen - state to 0 when we encounter a '\n'. - -2013-05-04 Jeffrey Stedfast - - * gmime/gmime-part-iter.c: Modified to work for non-multipart - messages. - -2013-05-04 Jeffrey Stedfast - - * gmime/gmime-utils.c (rfc2047_encode): Respect the new - GMIME_ENABLE_USE_ONLY_USER_CHARSETS initialization flag. - - * gmime/gmime.h: Define a new GMIME_ENABLE_USE_ONLY_USER_CHARSETS - initialization flag. - -2013-04-05 Jeffrey Stedfast - - * gmime/gmime-utils.c (header_fold_tokens): New internal function - that replaces the older header_fold() function. This new one uses - the rfc2047 tokenizer so that we share the same rfc2047 workaround - logic in the tokenizer. - - Fixes bug #697407 - -2013-02-23 Jeffrey Stedfast - - * gmime/gmime-filter-html.c: Disable g_warnings unless warnings - are enabled in the build. - -2013-02-19 Jeffrey Stedfast - - * README: Bumped version - - * configure.ac: Bumped version to 2.6.15 - -2013-02-19 Jeffrey Stedfast - - * gmime/gmime-filter-html.c (html_convert): Fixed to convert the - last line of input even if it doesn't end with a \n. - -2013-02-18 Jeffrey Stedfast - - * README: Bumped version - - * configure.ac: Bumped version to 2.6.14 - -2013-02-18 Jeffrey Stedfast - - * util/url-scanner.c (url_addrspec_start): Fixed the logic to - actually scan for the beginning of the mailbox. - -2012-12-09 Jeffrey Stedfast - - * README: Bumped version - - * configure.ac: Bumped version to 2.6.13 - -2012-11-26 Jeffrey Stedfast - - * gmime/gmime-header.c (g_mime_header_iter_first): Make sure the - list isn't empty. - (g_mime_header_iter_last): Same. - -2012-11-23 Jeffrey Stedfast - - * gmime/gmime-header.c (g_mime_header_list_prepend): Prepend the - header to the list, don't *append* it. Oops. - (g_mime_header_list_clear): Don't forget to reset the linked list - so that it doesn't contained free'd nodes. - -2012-11-02 Jeffrey Stedfast - - * README: Bumped version - - * configure.ac: Bumped version to 2.6.12 - -2012-10-27 Jeffrey Stedfast - - * gmime/gmime-stream-filter.c (stream_read): Initialize presize to - READ_PAD instead of READ_SIZE to prevent potential buffer - underruns. - -2012-10-20 Jeffrey Stedfast - - * gmime/gmime-filter-gzip.c (gunzip_filter): Apparently - Z_BUF_ERROR isn't actually an error unless there is input - available. Thanks to Pavlo for this patch. - -2012-10-19 Jeffrey Stedfast - - * gmime/gmime-parser.c (parser_push_boundary): Don't use strcmp to - check if the boundary is an mbox boundary, use a direct pointer - comparison so that we can handle Content-Type boundary parameters - with a value of "From " - -2012-10-19 Jeffrey Stedfast - - * gmime/gmime-parser.c (parser_step_headers): Don't assume that - the first non-header line we find indicates the start of the - content unless we've already gotten some basic headers. - - Fix for bug #686223. - -2012-10-18 Jeffrey Stedfast - - * README: Bumped version - - * configure.ac: Bumped version to 2.6.11 - -2012-09-12 Jeffrey Stedfast - - * gmime/gmime-gpg-context.c (gpg_ctx_parse_status): Unref the - certificate after adding it to the list (adding it to the list - refs it). - - * gmime/gmime-multipart-encrypted.c - (g_mime_multipart_encrypted_decrypt): If the 'result' out param is - null, unref the GMimeDecryptResult to avoid leaking. - -2012-08-13 Jeffrey Stedfast - - * gmime/gmime-utils.c (tokenize_rfc2047_phrase): Don't forget to - initialize 'ascii' to TRUE. - -2012-08-05 Jeffrey Stedfast - - * gmime/gmime-stream-pipe.c (stream_flush): Pipes and sockets - cannot be fsync()'d, so don't even try! - -2012-08-05 Jeffrey Stedfast - - * gmime/gmime-utils.c (rfc2047_token_new_encoded_word): Make sure - to properly handle broken encoded-word tokens in the form: - =?charset?q?=. - - Fixes the g_malloc abort() in bug #679388 - -2012-08-05 Jeffrey Stedfast - - * gmime/gmime-multipart-signed.c (check_protocol_supported): Oops, - need to compare against xsupported in the second string compare. - - Fixes bug #674032 - -2012-06-13 Jeffrey Stedfast - - * README: Bumped version - - * configure.ac: Bumped version to 2.6.10 - -2012-06-13 Jeffrey Stedfast - - * gmime/Makefile.am: Always build gmime-gpg-context.[c,h] and - gmime-pkcs7-context.[c,h] - - * gmime/gmime-gpg-context.c: Armor internals with #ifdef - ENABLE_CRYPTOGRAPHY so that if crypto is disabled, only the - skeletal API is built. - - * gmime/gmime.h: Include gmime-pkcs7-context.h - - Fixes bug #676692. - -2012-06-13 Jeffrey Stedfast - - * gmime/gmime-utils.c (rfc2047_encode_get_rfc822_words): Use - is_blank() instead of is_lwsp() so that we only treat space and - tab as word delimiters (we want to rfc2047 encode \r's and - \n's). Check for ctrl characters when deciding what the type and - encoding of the word is. - -2012-06-13 Jeffrey Stedfast - - * gmime/gmime-utils.c (rfc2047_encode_get_rfc822_words): When - breaking up really long atom tokens, change the word type to - RFC2047 so that we encode them, thus preventing forced header - folding which cannot be unmunged. - (header_fold): Fixed for cases where the first word in a header is - 68 chars. (Note: this fix is largely unnecessary due to the above fix) - -2012-06-13 Jeffrey Stedfast - - * gmime/gmime-message.c: When setting a header, make sure to - always clear the header list cache of the toplevel mime_part as - well. - -2012-06-13 Jeffrey Stedfast - - * gmime/gmime-param.c (rfc2184_param_new): Only decode the charset - and lang if the parameter is actually encoded. Thanks to Peter - Bloomfield for this patch. - -2012-06-13 Jeffrey Stedfast - - * gmime/gmime-gpg-context.c (gpg_ctx_parse_status): Keep track of - DECRYPTION_OKAY status. - (gpg_decrypt): Only return NULL if decryption failed (e.g. we - didn't get a DECRYPTION_OKAY status). - - Fixes bug #677088. - -2012-06-13 Jeffrey Stedfast - - * docs/reference/building.sgml: Updated docs. - - Fixes bug #676341 - -2012-04-22 Jeffrey Stedfast - - * README: Bumped version - - * configure.ac: Bumped version to 2.6.9 - -2012-04-22 Jeffrey Stedfast - - * gmime/gmime-multipart-signed.c (g_mime_multipart_signed_verify): - Match protocols like application/x-pkcs7-signature, too. - - Fixes bug #674032. - -2012-04-19 Jeffrey Stedfast - - * README: Bumped version - - * configure.ac: Bumped version to 2.6.8 - -2012-04-12 Jeffrey Stedfast - - * gmime/gmime-parser.c (parser_scan_headers): Make sure to - initialize 'start' before using it to calculate headers_end in the - case where parser_fill() failed. - - Fixes bug #673493. - -2012-03-10 Daniel Gillmor - - * mono/gmime-sharp.dll.config.in: Fixed missing .so number. - - Fixes bug #671785. - -2012-03-09 Jeffrey Stedfast - - * README: Bumped version - - * configure.ac: Bumped version to 2.6.7 - -2012-03-09 Daniel Gillmor - - * gmime/gmime-certificate.h: Remove the trailing comma from the - last enum item to silence gcc -pedantic warnings. - - * gmime/gmime-message.h: Same. - -2012-03-09 Jeffrey Stedfast - - * gmime/gmime-parser.c (parser_step_headers): Be lenient with - "From " lines found in message headers. Fixes bug #671680. - -2012-02-20 Jeffrey Stedfast - - * README: Bumped version - - * configure.ac: Bumped version to 2.6.6 - -2012-02-20 Jeffrey Stedfast - - * gmime/gmime-message.c (multipart_guess_body): Fixed - multipart/signed logic. - -2012-02-20 Jeffrey Stedfast - - * gmime/gmime-common.c (g_mime_strdup_trim): Optimized. - - * gmime/gmime-parser.c (header_parse): Use g_mime_strdup_trim() - instead of reimplementing the same logic here. - -2012-02-20 Jeffrey Stedfast - - * gmime/gmime-parser.c: Instead of filtering Content-* headers - inside GMimeObject subclasses, filter them in the parser. This way - header fetching works as expected in subparts which might have - non-standard headers (X-* and whatnot). - -2012-02-19 Jeffrey Stedfast - - * gmime/gmime-encodings.c (g_mime_content_encoding_from_string): - Match non-standard encodings: 7-bit, 8-bit, and x-uue (the - standard names for these are 7bit, 8bit, and x-uuencode). - -2012-02-19 Jeffrey Stedfast - - * gmime/gmime-common.c (g_mime_strdup_trim): New function that - optimizes g_strstrip combined with g_strdup in both speed and - memory usage (g_strstrip won't shrink the size of the dup'd - memory). - -2012-02-18 Jeffrey Stedfast - - * configure.ac: Add a --enable-smime flag which defaults to "no". - -2012-02-18 Jeffrey Stedfast - - * README: Bumped version - - * configure.ac: Bumped version to 2.6.5 - -2012-02-18 Jeffrey Stedfast - - * gmime/gmime-parser.c (parser_scan_message_part): Make sure that - a boundary doesn't appear before we start scanning for the - headers. - -2012-02-18 Jeffrey Stedfast - - * src/uuencode.c: - * src/uudecode.c: Moved to examples/ - -2012-02-17 Jeffrey Stedfast - - * gmime/gmime-gpg-context.c (gpg_verify): In cases where gpg does - not exit with code 0, only set the GError when we've gotten no - signer information from gpg (otherwise we return the list of - signers, which will presumably include why the verification failed - in the status of each signer). Fixes bug #668085. - -2012-02-17 Jeffrey Stedfast - - * gmime/gmime-part-iter.c: Fixed to behave the same as IMAP and - also to actually work. - -2012-02-16 Jeffrey Stedfast - - * mono/Multipart.custom: Fixed the binding for Multipart.Count. - -2012-02-04 Jeffrey Stedfast - - * configure.ac: Added --with-gacdir to fix bug #667072 - -2012-01-11 Jeffrey Stedfast - - * mono/Makefile.am: Fixed up to more closely match the gtk-sharp - build. - - * mono/gmime-sharp.pc.in: Fixed to more closely match gtk-sharp. - -2012-01-11 Jeffrey Stedfast - - * gmime/gmime-pkcs7-context.c: Fixed some switch statements to - include a 'default' code path, fixing some compiler - warnings. Fixes bug #667684. - -2012-01-09 Ionut Biru - - * gmime/gmime-pkcs7-context.c: Fix compilation when S/MIME is not - enabled. - -2012-01-08 Jeffrey Stedfast - - * README: Bumped version - - * configure.ac: Bumped version to 2.6.4 - -2012-01-08 Jeffrey Stedfast - - Fix for bug #667070 - - * configure.ac: Fixed Docbook checks for the html and pdf converters. - - * docs/tutorial/Makefile.am: Use the DB2HTML and DB2PDF variables. - -2012-01-05 Jeffrey Stedfast - - Fixes for bug #667137. - - * tests/Makefile.am: If any tests fail, exit with an error to - abort make. - - * tests/testsuite.c (testsuite_exit): Simply return - total_errors. - -2012-01-05 Jeffrey Stedfast - - Fixes for bug #667072. - - * mono/Makefile.am: Install to $(libdir) instead of $(prefix)/libdir. - - * mono/gmime-sharp.pc.in: Set libdir to @libdir@ - -2012-01-05 Jeffrey Stedfast - - * src/Makefile.am: Rename uuencode/uudecode to - gmime-uuencode/decode to prevent naming collisions with the GNU - Sharutils tools. Fixes bug #667073. - -2012-01-05 Jeffrey Stedfast - - * gmime/gmime-gpg-context.c (gpg_ctx_parse_status): Fixed returns - without a return value. Also fixed up some error-handling. - -2012-01-05 Jeffrey Stedfast - - * gmime/gmime-utils.c (rfc2047_decode_tokens): Fixed a memory leak. - -2011-12-23 Jeffrey Stedfast - - * README: Bumped version - - * configure.ac: Bumped version to 2.6.3 - -2011-12-18 Jeffrey Stedfast - - * gmime/gmime-utils.c (quoted_decode): Made more robust and also - modified to keep state (e.g. for use when triplets span across - multiple encoded-word tokens). - (tokenize_rfc2047_phrase): Tokenizes a rfc822 phrase header for - later processing. - (tokenize_rfc2047_text): Tokenizes a rfc822 unstructured text - header for later processing. - (rfc2047_decode_tokens): Merge and decode rfc2047 tokens, - converting the decoded text into UTF-8. - (g_mime_utils_header_decode_phrase): Rewritten to use the above - functions. - (g_mime_utils_header_decode_text): Same. - -2011-12-18 Jeffrey Stedfast - - * gmime/gmime-utils.c (charset_convert): Don't count the - terminating nul character in the returned string length. - -2011-12-17 Jeffrey Stedfast - - * README: Bumped version - - * configure.ac: Bumped version to 2.6.2 - -2011-12-15 Jeffrey Stedfast - - * gmime/gmime-iconv-utils.c (g_mime_iconv_strndup): Same. - - * gmime/gmime-filter-charset.c (flter_complete): Same as - charset_convert(). - - * gmime/gmime-utils.c (charset_convert): Make sure the output - buffer is large enough when flushing the conversion descriptor. - -2011-12-15 Jeffrey Stedfast - - * gmime/gmime.c (g_mime_init): Don't initialize the crypto types - unless crypto was enabled in the build. - -2011-11-06 Jeffrey Stedfast - - * README: Bumped version - - * configure.ac: Bumped version to 2.6.1 - -2011-11-05 Jeffrey Stedfast - - * gmime/gmime-multipart-encrypted.c - (g_mime_multipart_encrypted_decrypt): Need to decode the content - of the application/octet-stream part containing the encrypted - payload as it may have a non-7bit Content-Transfer-Encoding. - -2011-11-05 Jeffrey Stedfast - - * gmime/gmime.c (g_mime_init): Register all GObject-based types - to prevent race conditions in multi-threaded apps. - -2011-08-27 Jeffrey Stedfast - - * README: Bumped version - - * configure.ac: Bumped version to 2.6.0 - -2011-08-14 Jeffrey Stedfast - - * mono/*.custom: Simplified the GetEnumerator() implementations. - - * mono/HeaderEnumerator.cs: New IEnumerator class returned by - HeaderList.GetEnumerator(). Wraps HeaderIter, providing a more - C#-like experience. - -2011-08-14 Jeffrey Stedfast - - * mono/GMime.metadata: Rename AppendHeader() to Append(), - PrependHeader() to Prepend(), RemoveHeader() to Remove(), etc. - - * mono/HeaderList.custom: Instead of having - GetHeader()/SetHeader(), manually bind this as an indexer. - - * gmime/gmime-header.c (g_mime_header_list_clear): New function - to clear all headers. - (g_mime_header_list_contains): New function added mostly for - completeness in the C# binding. - -2011-08-14 Jeffrey Stedfast - - * README: Bumped version - - * configure.ac: Bumped version to 2.5.10 - -2011-08-14 Jeffrey Stedfast - - * mono/GMime.metadata (PartBase): Rename to Entity to be more - consistent with MIME terminology and removed more convenience - methods that really only make sense in the C API. - (g_mime_object_new_type): Removed, there's no easy way to map this - to managed. - (g_mime_object_new): Removed, there's no easy way to map this - to managed. - -2011-08-14 Jeffrey Stedfast - - * gmime/gmime-part-iter.c: Updated to be more consistent with IMAP - part specifiers. - -2011-08-13 Jeffrey Stedfast - - * gmime/gmime-part-iter.c: New class for iterating over a tree of - GMimeObjects. Fixes bug #652012. - -2011-08-13 Jeffrey Stedfast - - * gmime/gmime-multipart.c (g_mime_multipart_replace): New - convenience function to replace a mime part at a specified - position. - -2011-08-08 Jeffrey Stedfast - - * README: Bumped version - - * configure.ac: Bumped version to 2.5.9 - -2011-07-17 Jeffrey Stedfast - - * gmime/gmime-utils.c (charset_convert): Don't skip validation of - UTF-8 text. - -2011-07-17 Jeffrey Stedfast - - * gmime/gmime-utils.c (charset_convert): Handle ERANGE the same as - EILSEQ. - - * gmime/gmime-filter-charset.c (filter_filter): Handle ERANGE the - same as EILSEQ. - - * gmime/gmime-charset.c (g_mime_charset_map_init): Improved logic - for Win32 (and even Linux) systems. Don't rely on setlocale(). - -2011-06-15 Jeffrey Stedfast - - * gmime/gmime-parser.c: Added new state, MESSAGE_HEADERS, which - behaves the same as HEADERS but is only ever set when we are - parsing the toplevel GMimeMessage object. - (parser_step_headers): Be slightly more strict in handling - malformed headers in the MESSAGE_HEADERS state so that trying to - parse non-message streams fails (e.g. if someone tries to parse a - jpeg stream). - -2011-06-15 Jeffrey Stedfast - - * gmime/gmime-gpg-context.c: Define nfds_t on OSX. - -2011-06-10 Jeffrey Stedfast - - * README: Bumped version - - * configure.ac: Bumped version to 2.5.8 - -2011-06-09 Jeffrey Stedfast - - Fix for bug #652056 - - * gmime/gmime-param.c (decode_value): If STRICT_PARSER isn't - defined, don't require the value to start with a valid character. - -2011-06-08 Daniel Kahn Gillmor - - Fix for bug #651826 - - * gmime/gmime-gpg-context.c - (g_mime_gpg_context_[g,s]_set_use_agent): New functions to allow - the invoker to declare that they expect there to be a functioning - gpg-agent, and want gpg to talk to it for any needed credentials. - -2011-06-08 Jeffrey Stedfast - - * gmime/gmime-gpg-context.c: If building on Apple, force the use - of our own implementation of poll() because Apple's poll() is - broken on some versions of MacOS. - -2011-03-18 Jeffrey Stedfast - - * README: Bumped version - - * configure.ac: Bumped version to 2.5.7 - -2011-03-17 Jeffrey Stedfast - - * gmime/gmime-multipart-encrypted.c: Updated for crypto API - changes. - - * gmime/gmime-multipart-signed.c: Updated for crypto API changes. - - * gmime/gmime-crypto-context.c (g_mime_crypto_context_verify): Now - returns a GMimeSignatureList, the 'details' string was worthless - for GpgMe backend. - (GMimeDecryptResult): This is now a GObject. - - * gmime/gmime-pkcs7-context.c: Updated for crypto API changes. - - * gmime/gmime-gpg-context.c: Updated for crypto API changes. - - * gmime/gmime-certificate.[c,h]: New source files implementing - Certificate and CertificateList classes. - - * gmime/gmime-signature.[c,h]: New source files implementing - Signature and SignatureList classes. - -2011-03-16 Jeffrey Stedfast - - * mono/StreamWrapper.cs (Write): Implemented. - - * mono/CryptoRecipientCollection.cs: - * mono/SignerCollection.cs: New collections for Signers and - CryptoRecipients. - - * mono/SignatureValidity.custom: - * mono/DecryptionResult.custom: Don't return IEnumerators for - signers/recipients, return the appropriate Collections instead. - -2011-03-15 Jeffrey Stedfast - - * mono/SignatureValidity.custom: - * mono/DecryptionResult.custom: - * mono/CryptoRecipient.custom: - * mono/Signer.custom: New custom sources implementing enumerators - for Signers and Recipients. - -2011-03-14 Jeffrey Stedfast - - * configure.ac: Check for glib-sharp-2.0 instead of gtk-sharp-2.0 - since we really only depend on glib-sharp. Also check for gapi-2.0 - via pkgconfig. - -2011-03-07 Jeffrey Stedfast - - * README: Bumped version - - * configure.ac: Bumped version to 2.5.6 - - * gmime/gmime-gpg-context.c (gpg_ctx_parse_signer_info): Treat - EXPSIG, EXPKEYSIG, and REVKEYSIG the same as GOODSIG/BADSIG status - messages in that all of them denote a new signer info. - -2011-03-04 Jeffrey Stedfast - - * README: Bumped version - - * configure.ac: Bumped version to 2.5.5 - -2011-03-04 Jeffrey Stedfast - - Implements features requested in bug #641841 and #641320. - - * gmime/gmime-crypto-context.h (GMimeCryptoHash): Reordered to be - identical to gnupg's listing. - (GMimeCryptoPubKeyAlgo): Same. - - * gmime/gmime-crypto-context.c (g_mime_decryption_result_[g,s]et_cipher): - New functions to get/set the cipher algorithm used. - (g_mime_decryption_result_[g,s]et_mdc): New functions to get/set - the mdc digest algorithm used. - - * gmime/gmime-gpg-context.c (gpg_hash_algo): Removed, no longer - needed. - (gpg_pubkey_algo): Same. - (gpg_ctx_parse_status) :Parse the DECRYPTION_INFO status to get - the cipher and mdc algorithms used. - (gpg_decrypt): Set the cipher and mdc values on the - GMimeDecryptionResult. - - * gmime/gmime-pkcs7-context.c (pkcs7_pubkey_algo): Removed, no - longer needed. - (pkcs7_hash_algo): Same. - -2011-03-04 Jeffrey Stedfast - - * gmime/gmime-gpg-context.c (gpg_ctx_parse_signer_info): Make sure - to extract the pubkey_algo, hash_algo, sig_class, sig_expires, and - return-code values for ERRSIG. - -2011-03-04 Jeffrey Stedfast - - Implemented bug #641319. - - * gmime/gmime-crypto-context.c (g_mime_crypto_recipient_*): New - set of functions for manipulating a GMimeCryptoRecipient. - (g_mime_decryption_result_*): New set of functions to manipulate a - GMimeDecryptionResult - (g_mime_crypto_context_decrypt): Now returns a - GMimeDecryptionResult. - - * gmime/gmime-multipart-encrypted.c - (g_mime_multipart_encrypted_decrypt): Updated for API changes. - - * gmime/gmime-pkcs7-context.c (pkcs7_decrypt): Updated for API - changes. - - * gmime/gmime-gpg-context.c (gpg_decrypt): Updated for API - changes. - -2011-03-04 Jeffrey Stedfast - - API cleanup as well as preparing for the possibility of a - multi-protocol CryptoContext. - - * gmime/gmime-multipart-encrypted.c (g_mime_multipart_encrypted_encrypt): - Updated to use new APIs for getting the encryption protocol. - (g_mime_multipart_encrypted_decrypt): Same. - - * gmime/gmime-multipart-signed.c (g_mime_multipart_signed_sign): - Updated to use new APIs for getting the signature protocol. - (g_mime_multipart_signed_verify): Same. - - * gmime/gmime-crypto-context.c (g_mime_crypto_context_get_*_protocol): - New methods for getting the crypto protocol strings used by - multipart/encrypted and multipart/signed parts. - - * gmime/gmime-pkcs7-context.c (pkcs7_get_*_protocol): Implemented. - - * gmime/gmime-gpg-context.c (gpg_get_*_protocol): Implemented. - -2011-03-03 Jeffrey Stedfast - - * gmime/gmime-pkcs7-context.c (pkcs7_stream_seek): Added. - - * gmime/gmime.c (g_mime_init): Initialize gpgme. - -2011-02-08 Jeffrey Stedfast - - Implements feature request in bug #635663. - - * gmime/gmime-crypto-context.c (g_mime_signer_[g,s]et_sig_version): - New functions to access new signature version member. - (g_mime_signer_[g,s]et_sig_class): New functions to access new - signature class member. - - * gmime/gmime-gpg-context.c (gpg_ctx_parse_signer_info): Extract - the signature class and version tokens. - -2011-02-08 Jeffrey Stedfast - - * PORTING: Updated docs. - - * mono/GMime.metadata: Fixed up for the new decrypt API. - - * gmime/gmime-message.c (multipart_guess_body): Updated. We can no - longer descend into the decrypted part because it is no longer - cached. - - * gmime/gmime-multipart-encrypted.c (g_mime_multipart_encrypted_decrypt): - Now takes a GMimeSignatureValidity argument and no longer caches - the decrypted mime part/validity. - (g_mime_multipart_encrypted_get_signature_validity): Removed. - (g_mime_multipart_encrypted_encrypt): Don't cache the input part - as the decrypted part. - -2011-01-22 Jeffrey Stedfast - - * gmime/gmime-gpg-context.c (gpg_ctx_parse_signer_info): Parse the - ERRSIG's return code, fixes bug #638605. - - * gmime/gmime-crypto-context.h: Added UNSUPP_ALGO error value. - -2011-01-22 Jeffrey Stedfast - - * gmime/gmime-stream-mem.c (stream_write): Correctly calculate the - end boundary of the stream when bound_end is -1. - -2010-12-05 Jeffrey Stedfast - - * README: Bumped version - - * configure.ac: Bumped version to 2.5.4 - -2010-11-29 Jeffrey Stedfast - - * gmime/internet-address.c (decode_address): Handle edge cases - where inptr reaches the end of the input string prematurely due to - a malformed address. - -2010-11-29 Jeffrey Stedfast - - Fixes bug #635409. - - * gmime/gmime-pkcs7-context.c (pkcs7_get_validity): Reworked the - logic to calculate the signer status. Also dropped - GMimeSignatureStatus logic. - - * gmime/gmime-gpg-context.c (gpg_verify): Removed the (broken) - logic of calculating a GMimeSignatureStatus. - (gpg_decrypt): Same. - (gpg_ctx_parse_signer_info): Updated for the g_mime_signer_new() - API change. - - * gmime/gmime-crypto-context.c (g_mime_signature_validity_new): No - longer initializes a GMimeSignatureStatus member. - (g_mime_signature_validity_get_status): Removed. - (g_mime_signature_validity_set_status): Removed. - (g_mime_signer_new): Now takes a GMimeSignerStatus so that I could - get rid of the default NONE status. - - * gmime/gmime-crypto-context.h (GMimeSignatureStatus): Removed. - -2010-11-24 Jeffrey Stedfast - - Fixes bug #635661. - - * gmime/gmime-crypto-context.c (g_mime_signer_new): Initialize - pubkey_algo and hash_algo. - (g_mime_signer_[g,s]et_pubkey_algo): Implemented. - (g_mime_signer_[g,s]et_hash_algo): Renamed from [g,s]et_hash(). - - * gmime/gmime-crypto-context.h (GMimeCryptoPubKeyAlgo): Defined - enum. - - * gmime/gmime-pkcs7-context.c (pkcs7_get_validity): Record the - hash and pubkey algorithms used in the GMimeSigner. - - * gmime/gmime-gpg-context.c (gpg_ctx_parse_signer_info): Record - the pubkey algorithm used by the signer. - -2010-11-22 Jeffrey Stedfast - - * gmime/gmime-multipart-encrypted.c (g_mime_multipart_encrypted_encrypt): - Now takes a hash algorithm argument which it passes along to - g_mime_crypto_context_encrypt(). - - * gmime/gmime-gpg-context.c (gpg_ctx_get_argv): When signing and - encrypting, pass the digest algorithm to gpg on the command-line. - (gpg_encrypt): Set the hash id on the GpgCtx. - - * gmime/gmime-crypto-context.c (g_mime_crypto_context_encrypt): - Now takes a hash algorithm argument. - -2010-11-22 Jeffrey Stedfast - - Fixes bug #635492. - - * gmime/gmime-gpg-context.c (gpg_hash_from_id): New function - mapping the numeric hash id's that gpg uses to GMimeCryptoHash - ids. - (gpg_ctx_parse_signer_info): Extract the hash algorithm used by - the signer. - (gpg_ctx_parse_status): Updated to use gpg_hash_from_id(). - - * gmime/gmime-crypto-context.c (g_mime_signer_set_hash): New - function to set the hash algorithm used by the signer. - (g_mime_signer_get_hash): New function to get the hash algorithm - used by the signer. - -2010-11-22 Jeffrey Stedfast - - Fixes bug #635491. - - * gmime/gmime-crypto-context.[c,h]: Renamed from - gmime-cipher-context.[c,h]. - -2010-11-21 Jeffrey Stedfast - - Fixes bug #635407. - - * gmime/gmime-multipart-encrypted.c (g_mime_multipart_encrypted_decrypt): - Updated error messages to be more consistent. - - * gmime/gmime-multipart-signed.c (g_mime_multipart_signed_verify): - Make sure to set an error in all cases returning NULL. - -2010-11-21 Jeffrey Stedfast - - Fixes bug #635405. - - * gmime/gmime-cipher-context.c (g_mime_signer_get_*): These - functions all now take a const GMimeSigner *. - -2010-11-19 Jeffrey Stedfast - - Fixes bug #635152 - - * gmime/gmime-gpg-context.c (GpgCtx): No longer has a sigfile - member. Instead contains a sigstream and passwd_fd is now renamed - to secret_fd and used for both sending gpg the user's passwd as - well as for sending gpg the digital signature when verifying. - (gpg_ctx_new): Updated for the new struct members. - (gpg_ctx_set_sigstream): Replaces gpg_ctx_set_sigfile(). - (gpg_ctx_free): Updated for the new struct members. - (gpg_ctx_get_argv): Modify our --verify command-line so that we - can pas gpg the digital signature without first writing it to - disk. Also modified to return char** instead of a GPtrArray to - simplify things. - (gpg_ctx_op_start): Modified to also create more pipes in VERIFY - mode. - (gpg_ctx_op_step): Modified to stream the digital signature to - gpg. - (gpg_verify): Don't write the digital signature to disk - instead, - we now stream it directly to gpg. - -2010-10-30 Jeffrey Stedfast - - * gmime/gmime-message.c (g_mime_message_get_body): New function to - try and guess which part (or multipart/alternative) represents the - message body. - -2010-09-25 Jeffrey Stedfast - - * gmime/charset-map.c: According to rfc1557, it is suggested that - euc-kr be used for headers since many Korean mailers cannot handle - base64 or quoted-printable encoded iso-2022-kr. Based on this and - bug #629235, I'm just going to drop iso-2022-kr. - -2010-09-17 Jeffrey Stedfast - - Based on a patch by Marek Łętowski - - * gmime/gmime-utils.c (g_mime_utils_header_decode_text): In the - workaround case, if we don't find an end marker, reset our inptr - to the beginning of the most recent word *plus 2* (to skip over - the leading "=?"), not the beginning of the input text. Also need - to reset our ascii state. - (g_mime_utils_header_decode_phrase): In the workaround case, if we - don't find an end marker, reset our inptr to the beginning of the - most recent word *plus 2*, to skip over the leading "=?". - -2010-09-16 Jeffrey Stedfast - - * gmime/gmime-encodings.c (g_mime_encoding_quoted_encode_close): - If the last input character is not a \n, append an "=\n" sequence. - -2010-09-13 Jeffrey Stedfast - - * gmime/gmime-charset.c: Mark known_iconv_charsets[] as - static. Also mark string members of various private structs as - const. - -2010-09-06 Jeffrey Stedfast - - * configure.ac: Bump glib version requirement for - g_set_error_literal(). - -2010-09-02 Jeffrey Stedfast - - * gmime/internet-address.c (group_to_string): Don't crash if the - group name is unset. Thanks to Damian Pietras for this patch. - -2010-09-01 Jeffrey Stedfast - - * gmime/gmime-utils.c (g_mime_utils_header_decode_phrase): - Implement the same rfc2047-workaround hack as the one found in - g_mime_utils_header_decode_text(). - - * gmime/gmime-encodings.c (g_mime_encoding_base64_decode_step): - Need to keep state to keep track of the number of ='s we've backed - out over in case it crosses buffer boundaries. - -2010-08-30 Jeffrey Stedfast - - * gmime/gmime-param.c (decode_token): Make less strict in order to - handle unquoted boundary values containing '=' (and other illegal - characters). - -2010-08-26 Jeffrey Stedfast - - * gmime/internet-address.c (_internet_address_set_name): Don't - decode/unquote the name. The docs for all the functions that call - this assume the name string is in its decoded form already. - (_internet_address_decode_name): New internal function that - decodes a string and sets it as the name on the InternetAddress. - (decode_address): Rewritten to be even more liberal in what it - accepts. - -2010-06-20 Jeffrey Stedfast - - * gmime/gmime-multipart-encrypted.c (g_mime_multipart_encrypted_decrypt): - Don't unref the encrypted content mime part object when the - content-type doesn't match application/octet-stream, - g_mime_multipart_get_part() does not ref parts it returns. We also - need to set an error when this happens. - -2010-05-18 Jeffrey Stedfast - - * README: Bumped version - - * configure.ac: Bumped version to 2.5.3 - - * gmime/gmime-encodings.h (GMIME_QP_ENCODE_LEN): Since - force-wrapped lines use "=\n" instead of just "\n", lines will be - 74 bytes, not 73. - -2010-05-15 Jeffrey Stedfast - - * README: Bumped version - - * configure.ac: Bumped version to 2.5.2 - -2010-05-14 Jeffrey Stedfast - - * gmime/gmime-encodings.h (GMIME_QP_ENCODE_LEN): Fixed to take - into acount the possibility of having to force-wrap lines at 72+ - characters. - -2010-05-06 Jeffrey Stedfast - - * gmime/gmime-data-wrapper.c (g_mime_data_wrapper_get_stream): - Fixed documentation. - -2010-04-13 Jeffrey Stedfast - - * configure.ac: Added a --disable-cryptography flag to alloow - building without GnuPG or S/MIME support. Thanks to - pier11@operamail.com for this patch. Fixes bug #615343. - - * tests/test-streams.c: Use glib's G_GINT64_FORMAT and - G_GSIZE_FORMAT macros for our various *printf needs to be more - portable. Thanks to pier11@operamail.com for this patch. - - * gmime/gmime-gpg-context.c: Use g_set_error_literal() when no - printf-style arguments are needed. Fixes bug #615594. Thanks to - Tobias Mueller and Christian Persch. - - * Applied patch by pier11@operamail.com to fix the build for - MingW. Fixes bug #615068. - -2010-03-26 Jeffrey Stedfast - - Fixes for bug #613653 - - * gmime/gmime.c (g_mime_init): Initialize GMimeObject's type - registry. - (g_mime_shutdown): Shut it down here. - - * gmime/gmime-object.c (g_mime_object_type_registry_init): Renamed - a bit and fixed to not use g_atexit(). Also made internal-public. - (g_mime_object_type_registry_shutdown): Renamed and made - internal-public. Also set type_hash to NULL after destroying it so - that a re-init will work. - (g_mime_object_register_type): Don't init the type system anymore. - (g_mime_object_new): Same. - (g_mime_object_new_type): Same here. - -2010-03-26 Jeffrey Stedfast - - Fixes for bug #598855 - - * gmime/gmime-message.c (process_header): Return TRUE if we match - MIME-Version. - (message_prepend_header): Don't drop MIME-Version headers. - (message_append_header): Same. - (message_set_header): Here too. - (message_get_header): Only return the hard-coded "1.0" value for - MIME-Version if it is not set on the header object. - (message_remove_header): Allow the MIME-Version header to be - removed. - (message_get_headers): Only write our own MIME-Version header if - one isn't already set in the message headers. - (message_write_to_stream): Same here. - -2010-02-12 Jeffrey Stedfast - - Fixes bug #609700. - - * configure.ac: Define ENABLE_SMIME if we find GpgMe. - - * gmime/gmime-pkcs7-context.c: #ifdef out the GpgMe logic if we - are building without S/MIME support enabled. - -2010-02-07 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.5.1 - -2010-01-31 Jeffrey Stedfast - - * src/uudecode.c (uudecode): Just use fopen() to open fout instead - of using open() and then fdopen(). Fixes the code to work properly - on Windows. - - * gmime/gmime-encodings.h (GMIME_UUENCODE_LEN): Fixed to prevent - possible buffer overflows. - -2010-01-30 Jeffrey Stedfast - - * configure.ac: Disabled strict-aliasing to work around subtle - bugs generated by gcc 4.4 when optimizations are enabled. - -2010-01-30 Jeffrey Stedfast - - * gmime/gmime-iconv-utils.c (g_mime_iconv_strndup): Cleaned up the - code a bit. - -2010-01-17 Jeffrey Stedfast - - * gmime/gmime-filter-crlf.c (filter_filter): Fixed bug #606875 by - not trying to skip multiple characters per pass thru the loop when - encountering the first '.' of a possible '..' sequence. - -2010-01-12 Jeffrey Stedfast - - * gmime/gmime-utils.c (g_mime_utils_decode_8bit): Make sure to - always increment inptr as we force-convert it to ascii. Thanks to - Damian Pietras for finding this bug. - -2009-12-15 Jeffrey Stedfast - - * Released 2.5.0 - it's time to get this out there for people to - play with. - -2009-11-30 Jeffrey Stedfast - - * configure.ac: Don't include EXTRA_LIBS in GMIME_LIBS, instead - add it to GMIME_LIBS_PRIVATE so that things properly expand in the - .pc file. - - * gmime.pc.in: Moved -lz -lnsl, etc into Libs.private. Fixes bug - #603273. - -2009-11-05 Jeffrey Stedfast - - * gmime/gmime-multipart.c (ptr_array_insert): Fixed to handle an - index larger than the current array length as well as fixing the - true insert case to shift items when index is les than the current - array length (as opposed to when it is equal-to). Thanks to - harven@gingers.rulez.pl for finding this bug. - -2009-10-10 Jeffrey Stedfast - - * gmime/gmime-utils.c: Fixed the military timezone offsets. - - * gmime/gmime-encodings.c (g_mime_encoding_uudecode_step): Fixed a - uudecoding bug when uulen % 3 is 2. Thanks to Peter Hartley. Fixes - bug #597794. - -2009-10-01 Jeffrey Stedfast - - * gmime/gmime-part.c (mime_part_encode): Shortcut if the currently - set encoding is within the acceptable constraints. - - * docs/reference/gmime-sections.txt: Updated. - - * mono/gmime-api.raw: Updated. - -2009-10-01 Jeffrey Stedfast - - * gmime/gmime-filter-best.h: Moved GMimeEncodingConstraint to - gmime-encodings.h - - * gmime/gmime-object.c (g_mime_object_encode): New method to - calculate and set the best Content-Transfer-Encoding on a mime - part and its children. - - * gmime/gmime-part.c (mime_part_encode): Use a GMimeFilterBest to - make magic happen. - - * gmime/gmime-message.c (message_encode): Encode our toplevel mime - part object. - - * gmime/gmime-multipart.c (multipart_encode): Recurse over our - children and encode them. - - * gmime/gmime-multipart-signed.c (multipart_signed_encode): - Prevent our base class implementation from iterating over our - children. - -2009-09-30 Jeffrey Stedfast - - * build/vs2008/*: Made the Project/Solution tree much nicer. - - * gmime/gmime-stream-gio.c: various warning fixes. - (set_errno): Fixes to build on Windows. - (gio_seekable_bound_end): This needs to return gint64, not - ssize_t. - - * tests/test-streams.c: Use GDir instead of POSIX's dirent API and - also conditionally disable mmap tests. - - * tests/test-mbox.c: Use GDir instead of POSIX's dirent API to aid - in portability to Windows. - -2009-09-03 Jeffrey Stedfast - - * mono/gmime-sharp.dll.config.in: Simply target - libgmime-@GMIME_API_VERSION@.so since we are now properly - versioning libgmime-2.6.so - -2009-08-12 Jeffrey Stedfast - - * gmime/gmime-utils.c (charset_convert): If iconv() fails, treat - conditions where outleft == 0 the same as if we had gotten an - E2BIG error (e.g. we need to grow the output buffer) so that we - don't overrun it while appending a '?' placeholder character. - -2009-07-04 Jeffrey Stedfast - - * configure.ac: Check for GpgME needed for S/MIME support. - - * gmime/Makefile.am: Include gmime-pkcs7-context.[c,h] in the - build. - - * gmime/gmime-pkcs7-context.[c,h]: New source files implementing - the pkcs7 cipher context using GpgMe. - -2009-07-04 Jeffrey Stedfast - - * gmime/gmime-gpg-context.c (gpg_ctx_parse_signer_info): Updated - for API changes to the GMimeSigner stuff. - - * gmime/gmime-cipher-context.c (g_mime_signer_new): Initialize the - newly added fields. - (g_mime_signer_free): Free the newly added fields. - (g_mime_signer_set_issuer_serial): New field accessor. - (g_mime_signer_get_issuer_serial): Same. - (g_mime_signer_set_issuer_name): Another new accessor. - (g_mime_signer_get_issuer_name): Same. - (g_mime_signer_set_email): And another... - (g_mime_signer_get_email): Same. - (g_mime_signer_set_sig_created): Renamed from - g_mime_signer_set_created(). - (g_mime_signer_get_sig_created): Renamed from - g_mime_signer_get_created(). - (g_mime_signer_set_sig_expires): Renamed from - g_mime_signer_set_expires(). - (g_mime_signer_get_sig_expires): Renamed from - g_mime_signer_get_expires(). - (g_mime_signer_set_key_created): New field accesor. - (g_mime_signer_get_key_created): Same. - (g_mime_signer_set_key_expires): Same. - (g_mime_signer_get_key_expires): Same. - -2009-07-02 Stanislav Brabec - - * configure.ac: Simplified configuring of gmime in a - cross-compilation environment. Make it possible to work-around - AC_TRY_RUN limitations by copying of target system iconv-detect.h - and setting ac_cv_have_iconv_detect_h=yes. - -2009-05-07 Jeffrey Stedfast - - * gmime/gmime-stream-fs.c (stream_read): Removed gross hack. - (stream_write): Same. - (g_mime_stream_fs_new): On Windows systems, set the translation - mode to BINARY. - (g_mime_stream_fs_new_with_bounds): Same. - - * gmime/gmime-stream-file.c: Same as GMimeStreamFs - -2009-05-02 Jeffrey Stedfast - - * gmime/gmime-stream-buffer.c (stream_seek_cache_read): Fixed a - 64bit cleanliness issue. - (stream_seek_cache_read): Cap the max cache size to G_MAXSIZE. - -2009-04-30 Jeffrey Stedfast - - * gmime/gmime-filter-best.h: Renamed GMimeBestEncoding to - GMimeEncodingConstraint to make this enum more clear as to what - it's intended purpose is. - - * gmime/gmime-part.c: Updated. - -2009-04-29 Sankar P - - * gmime.doap: Added new doap file to describe the project. - -2009-04-29 Jeffrey Stedfast - - * gmime/gmime-events.[c,h]: Don't require a GObject owner. - - * gmime/gmime-message.c (g_mime_message_set_mime_part): Add a - mime_part_headers_changed listener. - (g_mime_message_finalize): Remove the listener. - (mime_part_headers_changed): Uncache the message header stream. - (message_get_headers): Removed hack. - (message_write_to_stream): Same. - - * gmime/gmime-header.c (g_mime_header_list_set_stream): Emit a - changed event. - (g_mime_header_iter_set_value): Call set_stream() instead of - setting the stream to NULL ourselves. Also causes a changed event - to be emitted. - (g_mime_header_list_prepend): Same. - (g_mime_header_list_append): Here too. - (g_mime_header_list_set): And here. - (g_mime_header_list_remove): Same. - -2009-04-28 Jeffrey Stedfast - - * gmime/gmime-part.c (g_mime_part_get_best_content_encoding): New - helper function to calculate the most efficient - Content-Transfer-Encoding for a given mime-part. - -2009-04-28 Jeffrey Stedfast - - * build/vs2008/config-win32.h.in: No longer has GMIME_*_VERSION - defines - these are all in gmime-version.h now. - - * gmime/gmime-version.h.in: New template for generating - gmime-version.h - - * gmime/gmime.h: #include gmime-version.h - - * configure.ac: Renamed from configure.in. Now generates a - gmime/gmime-version.h header which contains a macro for checking - the GMime version at compile-time. Requested feature from the - Balsa guys. - -2009-04-26 Jeffrey Stedfast - - * tests/test-streams.c: Updated to test GIO streams. - - * gmime/gmime-stream-gio.c: New GMimeStream wrapper around GIO - streams. - -2009-04-26 Jeffrey Stedfast - - * gmime/gmime-session*.[c,h]: Removed. - - * gmime/gmime-stream-pipe.[c,h]: New stream for pipes (where - seeking isn't allowed). Needed by GMimeGpgContext. - - * gmime/gmime-gpg-context.c: Updated to use the new request_passwd - callback function instead of the GMimeSession. - (g_mime_gpg_context_set_auto_key_retrieve): New function for - disabling the auto-key-retrieve functionality of gpg. - (g_mime_gpg_context_get_auto_key_retrieve): New function to get - the state of auto-key-retrieve enabledness. - - * gmime/gmime-cipher-context.[c,h]: No longer references a - GMimeSession. Instead, we now have a GMimePasswordRequestFunc used - for prompting the user. - -2009-04-26 Jeffrey Stedfast - - * gmime/gmime-multipart-encrypted.c: Removed stub virtual method - overloads that did nothing but call the base class' - implementation. - - * gmime/gmime-multipart-signed.c: Same. - - * gmime/gmime-message-part.c (message_part_prepend_header): - Protect against setting Content-MD5 header since this is not - allowed. - (message_part_append_header): Same. - (message_part_get_header): Don't bother checking that the - requested header begins with "Content-", just pass it along to our - base class implementation to worry about. - (message_part_remove_header): Same. - - * gmime/gmime-message-partial.c (message_partial_get_header): - Same. - (message_partial_remove_header): Here too. - - * gmime/gmime-part.c (mime_part_remove_header): Same. - -2009-04-25 Jeffrey Stedfast - - * gmime/gmime-message-partial.c (g_mime_message_partial_split_message): - Fixed to use gint64 variables for stream length/offsets. - -2009-04-25 Jeffrey Stedfast - - * gmime/gmime-object.c (g_mime_object_set_disposition): Unref the - disposition after setting it on the GMimeObject, don't ref it - again. Oops. - - * gmime/gmime-message.c (to_list_changed, cc_list_changed): - (bcc_list_changed): Fixed callback signatures. Oops. - - * gmime/gmime-events.c: Fixed list traversal. What was I thinking - before? - -2009-04-25 Jeffrey Stedfast - - * gmime/gmime-parse-utils.h: Marked APIs as internal linkage only. - - * gmime/gmime-common.h: Same. - - * gmime/gmime-content-type.c: Use the new GMimeEvent API instead - of libgobject's g_signal API which is more than we need. - - * gmime/gmime-disposition.c: Same. - - * gmime/gmime-object.c: Updated to use the GMimeEvent API for - content-type and content-disposition. - - * gmime/internet-address.c: Use the new GMimeEvent API instead of - our own. - - * gmime/gmime-events.[c,h]: New source files implementing a simple - and performant event system needed internally within GMime. Based - on the event system that used to be in internet-address.c - -2009-04-24 Jeffrey Stedfast - - * gmime/gmime-parser.c (struct _GMimeParserPrivate): Added - message_headers_begin/end and changed the meaning of - headers_begin/end to be for the current MIME part rather than for - the current message itself. - (g_mime_parser_init): Init the boolean state variables before - calling parser_init() so that parser_init() can use them. - (parser_init): Only create a rawbuf if our stream isn't seekable - or isn't persistent. Initialize our new message_headers_begin/end. - (g_mime_parser_set_persist_stream): If our persist mode has - changed, malloc or free our rawbuf. - (raw_header_append): Don't append any data if rawbuf is NULL (this - means we're keeping track of offsets instead). - (parser_step_headers): Always update headers_begin/end since we - now always want to keep track of all header begin/end offsets. - (parser_step): Update our message_headers_begin/end state. - (parser_scan_message_part): Set the mime-part's raw header stream - on the message too. - (parser_construct_message): Same. - (parser_construct_leaf_part): Substream the input stream to get - our raw header stream to set on the mime-part's header-list. - (parser_construct_multipart): Same. - - * gmime/gmime-header.c (struct _GMimeHeaderList): Instead of - having a string buffer holding the raw header block content, - instead keep a stream. This not only makes it easy for us to keep - track of what the header offsets on disk are should the developer - want to know, but it also means we don't necessarily have to use - duplicate the header block to memory. - (g_mime_header_list_set_stream): New function that replaces the - old g_mime_header_list_set_raw() and looks much cleaner. - (g_mime_header_list_get_stream): New function to access said - stream. - - * gmime/gmime-message.c: Fixed uses of - g_mime_header_list_set/has_raw(). - (g_mime_message_set_mime_part): Set the message's raw header - stream to NULL. - - * gmime/gmime-multipart.c: Same. - - * tests/test-parser.c (test_parser): Updated. - -2009-04-24 Jeffrey Stedfast - - * build/vs2008/config-win32.h.in: New template to replace - config.h.win32 so that the version info gets autogenerated when I - make a new release. Makes it easier for me to keep it in sync. - - * build/vs2008/gmime.vcproj: No longer defines the gmime version - variables on the command-line (as these are now part of config.h). - -2009-04-23 Jeffrey Stedfast - - * branched: now begins 2.5.x development - - * configure.in: Updated. - - * zentimer.h: Updated to hopefully build on Windows. - - * gmime/Makefile.am: Rename lib name to gmime-2.6. - - * gmime.pc.in: Renamed from gmime-2.4.pc.in. - - * mono/gmime-sharp.pc.in: Renamed from gmime-sharp-2.4.pc.in. - - * gmime/gmime-stream*.[c,h] (stream_length): Fixed to return a gint64 - -2009-04-09 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.4.6 - -2009-04-05 Jeffrey Stedfast - - * gmime/gmime-encodings.c (g_mime_encoding_uudecode_step): Fixed a - bug wrt updating uulen when the data isn't an exact multiple of 3. - - * src/uuencode.c (uuencode): Don't bother dup()ing the stdout fd, just - use set_owner(FALSE) so that it doesn't close when we destroy the stream - instead. - - * gmime/gmime-stream-file.c (stream_read, stream_write): Don't depend on - simple arithmetic to update our stream->position on Windows since it - may do line-ending translation behind our backs. Call ftell() to get - our real position after reading or writing. - - * gmime/gmime-stream-fs.c (stream_read, stream_write): Same idea. - - * gmime/gmime-utils.c (mktime_utc): Fixed the Windows code-path. - (charset_convert): In the Windows case, fake the E2BIG error condition - if outleft <= inleft on any error as errno doesn't seem to get - properly set in this case. - - * tests/test-headers.c: Removed unused headers to fix the build on - Windows. - -2009-04-04 Jeffrey Stedfast - - * gmime/gmime-stream-fs.c: Ported to Windows by #including io.h - - * examples/basic-example.c: Reverted to the old GMimeStreamFs logic - and #included io.h for G_OS_WIN32 systems. - - * examples/imap-example.c: Ported to Windows by #including io.h and - using g_ascii_strcasecmp(). - -2009-04-03 Jeffrey Stedfast - - * build/vs2008: New directory for Visual Studio 2008 Solution & Project - files. - - * gmime.vcproj: Moved to build/vs2008 - - * config.h.win32: Same. - - * gmime.sln: Same. - - * examples/basic-example.c: Fixed to build under Visual Studio by - using GMimeStreamFile instead of GMimeStreamFs and by #ifdef'ing - out the GnuPG code. - - * tests/testsuit.[c,h]: Fixed to compile under Visual Studio which - basically means we can't use _try() as a function. Renamed to g_try(). - Also renamed throw() to g_throw() for consistency. - -2009-04-02 Jeffrey Stedfast - - * tests/testsuite.c: Modified to compile without the need for - pthread.h - - * gmime.vcproj: Added logic to the PreBuild step to copy - config.h.win32 to config.h - - * config.h.win32: Added. - -2009-04-01 Jeffrey Stedfast - - * gmime/gmime-utils.c: #include for getpid() and ws2tcpip.h - for getaddrinfo() on Windows platforms. - (mktime_utc): Use _get_timezone() when building on Windows. - (g_mime_utils_header_format_date): Windows has gmtime_s() instead - of gmtime_r(), so use that on Windows. - - * gmime/gmime-parser.c: If glib is >= 2.14, use GRegex instead of - glibc regex. - -2009-04-01 Jeffrey Stedfast - - * gmime/gmime-utils.c: Need to #include for getpid(). - - * gmime/gmime-stream-fs.c: Need to #include here. - - * gmime/gmime-multipart-signed.c: Got rid of an unused variable. - - * gmime/gmime-message.c: Removed unused variables. - - * gmime/gmime-content-type.c: Don't need to #include - "gmime-table-private.h" here as we don't actually use it. - - * util/gtrie.c: Disable g_warning()'s when compiled w/o - --enable-warnings and also fixed some compile warnings. - -2009-03-31 Jeffrey Stedfast - - * gmime.sln: New Microsoft Visual Studio 2008 Solution file for GMime. - - * gmime.vcproj: New Microsoft Visual C++ Project file for GMime. - -2009-03-31 Jeffrey Stedfast - - * gmime/gmime-utils.c: Removed unneeded #include - - * configure.in: Check for unistd.h - - * gmime/gmime-multipart.c (read_random_pool): Implement using - rand() in the case that unistd.h is not available. - - * gmime/gmime-parser.c (parser_scan_content): Fixed 'crlf' - argument to be a guint to make it easier to avoid compile warnings - about comparison between signed/unsigned ints in the callers. - - * gmime/internet-address.c (internet_address_group_add_member): - Fixed g_return macros to return a value. - (internet_address_mailbox_get_addr): Same. - -2009-03-30 Jeffrey Stedfast - - * configure.in: Check for regex.h - - * gmime/gmime-parser.c: #ifdef out the regex functionality if the - system does not have regex.h - - * gmime/gmime-stream-fs.h: Don't #include here. - - * gmime/gmime-stream.h: Removed #include as it isn't - needed there. - - * gmime/gmime-part.c: Removed unused includes. - - * gmime/gmime-utils.c: Only #include if we have - utsname.domainname. Helps build process on Windows. - -2009-03-29 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.4.5 - -2009-03-27 Jeffrey Stedfast - - * gmime/gmime-stream-buffer.c: Fixed to be more diligent in setting - errno on error. - - * gmime/gmime-stream-mmap.c: Fixed to be more diligent in setting - errno on error. - - * gmime/gmime-stream-mem.c: Fixed to be more diligent in setting - errno on error. - (stream_seek): If the user seeks beyond the end of the buffer and - bound_end is unbound, then grow the buffer (e.g. a sparse file). - - * gmime/gmime-stream-file.c: Fixed to be more diligent in setting - errno on error. - - * gmime/gmime-stream-fs.c: Fixed to be more diligent in setting - errno on error. - -2009-03-20 Jeffrey Stedfast - - * configure.in: Default --enable-largefile to yes. Looks like I - forgot to do this before rolling the version to 2.4.0 like I - intended. - - * tools/Makefile.am: Fixed to include the porting script in - EXTRA_DIST (instead of extra_DIST) so that the tarball includes - it, doh! - -2009-03-18 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.4.4 - -2009-03-18 Jeffrey Stedfast - - * configure.in: Check for select() and poll() as well as poll.h - - * gmime/gmime-gpg-context.c (poll): Implement our own poll() - function using select() for portability to MacOS 10.2, which - apparently doesn't have poll(). - -2009-02-22 Jeffrey Stedfast - - * gmime/gmime-utils.c: Use GSlice for rfc822 word tokens and date - tokens. - - * gmime/gmime-parser.c: Updated to use GSlice. - -2009-02-22 Jeffrey Stedfast - - * gmime/gmime-header.c (g_mime_header_iter_new): Use - g_slice_new(). - (g_mime_header_iter_free): Use g_slice_free(). - (g_mime_header_list_new): Use g_slice_new(). - (g_mime_header_list_destroy): Use g_slice_free(). - - * gmime/gmime-gpg-context.c (gpg_ctx_new): Use g_slice_new(). - (gpg_ctx_free): Use g_slice_free(). - - * gmime/gmime-cipher-context.c (g_mime_signer_new): Use - g_slice_new() instead of g_new(). - (g_mime_signature_validity_new): Same. - (g_mime_signature_validity_free): Use g_slice_free(). - (g_mime_signer_free): Same. - -2009-02-07 Jeffrey Stedfast - - * gmime/internet-address.c: Removed some unused macros. - -2009-01-12 Jeffrey Stedfast - - * mono/Makefile.am: Fixed to parallel make install, thanks to - Diego Pettenò. Fixes bug #567549. - -2009-01-09 Jeffrey Stedfast - - * examples/imap-example.c (write_part): Don't unref the stream we - get from g_mime_data_wrapper_get_stream(). - (reconstruct_part_content): Fixed error-checking. - -2008-11-01 Jeffrey Stedfast - - * gmime/gmime-parser.c (nearest_pow): Implement using asm on i386 - - this code path isn't normally built, but it's fun to - micro-optimize anyway ;-) - - * gmime/gmime-gpg-context.c (status_backup): Use next_alloc_size() - macro - same as gmime-parser.c - -2008-10-22 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.4.3 - -2008-10-22 Jeffrey Stedfast - - Fixes by Damian Pietras. - - * gmime/gmime-parser.c (check_boundary): Check that len > 0 before - checking for \r. - (header_parse): Fixed to handle headers with nothing but lwsp. - -2008-10-07 Jeffrey Stedfast - - * util/gtrie.c (g_trie_search): Instead of returning the first - match, find instead the best match starting at the same starting - offset (e.g. if we have two patterns "abc" and "abcdef" and the - input buffer is "abcdefghi", we want to match "abcdef" rather than - just "abc"). - (g_trie_quick_search): Renamed from the old g_trie_search(). - -2008-10-06 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.4.2 - -2008-10-02 Jeffrey Stedfast - - * gtk-doc.make: More parallel-install fixes so that devhelp - actually works. Patch to gtk-doc.make submitted upstream. - -2008-10-02 Jeffrey Stedfast - - Fixes for bug #554830 - - * mono/Makefile.am: Don't hard-code the API version. - - * mono/gmime-sharp-2.4.pc.in: Fixed incorrect path to include the - API_VERSION. - - * gmime-2.4.pc.in: Similar fixes. - - * configure.in: Define GMIME_API_VERSION - -2008-10-02 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.4.1 - -2008-10-02 Jeffrey Stedfast - - * gtk-doc.make: Allow for a versioned install of the - gtk-docs. Completes the fix for bug #554121. - - * docs/reference/Makefile.am: Define a DOC_MODULE_VERSION - - * mono/Makefile.am: Fix PACKAGE_SHARP to be versioned. Partial fix - for bug #554121. - - * gmime/gmime-parser.c: Made the headerbuf allocator a little less - liberal in the amount it allocates. - -2008-09-25 Jeffrey Stedfast - - * gmime/gmime-stream.c (stream_length): Implemented a default - solution using g_mime_stream_seek(). - -2008-09-25 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.4.0 - -2008-09-18 Jeffrey Stedfast - - * gmime/gmime-utils.c (g_mime_utils_header_decode_text): Check if - rfc2047-workarounds has been enabled at runtime. - - * gmime/gmime.h (GMIME_ENABLE_RFC2047_WORKAROUNDS): New - g_mime_init() flag so that a programmer can enable rfc2047 - workarounds at runtime. - - * gmime/gmime.c (g_mime_init): Save the init flags. - - * gmime/internet-address.c (internet_address_group_set_members): - Add an event listener to the new members, not the unref'd old - member list. Thanks to Peter Bloomfield for spotting this. - -2008-09-18 Jeffrey Stedfast - - * gmime/gmime.c (g_mime_init): Register all of our GObject types - with the glib type system so that there's less risk of a - race-condition in multi-threaded applications (not sure if this is - a justifiable concern or not, but it doesn't hurt). - -2008-09-15 Jeffrey Stedfast - - * gmime/gmime-message.c: Use the new InternetAddressList event - system. - - * gmime/internet-address.c: Implemented a custom event system - which gains us another 20% performance improvement. - -2008-09-14 Jeffrey Stedfast - - * gmime/gmime-object.c (g_mime_object_get_type): Register this - class as being abstract. - - * gmime/gmime-filter.c (g_mime_filter_get_type): Register this - class as being abstract. - - * gmime/gmime-stream.c (g_mime_stream_get_type): Register this - class as being abstract. - - * gmime/internet-address.c (decode_mailbox): Pass name->len to - g_utf8_validate() rather than -1 since we have the length. Might - save us some cycles. - (internet_address_get_type): Register this class as being - abstract. - - * gmime/gmime-parser.c (parser_init): Initialize the headerbuf and - rawbuf buffers to something more reasonable. - -2008-09-14 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.3.10 - -2008-09-13 Jeffrey Stedfast - - Epic optimization hack-a-thon which resulted in another ~5% - performance improvement. - - * gmime/gmime-message.c (g_mime_message_init): Instead of using a - hash table for our recipients table, simply use an array since we - can easily look them up using the GMimeRecipientType as an array - index. Eliminates unnecessary memory and, most importantly, - performance overhead. - (message_add_recipients_from_string): Optimized quite a bit by - using the new internet_address_list_append/prepend functions. - - * gmime/gmime-utils.c (decode_addrspec): Updated for - g_mime_decode_domain() changes. - - * gmime/gmime-parse-utils.c (g_mime_decode_domain): Changed the - API a bit to prevent the need for string duplication/g_free - overhead in our callers. - - * gmime/gmime-parser.c (parser_fill): Keep track of the stream - offset ourselves. - - * gmime/internet-address.c (internet_address_list_append): Renamed - from internet_address_list_concat() and optimized slightly. - (internet_address_list_prepend): New function that prepends the - contents of a list to another list. - (_internet_address_set_name): New internal function which avoids - emitting a "changed" event in an attempt to enhance the - performance of internet_address_list_parse(). - (_internet_address_list_add): Same idea as - _internet_address_set_name(), but also takes ownership of the - InternetAddress' ref to avoid unnecessary ref/unref overhead. - (internet_address_mailbox_new): Instead of calling - internet_address_mailbox_set_addr(), set it manually to avoid a - g_signal_emit(). - (internet_address_group_new): Call _internet_address_set_name() to - avoid signal emission. - (internet_address_group_add_member): Now returns the index of the - newly added member. - (decode_mailbox): Avoid string duplication of the addrspec token, - use the new g_mime_decode_domain() API to avoid unnecessary - strdup/g_free overhead, and use _internet_address_set_name(). - (decode_address): Don't need to unref members anymore as the lists - we add them to take ownership of the refs. - -2008-09-12 Jeffrey Stedfast - - I/O Optimization which improved performance by ~5% - - * gmime/gmime-parser.c (parser_fill): Now takes an 'atleast' - argument which we use to decide whether we should bother calling - read() or not. If we have more than 'atleast' bytes left in our - buffer, we don't read. - (parser_scan_content): Take advantage of the 'atleast' argument to - parser_fill(). - (parser_step_headers): Same. - (parser_step_from): Here too. - (parser_skip_line): And here. - -2008-09-08 Jeffrey Stedfast - - * gmime/gmime-message.c (message_add_recipients_from_string): - Prepend, append, or set the addresses in the recipients list - depending on the new 'action' argument. - (process_header): Pass along our 'action' to - message_add_recipients_from_string(). - (message_prepend_header): Pass PREPEND as the action argument to - process_header(). - (message_append_header): Pass APPEND as the action argument to - process_header(). - (message_set_header): Pass SET as the action argument to - process_header(). - - * gmime/gmime-header.c (g_mime_header_list_set): If there is more - than a single header with the specified name, remove them. - -2008-09-07 Jeffrey Stedfast - - * util/memchunk.[c,h]: Removed. No longer used. - -2008-09-07 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.3.9 - -2008-09-07 Jeffrey Stedfast - - New feature needed by the Bongo project (seems DBMail could also - use this feature as they currently have a hack-around). - - * tests/test-mbox.c: Output header offsets as well so that they - can be checked. - - * gmime/gmime-parser.c (g_mime_parser_get_headers_begin): New - function to get the beginning offset of the message headers. - (g_mime_parser_get_headers_end): Same, but for the end offset. - (parser_step_headers): Only set priv->headers_begin and - priv->headers_end if they are set to -1, we don't want to - overwrite this value if parsing a subpart. - (parser_step): Reset priv->headers_begin and priv->headers_end - when appropriate. - -2008-09-07 Jeffrey Stedfast - - * gmime/gmime-charset.c (g_mime_charset_map_init): Create the - iconv_charsets hashtable using g_hash_table_new_full() so that we - don't have to call g_hash_table_foreach() before destroying it in - g_mime_charset_map_shutdown(). - - * gmime/gmime-gpg-context.c: Use g_hash_table_new_full() so that - we don't have to g_hash_table_foreach() to remove all user-id - hints before destroying the user-id hint hashtable. - - * util/cache.c: Updated to use GSlice instead of a custom MemChunk - allocator. - - * util/gtrie.c: Updated to use GSlice instead of my custom - MemChunk. The main purpose for using the MemChunk allocator had - been ease of cleanup, but it made it more difficult to use GTrie - elsewhere. - - * examples/basic-example.c: Updated for the foreach() changes. - - * gmime/gmime-multipart.c (g_mime_multipart_foreach): Changed to - be recursive. The callback function signature has changed a bit to - be more useful as well by providing the parent MIME object. - - * gmime/gmime-message.c (g_mime_message_foreach): Same. - -2008-09-06 Jeffrey Stedfast - - * gmime/gmime-multipart.c (g_mime_multipart_get_subpart_from_content_id): - Multiparts can have Content-Id's too. - -2008-09-06 Jeffrey Stedfast - - * gmime/gmime-part.c (g_mime_part_set_content_object): Made - virtual, seems like it could be useful. - - * gmime/gmime-object.c (set_content_type): Do not serialize the - GMimeContentType object to the headers. This is done elsewhere - now. - (g_mime_object_set_content_type): After calling the virtual - set_content_type(), serialize the GMimeContentType object to the - headers. - - * gmime/gmime-multipart-encrypted.c: Get rid of the protocol - member variable, it's not needed. - - * gmime/gmime-multipart-signed.c: Get rid of the protocol and - micalg member strings, these aren't needed - just request them - from the content_type. - - * gmime/gmime-multipart.c: Get rid of boundary member variable, we - can just request it from the ContentType object. No sense - duplicating strings. - - * gmime/gmime-message.c (message_get_headers): Don't write out a - MIME-Version header if a Content-Type header doesn't exist. - - * gmime/gmime-parser.c (parser_content_type): Instead of returning - a GMimeContentType object, we now return a simpler ContentType - struct so that we don't waste time processing more of the header - than we need to, all we need is the type/subtype to figure out - which MIME object type to instantiate. - (parser_scan_message_part): After finishing parsing the object, - destroy the content_type ourselves. - (parser_construct_leaf_part): Updated. Don't set a - GMimeContentType on the GMimeObject unless the Content-Type header - doesn't exist (if it does exist, then appending the Content-Type - header will cause one to be created and set on the GMimeObject). - (parser_construct_multipart): Updated. - - * gmime/gmime-content-type.c (g_mime_content_type_new_from_string): - Use the new g_mime_parse_content_type() utility function and set - the parsed string values on the new GMimeContentType object - directly to avoid unnecessary strdup()ing. - - * gmime/gmime-parse-utils.c (g_mime_parse_content_type): New - function to parse the simple type/subtype Content-Type form. - -2008-08-31 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.3.8 - -2008-08-31 Jeffrey Stedfast - - * mono/Multipart.custom: GMime.Multipart now implements the IList - interface. - - * gmime/gmime-message.c (g_mime_message_add_recipients_from_string): - Removed. This function was a kludge - use - g_mime_message_get_recipients() and then add recipients you have - manually instead. - - * gmime/gmime-multipart.c (g_mime_multipart_clear): New method. - (g_mime_multipart_contains): Same. - (g_mime_multipart_index_of): Same. - -2008-08-31 Jeffrey Stedfast - - * gmime/gmime-parser.c (parser_scan_multipart_subparts): Updated - for GMimeMultipart API changes. - - * gmime/gmime-multipart-signed.c (sign_prepare): Updated for - GMimeMultipart API changes. - (g_mime_multipart_signed_sign): Same. - - * gmime/gmime-multipart-encrypted.c (g_mime_multipart_encrypted_encrypt): - Updated for GMimeMultipart API changes. - - * gmime/gmime-multipart.c (g_mime_multipart_add): Renamed from - g_mime_multipart_add_part(). The "_part" seemed superfluous. - (g_mime_multipart_remove): Same. - (g_mime_multipart_remove_at): Same. - (g_mime_multipart_insert): Renamed from - g_mime_multipart_add_part_at(). - (g_mime_multipart_get_count): Renamed to be more obvious. - -2008-08-31 Jeffrey Stedfast - - * gmime/gmime-message-partial.c (g_mime_message_partial_new): Need - to unref the content_type after setting it on the object. - - * gmime/gmime-message-part.c (g_mime_message_part_new): Need to - unref the content_type after setting it on the object. - - * gmime/gmime-multipart.c (g_mime_multipart_new): Need to unref - the content_type after setting it on the object. - (g_mime_multipart_new_with_subtype): Same. - - * gmime/gmime-multipart-signed.c (g_mime_multipart_signed_sign): - Need to unref the content_type after setting it on the - object. Also need to set mps->protocol /before/ we use it. - - * gmime/gmime-multipart-encrypted.c (g_mime_multipart_encrypted_new): - Need to unref the content_type after setting it on the object. - (g_mime_multipart_encrypted_encrypt): Same. - - * gmime/gmime-part.c (g_mime_part_new): Need to unref the - content_type after setting it on the object. - (g_mime_part_new_with_type): Same. - (g_mime_part_set_content_header): Removed. - (g_mime_part_get_content_header): Removed. - (g_mime_part_set_filename): Don't need to pre-set a - ContentDisposition on the object if it is NULL, - g_mime_object_set_content_disposition_parameter() will do that for - us. - - * gmime/gmime-parser.c (parser_construct_leaf_part): Instead of - going around the GMimeObject's back to set the content_type, call - g_mime_object_set_content_type(). - (parser_construct_multipart): Same. - - * gmime/gmime-object.c: Updated for GMimeContentType and - ContentDisposition GObjectification. - (g_mime_object_new): New function. - - * gmime/gmime-disposition.c: Subclass GObject. - - * gmime/gmime-content-type.c: Subclass GObject. - - * gmime/internet-address.c: Got rid of unneeded vfuncs for the - changed event (which we don't want to be made public). - -2008-08-25 Jeffrey Stedfast - - Making GMime's object-returning APIs consistent with Gtk+ which do - not ref returned objects. - - * tests/test-headers.c (test_header_sync): No longer need to unref - the InternetAddressList object returned from - g_mime_message_get_recipients(). - - * tests/test-mbox.c (print_mime_struct): Since - g_mime_multipart_get_part() no longer returns a ref'd object, no - need to unref it once we're done with it. - - * gmime/gmime-multipart-encrypted.c (g_mime_multipart_encrypted_decrypt): - Don't ref the returned decrypted part. - - * gmime/gmime-message-part.c (g_mime_message_part_get_message): - Don't ref the returned message part. - - * gmime/gmime-data-wrapper.c (g_mime_data_wrapper_get_stream): - Don't ref the returned stream. - - * gmime/gmime-part.c (g_mime_part_get_content_object): Don't ref - the returned content object anymore. - - * gmime/gmime-multipart.c (multipart_get_part): No longer ref the - returned part. - (g_mime_multipart_get_subpart_from_content_id): Same. - - * gmime/gmime-message.c (g_mime_message_get_recipients): Don't ref - the list anymore. - (g_mime_message_get_mime_part): Don't ref the returned mime part - anymore. - - * gmime/gmime-object.c (g_mime_object_get_content_type): Don't - return const anymore. We want app devs to be able to manipulate - the GMimeContentType directly. - (g_mime_object_get_content_disposition): Same idea here. - - * gmime/internet-address.c (internet_address_group_get_members): - Don't ref the members list anymore. - (internet_address_list_get_address): Same. - -2008-08-24 Jeffrey Stedfast - - * tests/test-headers.c (test_header_sync): Check that changes to - the GMimeContentType, GMimeDisposition, and InternetAddressList - objects cause a re-sync of the GMimeObject/GMimeMessage headers. - - * gmime/internet-address.c (internet_address_list_add): Connect to - the added address's changed signal. Exposed by my new test-suite - code. - (internet_address_list_insert): Assert index >= 0, not < 0. - (internet_address_list_remove_at): Same. - (internet_address_list_get_address): Same. - (internet_address_list_set_address): Same. - (internet_address_list_to_string): Return NULL if the list is - empty. This makes it easier to keep the new behavior of keeping - around InternetAddressList objects in GMimeMessage the same as the - old behavior when all of the addresses have been removed. - - * gmime/gmime-disposition.c (g_mime_content_disposition_set_params): - New function. - - * gmime/gmime-content-type.c (g_mime_content_type_set_media_type): - New function. - (g_mime_content_type_set_media_subtype): Another new function. - (g_mime_content_type_set_params): New function. - -2008-08-19 Jeffrey Stedfast - - * gmime/gmime-message.c: Updated to listen to changed events from - recipient lists and to update the headers when the lists change. - - * gmime/internet-address.c: InternetAddress is now GObject with a - "changed" signal. Split out InternetAddressMailbox and - InternetAddressGroup subclasses of - InternetAddress. InternetAddressList is now also a GObject with a - "changed" signal. These changes were made so that manipulating an - InternetAddress[List] of recipients will auto-magically update - GMimeMessage's corresponding recipient header. - -2008-08-18 Jeffrey Stedfast - - * gmime/gmime-message.c (g_mime_message_get_recipients): Now - returns a ref'd version of the InternetAddressList. You must now - unref the list when you are done with it. - - * tools/gmime-port-2-2-to-2-4.sh: Updated. - - * gmime/internet-address.c (internet_address_new_mailbox): Renamed - from internet_address_new_name() to make it less ambiguous (and to - use the terminology used in the RFC's). - (internet_address_get_type): Now takes a const InternetAddress - argument. - (internet_address_get_name): Same. - (internet_address_get_addr): Same. - (internet_address_get_members): Same, but now returns a ref'd - InternetAddressList rather than a const InternetAddressList. - (internet_address_list_ref): InternetAddressLists are now - reffable. - (internet_address_list_unref): Same. - (internet_address_list_get_address): Now returns a ref'd copy of - the InternetAddress at the index specified. - -2008-08-16 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.3.7 - -2008-08-16 Jeffrey Stedfast - - Fixes to actually pass the test suite. D'oh! - - * gmime/gmime-message.c (process_header): Protect against passing - a NULL list to internet_address_list_to_string(). - (g_mime_message_add_recipient): Create a new InternetAddressList - if it doesn't already exist in the hash table. - (message_add_recipients_from_string): Protect against passing a - NULL list to internet_address_list_concat(). - - * gmime/internet-address.c (_internet_address_list_to_string): - Fixed the logic to avoid adding a ',' after the last email - address. - -2008-08-16 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.3.6 - -2008-08-16 Jeffrey Stedfast - - * mono/InternetAddressList.cs: Rewritten to be more awesome. Now - implements IList. - - * tools/gmime-port-2-2-to-2-4.sh: Updated. - - * gmime/gmime-message.c: Updated for InternetAddressList API - changes. - - * gmime/internet-address.c: Completely reworked the - InternetAddressList API. - (internet_address_list_parse_string): Renamed from - internet_address_parse_string(). - -2008-08-15 Jeffrey Stedfast - - * gmime/internet-address.c (decode_mailbox): Implemented a - work-around for broken email addresses that have more than a - single '.' between word tokens making up the local-part of an - addr-spec. See Evolution bug #547969 for details. - -2008-08-07 Jeffrey Stedfast - - * gmime/gmime-message-part.c (g_mime_message_part_get_message): - Only ref the message if it is non-NULL. Thanks to Peter Bloomfield - for this fix. - -2008-07-19 Jeffrey Stedfast - - * gmime/gmime-header.c (g_mime_header_iter_get_offset): Disable - for now, currently it never gets set. - -2008-07-11 Jeffrey Stedfast - - * src/uudecode.c (uudecode): Don't base64 decode the - end-tag ("====\n"). Fixes bug #542222. - -2008-07-08 Jeffrey Stedfast - - * COPYING: Fixed to reference LGPL v2.1 - - * docs/reference/gmime-sections.txt: Updated. - - * gmime/gmime-header.c (g_mime_header_list_foreach): Added back - since it's fairly simple and makes it easier for apps to be ported - over to GMime 2.4 - - * gmime/gmime-message.h: Removed unused prototypes. - - * gmime/gmime-common.h: Same. - -2008-07-05 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Doltified and bumped version to 2.3.5 - -2008-07-04 Jeffrey Stedfast - - * mono/Message.custom: Updated. - - * gmime/gmime-message.[c,h]: Make GMIME_RECIPIENT_TYPE_* string - macros into an enum. Translate the enum into strings as - appropriate internally. - -2008-07-04 Jeffrey Stedfast - - Fixes bug #541578 - - * gmime/gmime-message.c (g_mime_message_add_recipient): Change - 'type' argument to const char *. - (g_mime_message_add_recipients_from_string): Same. - -2008-06-20 Jeffrey Stedfast - - * gmime/gmime-multipart.c (g_mime_multipart_remove_part): Fixed - g_return macros to return bool instead of void. - - * gmime/gmime-cipher-context.c (g_mime_signer_get_errors): Fixed - the function name to match the prototype name. - - * gmime/gmime-header.c (g_mime_header_list_remove): Fixed the - g_return macros here too. Also need to make sure to return TRUE at - the end of the function. - - * gmime/gmime-part.c (write_content): Don't unred filtered_stream - if we haven't used it. - - * gmime/gmime-object.c (g_mime_object_remove_header): Fixed - g_return macros, this function returns bool, not void. - - * gmime/gmime-gpg-context.c (gpg_ctx_parse_status): Get rid of - unused variable. - -2008-06-18 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.3.4 - -2008-06-15 Jeffrey Stedfast - - * gmime/gmime-gpg-context.c (status_backup): Use the bitwise - nearest_pow() implementation. - -2008-06-14 Jeffrey Stedfast - - * gmime/gmime-parser.c: When mallocing header/raw buffers, malloc - a power-of-2 rather than a power-of-2 + 1. Also optimized the - logic to calculate the amount of memory to realloc. - -2008-06-12 Jeffrey Stedfast - - * gmime/gmime-encodings.h (GMIME_QP_ENCODE_LEN): Add an extra byte - for \n in the case of quoted_encode_close(). Thanks to Peter - Bloomfield for discovering this. - -2008-06-08 Jeffrey Stedfast - - * gmime/gmime-gpg-context.c (gpg_ctx_parse_status): added - constants for MD2, TIGER and HAVAL. - -2008-06-08 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.3.3 - - * docs/reference/changes-2.4.sgml: Updated. - - * PORTING: Updated. - -2008-06-07 Jeffrey Stedfast - - * gmime/*.h: Finished documenting all of the structs. Now at 100% - symbols documented! Woot! - - * gmime/gmime-multipart-signed.c (g_mime_multipart_signed_sign): - Use the GMimeCipherHash returned from g_mime_cipher_context_sign() - to create the micalg parameter value - this way if the requested - hash was DEFAULT, we set the micalg to the proper value. - - * gmime/gmime-gpg-context.c (gpg_ctx_parse_status): Parse which - hash algorithm was actually used by gpg. - (gpg_hash_str): Updated to return strings for the new SHA - algorithms added this past week. - (gpg_sign): Return the hash algorithm actually used. - - * gmime/gmime-cipher-context.c (g_mime_cipher_context_sign): This - method now returns -1 on fail or the GMimeCipherHash on success. - -2008-06-07 Jeffrey Stedfast - - * gmime/gmime-parse-utils.c (g_mime_decode_word): No longer - returns a strdup'd string, this helps increase the performance of - the address parser and reduces memory fragmentation. - - * gmime/gmime-utils.c (g_mime_references_decode): Updated for - decode_word() changes. - (decode_addrspec): Same. - - * gmime/internet-address.c (decode_mailbox): Make sure we don't - stray beyond the end of the input string. Also updated for changes - to decode_word() (which now returns a const string rather than a - strdup'd string). - - * gmime/gmime-header.c (g_mime_header_iter_is_valid): Fixed an FMR - when the header the cursor is pointing to has been removed by - validating the hdrlist version first. - -2008-06-06 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.3.2 - - * gmime/*.[c,h]: Updated a bunch of gtk-doc documentation. - -2008-06-05 Jeffrey Stedfast - - * gmime/gmime-message.c (g_mime_message_get_date_as_string): - Renamed from g_mime_message_get_date_string(). - (g_mime_message_set_date_as_string): New function to provide - another means of setting a date (might help with some bindings - where time_t and tz_offsets are more difficult to work with). - - * mono/GMime.metadata: Fixed MessagePartial.ReconstructMessage - binding, thanks to Mike Kestner for helping me figure out the - proper metadata kung-fu to achieve this. - - * gmime/gmime-object.c: Get rid of the 'init' class method, - GObject already has an initializer (must be a leftover from before - the port to GObject). - (g_mime_object_new_type): Don't call GMimeObject->init(), - g_object_new() has already initialized the object. - - * gmime/gmime-multipart.c (g_mime_multipart_remove_part): Now - returns TRUE or FALSE. - -2008-06-04 Jeffrey Stedfast - - * tests/test-pgp.c (main): Test encrypt+sign and decrypt+verify as - well. - -2008-06-03 Jeffrey Stedfast - - * tests/test-pgpmime.c: Updated to test for - multipart/encrypted+sign - - * gmime/gmime-multipart-encrypted.c (g_mime_multipart_encrypted_encrypt): - Changed to take 'sign' and 'userid' arguments so that it is - possible to both sign and encrypt the content. - (g_mime_multipart_encrypted_decrypt): Updated to save the - GMimeSignatureValidity from our call ot - g_mime_cipher_context_decrypt() so that callers can choose to get - the signer validity (in the case where the encrypted part was also - signed). - (g_mime_multipart_encrypted_get_signature_validity): New function. - - * gmime/gmime-gpg-context.c (gpg_decrypt): Updated to return a - GMimeSignatureValidity. - (gpg_ctx_parse_signer_info): Split out from gpg_ctx_parse_status() - to parse signer info. - (gpg_ctx_parse_status): Updated VERIFY mode to call - gpg_ctx_parse_signer_info() and made DECRYPT also call it so that - we properly collect signer info when the encrypted stream was also - signed. - (gpg_encrypt): Respect the 'sign' argument. - - * gmime/gmime-cipher-context.c (g_mime_cipher_context_decrypt): - Now returns a GMimeSignatureValidity in case the encrypted stream - was also signed. - -2008-06-02 Jeffrey Stedfast - - * gmime/gmime-message-partial.c (message_partial_message_new): Use - an iter on the stack. - - * gmime/gmime-header.[c,h]: Changed iters again. Iters are now - able to be allocated on the stack by making the struct public, - however this means that they are more sensitive to changes in the - HeaderList (e.g. all iters other than the one used to remove a - header become invalid regardless of whether or not the header they - refer to still exists). - -2008-06-01 Jeffrey Stedfast - - * gmime/gmime-header.c (g_mime_header_iter_new): New function to - allocate an iter on the heap. - (g_mime_header_iter_copy_to): New copy function so that you can - copy to a pre-allocated destination iter. - (g_mime_header_list_get_iter): Changed the API a bit. Instead of - returning a newly allocated iter, instead return bool and take an - iter arg to initialize. - -2008-06-01 Jeffrey Stedfast - - * tools/gmime-port-2-2-to-2-4.sh: New helper tool to port existing - GMime 2.0 and 2.2 based applications over to GMime 2.4. - - * gmime/gmime-part.c: Updated for GMimeFilterCRLF changes. - - * gmime/gmime-multipart-signed.c: Updated for GMimeFilterCRLF - changes. - - * gmime/gmime-multipart-encrypted.c: Updated for GMimeFilterCRLF - changes. - - * gmime/gmime-filter-crlf.c (g_mime_filter_crlf_new): No longer - takes 2 enum arguments, rather it now takes 2 bool arguments which - makes the API simpler to understand. - - * gmime/gmime-filter-best.c (g_mime_filter_best_new): Changed the - unsigned int flags argument to be an enum so developers could more - easily figure out what the argument was. - - * gmime/gmime-param.c (g_mime_param_next): New helper function for - bindings. - (g_mime_param_get_name): Same. - (g_mime_param_get_value): Same. - -2008-05-31 Jeffrey Stedfast - - * tests/test-html.c (main): Updated. - - * tests/test-best.c (main): Updated. - - * src/uuencode.c (uuencode): Updated. - - * gmime/gmime-part.c: Updated for filter stream change. - - * gmime/gmime-multipart-signed.c (g_mime_multipart_signed_sign): - Updated for filter stream change. - - * gmime/gmime-multipart-encrypted.c: Updated for filter stream - change. - - * gmime/gmime-gpg-context.c (gpg_ctx_new): Updated for filter - stream change. - - * gmime/gmime-filter-yenc.c (g_mime_filter_yenc_new): Now takes a - bool encode argument rather than a GMimeFilterYencDirection - no - sense making this more complicated than it needs to be. - - * gmime/gmime-stream-filter.c (g_mime_stream_filter_new): Renamed - from g_mime_stream_filter_new_with_stream(). This is the only - constructor, so should be named _new(). - -2008-05-31 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.3.1 - - * gmime/gmime-header.c (g_mime_header_list_invalidate_iters): Only - unlink the iter if the headers are being destroyed. - - * gmime/gmime-gpg-context.c: Updated. - - * gmime/gmime-cipher-context.c: Added GMimeCipherHash enums for - SHA-224, SHA-256, SHA-384 and SHA-512. - (g_mime_signer_next): New function to ease binding. - (g_mime_signer_set_status): Same. - (g_mime_signer_get_status): Same. - (g_mime_signer_set_error): Same. - (g_mime_signer_get_error): Same. - (g_mime_signer_set_trust): Same. - (g_mime_signer_get_trust): Same. - (g_mime_signer_set_fingerprint): Same. - (g_mime_signer_get_fingerprint): Same. - (g_mime_signer_set_key_id): Same. - (g_mime_signer_get_key_id): Same. - (g_mime_signer_set_name): Same. - (g_mime_signer_get_name): Same. - (g_mime_signer_set_sig_created): Same. - (g_mime_signer_get_sig_created): Same. - (g_mime_signer_set_sig_expire): Same. - (g_mime_signer_get_sig_expire): Same. - -2008-05-31 Jeffrey Stedfast - - * gmime/gmime-object.c (g_mime_object_get_header_list): New - function to get at the GMimeObject headers. - - * gmime/gmime-message-partial.c (message_partial_message_new): Use - iters to copy the headers. - - * gmime/gmime-header.c (g_mime_header_list_foreach): Removed, this - API sucked. - -2008-05-31 Jeffrey Stedfast - - * tests/test-headers.c: New set of unit tests for GMimeHeaderIter. - - * gmime/gmime-header.c (g_mime_header_iter_equal): New method to - check if two iters are equal. - (g_mime_header_iter_first): New method to update @iter to point to - the first header. - (g_mime_header_iter_last): New method to update @iter to point to - the last header. - (g_mime_header_iter_next): Fixed. - (g_mime_header_iter_prev): Fixed. - (g_mime_header_iter_remove): Invalidate all other iters currently - pointing to the same header as @iter. - -2008-05-30 Jeffrey Stedfast - - * gmime/gmime-parser.c: Updated for GMimeHeaderList and - GMimeObject changes. - - * gmime/gmime-message-partial.c: Updated for GMimeHeaderList and - GMimeObject changes. - - * gmime/gmime-multipart-encrypted.c: Updated for GMimeHeaderList - and GMimeObject changes. - - * gmime/gmime-multipart-signed.c: Updated for GMimeHeaderList and - GMimeObject changes. - - * gmime/gmime-multipart.c: Updated for GMimeHeaderList and - GMimeObject changes. - - * gmime/gmime-part.c: Updated for GMimeHeaderList and GMimeObject - changes. - - * gmime/gmime-message.c: Updated for GMimeHeaderList and - GMimeObject changes. - - * gmime/gmime-object.c (g_mime_object_append_header): Renamed from - g_mime_object_add_header(). - (g_mime_object_prepend_header): New method. - (remove_header): Cleanup content-header variables if they get - removed. Don't allow removal of the Content-Type header. - - * gmime/gmime-header.[c,h]: Renamed GMimeHeader to GMimeHeaderList - and all of it's methods appropriately. Added a new GMimeHeaderIter - class for iterating over a header list. - (g_mime_header_list_remove): Return gboolean specifying whether or - not a header was removed. - (g_mime_header_list_get_iter): New function to get a header - iterator. - -2008-05-30 Jeffrey Stedfast - - * util/cache.c: Updated for list.[c,h] changes. - - * util/list.c (list_append): Renamed from list_append_node(). - (list_prepend): Renamed from list_prepend_node(). - (list_unlink): Renamed from list_node_unlink(). - -2008-05-30 Jeffrey Stedfast - - * gmime/gmime-message.c (g_mime_message_get_headers): Removed as - GMimeObject has an equivalent method. - (handle_multipart_alternative): Removed. - (handle_multipart_mixed): Removed. - (g_mime_message_get_header): Removed, this has equivalent - functionality on GMimeObject. - (g_mime_message_set_header): Same. - (g_mime_message_add_header): Same. - -2008-05-28 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.3.0 - -2008-05-28 Jeffrey Stedfast - - These changes are to make it so that changing the GMimeContentType - and/or GMimeContentDisposition fields directly will still update - the headers. - - * gmime/gmime-disposition.c (g_mime_content_disposition_set_disposition): - Notify our parent object that we've changed. - (g_mime_content_disposition_set_parameter): Same. - - * gmime/gmime-content-type.c (g_mime_content_type_set_parameter): - Notify our parent object that we've changed. - - * gmime/gmime-object.c (_g_mime_object_content_type_changed): - Renamed from sync_content_type() and also made callable from - gmime-content-type.c - (_g_mime_object_content_disposition_changed): Renamed from - sync_content_disposition() and also made callable from - gmime-disposition.c - (g_mime_object_set_content_type): Set the parent object on the - GMimeContentType and call _g_mime_object_content_type_changed(). - (g_mime_object_set_content_disposition): Set the parent object on - the GMimeContentDisposition and call - _g_mime_object_content_disposition_changed(). - -2008-05-28 Jeffrey Stedfast - - * gmime/gmime-encodings.c: New source file containing all the - basic MIME encoding functions. - - * src/uuencode.c: Updated. - - * src/uudecode.c: Updated. - - * gmime/gmime-parser.c: Updated for GMimeContentEncoding change. - - * gmime/gmime-multipart-signed.c: Updated for GMimeContentEncoding - change. - - * gmime/gmime-multipart-encrypted.c: Updated for - GMimeContentEncoding change. - - * gmime/gmime-message-partial.c: Updated for GMimeContentEncoding - change. - - * gmime/gmime-filter-best.c (g_mime_filter_best_encoding): Updated - to use the new GMimeContentEncoding enum. - - * gmime/gmime-data-wrapper.c: Updated to use GMimeContentEncoding - enum. - (write_to_stream): Drastically simplified using the new - GMimeFilterBasic API. - - * gmime/gmime-filter-basic.c: Updated to use the new GMimeEncoding - API. - (g_mime_filter_basic_new): Renamed and changed the arguments. We - now just re-use the GMimeContentEncoding enum and a bool to - declare encode vs decode. - - * gmime/gmime-utils.c (g_mime_references_free): New function to - simplify bindings. - (g_mime_utils_best_encoding): Updated to use the new - GMimeContentEncoding enum. - (g_mime_utils_base64_encode_close): Moved to gmime-encodings.c - and renamed to g_mime_encoding_base64_encode_close(). - (g_mime_utils_base64_encode_step): Same. - (g_mime_utils_base64_decode_step): Same. - (g_mime_utils_uuencode_close): Same. - (g_mime_utils_uuencode_step): Same. - (g_mime_utils_uudecode_step): Same. - (g_mime_utils_quoted_encode_close): Same. - (g_mime_utils_quoted_encode_step): Same. - (g_mime_utils_quoted_decode_step): Same. - - * gmime/gmime-utils.h (GMimePartEncodingType): Removed. This enum - has been replaced. - - * gmime/gmime-part.c (g_mime_part_set_content_type): Removed, - GMimeObject already has this functionality. - (g_mime_part_get_content_type): Same. - (g_mime_part_set_content_encoding): Renamed from - g_mime_part_set_encoding() and updated to use the new - GMimeContentEncoding enum. - (g_mime_part_get_content_encoding): Renamed from - g_mime_part_get_encoding() and updated to use the new - GMimeContentEncoding enum. - (g_mime_part_encoding_to_string): Removed, equivalent - functionality has been added to gmime-encodings.c named - g_mime_content_encoding_to_string(). - (g_mime_part_encoding_from_string): Removed, equivalent - functionality has been added to gmime-encodings.c named - g_mime_content_encoding_from_string(). - (write_content): Updated for new GMimeFilterBasic API which helps - simplify this. - -2008-05-27 Jeffrey Stedfast - - * gmime/gmime-utils.c (g_mime_references_get_message_id): New - accessor function to ease bindings. - (g_mime_references_get_next): Renamed from - g_mime_references_next() for consistency. - (g_mime_utils_8bit_header_decode): Removed. - (g_mime_utils_8bit_header_encode): Removed. - (g_mime_utils_8bit_header_encode_phrase): Removed. - - * gmime/gmime-disposition.c (g_mime_content_disposition_get_params): - New accessor function to ease bindings. - - * gmime/gmime-content-type.c (g_mime_content_type_get_media_type): - New accessor function to ease bindings. - (g_mime_content_type_get_media_subtype): Same. - (g_mime_content_type_get_params): Same. - -2008-05-27 Jeffrey Stedfast - - * examples/basic-example.c: Fixed to use GMimeSignatureValidity. - - * gmime/gmime-cipher-context.c (g_mime_cipher_*): Removed, since - we're not going to maintain compatability with 2.2, no sense - keeping these wrappers around. - (g_mime_cipher_validity_*): Removed. No one should still be using - these... - -2008-05-26 Jeffrey Stedfast - - * gmime/gmime-message.c (g_mime_message_get_body): Removed. - - * gmime/gmime-disposition.c: Changed GMimeDisposition to - GMimeContentDisposition and updated method names to match. - (g_mime_content_disposition_new_from_string): Same as the old - g_mime_disposition_new(). - (g_mime_content_disposition_new): New ctor that doesn't take any - args. - (g_mime_content_disposition_set_parameter): Renamed from - g_mime_disposition_add_parameter(). - (g_mime_content_disposition_get_disposition): Renamed from - g_mime_disposition_get(). - (g_mime_content_disposition_set_disposition): Renamed from - g_mime_disposition_set(). - - * gmime/gmime-object.c: Moved Content-Disposition handling here. - (g_mime_object_get_content_disposition): New method which is the - equivalent of g_mime_part_get_content_disposition_object(). - (g_mime_object_set_content_disposition): New method which is the - equivalent of g_mime_part_set_content_disposition_object(). - (g_mime_object_get_disposition): New method which is the - equivalent of g_mime_part_get_content_disposition(). - (g_mime_object_set_disposition): New method which is the - equivalent of g_mime_part_set_content_disposition(). - (g_mime_object_get_content_disposition_parameter): New method - which is the equivalent of - g_mime_part_get_content_disposition_parameter(). - (g_mime_object_set_content_disposition_parameter): New method - which is the equivalent of - g_mime_part_add_content_disposition_parameter(). - - * gmime/gmime-part.c (g_mime_part_get_content_disposition_object): - Moved functionality to GMimeObject. - (g_mime_part_set_content_disposition_object): Same. - (g_mime_part_set_content_disposition): Same. - (g_mime_part_get_content_disposition): Same. - (g_mime_part_add_content_disposition_parameter): Same. - (g_mime_part_get_content_disposition_parameter): Same. - (g_mime_part_set_content): Removed long-deprecated function. - (g_mime_part_set_content_byte_array): Same. - (g_mime_part_set_pre_encoded_content): Same. - (g_mime_part_get_content): Same. - (g_mime_part_set_content_type): - Removed... equivalent functionality already on GMimeObject. - (g_mime_part_get_content_type): Same. - -2008-05-25 Jeffrey Stedfast - - * gmime/gmime-multipart-encrypted.c (g_mime_multipart_encrypted_encrypt): - Don't use g_mime_part_set_content() as it is a deprecated - function. - - * gmime/gmime-part.c (g_mime_part_get_content_disposition_object): - Added an accessor to make bindings easier. - -2008-05-24 Jeffrey Stedfast - - * gmime/gmime-stream.c (stream_eos): Fixed a typo. - -2008-05-24 Jeffrey Stedfast - - * tests/test-pgp.c: Updated. - - * gmime/gmime-multipart-encrypted.c: Updated. - - * gmime/gmime-multipart-signed.c: Updated. - - * gmime/gmime-cipher-context.c (g_mime_cipher_context_*): Renamed - from g_mime_cipher_*() which did not match the class - name. Deprecated the old names. - -2008-05-24 Jeffrey Stedfast - - * gmime/gmime-message.c (g_mime_message_write_to_stream): - Removed. Removing all deprecated functions which have equivalent - functionality in a parent class. - (g_mime_message_to_string): Same. - - * gmime/gmime-object.c (g_mime_object_ref): Same. - (g_mime_object_unref): Same. - - * gmime/gmime-part.c (g_mime_part_write_to_stream): Same. - (g_mime_part_to_string): Same. - - * gmime/gmime-stream.c (g_mime_stream_ref): Same. - (g_mime_stream_unref): Same. - -2008-05-23 Jeffrey Stedfast - - * gmime/gmime-stream-fs.c: Cast offset arguments to lseek() to - off_t. - - * gmime/gmime-stream-file.c: Cast offset arguments to fseek() to - long. - - * gmime/gmime-stream-mmap.c (g_mime_stream_mmap_new_with_bounds): - Don't assign to st.st_size. - - * gmime/*.[c,h]: Use gint64 instead of off_t for public APIs. - - * mono/gmime-api.raw: s/off_t/gint64/g - -2008-05-23 Jeffrey Stedfast - - * mono/Makefile.am: Don't delay-sign, newer versions of Mono do - not allow this anymore. - - * mono/gmime-sharp.snk: New sign-key for signing gmime-sharp - assembly. - - * mono/AssemblyInfo.cs.in: Updated. - -2008-05-23 Jeffrey Stedfast - - * branched: now begins 2.3.x development - - * gmime-2.4.pc.in: Renamed from gmime-2.0.pc.in. - - * gmime-config.in: Removed. - - * gmimeConf.sh.in: Removed. - - * configure.in: Updated. - - * */Makefile.am: Rename lib name to gmime-2.4. - -2008-05-23 Jeffrey Stedfast - - * mono/StreamWrapper.cs: Allow seeking to position 0 for - GMimeStreamFilter. Thanks to Debajyoti Bera for this patch. - -2008-05-23 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.2.21 - - * gmime/gmime-parser.c: Check parser_step() against - GMIME_PARSER_STATE_ERROR rather than -1 in case the value ever - changes. - (struct _GMimeParserPrivate): Changed state to be 16bit int - instead of a 26bit int which apparently cannot be set to -1 on - Solaris. Fixes bug #534301. - (parser_step_headers): Fixed a corner-case where a read boundary - fell between the \n and \t of a folded header. - -2008-05-16 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.2.20 - -2008-05-15 Jeffrey Stedfast - - * gmime/gmime-stream-buffer.c (stream_read): Break if - g_mime_stream_read() returns 0 as well (meaning EOF, no more data - to read) and don't keep looping. Fixes bug #533331. - -2008-05-03 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.2.19 - -2008-05-02 Jeffrey Stedfast - - * gmime/gmime-parser.c (parser_step_headers): Fix for CRLF encoded - input. - -2008-04-05 Jeffrey Stedfast - - * gmime/gmime-parser.c (header_parse): Fixed a memory leak in the - case of an invalid header. - -2008-02-16 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.2.18 - -2008-03-13 Jeffrey Stedfast - - * gmime/gmime-parser.c (parser_construct_message): Changed - content_length to an unsigned long rather than unsigned int, fixes - bug #521872. Thanks to Pawel Salek for this fix. - -2008-03-10 Jeffrey Stedfast - - * gmime/gmime-parser.c (parser_scan_mime_part_content): Don't let - size go negative. - -2008-02-10 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.2.17 - -2008-02-09 Jeffrey Stedfast - - * gmime/gmime-filter-basic.c (filter_filter): Use the new macros - defined below. - - * gmime/gmime-utils.c (rfc2047_encode_word): Use the new macros. - - * gmime/gmime-utils.h: Added more accurate encoding-length macros - for base64, quoted-printable, and uuencode which are try to - minimize over-calculating the amount of output data that we - need. Also namespaced them. - -2008-02-08 Jeffrey Stedfast - - * src/uudecode.c (uudecode): Use g_strchomp() on the filename - parsed from the 'begin' line. - -2008-02-07 Jeffrey Stedfast - - * util/url-scanner.c (url_web_end): Handle IP address literals - within []'s. Fixes bug #515088. - -2008-02-06 Jeffrey Stedfast - - * gmime/gmime-utils.c (g_mime_utils_uuencode_step): Optimized. - -2008-02-03 Jeffrey Stedfast - - * gmime/gmime-stream-cat.c (stream_read): Removed an extra seek. - -2008-02-02 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.2.16 - -2008-02-02 Jeffrey Stedfast - - Fix for https://bugzilla.novell.com/show_bug.cgi?id=333292 and - some other bugs I discovered while fixing it. - - * gmime/gmime-parser.c (header_parse): Made an actual function - rather than a macro. Don't turn invalid headers into - X-Invalid-Headers, just ignore them. Instead of using - g_strstrip(), do our own lwsp trimming so we can do it before - malloc'ing - this helps reduce memory usage and memmove() - processing in g_strstrip(). - (parser_step_headers): Validate the header field names as we go so - that we can stop when we come to an invalid header in some - cases. May now return with 3 states rather than only 1: - HEADERS_END (as before), CONTENT (suggesting we've reached body - content w/o a blank line to separate it from the headers), and - COMPLETE (which suggests that we've reached the next message's - From-line). - (parser_skip_line): Rearranged a bit: don't fill unless/until we - need to. - (parser_step): For HEADERS_END state, skip a line and increment - state to CONTENT. No-op for CONTENT and COMPLETE states. - (parser_scan_message_part): parser_step() can return more than - just HEADERS_END on 'success' when starting with HEADERS state, so - check for error rather than HEADERS_END. - (parser_construct_leaf_part): No need to parser_step() thru header - parsing, they should already be parsed by the time we get - here. Also, don't call parser_skip_line() directly to skip the - blank line between headers and content, use parser_step() to do - that for us. - (parser_construct_multipart): Same as parser_construct_leaf_part() - (found_immediate_boundary): Now takes an 'end' argument so callers - can request a check against an end-boundary vs a part boundary. - (parser_scan_multipart_subparts): Check for errors with - parser_skip_line(). Set HEADERS state and use parser_step() to - parse headers rather than calling parser_step_headers() - directly. If, after parsing the headers, we are at the next - message (aka COMPLETE state) and we have no header list, then - break out of our loop and pretend we've found an - end-boundary. After parsing the content of each MIME part, check - that the boundary we found is our own and not a parent's (if it - belongs to a parent, break out). - (parser_construct_part): Loop parser_step() until we're at any - state past the header block (>= HEADERS_END). - (parser_construct_message): Same idea. Also, do error checking for - decoded content_length value. - -2008-02-02 Jeffrey Stedfast - - * gmime/gmime-iconv-utils.c (iconv_utils_init): Don't break if the - user's locale is unset (e.g. US-ASCII). - -2008-01-31 Jeffrey Stedfast - - * gmime/gmime-parser.c: Removed the need for 'unstep' state - information. - -2008-01-27 Jeffrey Stedfast - - * gmime/gmime-stream-buffer.c (stream_write): Don't modify the - passed-in arguments so that it makes debugging easier if there's - ever a bug. - -2008-01-27 Jeffrey Stedfast - - * gmime/gmime-stream-buffer.c (stream_read): Optimized the - BLOCK_READ code-path. - (stream_write): Optimized the BLOCK_WRITE code-path. - (stream_seek): Optimized the BLOCK_READ code-path. - (g_mime_stream_buffer_gets): Updated for the changes made to the - way bufptr is used in the BLOCK_READ case. - -2008-01-14 Jeffrey Stedfast - - * gmime/gmime-charset.c (g_mime_set_user_charsets): Deep copy the - string array. Fixes bug #509434. - -2008-01-03 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.2.15 - -2008-01-02 Jeffrey Stedfast - - * gmime/gmime-message.c (message_write_to_stream): Reworked the - logic to be easier to understand what is going on. - - * gmime/gmime-multipart.c (multipart_write_to_stream): In the case - where multipart->boundary is NULL /and/ we have a raw - header (suggesting a parsed message), do not set a boundary as it - will break the output because it will clobber the saved raw header - and GMimeMessage's write_to_stream() method will have skipped - writing its own headers if its toplevel part (us) have a raw - header set. In this case, also skip writing the end boundary. - -2008-01-01 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.2.14 - - * gmime/gmime-utils.c (g_mime_utils_generate_message_id): Fixed a - Free Memory Read access (FMR) by not freeing 'name' before using - it's value. Also reworked to take advantage of uname(2) or - getdomainname() to get the domain name if available to avoid - having to do a DNS lookup. - -2007-01-01 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.2.13 - -2008-01-01 Jeffrey Stedfast - - Fixes bug #506701 - - * gmime/gmime-utils.c (rfc2047_encode_get_rfc822_words): Don't - reset the word-type variable as it needs to be preserved when - breaking long words. - (rfc2047_encode): Switch on word->encoding - if 0, rfc2047 encode - as us-ascii. - -2007-12-27 Jeffrey Stedfast - - * gmime/gmime-utils.c (decode_8bit): Now takes a default_charset - argument which we use in place of the locale charet if - non-NULL. We also now always include this charset in our list of - charsets to check for a best-match (obviously this charset is - unlikely to be an exact fit if this function is getting called, so - we place it at the end of the list). - (rfc2047_decode_word): If given a valid charset in the - encoded-word token, always use that for charset conversion to UTF-8 - even if it doesn't convert fully. We don't want to fall back to - the user's supplied charset list because it may contain iso-8859-1 - which will likely always be a 'best-match' charset. - -2007-12-26 Jeffrey Stedfast - - * gmime/gmime-utils.c (g_mime_utils_decode_8bit): Made public. - - * gmime/internet-address.c (decode_mailbox): Instead of doing our - own thing to convert raw 8bit/multibyte text sequences into UTF-8, - use the same function we use in gmime-utils.c's header decoder. - -2007-12-25 Jeffrey Stedfast - - * gmime/charset-map.c: New source file to generate the charset - map (moved out of gmime-charset.c) - - * gmime/gmime-charset.c (main): Removed. - -2007-12-25 Jeffrey Stedfast - - * gmime/gmime-charset.c (main): Cleaned up the logic and made it - so that we can alias a block to a previous block if the blocks are - identical rather than just aliasing when all values in the block - are identical. Happens to make no difference in the output, but - the logic is now there if that ever changes. - -2007-12-24 Jeffrey Stedfast - - * gmime/gmime-charset-map-private.h: Regenerated. - - * gmime/gmime-charset.c (known_iconv_charsets): Map all of the - gb2312 aliases to GBK as GBK is a superset of gb2312 (apparently - some clients are tagging GBK as gb2312 which is missing some - glyphs contained within GBK). - (main): Added iso-8859-6 to the table for Arabic support. - -2007-12-16 Jeffrey Stedfast - - * gmime/gmime-utils.c (decode_8bit): When reallocing our output - buffer, we need to update outleft as well. - -2007-12-15 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.2.12 - -2007-12-08 Jeffrey Stedfast - - * gmime/gmime-utils.c (rfc2047_encode_merge_rfc822_words): - Completely rewritten with new logic which will hopefully group - words more logically. - -2007-12-08 Jeffrey Stedfast - - Fixes bug #498720 - - * gmime/internet-address.c (internet_address_list_writer): Renamed - from the temporary internet_address_list_fold() name. - (_internet_address_to_string): New internal function that writes - an InternetAddress to a GString, doing proper folding and rfc2047 - encoding if requested. - (internet_address_to_string): Use the new internal function. - - * tests/test-mime.c: Added another addrspec test and fixed up some - exception strings to be a little more helpful. - -2007-12-05 Jeffrey Stedfast - - * configure.in: Fixed a bug where explicitly disabling largefile - support would add -D_FILE_OFFSET_BITS=no to the compiler - CFLAGS. Also added a blaring WARNING when -enable-largefile is - passed. - -2007-11-23 Jeffrey Stedfast - - Attempt at solving bug #498720 for address fields, altho it should - probably be made to handle folding single addresses in the case - where they are too long to fit within a single line. - - * gmime/internet-address.c (internet_address_list_fold): New - function. - - * gmime/gmime-message.c (write_structured): Renamed from - write_addrspec(). - (write_addrspec): New header writer that writes - InternetAddressLists in a nicely folded manner. - -2007-11-12 Jeffrey Stedfast - - * gmime/internet-address.c (internet_address_destroy): No need to - check if ia != NULL, we know this is true already. - -2007-11-12 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.2.11 - - * gmime/gmime-utils.c (g_mime_utils_header_decode_text): Fix for - bug #485005. - -2007-11-06 Jeffrey Stedfast - - * gmime/gmime-utils.c (rfc2047_decode_word): If the charset string - is empty, default to decode_8bit() and don't try to iconv_open() - it. - -2007-11-06 Jeffrey Stedfast - - * gmime/gmime-utils.c (is_rfc2047_token): Don't assume the charset - component of the token is >= 1 char, start checking for a '?' at - string index 2. - -2007-11-01 Jeffrey Stedfast - - * gmime/gmime-gpg-context.c (gpg_ctx_parse_status): Clear any - error we may have (bad passwd?) each pass so that we don't try to - set an error when one is already set. - -2007-10-27 Jeffrey Stedfast - - * gmime/gmime-message.c (g_mime_message_set_mime_part): Reset the - raw headers of the current top-level MIME part so that if it is - being used elsewhere, it won't carry along all the message headers - from this message. - -2007-10-24 Jeffrey Stedfast - - * gmime/gmime-part.c (g_mime_part_encoding_from_string): Handle - the value "uuencode" the same as we were handling "x-uuencode". - -2007-10-14 Jeffrey Stedfast - - Changed the license to LGPLv2 - -2007-10-13 Jeffrey Stedfast - - * tests/test-pgp.c (test_export): Skip past the PGP headers so as - to avoid comparing the "Version: " headers which might fail if a - newer gnupg is used than what created the pgp key originally. - -2007-10-13 Jeffrey Stedfast - - * gmime/gmime-filter-html.c: Updated for url-scanner.c symbol - changes. - - * util/url-scanner.[c,h]: Renamed symbols to get rid of the G - prefix and marked all symbols for internal linkage. - - * util/md5-utils.h: Declare symbols as internal. - - * util/memchunk.h: Here too. - - * util/cache.h: And here. - - * util/list.h: Same. - -2007-09-25 Joe Shaw - - * configure.in: Set an AM_CONDITIONAL for whether we are - building with large file support. - - * mono/GMime.metadata.in: Move GMime.metadata to this and - change any references of off_t to @off_t_type@, which is - substituted with the correct type. This is needed because - off_t is converted to an IntPtr by the gtk-sharp binding - generator, which is good for 64-bit systems and 32-bit - systems without large file support but breaks on 32-bit - systems with large file support. - - * mono/Makefile.am: Generate GMime.metadata from - GMime.metadata.in by using sed to replace @off_t_type@ - with gint64 on 32-bit systems with large file support - and long otherwise. - -2007-09-03 Jeffrey Stedfast - - * gmime/gmime-utils.c: Disabled a debug printf. - -2007-08-15 Joe Shaw - - * mono/DataWrapper.custom: We want to dispose of the GMime - stream immediately, since we don't use its managed wrapper - except to immediately pass it into the GMime.StreamFilter - constructor. - -2007-07-21 Jeffrey Stedfast - - * gmime/gmime-iconv-utils.c (g_mime_iconv_strndup): Save errno - before resetting the iconv descriptor so that we don't lose the - error. - -2007-07-19 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.2.10 - - * tests/test-mime.c: Added rfc2047_text entries for testing the - new workaround support. - - * gmime/gmime-utils.c (g_mime_utils_header_decode_text): - Implemented a conditional workaround for broken rfc2047 encodings. - -2007-07-03 Jeffrey Stedfast - - * gmime/gmime-common.c: Removed str[n]casecmp - -2007-05-21 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.2.9 - - * gmime/gmime-stream-cat.c (stream_substream): Fixed a memory leak - by always returning a GMimeStreamCat, even if the source list - contains only a single stream (probably better that it work this - way anyway for consistency), thanks again to Charles Kerr for - finding and presenting a fix for this. Fixes bug #440054. - - * gmime/gmime-stream-file.c (stream_seek): Oops, fseek() should - have been using SEEK_SET, not SEEK_END. Thanks to Charles Kerr for - the report and the fix. Fixes bug #439841. - -2007-04-25 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.2.8 - - * tests/test-pgp.c: Test exporting of keys. - - * gmime/gmime-utils.c (rfc2047_decode_word): Fixed compile - warnings. - - * gmime/gmime-stream-file.c (stream_reset): Removed an unused - variable. - - * gmime/gmime-charset.c (g_mime_charset_can_encode): - s/if (mask->level = 1)/if (mask->level == 1)/ - -2007-04-23 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.2.7 - -2007-04-14 Jeffrey Stedfast - - * gmime/*.c (g_mime_*_get_type): Set n_preallocs to 0. - -2007-04-12 Jeffrey Stedfast - - * gmime/*.c: no need for a second NULL argument to g_object_new() - - * util/cache.c (cache_new): Change max_size and node_size to be of - type size_t. - - * gmime/gmime-multipart-encrypted.c - (g_mime_multipart_encrypted_new): g_object_new() doesn't need a - second NULL argument. - - * gmime/gmime-utils.c (decode_8bit): Close the iconv descriptor - and since we are using is_ascii() now, we don't need to use - unsigned char *'s. - -2007-04-12 Jeffrey Stedfast - - * gmime/gmime-utils.c (decode_8bit): Use is_ascii(). - (g_mime_utils_header_decode_text): Same. - (g_mime_utils_header_decode_phrase): Here too. - - * gmime/gen-table.c: Added a is_ascii() macro for use instead of - the ctype isascii() so that I don't have to worry about casting. - -2007-04-11 Jeffrey Stedfast - - Revision 1119 (previous commit) made the following 2 functions - even less attractive than they already were, so I decided to - rewrite them especially since it wasn't hard to find a far cleaner - approach. - - * gmime/gmime-utils.c (g_mime_utils_header_decode_text): Rewritten - to be cleaner, faster, and more elegant. - (g_mime_utils_header_decode_phrase): Same. - -2007-04-11 Jeffrey Stedfast - - Fixes for bug #423760 and bug #342196 - - * gmime/gmime-charset.c (g_mime_charset_can_encode): New - convenience function to check whether a length of UTF-8 text can - be converted into the specified charset. - (g_mime_set_user_charsets): New function allowing an application - to provide GMime with a list of user-preferred charsets to use for - encoding and decoding headers. - (g_mime_user_charsets): New function to get the list of - user-preferred charsets. - - * gmime/gmime-utils.c (decode_8bit): New function to convert - arbitrary 8bit text into UTF-8 using the charset list provided by - g_mime_user_charsets(). - (rfc2047_decode_word): Don't assume that just because the declared - charset is UTF-8 that it actually is in UTF-8. - (rfc2047_decode_word): If we can't open a converter for the - declared charset to UTF-8 or if we can't convert from the declared - charset into UTF-8, fall back to using decode_8bit(). - (g_mime_utils_header_decode_text): Convert 8bit word tokens into - UTF-8 using decode_8bit(). - (g_mime_utils_header_decode_phrase): Same. - (rfc2047_encode_word): Be a little more efficient about removing - '\n' chars... - (rfc2047_encode): When encoding a level-2 word cluster, attempt to - fit the cluster within a charset provided by - g_mime_user_charsets() rather than using GMime's best-fit charset - table (unless, of course, it doesn't fit within any of the - user-specified charsets). - -2007-03-28 Jeffrey Stedfast - - * gmime/gmime-iconv-utils.c (g_mime_iconv_strndup): No need to - cast out to a char *, it already is. - - * gmime/gmime-stream-mem.c (g_mime_stream_mem_set_byte_array): - Only free the previous memory buffer if we were the owner. - -2007-03-28 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.2.6 - critical release for the - gmime-stream-fs and gmime-stream-file fixes below. - - * gmime/gmime-stream-filter.c (stream_reset): Try resetting source - stream first, this way if that fails we don't reset our state - either. - - * gmime/gmime-stream-fs.c (stream_reset): Same as below. - - * gmime/gmime-stream-file.c (stream_reset): Make sure to always - return 0 or -1, not the value from fseek()ing back to the - beginning of the stream (which might not be position 0). - -2007-03-27 Jeffrey Stedfast - - * gmime/gmime-gpg-context.c (gpg_ctx_parse_status): If we aren't - in a UTF-8 locale, convert status messages into UTF-8 when using - the status line in the GError. - -2007-03-26 Jeffrey Stedfast - - * gmime/gmime-utils.c (g_mime_utils_8bit_header_decode) - (g_mime_utils_8bit_header_encode) - (g_mime_utils_8bit_header_encode_phrase): Changed all of these - functions to take `const unsigned char *' like they used to. Fixes - bug #423147. - - * gmime/gmime-gpg-context.c (gpg_ctx_new): Initialize flushed and - nodata state variables. Thanks to valgrind for finding these... - - * gmime/gmime-content-type.c - (g_mime_content_type_new_from_string): Shouldn't need to - g_strstrip() the type, is_ttoken() won't match against lwsp - chars. Also, instead of simply scanning past lwsp between some - tokens, use decode_lwsp() between *all* tokens so that we handle - comments as well (not that there should be any...). - - * gmime-2.0.pc.in: Got rid of the redundant @LIBS@ which contained - the same value as @GMIME_LIBS@. - - * configure.in: Added configure checks for large file support. - -2007-03-26 Jeffrey Stedfast - - * gmime-param.c: #include "gmime-parse-utils.h" and got rid of - this file's own decode_lwsp() implementation. - - * internet-address.c: #include "gmime-parse-utils.h" which is - where a bunch of the parser functions have been moved from here. - - * gmime-utils.c: #include "gmime-parse-utils.h" for decode_lwsp() - and decode_domain() - (decode_addrspec): Moved here from internet-address.c which had - been exporting the symbol previously (so that decode_domain didn't - have to be copy/pasted). Now this function can be made static - - yay! No more exporting un-namespaced symbols! - - * gmime/gmime-message.c: #include "gmime-parse-utils.h" for - decode_lwsp() - - * gmime/gmime-parse-utils.[c,h]: New source files containing some - parse utility functions that had been copy/pasted between several - source files previously. - -2007-03-25 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.2.5 - -2007-03-25 Jeffrey Stedfast - - * tests/Makefile.am (local-check): Simplified. - - * tests/test-streams.c: Generate our own test data if we aren't - given any. - - * tests/test-cat.c: Updated for the new Makefile.am rule. - - * gmime/gmime-stream-mmap.c (stream_length): Fixed to return the - correct length when bound_end == -1 but bound_start != 0. - Discovered this thanks to my new testsuite. - - * gmime/internet-address.c (decode_mailbox): If we can't find a - local-part and inptr is ',', set *in = inptr; rather than *in = - inptr + 1; Discovered this bug thanks to my new testsuite. - - * tests/test-mime.c: Rewritten to use testsuite library. - -2007-03-24 Jeffrey Stedfast - - * tests/Makefile.am (check-local): Rewritten to actually run the - automated tests. - - * tests/test-mbox.c: Rewritten to use testsuite library. - - * tests/test-pgp.c: Rewritten to use testsuite library. - - * tests/test-pgpmime.c: Rewritten to use testsuite library. - - * tests/test-cat.c: Rewritten to use testsuite library. - - * tests/test-streams.c: Rewritten to use testsuite library. - - * tests/test-iconv.c: Rewritten to use testsuite library. - - * tests/testsuite.[c,h]: New automated test-suite helper library. - -2007-03-20 Jeffrey Stedfast - - * configure.in: Check for the existance of _timezone and nfds_t. - - * gmime/gmime-utils.c (mktime_utc): Use _timezone if - HAVE__TIMEZONE is set. - - * gmime/gmime.c (g_mime_init): If HAVE_TIMEZONE or HAVE__TIMEZONE - is set, call tzset() to initialise the timezone variable. - -2007-03-12 Jeffrey Stedfast - - * gmime/gmime-param.c (decode_param): Instead of only checking - that the param value begins with "=?", check if that sequence - exists anywhere in the value. Fixes bug #407522. - - * src/uudecode.c (uudecode): Use a strcmp instead of comparing - against a string literal (which was technically correct in this - case, but the prettyification would be nice if "-" was specified - in argv too). Fixes bug #408613. - -2007-03-10 Jeffrey Stedfast - - * gmime/gmime-message.c (g_mime_message_get_all_recipients): New - convenience function to get To, Cc, and Bcc recipients all in a - single list. - -2007-02-19 Jeffrey Stedfast - - * gmime/gmime-message.h: Moved g_mime_message_get_body() into the - deprecated block. - -2007-02-11 Jeffrey Stedfast - - * gmime/gmime-utils.c: Removed the need for the ctype isblank() - function. - - * gmime/gmime-param.c (decode_int): Need to use (unsigned char *) - when passing indexes to ctype functions. - -2007-02-10 Jeffrey Stedfast - - * gmime/gmime-charset.c: Changed the names of the charset format - macros to coincide with the new names output by iconv-charset.c. - (g_mime_charset_iconv_name): Use the new macro names. - - * iconv-detect.c: Use %u instead of %d, also changed the names of - the format #defines that we print out. - - * gmime/gmime-utils.c (g_mime_utils_quote_string): Optimise a - smidgen. - (g_mime_utils_unquote_string): Fixed, this wasn't working right... - -2007-02-09 Jeffrey Stedfast - - * gmime/gmime-stream-filter.c (stream_write): Instead of comparing - the return value of the source stream write() to our input length - to write, compare to -1. We can't assume the the value the source - stream will return will be what we expected, all we can do is - check for error. - - * gmime/gmime-part.c: Same as below. - - * gmime/gmime-filter-basic.c: Fixes to signedness compile warnings - and updated to reflect gmime-utils.h changes. - - * gmime/gmime-multipart.c (multipart_set_boundary): Updated to - reflect gmime-utils.h changes. - - * gmime/gmime-stream.c (g_mime_stream_writev): If any of the - writes fail, return -1. - - * gmime/gmime-utils.c: header_encode_*() and header_decode_*() now - take const char * rather than const unsigned char * - arguments. This has been done in an effort to fix compile warnings - about signed vs unsigned char * pointers. The 'save' argument to - all of the stream encoders/decoders have been changed to a - guint32, again for signed vs unsigned warning fixes. - -2007-02-08 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.2.4 - -2007-02-06 Jeffrey Stedfast - - Fix for bug #394433 - - * configure.in: Detect if the system has GNU's getopt - implementation available for us to use. - - * Makefile.am: Don't build our own copy of the GNU getopt library - if the system has it available. - - * src/uuencode.c: If the system has getopt.h, use it instead of - our own getopt.h. - - * src/uudecode.c: If the system has getopt.h, use it instead of - our own getopt.h. - -2007-02-06 Jeffrey Stedfast - - More fixes on account of my test suite... - - * tests/test-cat.c (test_cat_substream): end = start + random - amount... duh. Fixes a bug where sometimes the end bound was < the - start bound. - - * gmime/gmime-stream-cat.c (stream_substream): Calculate the - length of each of the source streams correctly. D'oh. - (stream_substream): Fixed the calculation for s->start. - (stream_substream): Fixed the s->end calculation for when end - within the source stream's bounds. - (stream_substream): Keep track of how long our substream is going - to be for use with setting absolute bound_end on a multi-stream - substream. - -2007-02-05 Jeffrey Stedfast - - Fixes on account of the awesome test suite I wrote earlier... still - need to fix ::substream() tho (or maybe it's just the test that's - broke?). - - * gmime/gmime-stream-cat.c: Added an id member to struct - _cat_node, for use with debugging... - (stream_read): Seek in the source stream, don't call - Cat::stream_seek() to do it. - (stream_seek): Swapped the logic of the "within bounds" check, had - it backwards. When seeking past a stream, set the node->position - to the length of the stream (technically, it's like we read() thru - all that data, right?). Instead of resetting all streams starting - at n->next, reset them all starting at current->next... since 'n' - technically might be before 'current'. - (g_mime_stream_cat_add_source): Assign each node an id for easier - debugging... - -2007-02-05 Jeffrey Stedfast - - * tests/test-cat.c: The beginnings of a test suite for - GMimeStreamCat. - - * gmime/gmime-stream-cat.c (stream_read): Go to the next stream if - nread <= 0, not just nread == 0. - -2007-02-04 Jeffrey Stedfast - - * gmime/gmime-stream-mem.c (stream_reset): No longer need to - update stream->position. - - * gmime/gmime-stream-mmap.c (stream_reset): Same g_return_if_fail - change. Also don't update stream->position. - (stream_seek): Added similar sanity checking/eos resetting as - StreamFs code. - - * gmime/gmime-stream-file.c (stream_read): Style changes. - (stream_write): Style changes. - (stream_close): Fixed compiler warning. - (stream_reset): Changed g_return_if_fail to a true if-then. - (stream_seek): Changed to mimic the StreamFs changes. - (g_mime_stream_file_new): Similar to fs_new() change. - - * gmime/gmime-stream-fs.c (stream_close): Loop the close() - ourselves. - (stream_reset): Changed g_return_if_fail to a true if-then. Also - be better about resetting eos. - (stream_seek): Rewritten to be more correct/robust (at least I - hope). Also properly reset eos when appropriate. - (g_mime_stream_fs_new): If lseek() fails, pretend start offset is - 0. - - * gmime/gmime-stream.c (stream_reset): No longer needs to update - stream->position. - (g_mime_stream_reset): Update stream->position if everything reset - smoothly. This is just a convenience change to subclass - implementations. - - * gmime/gmime-stream-cat.c (stream_read): Rewritten. Hopefully - correct now? Ugh. We can hope... - (stream_write): Fixed to work better. - (stream_close): Rewritten. - (stream_reset): Rewritten to reset the streams, don't seek. - (stream_seek): Rewritten... still not correct, but should be ok - assuming our bound_start is 0. - (stream_length): Rewritten to not depend on a pre-calculated - length value... this Does Not Work (tm) if the source streams are - unbound and we've written to them. - (stream_substream): Rewritten... because ::seek() is so complex - for this type of stream, I've tried to eliminate a lot of the - headaches by making substreams only slurp up the streams within - the bounds of the start/end requested. If the entire contents - within the requested bounds are contained within a single source - stream, we return a substream of said source stream instead. - (g_mime_stream_cat_add_source): Don't precalculate the length here - anymore. - - * gmime/gmime-stream-buffer.c (stream_read): Fixed to never allow - buflen to be negative if the read() of our source stream fails. - (stream_close): Handle the case where we've already been closed. - (stream_eos): Simplified. - (stream_reset): Stylistic changes. - (stream_seek): Don't allow seeks under our bound_start. - -2007-02-03 Jeffrey Stedfast - - * gmime/gmime-stream-cat.c (stream_flush): Flush all streams up to - and including the current stream, not just the current stream. - (stream_write): break if we don't write any data to - current->stream or get an error so we can try the next stream. - - * gmime/gmime-stream-file.c (stream_close): Same as below. - - * gmime/gmime-stream-fs.c (stream_close): Allow closing multiple - times... makes this consistant with the other streams. - (stream_write): If a system write fails with EFBIG or ENOSPC, set - eos to TRUE. - -2007-01-20 Jeffrey Stedfast - - * tests/test-streams.c (test_stream_gets): printf formatter fixes. - - * examples/imap-example.c: #include , fixes bug - #394434. - -2007-01-20 Jeffrey Stedfast - - Fixes bug #394419 - - * gmime/gmime-filter-charset.c (filter_filter): Do iconv const - casting. - (filter_complete): Same. - -2006-11-02 Jeffrey Stedfast - - * gmime/gmime-utils.c (g_mime_utils_header_format_date): Changed - the names of the parameters to date and tz_offset to prevent - warnings from -Wshadow. - - * gmime/gmime-filter-html.c (writeln): Fixed another possible - buffer overflow condition pointed out by hpj. - - * gmime/gmime-filter-crlf.c (filter_filter): Fixed a possible - buffer overflow condition pointed out by hpj. - - * gmime/gmime-gpg-context.c (gpg_ctx_op_step): Modified to use - poll() rather than select() - -2006-09-18 Joe Shaw - - * mono/Makefile.am: Use SOURCES_XML instead of XML_SOURCES to - specify the sources.xml file. XML_SOURCES breaks with newer - automakes. - -2006-08-29 Pawel Salek - - * gmime/gmime-message-partial.c: set buf just before use - since - the mem stream buffer may get reallocated in the meantime leading - to segfaults. - -2006-08-29 Jeffrey Stedfast - - * gmime/gmime-param.c (decode_quoted_string): Unescape escape - sequences. Fixes bug #352771. - - * gmime/gmime-message.c (g_mime_message_set_subject): Updated the - docs. - (g_mime_message_get_subject): Same. - -2006-08-21 Peter Bloomfield - - * gmime/gmime-utils.c (g_mime_utils_unquote_string): handle an - arbitrary sequence of quoted and unquoted sections. - -2006-08-02 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.2.3 - - * gmime/gmime-message.c (process_header): Decode the values for - Subject, From, Reply-To so that g_mime_message_get_subject/etc all - return decoded strings like they were meant to. - -2006-06-23 Jeffrey Stedfast - - * gmime/gmime-gpg-context.c (swrite): Use g_build_filename() and - g_get_tmp_dir() rather than hard-coding the tmpfile to be in /tmp. - -2006-06-23 Jeffrey Stedfast - - * gmime/gmime-part.c: Use g_ascii_* versions of str[n]casecmp. - - * gmime/gmime-parser.c: Use g_ascii_* versions of str[n]casecmp. - - * gmime/gmime-param.c: Use g_ascii_* versions of str[n]casecmp. - - * gmime/gmime-multipart-signed.c: Use g_ascii_* versions of - str[n]casecmp. - - * gmime/gmime-multipart-encrypted.c: Use g_ascii_* versions of - str[n]casecmp. - - * gmime/gmime-multipart.c: Use g_ascii_* versions of - str[n]casecmp. - - * gmime/gmime-message-partial.c: Use g_ascii_* versions of - str[n]casecmp. - - * gmime/gmime-message-part.c: Use g_ascii_* versions of - str[n]casecmp. - - * gmime/gmime-message.c: Use g_ascii_* versions of str[n]casecmp. - - * gmime/gmime-iconv.c (g_mime_iconv_open): Use g_ascii_* versions - of str[n]casecmp. - - * gmime/gmime-header.c (g_mime_header_new): Use - g_mime_strcase_[hash,equal] rather than param_[hash,equal] to - reuse code. - - * gmime/gmime-gpg-context.c: Use g_ascii_* versions of - str[n]casecmp. - - * gmime/gmime-filter-enriched.c: Use g_ascii_* versions of - str[n]casecmp. - - * gmime/gmime-disposition.c (g_mime_disposition_add_parameter): - Use g_mime_strcase_[hash,equal] rather than param_[hash,equal] to - reuse code. - (g_mime_disposition_new): Same. - (param_equal): Removed. - (param_hash): Removed. - - * gmime/gmime-content-type.c: Use g_ascii_* versions of - str[n]casecmp. - (g_mime_content_type_new_from_string): Use - g_mime_strcase_[hash,equal] rather than param_[hash,equal] to - reuse code. - (g_mime_content_type_set_parameter): Same. - (param_equal): Removed. - (param_hash): Removed. - - * gmime/gmime-charset.c: Use g_ascii_* versions of str[n]casecmp. - -2006-06-23 Jeffrey Stedfast - - * gmime/gmime-stream-cat.c (stream_seek): Fixed to only seek if - necessary and also to use ::reset() if seeking back to the - beginning of the stream so that it works for non-seekable streams - too. Fixes bug #345503 - again thanks to Charles for reporting - this bug. - - * gmime/gmime-object.c (subtype_bucket_foreach): Fixed to also - free the bucket memory. Fixes bug #345768, thanks to Charles Kerr - for pointing this out. - -2006-06-22 Jeffrey Stedfast - - * gmime/gmime-gpg-context.c: Removed #define _POSIX_SOURCE to fix - bug #172179. - -2006-06-15 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.2.2 - -2006-06-01 Jeffrey Stedfast - - * gmime/gmime-utils.c (parse_broken_date): Fixed to handle - MM-DD-YY properly and also to fallback to DD-MM-YY if the first - pair of digits isn't within range for a proper month. - -2006-05-30 Jeffrey Stedfast - - * gmime.h.in: Removed. - - * gmime.h: Now static, no longer auto-generated. - - * gmime/gmime.c: Set the gmime_[major,minor,micro]_version - variables. - (g_mime_check_version): New function to check the required - version. - - * gmime/gmime-stream-fs.c: Implement our own no-op version of - fsync() for systems that don't have fsync(). - -2006-05-24 Jeffrey Stedfast - - * examples/imap-example.c (main): Use g_mkdir() to make this - example portable to Win32. - -2006-05-01 Jeffrey Stedfast - - * gmime/gmime-gpg-context.c (gpg_ctx_parse_status): Handle prompts - from GnuPG asking for the user's PIN for their SmartCard. - -2006-04-21 Jeffrey Stedfast - - * gmime/gmime-stream.h: #include for SEEK_SET/CUR/END - enum values. - -2006-03-16 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.2.1 - - * gmime/gmime-parser.c (parser_step): No-op if we are in an ERROR - state. - (parser_construct_message): Don't bail if we don't start in state - INIT, this is valid. - (parser_step_from): We need to bail even if parser_fill() returns - > 0 if the line is incomplete (e.g. a forced refill was needed but - no additional data could be read). - -2006-03-16 Jeffrey Stedfast - - * README: Bumped version - - * configure.in: Bumped version to 2.2.0, it's about time I made a - stable release. - -2006-03-15 Jeffrey Stedfast - - * gmime/gmime-parser.c (parser_step_from): If we fail to find a - From line, set an error state. Also fixed the End-Of-Data check to - prevent an infinite loop if the stream ends with \n\n. - (parser_construct_message): Make sure our state starts off at - INIT. Also check for the ERROR state in our parser_step() loop and - return NULL if we encounter an error. - -2006-03-03 Jeffrey Stedfast - - * util/url-scanner.c (g_url_web_end): Allow urls such as - "http://www.novell.com./path" (note the '.' before the path - component). - (g_url_addrspec_start): If the '@' is the first character in the - match, then it isn't a valid email address. - -2006-01-12 Jeffrey Stedfast - - * configure.in: Bumped version to 2.1.19 - -2006-01-19 Joe Shaw - - * mono/DataWrapper.custom: We need to manually create a decoding - filtering stream and wrap that in a StreamWrapper rather than the - DataWrapper's GMimeStream directly, which contains undecoded data. - - * mono/GMime.metadata: Rename some enum members, add DataWrapper's - GMimeStream property and MimePart's ContentObject properties as - items which return an owned ref. - -2006-01-12 Jeffrey Stedfast - - ** made a release of 2.1.18 ** - - * gmime/gmime-stream-mem.c (g_mime_stream_mem_get_byte_array): Use - g_return_val_if_fail() rather than g_return_if_fail() since we - need to return NULL on error. - -2006-01-09 Joe Shaw - - * mono/Message.custom: Add a References property. Based on a - patch from D Bera - -2006-01-05 Joe Shaw - - * configure.in: Require gtk-sharp 2.4.0. Set the mono API version - to ..0., which initially is set to - 2.1.0.0, so that version numbers are handled better with gmime - upgrades (and hopefully RPM deps on most distros). Bump version - to 2.1.18. - - * README: Updated version - - * gmime/gmime-stream-mem.[ch]: Add a - g_mime_stream_mem_get_byte_array() method for the mono bindings. - - * mono/DataWrapper.custom: - * mono/Header.custom: - * mono/Object.custom: Remove WriteToStream() and replace with a - new Stream property which returns a wrapped gmime memory stream. - - * mono/GMime.metadata: A bunch of metadata fixes, mainly for - 64-bit compatibility. gtk-sharp incorrectly maps off_t to size_t, - which is an int; it's actually a long, so map it manually - ourselves. - - * mono/ObjectStream.cs: Remove this; it's been replaced by - StreamWrapper, which is much more memory efficient. - - * mono/Stream.custom: Seek() returns a long. Remove the - CopyToStream() and WriteToStream() methods, since streams can now - just be wrapped with a StreamWrapper. Implement the Read() - method, and return a long. - - * mono/StreamWrapper.cs: Added. Wraps a GMime.Stream in a - System.IO.Stream. - - * mono/gmime-api.raw: Regenerated. - -2005-11-14 Jeffrey Stedfast - - * gmime/gmime-utils.c (g_mime_references_next): Added for the C# - bindings. - -2005-10-12 Jeffrey Stedfast - - * README: Updated version - - * configure.in: Bumped version to 2.1.17 - - * gmime/gmime-message.c (message_get_header): For added - convenience, if the requested header is a Content-* header and a - top-level MIME part exists, query for the requested header on the - top-level MIME part and return the value. - - * gmime/gmime-parser.c (parser_step_headers): If we weren't able - to find the end of the header, save it to our tmp buff before - refilling our input buffer and set midline to TRUE. No need to - check inptr < inend later because we know it to be true. - (parser_step_headers): Append the raw header leftovers in the - parser_fill() failure case. - -2005-09-27 Jeffrey Stedfast - - * gmime/gmime-message-partial.c - (g_mime_message_partial_split_message): Reworked the splitting - logic to try and split on whole-lines. - - * gmime/gmime-multipart-signed.c (g_mime_multipart_signed_verify): - Return NULL if the number of parts is incorrect. - -2005-09-20 Jeffrey Stedfast - - * gmime/gmime-message-partial.c (header_copy): Only set the value - if the value is non-NULL. Thanks to Peter Bloomfield for this fix. - -2005-08-18 Jeffrey Stedfast - - * README: Updated version - - * configure.in: Bumped version to 2.1.16 - -2005-08-18 Joe Shaw - - * mono/Makefile.am: Install gmime-api.xml into gapi-2.0 - -2005-08-17 Joe Shaw - - * configure.in: Require gtk-sharp 2 for the mono bindings. - - * mono/GMime.metadata: Rename a few items that the gtk-sharp 2 - parser added. - - * mono/gmime-api.raw: Regengerate this using the gtk-sharp 2 - parser. - -2005-08-16 Joe Shaw - - * mono/Makefile.am: libexecdir isn't right; we should be using - $prefix/lib instead. - -2005-07-12 Jeffrey Stedfast - - * mono/Makefile.am: libexecdir fixes by Stanislav - - * gmime/internet-address.c: Fixes to various functions that used - incorrect g_return*_if_fail variants. Thanks to sbrabec@suse.cz - -2005-06-23 Jeffrey Stedfast - - * gmime/gmime-utils.c (g_mime_utils_header_decode_date): Handle - the case where the number of tokens returned from datetok is 0 - which can happen if broken software sends an empty Date: header. - -2005-06-13 Jeffrey Stedfast - - * README: Updated - - * configure.in: Bumped version to 2.1.15 - - * gmime/gmime-parser.c (parser_step_headers): Don't check - inptr[-1] unless inptr > start - -2005-06-10 Joe Shaw - - * mono/Stream.custom (CopyToStream): Check to see if - byte_array.data is IntPtr.Zero and don't try to copy if it is. - -2005-06-10 Joe Shaw - - * mono/DataWrapper.custom: Added. Adds a WriteToStream() overload - which takes a System.IO.Stream. - - * mono/Header.custom: Ditto. - - * mono/Makefile.am: Add DataWrapper.custom and Header.custom to - customs. - - * mono/Object.custom: Remove the GetData() method... it was rather - flawed. WriteToStream() is the right way to go about it now. Add - a WriteToStream() overload like DataWrapper and Header. - - * mono/Stream.custom: Add an internal CopyToStream() method which - instantiates a GMime.StreamMem, calls WriteToStream() on it, and - then copies the data from the GByteArray into a System.IO.Stream. - Also add a WriteToStream() overload like the others. - -2005-05-25 Joe Shaw - - * mono/GMime.metdata: Add a few extra rules since the - parser/generator changed how certain types are represented. - - * mono/InternetAddress.custom: Remove this file, move the code to... - - * mono/InternetAddressList.cs: ... this file, making it a - first-order object. Since it implements IDisposable and people - might want to explicitly dispose it. - - * mono/Message.custom (GetRecipients): Return an - InternetAddressList rather than an ICollection, so people can - dispose when finished. Also have it always return a valid - InternetAddressList, so you don't have to do a null check before a - foreach. - - * mono/Makefile.am: Remove InternetAddress.custom from customs and - add InternetAddressList.cs to sources. - -2005-05-25 Joe Shaw - - * gmime/internet-address.c: Add accessor functions - internet_address_get_type(), internet_address_get_name(), - internet_address_get_addr() and internet_address_get_members() for - binding into the Mono bindings. - - * mono/GMime.metadata: Work around an automatic rename of the - gtk-sharp generator of a method named "GetType" to a property - named "GType," since this method doesn't return a GType. Rename - it to "GetAddressType" which is mapped to an "AddressType" - property. - - * mono/gmime-api.raw: Regenerated. - -2005-05-20 Jeffrey Stedfast - - * gmime/gmime-utils.c (header_fold): Eat up extraneous whitespace - after forcing a fold. - -2005-03-30 Tim Mooney - - * tests/test-stream.c: include , so we can use G_GNUC_FUNCTION - and therefore compile with non-gcc compilers. - -2005-04-14 Jeffrey Stedfast - - * configure.in: Applied patch from - mooney@dogbert.cc.ndsu.nodak.edu to not assume that mcs was GNU - Mono and to instead verify that it was. Fixes bug #172175. - -2005-03-29 Jeffrey Stedfast - - * README: Updated. - - * configure.in: Bumped version to 2.1.14 - - * gmime/gmime-parser.c (parser_step_headers): If we didn't find - EOL for a header, set state based on 'inptr' rather than - 'start'. Fixes a bug parsing headers that cross read boundaries - (and where headers are longer than the internal read-ahead buffer - size). - -2005-03-23 Joe Shaw - - * configure.in: Require gtk-sharp >= 1.0.6 for important - memory leak fixes - -2005-03-15 Joe Shaw - - * mono/Makefile.am: Build ObjectStream.cs - - * mono/ObjectStream.cs: Added. Implements a .net Stream for - getting the conents from a GMime.Object. - -2005-03-12 Joe Shaw - - * mono/GMime.metadata: Tag the return values of - MessagePart.Message, Message.MimePart, Multipart.GetPart() and - Multipart.GetSubpartFromContentId() as "owned", meaning that - gtk-sharp should not ref them but take ownership of the single - reference that's returned from the underlying C functions. - - * mono/Message.custom: Don't instantiate InternetAddress - objects, just deal with the C APIs directly. This saves us a - lot of allocations and fixes a bug in gtk-sharp where opaque - objects would leak references. - -2005-03-07 Jeffrey Stedfast - - * gmime/gmime-header.c (g_mime_header_prepend): New function to - prepend a header to the list. - -2005-03-07 Jeffrey Stedfast - - * README: Updated. - - * configure.in: Bumped version to 2.1.13 - - * gmime/gmime-charset.c (g_mime_charset_step): Don't bother with - MAX() for cases where we'll just end up setting level to 2. - -2005-03-07 Joe Shaw - - * mono/GMime.metadata: Add the "owned" flag to the return - value parameter for ConstructMessage on the GMimeParser, - because this method returns a new object with a refcount - of 1. The binding needs to take ownership of the object. - -2005-02-14 Jeffrey Stedfast - - * README: Updated - - * configure.in: Bumped version to 2.1.12 - -2005-01-31 Jeffrey Stedfast - - * gmime/gmime-utils.c (header_fold): Don't break apart rfc2047 - encoded tokens. - -2005-01-18 Jeffrey Stedfast - - * README: Updated - - * configure.in: Bumped version to 2.1.11 - -2005-01-26 Joe Shaw - - * mono/GMime.metdata: The gtk-sharp generator doesn't handle - "const unsigned char *" well, so override those methods in - metadata. - -2005-01-20 Jeffrey Stedfast - - * gmime/gmime-param.c (param_list_format): If folding mode is - enabled, terminate the header with a \n. - -2005-01-19 Jeffrey Stedfast - - * gmime/gmime-part.c (g_mime_part_init): Register a writer for - Content-Disposition. - - * gmime/gmime-object.c (g_mime_object_init): Register a new writer - func for Content-Type headers so that we don't accidently fold in - the middle of a parameter value. - -2005-01-13 Joe Shaw - - * autogen.sh: Allow automake 1.9 - -2005-01-11 Jeffrey Stedfast - - * README: Updated - - * configure.in: Bumped version to 2.1.10 - -2004-12-10 Jeffrey Stedfast - - * gmime/internet-address.c (internet_address_to_string): rfc2047 - encode the group name too. - -2004-12-08 Jeffrey Stedfast - - * gmime/gmime-content-type.c (g_mime_content_type_is_type): Fixed - to do as advertised - allow wildcard matching for type. - -2004-12-06 Joe Shaw - - * mono/Makefile.am: Add InternetAddress.custom - - * mono/InternetAddress.custom: Added. Implements a new class - which will handle the destroying of InternetAddressLists. - Implement ParseString, which basically implements a managed - version of internet_address_parse_string. - - * mono/Message.custom: Use the InternetAddressList for - GetRecipients (). - -2004-12-01 Joe Shaw - - * configure.in: Error out if the user explicitly enables the mono - bindings and we can't find mcs. - - * gmime.spec.in: Add support for the mono bindings, placing them - in a separate gmime-sharp package. Patch from Ryan Skadberg - - -2004-11-29 Joe Shaw - - * mono/AssemblyInfo.cs.in: Add @srcdir@ to AssemblyKeyFile so we - build when builddir != srcdir. - - * mono/Makefile.am: Add gmime-sharp.pub to EXTRA_DIST. - -2004-11-27 Jeffrey Stedfast - - * gmime/gmime-gpg-context.c: #define _POSIX_SOURCE so it compiles - on IRIX. - - * gmime/gmime-multipart-signed.c (multipart_signed_remove_header): - Same. - - * gmime/gmime-multipart-encrypted.c - (multipart_encrypted_remove_header): Don't return. - -2004-11-19 Joe Shaw - - * mono/GMime.metadata: Don't autogenerate get GetDate method - - * mono/Message.custom: Implement it by hand and return a DateTime. - -2004-11-17 Joe Shaw - - * mono/GMime.metadata: More metadata goodness. - - * mono/Makefile.am: Added Object.custom and Stream.custom. - - * mono/Object.custom: Add a GetData() method which returns a byte - array of the object's data. - - * mono/Stream.custom: Add a wrapper around Seek() so that you - don't need to specify whence. - -2004-11-16 Joe Shaw - - * configure.in: Generate mono/gmime-sharp.pc. - - * mono/GMime.metadata: Convert all ssize_t and off_t values to - ints in C#, since they're not automatically handled by the - generator right now. - - * mono/Makefile.am: Install the gmime-sharp stuff as gmime-sharp - and not gmime. - - * mono/gmime-sharp.pc.in: Added. pkgconfig file for the mono - bindings. - -2004-11-16 Joe Shaw - - * Makefile.am: iconv-detect.h should be in DISTCLEANFILES, not - CLEANFILES, or else the build fails following a "make clean" - unless you re-autogen. - - * gmime/internet-address.[ch]: Added functions - internet_address_list_next() and - internet_address_list_get_address() since we can't poke at the - structures by hand in mono. - - * mono/GMime.metadata: Remove a bunch of commented out stuff, hide - the entire InternetAddressList structure. We'd prefer to do it - with .net datatypes. - - * mono/Message.custom: Added. Adds a GetRecipients() method which - returns an ICollection of InternetAddresses, and a - GetRecipientsAsString() method which returns a stringified list - for pretty printing. - - * mono/gmime-api.raw: Regenerate this for the new - InternetAddress.GetAddress() and Next() methods. - -2004-11-15 Joe Shaw - - * Added a mono binding - - * configure.in: Add optional checks for mono and gtk-sharp. - - * Makefile.am: Build the mono subdir if enabled. - - * gmime/Makefile.am: Add $(GLIB_LIBS) to the libgmime LIBADD line. - - * gmime/*.h: Replace GMIME_CHECK macros with the G_TYPE_CHECK - ones, because the gtk-sharp binding generator looks for them. - - * gmime/gmime-type-utils.h: Removed. - - * mono/AssemblyInfo.cs.in: Added. - - * mono/sources.xml: Added. The sources file, which tells the - generator how to generate the API data. - - * mono/GMime.metadata: Added. Metadata file used to tweak the - generated API. - - * mono/Global.custom: Added. The g_mime_init() function isn't - being wrapped automatically for some reason, so add the code here. - - * mono/gmime-api.raw: Added. The raw generated API, so that the - parser doesn't have to be run by most people. - - * mono/gmime-sharp.pub: Added. Public key used to sign the - assembly. - -2004-10-22 Jeffrey Stedfast - - * configure.in: Removed the --enable-ipv6 option. getaddrinfo is - now the only way hostname resolution is done. Added checks to see - if getaddrinfo requires -lsocket for Solaris boxen. - - * gmime/gmime-host-utils.[c,h]: Removed - - * gmime/gmime.h.in: Removed gmime-host-utils.h - - * gmime/gmime-utils.c (g_mime_utils_generate_message_id): Use - getaddrinfo to resolve hostnames, don't bother with the - gethostbyname() variants. Makes this code simpler and allows us to - get rid of gmime-host-utils.[c,h]. - -2004-10-01 Jeffrey Stedfast - - * README: Updated - - * configure.in: Bumped version to 2.1.9 - -2004-09-29 Jeffrey Stedfast - - * gmime/gmime-parser.c (parser_step_headers): Save the entire raw - part header as well. - (parser_init): Init the rawbuf (will be used for holding the raw - part header). - (parser_close): Free the rawbuf. - (parser_construct_leaf_part): Set the raw header on the mime part. - (parser_construct_multipart): Set the raw header on the multipart. - (parser_construct_message): Don't use g_mime_message_set_mime_part - or we'll end up clearing the raw header that we worked so hard to - preserve. - (parser_scan_message_part): Same. - (parser_scan_multipart_face): Change comparison to >= so that we - actually get rid of the last crlf sequence like we meant to. - (parser_fill): Get rid of the atleast check (it isn't really - needed and can cause breakage). - - * gmime/gmime-message.c (message_get_headers): Modified to only - write part headers if the toplevel mime part contains the raw - header. - (message_write_to_stream): Same. - (g_mime_message_set_mime_part): Clear the raw message headers - since it obviously won't contain the raw message headers. - (message_add_header): If any message headers change, clear the raw - header from the toplebel mime part. - (message_set_header): Same. - - * gmime/gmime-header.c (g_mime_header_set_raw): New function to - set the raw part header (to be used in place of our own folding if - available). - (g_mime_header_has_raw): New function to check if the raw header - is available. - -2004-09-28 Peter Bloomfield - - * gmime/gmime-multipart-signed.c (sign_prepare): Must treat - multipart/signed and multipart/encrypetd parts as opaque - (e.g. don't even attempt to change their encodings). - -2004-09-13 Jeffrey Stedfast - - * gmime/gmime-message.c (write_addrspec): New folding callback to - use on addrspec headers. - (g_mime_message_init): Register write_addrspec for all address - headers. - - * gmime/gmime-utils.c (header_fold): Fixed the logic a bit for - structured headers such that we don't break long tokens. - -2004-08-22 Jeffrey Stedfast - - * README: Updated. - - * configure.in: Bumped the version to 2.1.8 - - * gmime/gmime.h.in: #include for - ia64 build fix on Debian (required because of the way gtk-doc's - scan program works). - - * gmime/gmime-filter-enriched.c (enriched_to_html): Don't replace - with
. Also, replace lone '\n's with a space as
-	suggested by rfc1896.
-
-2004-08-08  Jeffrey Stedfast  
-
-	* gmime/gmime-multipart-encrypted.c
-	(g_mime_multipart_encrypted_encrypt): Don't set encrypted.asc as
-	the filename anymore.
-
-	* gmime/gmime-multipart-signed.c (g_mime_multipart_signed_sign):
-	Added a hack for Balsa so it can support S/MIME. Also don't set
-	the filename to signature.asc. Balsa maintainers don't want this
-	*shrug*.
-	(g_mime_multipart_signed_verify): Same. These changes really
-	require a design change to CipherContext but that'll have to wait.
-
-2004-08-04  Jeffrey Stedfast  
-
-	* configure.in: Changed the iconv-detect logic to not error-out on
-	fail. The code can properly handle the case where iconv-detect.h
-	doesn't exist, so let it do that instead.
-
-2004-07-30  Jeffrey Stedfast  
-
-	* gmime/gmime-utils.c (rfc2047_encode_get_rfc822_words): Don't use
-	g_unichar_isspace() here, we only want to break 'words' on ascii
-	lwsp.
-
-2004-07-16  Jeffrey Stedfast  
-
-	* gmime/gmime.c (g_mime_init): Make intialisation ref-counted.
-	(g_mime_shutdown): Updated.
-
-2004-07-06  Jeffrey Stedfast  
-
-	* gmime/gmime-utils.c (rfc2047_encode_get_rfc822_words): Break
-	apart long words so that they we don't generate encoded-word
-	tokens that are >75 chars. Fixes bug #145497.
-
-2004-07-04  Jeffrey Stedfast  
-
-	* README: Updated.
-
-	* configure.in: Bumped the version to 2.1.7
-
-	* gmime/gmime-parser.c (parser_construct_leaf_part): Removed code
-	to check that the content_type argument is NULL - it can never be
-	NULL.
-	(parser_scan_multipart_face): Fixed a possible buffer-overrun.
-
-	* gmime/gmime-object.c (process_header): Modified to call
-	g_mime_object_set_content_type() if we got called with a
-	Content-Type header. This way all the ::set_content_type()
-	subclass methods get a chance to update the object's state.
-	(process_header): Return TRUE if we've "processed" the value or
-	FALSE otherwise.
-	(add_header): Only add the header if process_header() didn't do
-	anything with the header.
-	(set_header): Same.
-
-	* gmime/gmime-message.c (g_mime_message_set_sender): Parse the
-	sender string so we can properly encode it before setting it as
-	the From header.
-
-2004-06-28  Jeffrey Stedfast  
-
-	* gmime/gmime-parser.c (parser_scan_content): Updated to handle
-	crlf sequences.
-	(parser_scan_mime_part_content): Same.
-	(crlf2lf): New function to convert CRLF to LF.
-	(parser_scan_multipart_face): Convert the pre/postface into lf
-	format.
-
-2004-06-27  Jeffrey Stedfast  
-
-	* util/url-scanner.c (g_url_web_end): Some fixes that I had to do
-	recently for Camel as well.
-
-2004-06-22  Jeffrey Stedfast  
-
-	* gmime/gmime-parser.c (parser_construct_leaf_part): Only destroy
-	the existing content_type on the object if it is non-NULL.
-	(parser_construct_multipart): Same.
-
-2004-06-15  Jeffrey Stedfast  
-
-	* configure.in: Added --enable-profile option and removed
-	--enable-gprof. --enable-profile enables gprof and gcov.
-
-	* gmime/gmime-parser.c: #include  for strtoul()
-	(parser_construct_leaf_part): Got rid of an unused variable.
-
-	* gmime/gmime-param.c (rfc2184_param_new): Got rid of an unused
-	variable.
-	(rfc2184_decode): Got rid of an unused variable.
-
-	* util/gtrie.c (trie_utf8_getc): Get rid of the unused labels.
-
-2004-06-09  Jeffrey Stedfast  
-
-	* gmime/gmime-stream-filter.c (stream_write): Set flushed to
-	FALSE.
-	(stream_read): Set flushed to FALSE if we end up filtering more
-	data.
-
-	* gmime/gmime-gpg-context.c (gpg_ctx_parse_status): Record the
-	nodata state.
-	(gpg_verify): Check the nodata state.
-
-2004-06-06  Jeffrey Stedfast  
-
-	* README: Updated.
-
-	* configure.in: Bumped version to 2.1.6
-
-	* gmime/gmime-parser.c (parser_construct_multipart): Instead of
-	using g_mime_object_set_content_type(), destroy the current
-	content_type object and set our own on it directly. This prevents
-	the raw Content-Type header value from being overridden by the
-	re-written version from our parsed object.
-	(parser_construct_leaf_part): Same.
-
-	* gmime/gmime-part.c (mime_part_write_to_stream): Don't sync the
-	GMimeDisposition object to the header here anymore. We want to try
-	and keep the original raw header if this is a parsed message.
-
-2004-06-03  Jeffrey Stedfast  
-
-	* gmime/gmime-part.c (sync_content_disposition): Moved. Also
-	protect against a NULL disposition.
-	(mime_part_write_to_stream): Sync the Content-Disposition header
-	before writing to the stream.
-
-	* gmime/gmime-utils.c (header_fold): Fixed a folding bug where we
-	could get a blank line (well, wasn't really blank - but we would
-	get a "\n\t\n" sequence which isn't really useful nor desirable).
-
-	* gmime/gen-table.c: Added a new bit and corresponding macro.
-
-	* gmime/gmime-table-private.h: Updated.
-
-	* gmime/gmime-param.c (encode_param): If conversion into the best
-	charset fails, fall back to using UTF-8. Also use the new
-	convenience macro, is_attrchar(), to decide which characters in
-	the param value to encode.
-	(param_list_format): Use is_attrchar() for calculating how many
-	characters we expect to either have to quote or encode.
-	(decode_param_list): Rewritten.
-
-2004-05-31  Jeffrey Stedfast  
-
-	* gmime/gmime-data-wrapper.c (g_mime_data_wrapper_set_stream):
-	Updated gtk-doc comments to note that you'll probably also want to
-	call g_mime_data_wrapper_set_encoding().
-
-2004-05-26  Jeffrey Stedfast  
-
-	* gmime/gmime-message.c (write_subject): New function. Use
-	unstructured folding rather than the default.
-	(g_mime_message_init): Register the subject header writer.
-
-	* gmime/gmime-utils.c (g_mime_utils_structured_header_fold): New
-	function (same as g_mime_utils_header_fold() but more
-	appropriately named).
-	(g_mime_utils_unstructured_header_fold): Fold unstructured headers
-	like Subject.
-	(header_fold): Moved all of the g_mime_utils_header_fold() logic
-	into here with a small adjustment to differentiate structured vs
-	unstructured header folding.
-
-2004-05-25  Jeffrey Stedfast  
-
-	* gmime/gmime-param.c (param_list_format): Modified to try and
-	squeeze more characters per line and still keep it under 76 chars
-	per line.
-
-2004-05-24  Jeffrey Stedfast  
-
-	* gmime/gmime-filter-gzip.c (g_mime_filter_gzip_finalize): Call
-	inflateEnd/deflateEnd to fix a memory leak.
-
-	* gmime/gmime-parser.c (parser_offset): If priv->offset == -1,
-	don't bother doing any pointer arithmetic as it will result in a
-	value that will break certain code (eg. the boundary matching
-	code).
-
-2004-05-20  Jeffrey Stedfast  
-
-	* gmime/gmime-gpg-context.c (gpg_ctx_new): Remember if our
-	environment is in UTF-8 or not.
-	(gpg_ctx_parse_status): Only convert the user name from the locale
-	charset to UTF-8 if the env isn't UTF-8.
-	(gpg_ctx_parse_status): Convert the password to the locale charset
-	if the locale isn't UTF-8.
-
-2004-05-15  Jeffrey Stedfast  
-
-	* README: Updated.
-
-	* configure.in: Bumped version to 2.1.5
-
-	* gmime/gmime-multipart-signed.c (g_mime_multipart_signed_verify):
-	Updated.
-
-	* gmime/gmime-cipher-context.h: Added a new GMimeSignatureValidity
-	which replaces the now deprecated GMimeCipherValidity. Typedef
-	GMimeCipherValidity to GMimeSignatureValidity and wrap deprecated
-	functions with #ifndef GMIME_DISABLE_DEPRECATED.
-
-	* gmime/gmime-cipher-context.c (g_mime_signature_validity_new):
-	New function.
-	(g_mime_signature_validity_free): New.
-	(g_mime_signature_validity_get_status): New.
-	(g_mime_signature_validity_set_status): New.
-	(g_mime_signature_validity_get_details): New.
-	(g_mime_signature_validity_set_details): New.
-	(g_mime_signature_validity_get_signers): New.
-	(g_mime_signature_validity_add_signer): New.
-	(g_mime_cipher_validity_new): Deprecated.
-	(g_mime_cipher_validity_init): Deprecated.
-	(g_mime_cipher_validity_get_valid): Deprecated.
-	(g_mime_cipher_validity_set_valid): Deprecated.
-	(g_mime_cipher_validity_get_description): Deprecated.
-	(g_mime_cipher_validity_set_description): Deprecated.
-	(g_mime_cipher_validity_clear): Deprecated.
-	(g_mime_cipher_validity_free): Deprecated.
-	(g_mime_signer_new): New function
-	(g_mime_signer_free): New function.
-
-	* gmime/gmime-gpg-context.c (gpg_ctx_parse_status): Save more
-	state.
-	(gpg_verify): Updated to fill out the new GMimeSignatureValidity
-	structure with more details.
-
-2004-05-15  Jeffrey Stedfast  
-
-	* gmime/gmime-host-utils.h: Wrap inclusion of netdb.h with G_OS_WIN32
-
-	* util/memchunk.c (memchunk_alloc): Fixed another cast warning on
-	win32.
-
-	* gmime/gmime-message.c (g_mime_message_get_mime_part): New
-	function.
-	(g_mime_message_get_body): Fixed a bug where is_html could get set
-	to TRUE even if the part wasn't html.
-
-2004-05-13  Jeffrey Stedfast  
-
-	* util/memchunk.c (memchunk_alloc): Add parens to fix casting
-	warning on win32.
-
-	* gmime/gmime-message.c (write_received): Rewritten.
-
-2004-05-10  Jeffrey Stedfast  
-
-	* gmime/gmime-filter-gzip.c: New filter for compressing/inflating
-	gzip streams.
-
-2004-05-09  Jeffrey Stedfast  
-
-	* gmime/gmime-message.c (write_received): Be careful to never
-	append bytes beyond the end of the header value (eg the nul byte).
-
-	* gmime/gmime-utils.c (g_mime_utils_header_fold): Don't allow
-	folded headers to end with \n\n.
-
-2004-04-28  Jeffrey Stedfast  
-
-	* gmime/gmime-multipart-encrypted.c
-	(g_mime_multipart_encrypted_decrypt): Reset the stream before
-	trying to parse it.
-
-2004-04-25  Jeffrey Stedfast  
-
-	* gmime/gmime-utils.c (g_mime_utils_header_fold): Rather than
-	always using a tab character when folding, use the lwsp character
-	that we are wrapping at instead.
-
-2004-04-24  Jeffrey Stedfast  
-
-	* gmime/gmime-parser.c (g_mime_parser_init): Initialise
-	respect_content_length.
-
-2004-04-24  Jeffrey Stedfast  
-
-	* README: Updated
-
-	* configure.in: Bumped version to 2.1.4
-
-	* gmime/gmime-part.c (g_mime_part_get_content): Disable debug
-	warning.
-
-	* gmime/gmime-iconv.c: Same.
-
-	* gmime/gmime-iconv-utils.c: Disable warnings.
-
-	* gmime/gmime-utils.c (decode_msgid): Try to always return a
-	string buffer containing whatever we can get from the msg-id, even
-	if it isn't a valid msg-id token.
-
-2004-04-19  Jeffrey Stedfast  
-
-	* gmime/gmime-content-type.c
-	(g_mime_content_type_new_from_string): Chew up lwsp between the
-	end of the subtype and the ';' token, if there is any.
-
-2004-04-13  Jeffrey Stedfast  
-
-	* gmime/gmime-gpg-context.c (gpg_ctx_parse_status): Save both the
-	TRUST_UNDEFINED trust state as well as the whether or not we get a
-	NO_PUBKEY status message.
-
-2004-04-11  Jeffrey Stedfast  
-
-	* gmime/gmime-stream-filter.c (stream_read): Check that we haven't
-	already flushed the stream if the source stream is at EOS - fixes
-	an infinite loop case if the user doesn't use a loop to check
-	eos() each loop.
-
-2004-04-02  Jeffrey Stedfast  
-
-	* gmime/gmime-stream-cat.c (stream_write): This should be writing
-	data, not reading it from the underlying streams. Oops.
-
-2004-03-30  Jeffrey Stedfast  
-
-	* gmime/gmime-charset.c (charset_best_mask): Don't use the charset
-	if it is lang specific and the lang doesn't match the
-	locale. Fixes bug #138218.
-
-	* gmime/gmime-utils.c (mktime_utc): New function to mktime() into
-	UTC.
-	(parse_rfc822_date): Use mktime_utc() instead of doing it
-	ourselves.
-	(parse_broken_date): Same.
-
-2004-03-21  Jeffrey Stedfast  
-
-	* gmime/gmime-stream-buffer.c (stream_write): Fixed a bug when
-	writing across block boundaries.
-
-2004-03-09  Jeffrey Stedfast  
-
-	* gmime/gmime-cipher-context.c (g_mime_cipher_verify): Allow the
-	sigstream to be NULL (it is optional afterall).
-
-	Thanks to Peter Bloomfield for reminding me about
-	g_ascii_strdown() and g_ascii_strup() and for providing the
-	original patch.
-
-	* gmime/gmime-charset.c (locale_parse_lang): Don't use
-	g_ascii_strdown() and g_ascii_strup() as these functions strdup
-	the result rather than working on the input string.
-	(g_mime_charset_map_init): Instead of strdup()ing the charset name
-	and then using g_ascii_strdown(), just use g_ascii_strdown() since
-	it malloc's. Also, even if we have nl_langinfo(), we want to parse
-	LC_ALL to get the locale lang.
-
-2004-03-06  Jeffrey Stedfast  
-
-	* README: Updated
-
-	* configure.in: Bumped version to 2.1.3
-
-2004-02-28  Jeffrey Stedfast  
-
-	* gmime/gmime-stream-buffer.c (stream_write): Shrink buflen down
-	by the number of bytes flushed or we'll loop forever writing the
-	same block over and over.
-
-	* gmime/gmime-strea.[c,h]: Make stream_write() take a const char
-	*buf argument instead of char *buf.
-
-	* gmime/gmime-stream-*.c (stream_write): constify the buf
-	argument.
-
-	* gmime/gmime-stream-null.c (stream_write): Count newlines as
-	well.
-
-2004-02-26  Jeffrey Stedfast  
-
-	* util/*.[c,h]: Moved here from gmime/
-
-	* gmime/*.h: Fixed #includes
-
-	* gmime/cache.[c,h]: Moved to util/
-
-	* gmime/gtrie.[c,h]: Moved to util/
-
-	* gmime/list.[c,h]: Moved to util/
-
-	* gmime/md5-utils.[c,h]: Moved to util/
-
-	* gmime/memchunk.[c,h]: Moved to util/
-
-	* gmime/url-scanner.[c,h]: Moved to util/
-
-	* gmime/gmime-parser.c: Don't use gobject macro casts.
-
-	* gmime/gmime-filter-md5.c: Move the MD5Context into a private
-	structure so that we don't need to install md5-utils.h
-
-2004-02-18  Jeffrey Stedfast  
-
-	* gmime/gmime-utils.c (rfc2047_encode): Return a duplicate of the
-	input string if there are no 'words'.
-
-	* gmime/internet-address.c (internet_address_to_string): Make sure
-	ia->name is not an empty string.
-
-2004-02-13  Jeffrey Stedfast  
-
-	* gmime/gmime-parser.c (parser_construct_multipart): Pop our end
-	boundary before scanning postface text data. Prevents a hang if a
-	multipart brokenly has 2 end boundaries.
-
-2004-02-08  Jeffrey Stedfast  
-
-	* gmime/*.c: Use g_object_ref/unref instead of the
-	g_mime_object_ref/unref and g_mime_stream_ref/unref.
-
-2004-02-08  Jeffrey Stedfast  
-
-	* gmime/gmime-utils.c (rfc2047_encode): Changed to take a safemask
-	arg instead of a gboolean phrase arg since we never used 'phrase'
-	directly.
-	(g_mime_utils_header_encode_phrase): Pass IS_PSAFE as second
-	argument.
-	(g_mime_utils_header_encode_text): Pass IS_ESAFE as second
-	argument.
-
-2004-02-07  Jeffrey Stedfast  
-
-	* README: Updated.
-
-	* configure.in: Bumped version to 2.1.2
-
-	* examples/README: New README explaining the purpose of each of
-	the example sources.
-
-2004-02-06  Jeffrey Stedfast  
-
-	* gmime/gmime-parser.c (parser_construct_message): If we've been
-	told to respect the Content-Length header, then parse the length
-	value and calculate the offset of the beginning of the next
-	message.
-	(g_mime_parser_get_respect_content_length): New function to get
-	whether we've been told to respect the Content-Length header.
-	(g_mime_parser_set_respect_content_length): New function to set
-	this option.
-	(parser_offset): Now takes a private struct pointer rather than
-	the parser object since it didn't really need it. Also makes it
-	usable from check_boundary().
-	(g_mime_parser_tell): Updated.
-	(check_boundary): Only scan for end-boundaries if we've reached
-	the projected end-of-content offset as calculated using the
-	Content-Length header.
-
-2004-02-06  Jeffrey Stedfast  
-
-	* configure.in: Generate examples/Makefile
-
-	* gmime/gmime-utils.c (g_mime_utils_generate_message_id):
-	Simplified and updated for g_gethostbyname_r() API changes.
-
-	* gmime/gmime-error.h: Changed the #define of GMIME_ERROR_QUARK to
-	just be the GQuark variable. Also added GMIME_ERROR_IS_SYSTEM() to
-	decide if an error is a system error (aka errno) or a GMime error.
-
-	* gmime/gmime.c: Make gmime_error_quark an actual variable and
-	initialise it here.
-
-2004-02-05  Jeffrey Stedfast  
-
-	* gmime/gmime-host-utils.c (g_gethostbyname_r): Replace the herr
-	argument with a GError to make the interface a bit nicer to use.
-	(g_gethostbyaddr_r): Same.
-
-	* gmime/url-scanner.c: Added single/double quotes to url_braces[]
-	in case the user is quoting the url.
-	(g_url_web_end): Add "-;:" to list of punctuation to strip off the
-	end of urls. Also fixed to handle user@domain's
-	(g_url_addrspec_start): Strip open brace characters from the
-	beginning of the addr.
-	(g_url_web_start): Make sure "www" wasn't part of something not a
-	url (like "Ewww.Gross") by check that pos[-1] is either an open
-	brace or whitespace.
-	(g_url_addrspec_end): Don't allow toplevel domain addr-specs
-	(if we encounter something that looks like it is a toplevel domain
-	addr, it is more likely to be bogus than correct).
-
-2004-02-04  Jeffrey Stedfast  
-
-	* gmime/gmime-stream-buffer.c (g_mime_stream_buffer_gets): Strip
-	off \r too if the stream is in the canonical form.
-
-	* gmime/gmime.c (g_mime_shutdown): Oops, call
-	g_mime_charset_map_shutdown(), not g_mime_charset_shutdown().
-
-2004-01-26  Jeffrey Stedfast  
-
-	* gmime/gmime.c (g_mime_shutdown): New public function to shutdown
-	GMime. Fixes a segfault in applications that dynamically
-	load/unload GMime during execution.
-
-	* gmime/gmime-iconv.c (g_mime_iconv_init): Don't register an
-	atexit handler.
-	(g_mime_iconv_shutdown): Make public.
-
-	* gmime/gmime-charset.c (g_mime_charset_map_init): Don't set a
-	g_atexit handler for the shutdown routine.
-	(g_mime_charset_map_shutdown): Make public.
-
-2004-01-25  Jeffrey Stedfast  
-
-	* gmime/gmime-param.c: Disable debugging and conditionally disable
-	warnings.
-
-	* gmime/gmime-multipart.c: Disable debugging.
-
-	* gmime/gmime-stream.c: Disable debugging.
-
-	* gmime/internet-address.c: Same.
-
-	* gmime/gmime-parser.c: Conditionally disable warnings.
-
-2004-01-19  Jeffrey Stedfast  
-
-	* gmime/gmime-host-utils.c (g_gethostbyaddr_r): Fixed some compile
-	problems in the IPv6 implementation.
-
-2003-12-16  Jeffrey Stedfast  
-
-	* gmime/gmime-stream-mmap.c (g_mime_stream_mmap_new): Don't add
-	getpagesize() to the file length.
-	(g_mime_stream_mmap_new_with_bounds): Same.
-
-2003-12-11  Jeffrey Stedfast  
-
-	* gmime/gmime-gpg-context.c (gpg_ctx_parse_status): Don't immediately
-	prompt for a passwd after receiving the NEED_PASSPHRASE status
-	message. Instead, parse the userid that gpg needs a passwd for and
-	store it on our context. Wait for a GET_HIDDEN status message
-	before prompting, this way if the user has their gpg configured to
-	use gpg-agent, the user won't get 2 passwd prompts.
-
-2003-12-06  Jeffrey Stedfast  
-
-	* gmime/gmime-parser.c (parser_step_headers): If scanning for eoln
-	results in finding inend, request a refill and try again (changed
-	from inptr + 1 >= inend).
-
-2003-12-05  Jeffrey Stedfast  
-
-	* gmime/internet-address.c (decode_domain): Make sure domain->len
-	> 0 before checking domain->str[domain->len - 1].
-
-	* gmime/gmime-gpg-context.c (gpg_ctx_op_start): Properly set the
-	O_NONBLOCK flag on each of the pipes (ie. we need to get the
-	current flags first and then add the O_NONBLOCK flag rather than
-	just setting the O_NONBLOCK flag by itself).
-
-2003-12-04  Jeffrey Stedfast  
-
-	* README: Updated.
-
-	* configure.in: Bumped version to 2.1.1
-
-2003-12-02  Jeffrey Stedfast  
-
-	* gmime/gmime-gpg-context.c (gpg_ctx_op_start): Modified the code
-	that closes the child's fds to use fcntl and also to start at fd =
-	3 so as to get rid of the need to check for stdin/out/err.
-
-	* gmime/gmime-filter-from.c (filter_filter): Fixed to malloc the
-	correct buffer length.
-
-2003-10-28  Pawel Salek  
-
-	* gmime.h.in: Use macros rather than the global variables to
-	prevent compiler warnings.
-
-	* gmime-error.h: Removed the trailing comma after the last enum
-	value to fix ANSI compile warnings.
-
-	* gmime-filter-basic.h: Same.
-
-	* gmime-filter-best.h: Here too.
-
-	* gmime-filter-crlf.h: And here.
-
-	* gmime-filter-from.h: Same.
-
-	* gmime-filter-yenc.h: Again here.
-
-	* gmime-multipart-encrypted.h: And here.
-
-	* gmime-multipart-signed.h: Here too.
-
-	* gmime-stream-buffer.h: Same.
-
-	* gmime-stream.h: And finally here.
-
-2003-10-08  Jeffrey Stedfast  
-
-	* configure.in: Added a check for altzone.
-
-	* gmime/gmime-utils.c (parse_broken_date, parse_rfc822_date):
-	Account for altzone if the system libc defines it.
-
-2003-09-26  Jeffrey Stedfast  
-
-	* gmime/gmime-host-utils.c (g_gethostbyaddr_r): IPv6
-	implementation rewritten to use getnameinfo() which is the proper
-	function to use in this case.
-
-	* gmime/internet-address.c (internet_address_list_length): Changed
-	to take a const argument.
-	(internet_address_to_string): Now takes a const InternetAddress.
-	(internet_address_list_to_string): Now takes a const
-	InternetAddressList.
-
-2003-09-12  Jeffrey Stedfast  
-
-	* gmime/gmime-stream.c (g_mime_stream_read): If len == 0, return 0.
-	(g_mime_stream_write): Same.
-
-	* gmime/gmime-parser.c (parser_push_boundary): Fix the
-	boundarylenfinal calculation. Thanks to Bart Visscher for catching
-	this mistake.
-
-2003-08-30  Jeffrey Stedfast  
-
-	* gmime/md5-utils.c (md5_get_digest_from_file): Open in binary
-	mode, fixes a bug when built on Win32 systems.
-
-2003-08-09  Jeffrey Stedfast  
-
-	* README: Bumped to version 2.1.0
-
-	* configure.in: Bumped to version 2.1.0
-
-	* gmime/gmime-charset.c (g_mime_charset_name): Added back this
-	symbol in order to avoid breaking ABI.
-	(g_mime_charset_locale_name): Same.
-
-	* gmime/gmime-utils.c (g_mime_utils_generate_message_id): Slight
-	fix for growing the buffer used by g_gethostbyname_r().
-
-2003-08-09  Jeffrey Stedfast  
-
-	* gmime/gmime.h.in: Added new headers.
-
-	* gmime/gmime-utils.c (g_mime_utils_generate_message_id): Use the
-	re-entrant g_gethostbyname_r() function rather than
-	gethostbyname() so that we are threadsafe.
-
-	* gmime/gmime-host-utils.[c,h]: New source files containing
-	gethostbyname_r() and gethostbyaddr_r() implementations.
-
-	* gmime/gmime-filter-windows.[c,h]: New source files implementing
-	a windows charset detection filter.
-
-	* gmime/gmime-charset.c (g_mime_charset_iso_to_windows): New
-	function to return the windows-cp125# equivalent charset for
-	iso-8859-# charsets.
-
-	* gmime/gmime-parser.c (parser_push_boundary): Soptimise a bit :-)
-	(parser_push_boundary): 
-
-2003-08-06  Jeffrey Stedfast  
-
-	* gmime/gmime-multipart.c (g_mime_multipart_foreach): Simplified.
-
-	* gmime/gmime-stream-cat.c (stream_read): Same here.
-	(stream_write): And finally here.
-
-	* gmime/gmime-stream-file.c (stream_read): Same.
-	(stream_write): And again...
-
-	* gmime/gmime-stream-fs.c (stream_read): Here too.
-	(stream_write): And here.
-
-	* gmime/gmime-stream-mmap.c (stream_read): Same as the mem stream.
-	(stream_write): Same.
-
-	* gmime/gmime-stream-mem.c (stream_read): Need to fix the MIN
-	expresion so that both args are signed, otherwise 'len' will be
-	the min if the 'bytes-left' calculation is negative.
-	(stream_write): Same.
-
-2003-07-29  Jeffrey Stedfast  
-
-	* gmime/gmime-message.c (g_mime_message_get_recipients): Return
-	const.
-
-	* gmime/gmime-message-part.c (g_mime_message_part_get_message):
-	Ref the content message before returning it.
-
-2003-07-25  Jeffrey Stedfast  
-
-	* gmime/gmime-multipart.c (g_mime_multipart_foreach): Don't
-	descend recursively... make the user descend into sub-multiparts
-	him/herself. This makes more sense since the callback will be
-	called on the multipart too...
-	(g_mime_multipart_get_subpart_from_content_id): Make checking if
-	the subpart is a multipart more efficient by using
-	GMIME_IS_MULTIPART macro.
-
-2003-07-15  Jeffrey Stedfast  
-
-	* gmime/gmime-charset.c (g_mime_charset_canon_name): Updated to
-	return canonical charset names for windows-cp125x charsets.
-
-2003-06-19  Jeffrey Stedfast  
-
-	* README: Added a section for links to language bindings starting
-	with the Perl MIME::Fast modules.
-
-	* docs/reference/question_index.sgml: Updated docs about the Perl
-	bindings.
-
-	* docs/tutorial/gmime-tut.sgml: Updated slightly.
-
-2003-06-14  Jeffrey Stedfast  
-
-	* gmime/gmime-parser.c (g_mime_parser_get_persist_stream): New
-	function to get whether or not the parser will attempt to keep the
-	content on disk when it constructs messages.
-	(g_mime_parser_set_persist_stream): New function to set whether or
-	not the above should be done.
-	(parser_scan_mime_part_content): Only load content if persist and
-	seekable are both TRUE.
-
-	* gmime/gmime-stream-fs.c (g_mime_stream_fs_get_owner): Same idea.
-	(g_mime_stream_fs_set_owner): And here.
-
-	* gmime/gmime-stream-file.c (g_mime_stream_file_get_owner): New
-	function, just like StreamMem.
-	(g_mime_stream_file_set_owner): Same.
-
-	* gmime/gmime-stream-mem.c (g_mime_stream_mem_set_owner): New
-	function to set whether or not the memory stream should free the
-	backend memory buffer when finalized.
-	(g_mime_stream_mem_get_owner): New function to get the above
-	attribute.
-
-2003-06-12  Jeffrey Stedfast  
-
-	* gmime/gtrie.c (g_trie_free): Free the fail_states array.
-
-2003-05-26  Jeffrey Stedfast  
-
-	* gmime/gmime-common.c (g_mime_strcase_hash): Oops, fixed a bug.
-
-	* gmime/gmime-multipart-signed.c (g_mime_multipart_signed_verify):
-	Do not strip trailing whitespace when verifying, this should allow
-	us to verify both rfc2015 and rfc3156 signed messages (as well as
-	this being the correct way of doing it anyway).
-
-2003-05-26  Jeffrey Stedfast  
-
-	* gmime/gmime-common.[c,h]: New source files implementing some
-	common routines scattered throughout the gmime sources (currently
-	a strcase_hash and strcase_equal implementation).
-
-	* gmime/gmime-object.c (type_registry_init): Use the new
-	g_mime_strcase_[hash,equal] functions from gmime-common.h.
-	(g_mime_object_register_type): Here too.
-
-	* gmime/gmime-filter-enriched.c
-	(g_mime_filter_enriched_class_init): Use the new
-	g_mime_strcase_[hash,equal] functions from gmime-common.h.
-
-2003-05-22  Jeffrey Stedfast  
-
-	* gmime/gmime-parser.c (parser_construct_multipart): Fixed to
-	properly handle multiparts which do not end with their own
-	end-boundary. See bug #113527 for details.
-
-2003-05-22  Jeffrey Stedfast  
-
-	* configure.in: Check for sys/param.h
-
-	* gmime/gmime-stream-mmap.h: Removed sys/mman.h and unistd.h from
-	the #includes. These are needed in the ehader and will break the
-	build on win32.
-
-	* gmime/gmime-utils.c: Only #include sys/param.h if the system has
-	it. Also added unistd.h and sys/types.h as they should have been
-	there for pid_t.
-
-2003-05-21  Jeffrey Stedfast  
-
-	* gmime/gmime-message.c (handle_multipart_mixed): Don't look at
-	the subtype of the first_type unless we have already defined
-	first_type. Fixes a crash.
-
-	* gmime/gmime-multipart.c
-	(g_mime_multipart_get_subpart_from_content_id): Don't return a
-	const GMimeObject, ref it to be consistant with the rest of the
-	API.
-
-	* gmime/gmime-message-partial.c
-	(g_mime_message_partial_split_message): Fixed an optimisation gone
-	bad. Thanks to Piotr Klaban for reporting this.
-
-2003-05-19  Jeffrey Stedfast  
-
-	* tests/test-mbox.c: Fixed a memory leak.
-
-	* gmime/gmime-multipart-encrypted.c: Same as below.
-
-	* gmime/gmime-multipart-signed.c: Fixed the prototype for
-	write_to_stream().
-
-2003-05-17  Jeffrey Stedfast  
-
-	* docs/reference/streams.sgml: Updated for correctness.
-
-	* docs/reference/data-wrappers.sgml: Pretty much re-written to
-	better explain GMimeDataWrapper.
-
-	* gmime/gmime-session-simple.[c,h]: New simple instantiable class
-	implementing the GMimeSession interfaces.
-
-2003-04-30  Jeffrey Stedfast  
-
-	* tests/test-mime.c: Fixed some compile warnings.
-
-	* src/uudecode.c: Fixed some compile warnings.
-
-	* src/uuencode.c: Fixed some compile warnings.
-
-	* gmime/gmime-parser.c (parser_scan_content): Initialise 'start'.
-
-	* gmime/gmime-multipart-signed.c: #include 
-
-	* gmime/gmime-message-part.c: #include 
-
-	* gmime/gmime-filter-enriched.c: #include  for strtoul.
-
-	* gmime/gmime-charset.c (strdown): New function to lowercasify a
-	string inline (rather than being lame and strdup'ing the bloody
-	string like g_ascii_strdown does).
-
-	* gmime/gmime-iconv.c: Turn off cache debugging.
-
-2003-04-21  Jeffrey Stedfast  
-
-	* gmime/gmime-gpg-context.c (gpg_ctx_new): Initialise seen_eof1 to
-	TRUE.
-	(gpg_ctx_set_ostream): Set seen_eof1 to FALSE here, this way we
-	only ever check for EOF for gpg's stdout if we care about the data
-	received from it.
-	(gpg_ctx_parse_status): Remove the hack that set seen_eof1 to TRUE
-	when we received a TRUST status from gpg when verifying a
-	signature. Same for when importing signatures.
-	(gpg_ctx_op_step): Only FD_SET() fd's that we have not finished
-	reading from.
-	(gpg_ctx_op_exited): #if 0'd for now since we aren't using it
-	anymore. Keeping it around for historical reasons and in case we
-	find we really do need it back.
-
-2003-04-15  Jeffrey Stedfast  
-
-	* configure.in: Check for netdb.h, gethostname and gethostbyname.
-
-	* gmime/gmime-utils.c (g_mime_utils_generate_message_id): Guard
-	against systems without netdb.h, gethostname() and/or
-	gethostbyname(). Seems MingW does not have these things.
-
-	* gmime/gmime-gpg-context.c (gpg_ctx_get_diagnostics): Flush the
-	diagnostics stream and append a nul-byte. This allows us to return
-	a const char * which will allow us to avoid strdup/free later.
-	(gpg_ctx_free): Unref the diagnostics stream.
-	(gpg_ctx_new): Get the locale charset and setup a charset filter
-	for the diagnostics stream (use a stream instead of a GByteArray
-	like we did before so we can do charset conversion more easily).
-	(gpg_ctx_op_step): Use g_mime_stream_write() to append data to the
-	diagnostics buffer instead of g_byte_array_append() - this way we
-	get some charset filtering action. When reporting errors, use
-	gpg_ctx_get_diagnostics(). Also make the errors reported to the
-	user a little nicer.
-	(gpg_sign): Diagnostics is now const, so don't free the result.
-	(gpg_verify): Same. But also don't exit the main loop when gpg
-	exits - there could still be data in the pipes left to read.
-	(gpg_encrypt): Same as gpg_sign().
-	(gpg_decrypt): Same here.
-	(gpg_import_keys): Here too.
-	(gpg_export_keys): And here.
-	(gpg_ctx_parse_status): Convert the userid hint to UTF-8.
-
-2003-03-31  Jeffrey Stedfast  
-
-	* gmime/*.c: s/g_str[n]casecmp/str[n]casecmp/g
-
-	* configure.in: Change the check for mmap so that we know we not
-	only have mmap defined, but also that it "works". Also added
-	checks for strcasecmp and strncasecmp and define them to the glib
-	versions if appropriate (g_ascii_str[n]casecmp since
-	g_str[n]casecmp is apparently deprecated *sigh*). Doing this
-	because I don't want to type g_ascii_str[n]casecmp. Call me a lazy
-	bastard, but this is rediculous.
-
-	* gmime/gmime-filter-enriched.[c,h]: New source files that can be
-	used to convert text/enriched and text/rtf to text/html.
-
-2003-03-31  Jeffrey Stedfast  
-
-	* PORTING: Began writing a porting guide for developers porting
-	their applications from GMime 2.0 to GMime 2.2.
-
-	* gmime/gmime-utils.c (g_mime_utils_8bit_header_encode_phrase):
-	Re-added for binary compatability. At least for now?
-	(g_mime_utils_8bit_header_encode): Same.
-	(g_mime_utils_8bit_header_decode): Here too.
-
-2003-03-30  Jeffrey Stedfast  
-
-	* gmime/internet-address.c (internet_address_new_name): Use
-	header_decode_phrase().
-	(internet_address_new_group): Same.
-	(internet_address_set_name): Again here.
-	(encoded_name): Always use encode_phrase() here if rfc2047_encode
-	is TRUE, even if the raw name contains no 8bit characters. It
-	*should* do the Right Thing (tm) now.
-
-	* gmime/gmime-param.c (decode_param): Use
-	g_mime_utils_header_decode_text().
-
-	* gmime/gmime-message.c (g_mime_message_set_subject): Use
-	g_mime_utils_header_encode_text().
-
-	* gmime/gmime-utils.c (g_mime_utils_header_encode_phrase):
-	Renamed. Also rewritten to do the Right Thing (ie. Group 'word's
-	by type and so forth).
-	(g_mime_utils_header_encode_text): Renamed from
-	8bit_header_encode() to make it clear that this function is meant
-	to encode 'text' fields (see rfc822 for the definition of 'text'
-	and for which headers have text values). Does the same basic
-	thing, but now shares a lot of code with encode_phrase().
-	(rfc2047_encode_get_rfc822_words): Renamed from
-	rfc2047_encode_phrase_get_words() - also now handles WORD_QSTRING
-	and takes an arg to determine whether or not to allow for QSTRING
-	words.
-	(g_mime_utils_text_is_8bit): Don't go past '\0' if we encounter
-	one before inend. Should allow our caller to cheat and pass in -1
-	instead of strlen()ing the string if the string is nul-terminated.
-	(g_mime_utils_header_decode_text): Renamed from
-	8bit_header_decode(). Also made a lot less strict.
-	(g_mime_utils_header_decode_phrase): Basically the same as
-	decode_text() but with the same strictness of previous versions.
-
-2003-03-30  Jeffrey Stedfast  
-
-	* gmime/gmime-message.c (g_mime_message_set_subject): Encode the
-	subject before setting it in the raw header list.
-
-	* gmime/gmime-header.c (g_mime_header_add): Don't try to encode
-	the header here. This is not our responsibility.
-	(g_mime_header_set): Same.
-
-2003-03-27  Jeffrey Stedfast  
-
-	* gmime/gmime-utils.c (rfc2047_encode_word): Add 1 to enclen so as
-	to protect against buffer overruns.
-	(rfc2047_encode_phrase_get_words): if c > 127 && c < 256, then set
-	encoding to MAX (encoding, 1), not 2.
-
-2003-03-11  Charles Kerr 
-
-	* gmime/md5-utils.c (md5_get_digest_from_file): fix
-	dangling file pointer.
-
-2003-03-09  Jeffrey Stedfast  
-
-	* gmime/url-scanner.c (g_url_addrspec_end): Make sure inptr != pos
-	+ 1, if it does, then return FALSE.
-	
-2003-03-06  Jeffrey Stedfast  
-
-	* configure.in: Check that the compiler supports the inline
-	optimisation keyword (or variant) and #define it to 'inline'.
-
-	* gmime/gtrie.c (trie_utf8_getc): Same.
-
-	* gmime/gmime-filter-html.c (html_utf8_getc): Use the inline macro.
-
-2003-03-03  Jeffrey Stedfast  
-
-	* gmime/gmime-filter-charset.c (filter_filter): Use outbuf -
-	filter->outbuf to calculate how much data we've written - simpler
-	and less likely to be wrong.
-	(filter_complete): Same.
-
-	* gmime/gmime-iconv.c: Modified to use the new cache
-	implementation in cache.c
-
-	* gmime/cache.[c,h]: New source files implementing an LRU cache.
-
-	* gmime/list.[c,h]: New source files containing a really nice/fast
-	linked-list implementation.
-
-2003-03-02  Jeffrey Stedfast  
-
-	* gmime/gmime-iconv.c (iconv_cache_bucket_new): If the current
-	list of cache buckets is non-NULL, set list->prev to the new
-	bucket being prepended.
-	(g_mime_iconv_open): Only expire unused if the cache size is
-	greater than the max allowable size.
-
-2003-02-27  Jeffrey Stedfast  
-
-	* gmime/gmime-stream-filter.c (stream_read): Set priv->flushed to
-	TRUE if we call g_mime_filter_complete() on our filters.
-	(stream_eos): It's not actually the end of the stream until we've
-	flushed the filters. This fixes some possible truncation when
-	reading from a filtered stream.
-
-2003-02-25  Jeffrey Stedfast  
-
-	* README: Bumped version to 2.1.0
-
-	* configure.in: Bumped version to 2.1.0
-
-	* gmime/gmime-utils.c (rfc2047_decode_word): Use
-	g_mime_locale_charset().
-
-	* gmime/gmime-param.c (rfc2184_decode): Use
-	g_mime_locale_charset().
-
-	* gmime/gmime-iconv-utils.c (iconv_utils_init): Same as
-	below. Also use g_mime_locale_charset() rather than
-	g_mime_charset_locale_name().
-
-	* gmime/gmime-iconv.c (g_mime_iconv_open): Use
-	g_mime_charset_iconv_name() instead of the older deprecated
-	g_mime_charset_name() function.
-
-	* gmime/gmime-charset.c (g_mime_charset_map_init): Initialize the
-	locale_lang.
-	(g_mime_charset_iconv_name): Renamed from g_mime_charset_name()
-	(g_mime_charset_canon_name): New function which does almost the
-	same thing as g_mime_charset_iconv_name() except that it will
-	always return the canonical forms of the iso-8859 charsets.
-	(g_mime_locale_charset): Renamed from g_mime_charset_locale_name()
-	(g_mime_locale_language): New function to return the user's locale
-	language.
-	(g_mime_charset_language): New function to map charsets to their
-	language code (meant for CJKR).
-
-2003-02-13  Jeffrey Stedfast  
-
-	* README: Bumped version to 2.0.2
-
-	* configure.in: Bumped version to 2.0.2
-
-	* gmime/gmime-parser.c (parser_scan_content): Stop looping if/when
-	we find EOS in all cases. Also handle the case where an
-	[end-]boundary ends an an EOS rather than a new-line.
-
-2003-02-14  Jeffrey Stedfast  
-
-	* gmime/url-scanner.c (g_url_file_end): If the file:// url is
-	preceded with some sort of brace, when scanning for the end of the
-	url - take this into consideration.
-	(g_url_web_end): Same.
-
-2003-02-13  Jeffrey Stedfast  
-
-	* gmime/gmime-gpg-context.c: #include 
-
-2003-02-12  Jeffrey Stedfast  
-
-	* gmime/url-scanner.c: Fixed the table to treat >=127 as a CTRL
-	character.
-
-	* gmime/gtrie.c (trie_utf8_getc): When we encounter an invalid
-	UTF-8 sequence, update in to point to in+1 and return 0xffff.
-	(g_trie_add): Handle invalid UTF-8 sequences (ie, c == 0xffff).
-	(g_trie_search): Same.
-
-	* gmime/gmime-filter-html.c (html_utf8_getc): Shortcut if inptr ==
-	inend by returning 0 and treating it as if we found the
-	terminating nul-char.
-
-2003-02-08  Jeffrey Stedfast  
-
-	* configure.in: Bumped the version to 2.0.1
-
-	* docs/*: A completely new set of documentation.
-
-2003-02-07  Jeffrey Stedfast  
-
-	* gmime/gmime-multipart.c (multipart_remove_part): When the part
-	being removed is not the first part in the list, make sure to set
-	node->prev->next = node->next -- oops :-)
-	(multipart_remove_part_at): Same.
-
-2003-01-25  Jeffrey Stedfast  
-
-	* configure.in: Bumped the version to 2.0.0
-
-	* gmime/gmime-filter-html.c (writeln): Read the stream as UTF-8
-	rather than 8bit so that we can properly write out unicode
-	entities.
-
-2002-12-17  Jeffrey Stedfast  
-
-	Build fixes for G_DISABLE_DEPRECATED
-
-	* gmime/gmime-param.c (encode_param): Replace calls to
-	g_string_sprintfa() with g_string_append_printf() since the former
-	is marked as being deprecated.
-	(param_list_format): Same.
-
-	* gmime/gmime-utils.c (rfc2047_encode_word): Here too.
-
-2002-12-16  Jeffrey Stedfast  
-
-	* configure.in: Bumped the version to 1.90.8
-
-	* doc/gmime-doc.sgml: Added a section for GMimeFilterMd5.
-
-	* doc/gmime-sections.txt: Added a section on GMimeFilterMd5.
-
-	* tests/test-parser.c (print_mime_struct): Validate Content-Md5
-	headers.
-
-	* gmime/gmime-part.c (g_mime_part_set_content_md5): Rewritten to
-	use the md5 filter and also to do things the right way by
-	converting textual parts to their canonical CRLF form.
-	(g_mime_part_verify_content_md5): Same.
-
-	* gmime/gmime-filter-md5.[c,h]: New filter to compute the md5
-	digest of a stream passed through it.
-
-2002-12-11  Jeffrey Stedfast  
-
-	* gmime/gmime-message.c (g_mime_message_get_body): Reworked the
-	logic a bit to properly handle multipart/alternative.
-
-2002-12-10  Jeffrey Stedfast  
-
-	* configure.in: Bumped the version to 1.90.7
-
-2002-12-09  Jeffrey Stedfast  
-
-	* gmime/url-scanner.c: Use our own masking table since we need it
-	atoms to be slightly different. There's a few more chars we want
-	to restrict. Also has the benefit of being easier to split out if
-	someone else wants to use it.
-	(g_url_addrspec_end): Fixed to not be fooled in the case where the
-	address is followed immediately by a period.
-	(g_url_web_end): Made more robust.
-	(g_url_scanner_scan): Oops. We need to set the match->pattern
-	string pointer to the correct pattern before executing the
-	start/end methods (as some of them rely on this info).
-
-2002-12-09  Jeffrey Stedfast  
-
-	* gmime/url-scanner.c: Don't need a hash table anymore.
-	(g_url_scanner_add): When adding a pattern to the trie, use the
-	array index as the pattern_id argument.
-	(g_url_scanner_scan): Use the matched_id set by g_trie_search() to
-	lookup the urlpattern_t instead of using a hash table.
-
-	* gmime/gtrie.c (g_trie_add): Now takes a pattern_id argument so
-	that we can avoid the use of GQuarks and thus save on unecessary
-	memory usage.
-	(g_trie_search): Instead of giving our caller back the pattern
-	string pointer, give him back the pattern id.
-
-2002-12-09  Jeffrey Stedfast  
-
-	* gmime/gtrie.c (g_trie_matches): Removed.
-	(g_trie_search): Fixed the FIXME.
-
-2002-12-09  Jeffrey Stedfast  
-
-	* gmime/gmime-filter-html.c: Modified to use url-scanner.c instead
-	of using glibc's regex routines. This has improved performance by
-	~16.5x not to mention that it is also more accurate than the regex
-	patterns had been (the url scanner can be setup to be much
-	stricter in the matching).
-
-	* gmime/url-scanner.c: New source file implementing a simple
-	expression scanner meant (currently designed for url matching)
-	which uses gtrie.
-
-	* gmime/gtrie.c: New source file implementing Aho-Corasick's Trie
-	graph algorithm.
-
-2002-12-08  Jeffrey Stedfast  
-
-	Fix for bug #91536
-
-	* gmime/gmime-object.c (g_mime_object_register_type): Use a struct
-	to hold the object_type for the subtype hash. 64 archs use 32bit
-	ints and so using GINT_TO_POINTER() and GPOINTER_TO_INT() doesn't
-	work.
-	(g_mime_object_new_type): Get the object_type from the subtype
-	bucket.
-
-2002-12-06  Jeffrey Stedfast  
-
-	* gmime/gmime-stream.c (g_mime_stream_writev): Pointer arithmetic
-	fixes.
-
-	* gmime/memchunk.c (memchunk_alloc): Pointer arithmetic fixes.
-
-2002-12-03  Jeffrey Stedfast  
-
-	* gmime/gmime-utils.c (datetok): Modified to properly handle when
-	the first char of a token is a special char (such as a '-') that
-	is also used as a token delimiter.
-
-2002-12-02  Jeffrey Stedfast  
-
-	* gmime/gmime-filter-html.c (g_mime_filter_html_init): match
-	REG_ICASE so we don't cut off at the first capital letter, duh.
-
-2002-12-01  Jeffrey Stedfast  
-
-	* gmime/gmime-utils.c: #define _GNU_SOURCE for isblank on GNU
-	systems.
-
-	* gmime/gmime-gpg-context.c (gpg_ctx_op_wait): Fixed the errno
-	saving.
-
-2002-11-21  Jeffrey Stedfast  
-
-	* gmime/gmime-message.c (write_received): After skipping the
-	special received token and it's value, skip any following comments
-	as well.
-	(skip_addrspec): Skip past the '.' and '@' chars before decoding
-	the next word or domain respectively.
-
-2002-11-20  Jeffrey Stedfast  
-
-	* gmime/gmime-message.c (write_received): New function to nicely
-	format Received headers.
-	(write_msgid): New writer function that doesn't fold the msg-id no
-	matter now long it is.
-	(g_mime_message_init): Override the writer functions for Received
-	and Message-Id headers. Should we also override the writer
-	function for Path headers to not wrap?
-
-	* gmime/internet-address.c (decode_addrspec): Get rid of an extra
-	call to decode_lwsp that wasn't needed.
-
-	* gmime/gmime-header.c (g_mime_header_register_writer): Renamed.
-
-2002-11-18  Jeffrey Stedfast  
-
-	* configure.in: Make sure to include -liconv on systems that need it.
-
-2002-11-17  Jeffrey Stedfast  
-
-	* configure.in: Check for gethostbyname in -lnsl and also bump the
-	version to 1.90.6.
-
-	* src/getopt*.[c,h]: Added for portability to non-GNU systems.
-
-	* gmime/gmime-parser.c (g_mime_parser_init): Initialize scan_from
-	and have_regex here instead of in parser_init() since we don't
-	want these flags to be reset when a new stream gets set.
-	(g_mime_parser_new_with_stream): New convenience function.
-
-2002-11-16  Jeffrey Stedfast  
-
-	* gmime/gmime-utils.c (decode_msgid): Eat the '<' before
-	continuing to parse the addr-spec.
-
-2002-11-14  Jeffrey Stedfast  
-
-	* gmime/gmime-content-type.c
-	(g_mime_content_type_new_from_string): #include
-	"gmime-table-private.h" and use is_ttoken() to correctly parse
-	type/subtype. Fixes bug #98463.
-
-2002-11-13  Jeffrey Stedfast  
-
-	* gmime/gmime-gpg-context.c (gpg_ctx_op_start): Don't bother
-	stat()ing gpg->path, if the file doesn't exist, the exec() call
-	will return immediately anyway.
-
-2002-11-13  Jeffrey Stedfast  
-
-	* configure.in: Bumped the version to 1.90.5.
-
-	* gmime/Makefile.am: Remove gmime-exception-list.def from the
-	EXTRAS.
-
-2002-11-12  Jeffrey Stedfast  
-
-	* doc/*: Updated.
-
-	* gmime/gmime-error.h: Added.
-
-	* gmime/gmime-multipart-encrypted.[c,h]: Use GError instead of
-	GMimeException.
-
-	* gmime/gmime-multipart-signed.[c,h]: Same.
-
-	* gmime/gmime-session.[c,h]: Here too.
-
-	* gmime/gmime-gpg-context.[c,h]: Don't use GMimeException anymore,
-	instead use GError.
-
-	* gmime/gmime-cipher-context.[c,h]: Same here.
-
-	* gmime/gmime.h.in: Remove gmime-exception.h and add gmime-error.h
-
-2002-11-09  Jeffrey Stedfast  
-
-	* configure.in: Generate src/Makefile.
-
-	* Makefile.am: Add src to the SUBDIRS.
-
-	* src/Makefile.am: Build uuencode and uudecode.
-
-	* src/uuencode.c: New source file emulating GNU shareutils'
-	uuencode.
-
-	* src/uudecode.c: New source file emulating GNU shareutils'
-	uudecode.
-
-2002-11-07  Jeffrey Stedfast  
-
-	* configure.in: Bumped the version to 1.90.4
-
-	* PORTING: New document meant to help developers port their
-	applications from gmime-1.0 to gmime-2.0.
-
-	* iconv-detect.c: Removed unused variables and #include 
-
-	* gmime/gmime-multipart.c
-	(g_mime_multipart_get_subpart_from_content_id): Init part to NULL.
-
-	* gmime/gmime-stream-cat.c (stream_write): Init n to -1 each time
-	through the outer loop.
-
-	* gmime/gmime-filter-strip.c: #include  for memcpy.
-
-	* gmime/gmime-filter-html.c (html_convert): Make sure to
-	initialise depth to 0 each loop so we don't use it uninitialised.
-
-2002-11-07  Jeffrey Stedfast  
-
-	* gmime*.[c,h]: Moved to gmime/ subdirectory. Also updated to
-	#include  instead of #include "some-header.h"
-
-	* test-*.c: Moved to tests/ subdirectory.
-
-2002-11-06  Jeffrey Stedfast  
-
-	* Makefile.am: Install headers to $(includedir)/gmime-2.0/gmime
-
-2002-11-04  Jeffrey Stedfast  
-
-	* gmime-filter-basic.c (g_mime_filter_basic_new_type): Set the
-	new->type to type.
-
-2002-11-01  Jeffrey Stedfast  
-
-	* gmime.h.in: Wrap in #ifdef __cplusplus
-
-	* gmime-filter-html.c (html_convert): If flush is TRUE, flush any
-	remaining input rather than backing it up.
-
-2002-10-31  Jeffrey Stedfast  
-
-	* gmime-gpg-context.c: Renamed stdin to stdin_fd, stdout to
-	stdout_fd, and stderr to stderr_fd to be more portable.
-
-2002-10-30  Jeffrey Stedfast  
-
-	* gmime-filter-html.c (html_convert): Rewrote to use regex for
-	url/addr extraction. Outputs more correct html now too.
-
-2002-10-18  Jeffrey Stedfast  
-
-	* gmime-stream-filter.c (stream_read): Change presize from an int
-	to a size_t to fix a 64bit cleanliness bug.
-	(stream_write): Same.
-
-2002-10-14  Jeffrey Stedfast  
-
-	* gmime-gpg-context.c (gpg_ctx_get_argv): Setup the import/export
-	command-line.
-	(gpg_ctx_op_step): Handle import/export errors.
-	(gpg_import_keys): Implemented.
-	(gpg_export_keys): Implemented.
-	(gpg_ctx_op_step): Don't do anything with gpg's stdin unless we
-	have something to write to it (exporting keys doesn't require
-	writing to gpg's stdin).
-
-2002-10-13  Jeffrey Stedfast  
-
-	* doc/*: Updated.
-
-	* gmime-utils.c (g_mime_utils_generate_message_id): New function
-	to generate a valid unique message-id string.
-
-2002-10-08  Jeffrey Stedfast  
-
-	Fixes to make g_mime_message_partial_split_message() use the
-	correct token as the id parameter.
-
-	* gmime-object.c (g_mime_object_set_content_id): Same as with
-	GMimeMessage::message_id.
-	(process_header): Same as process_header for gmime-message.c but
-	for content_id.
-
-	* gmime-message.c (process_header): Set only the addr-spec portion
-	of the msgid.
-	(g_mime_message_set_message_id): Treat the message_id passed in as
-	the addr-spec msgid (ie, as if it didn't contain <>'s).
-
-2002-10-02  Jeffrey Stedfast  
-
-	* gmime-gpg-context.c (gpg_import_keys): Renamed.
-	(gpg_export_keys): Renamed.
-
-	* gmime-cipher-context.c (g_mime_cipher_export_keys): Renamed to
-	be friendlier toward c++.
-	(g_mime_cipher_import_keys): Renamed to be similarly named with
-	the above function.
-
-2002-09-30  Jeffrey Stedfast  
-
-	* configure.in: Bumped version.
-
-	* Makefile.am: Don't install gmime.m4
-
-	* gmime.m4: Removed.
-
-2002-09-30  Jeffrey Stedfast  
-
-	* gmime-filter-charset.c (filter_filter): Rewritten, don't set
-	errno to 0 before calling iconv (we can't assume that on success
-	errno will not be set?). Also, don't grow the buffer here, save
-	any un-converted text in the backup buffer to be converted next
-	time through.
-	(filter_complete): Pick up the slack of filter_filter by
-	converting anything left over.
-
-2002-09-29  Jeffrey Stedfast  
-
-	* gmime-filter[c,h]: Ported to GObject.
-
-	* gmime-filter-basic.[c,h]:
-	* gmime-filter-best.[c,h]:
-	* gmime-filter-charset.[c,h]:
-	* gmime-filter-crlf.[c,h]:
-	* gmime-filter-from.[c,h]:
-	* gmime-filter-html.[c,h]:
-	* gmime-filter-strip.[c,h]:
-	* gmime-filter-yenc.[c,h]: Ported to the new GMimeFilter.
-
-	* gmime-data-wrapper.c (write_to_stream): Unref the filter after
-	adding it to the filtered stream.
-
-	* gmime-multipart-encrypted.c
-	(g_mime_multipart_encrypted_encrypt): Unref the filters once we've
-	added them to the filtered_stream.
-	(g_mime_multipart_encrypted_decrypt): And here.
-
-	* gmime-multipart-signed.c (g_mime_multipart_signed_sign): Unref
-	the filters once we've added them to the filtered_stream.
-	(g_mime_multipart_signed_verify): Same here.
-
-	* gmime-part.c (write_content): Unref the filter.
-	(g_mime_part_set_pre_encoded_content): Here too.
-
-	* gmime-stream-filter.c (g_mime_stream_filter_add): Ref the filter
-	here.
-	(g_mime_stream_filter_remove): Unref the filter.
-	(g_mime_stream_filter_finalize): Unref the filters here.
-
-2002-09-23  Jeffrey Stedfast  
-
-	* gmime-filter-charset.c: Try our best to handle EILSEQ (illegal
-	multibyte sequences) by eating the illegal bytes and
-	continuing. This seems to be what users expect (it's what Mozilla
-	seems to do).
-
-2002-09-15  Jeffrey Stedfast  
-
-	* gmime-charset.c (g_mime_charset_name): Don't g_assert after
-	using strtoul on the iso charset name, seems that some news
-	clients use 'isolatin' as if it were a real charset (it's not) and
-	we don't want to abort() on this.
-
-2002-09-14  Jeffrey Stedfast  
-
-	* doc/*: Updated.
-
-	* gmime-utils.c (g_mime_utils_decode_message_id): New function to
-	decode a message-id as defined by rfc822.
-	(g_mime_references_decode): New function to decode a references or
-	in-reply-to header.
-	(g_mime_references_append): New function to append a raw
-	message-id to a GMimeReferences list.
-	(g_mime_references_clear): New function to clear a GMimeReferences
-	list.
-
-	* internet-address.c (decode_addrspec): New function to parse an
-	addr-spec needed by the msg-id decoder.
-	(decode_lwsp): Make public.
-	(decode_word): Same.
-
-2002-09-08  Jeffrey Stedfast  
-
-	* gmime-utils.c (parse_broken_date): Wrap printfs in d() to
-	prevent them from printing anything unless debugging is turned on.
-
-2002-09-03  Jeffrey Stedfast  
-
-	* gmime-utils.c (get_tzone): Fixed to not get false positives when
-	the token is shorter than the actual timezone string (but matches
-	the first little bit of it).
-
-2002-09-03  Tomasz K³oczko  
-
-	* Makefile.am: fixes for automake >= 1.5 (removed duplicated
-	variables) and few minor cleanups and better method for install gmime
-	aclocal macros.
-
-	* doc/Makefile.am: fixes for "make install DESTDIR=".
-
-2002-09-01  Jeffrey Stedfast  
-
-	* internet-address.c (decode_mailbox): When erroring out due to no
-	local part in the add-spec, set *in to inptr + 1 so we don't get
-	into an infinite loop.
-
-	* gmime-message-part.c (message_part_remove_header): Same as
-	below.
-
-	* gmime-multipart.c (multipart_remove_header): Same as
-	gmime-part.c
-
-	* gmime-part.c (mime_part_remove_header): Don't return anything
-	here since our function is supposed to return void.
-
-2002-08-31  Jeffrey Stedfast  
-
-	* gmime-parser.c (parser_scan_mime_part_content): Pass `content'
-	into parser_scan_content(), fixes bug #92183.
-
-2002-08-30  Jeffrey Stedfast  
-
-	* configure.in: Bumped version to 1.90.1
-
-	* doc/Makefile.am: Don't gtkdoc-fixxref if the user disabled
-	gtk-doc from the build.
-
-2002-08-25  Jeffrey Stedfast  
-
-	* test-best.c: New test suite for the gmime-filter-best filter.
-
-	* gmime.h.in: Added gmime-filter-best.h
-
-	* gmime-filter-best.c (g_mime_filter_best_charset): Never return
-	NULL, instead return us-ascii.
-	(filter_filter): Fixed to not get into an infinite loop.
-
-2002-08-23  Jeffrey Stedfast  
-
-	* doc/*: Updated.
-
-	* gmime-message-part.c (message_part_write_to_stream): Changed the
-	prototype to return ssize_t and not int.
-
-2002-08-21  Jeffrey Stedfast  
-
-	* gmime-filter-best.c: New filter for calculating the best charset
-	and encoding for a stream.
-
-	* gmime-iconv-utils.c (g_mime_iconv_locale_to_utf8): Make
-	threadsafe.
-	(g_mime_iconv_locale_to_utf8_length): Same.
-	(g_mime_iconv_utf8_to_locale): Here too.
-	(g_mime_iconv_utf8_to_locale_length): And here.
-
-	* gmime.c (g_mime_init): Updated to call
-	g_mime_charset_map_init().
-
-	* gmime-charset.c (g_mime_charset_locale_name): Initialize the
-	charset map if it hasn't already been initialized.
-	(g_mime_charset_map_init): Renamed from g_mime_charset_init().
-	(g_mime_charset_init): Renamed from charset_init() and also made
-	it globally accessable.
-	(g_mime_charset_step): New external function (was an internal
-	function before).
-	(g_mime_charset_best_name): Now an external function also.
-
-2002-08-19  Jeffrey Stedfast  
-
-	* gmime-gpg-context.c (gpg_decrypt): Report better errors for when
-	gpg fails to be executed.
-	(gpg_encrypt): Same.
-	(gpg_verify): Here too.
-	(gpg_sign): And here.
-	(gpg_ctx_op_start): Try stat()ing the gpg binary to make sure it
-	exists and when handling an exception, save errno so we can re-set
-	it after cleanup.
-
-2002-08-11  Jeffrey Stedfast  
-
-	* gmime-iconv.c: Instead of checking for #ifdef _REENTRANT, just
-	check #ifdef G_THREADS_ENABLED and use a GStaticMutex rather than
-	a pthread_mutex_t.
-
-	* gmime-charset.c (g_mime_charset_init): Use nl_langinfo() if it
-	is available.
-	(g_mime_charset_name): Call g_mime_charset_init() if
-	iconv_charsets is NULL (meaning the programmer did not properly
-	initialize gmime). Also do mutex locking around the use of the
-	iconv_charset hash table.
-
-2002-08-10  Jeffrey Stedfast  
-
-	* test-pgpmime.c (test_multipart_signed): Unref the content object
-	after setting it on the MIME part.
-
-	* gmime-multipart-signed.c (g_mime_multipart_signed_sign): Unref
-	the content object after setting it on the MIME part.
-	(g_mime_multipart_signed_verify): Unref the content object after
-	we're done with it.
-
-	* gmime-multipart-encrypted.c
-	(g_mime_multipart_encrypted_encrypt): Unref the content object
-	after setting it on the MIME part.
-	(g_mime_multipart_encrypted_decrypt): Unref the content object
-	after we're done with it.
-
-	* gmime-message-partial.c
-	(g_mime_message_partial_reconstruct_message): Unref the content
-	object when we're done with it.
-	(g_mime_message_partial_split_message): Unref the content object
-	after setting it on the MIME part.
-
-	* gmime-parser.c (parser_scan_mime_part_content): Unref the
-	content object after setting it on the MIME part.
-
-	* gmime-part.c (g_mime_part_set_content_object): Ref the new
-	content object and unref the old.
-	(g_mime_part_get_content_object): Ref the content object before
-	returning it to our caller.
-	(g_mime_part_finalize): Unref the content object.
-
-	* gmime-data-wrapper.c: Rewritten to subclass GObject.
-	(g_mime_data_wrapper_destroy): Removed.
-	(g_mime_data_wrapper_write_to_stream): Virtualize.
-
-2002-08-08  Jeffrey Stedfast  
-
-	* gmime-iconv.c: Implemented an all new iconv cache. Also has the
-	beginnings of thread-safety but I'd really need to fix the
-	Makefiles to conditionally link with -lpthread before it'd be of
-	any value as well as needing to make gmime-charset.c's functions
-	thread-safe.
-
-2002-08-07  Jeffrey Stedfast  
-
-	* gmime-message.c (message_remove_header): If the header to be
-	removed is one of the special headers, then g_free() the cached
-	value on the message object and set it to NULL. Fixes bug #90138.
-
-2002-08-05  Jeffrey Stedfast  
-
-	* doc/*: Updated.
-
-	* gmime-multipart-signed.c (g_mime_multipart_signed_sign):
-	Documented.
-	(g_mime_multipart_signed_verify): Documented.
-
-	* gmime-filter-from.c (g_mime_filter_from_new): Updated the
-	documentation to explain the new mode argument.
-
-	* gmime-multipart-encrypted.c
-	(g_mime_multipart_encrypted_encrypt): Documented.
-	(g_mime_multipart_encrypted_decrypt): Documented.
-
-	* gmime-gpg-context.c (g_mime_gpg_context_get_always_trust):
-	Implemented.
-
-2002-08-04  Jeffrey Stedfast  
-
-	* doc/*: Updated.
-
-2002-08-03  Jeffrey Stedfast  
-
-	* gmime-message.c (g_mime_message_set_message_id): Revert Charles'
-	previous fix and just g_return_if_fail() if the message_id is NULL
-	instead.
-	(g_mime_message_set_subject): Same for NULL subjects.
-	(g_mime_message_set_reply_to): Here too.
-	(g_mime_message_set_sender): Again here.
-	(g_mime_message_add_header): Check that the value != NULL.
-	(g_mime_message_set_header): Same here.
-
-	* internet-address.c (decode_mailbox): Changed a for-loop into a
-	while-loop to make the code a tad easier to read. Also fixed a
-	type-o that meant to wrap a debug printf in d(). While we're at
-	it, g_strstrip the resulting comment before using it as the name
-	part of the address.
-
-2002-08-02  Jeffrey Stedfast  
-
-	* gmime-message-part.c: Fix some comments that say "message/*"
-	(which is meant as a wildcard mime-type match) and change them to
-	just "message" to prevent compiler warnings about a /* being
-	inside a comment.
-
-	* gmime-charset.c: Get rid of a #include "unicode.h". This is no
-	longer needed since we use glib2's unicode stuff.
-
-2002-08-02  Charles Kerr 
-
-	* gmime-message.c (gmime_message_foreach_part): if the message
-	isn't a multipart message, just invoke the callback directly,
-	passing in the single part.
-
-	* gmime-message.c (gmime_message_set_message_id): work around
-	a g_strstrip() warning if message_id is NULL.
-
-	* gmime-part.c (g_mime_part_get_content_object): remove "const"
-	from the retval; otherwise it's impossible to add a new filter.
-
-2002-07-31  Jeffrey Stedfast  
-
-	* gmime-filter-html.c (is_addr_char): Don't use "isprint(c)" to
-	mean "c >= 32 && c < 128" since it doesn't in most locales.
-	(is_url_char): Same.
-	(is_trailing_garbage): Same.
-	(is_domain_name_char): New macro for dns-valid characters
-	(email_address_extract): Use is_domain_name_char rather than
-	is_addr_char for the part after the @.
-
-2002-07-30  Jeffrey Stedfast  
-
-	* gmime-parser.c (parser_step_headers): Finish the fix from
-	yesterday, the last statement of the while-loop needs to
-	re-calculate `len' for parser_fill().
-
-2002-07-30  Charles Kerr 
-
-	* gmime-message.c (message_remove_header): Fix April 3 2002 bug
-	that kept message-remove-header from removing headers.
-
-2002-07-29  Jeffrey Stedfast  
-
-	* gmime-message.c (message_get_headers): Write the toplevel MIME
-	Part's headers to the string as well, this fixes bug #88632 in
-	bugzilla.gnome.org.
-
-2002-07-29  Jeffrey Stedfast  
-
-	The following changes are meant to address bug #88100 on
-	bugzilla.gnome.org - I'm as of yet unsure whether or not GMime
-	should override the Message-Id write function or if Pan should do
-	it. I'm sort of leaning towards Pan doing it simply because the
-	current behavior is RFC compliant and the bug is really a "we need
-	a workaround for a buggy NNTP server". However... It might just be
-	simpler to have GMime do it.
-
-	* gmime-header.c (g_mime_header_new): Init a new hash table that
-	stores info on how to write a particular header.
-	(g_mime_header_destroy): Free the hash table.
-	(g_mime_header_set_write_func): Set the writer function for a
-	header.
-	(g_mime_header_write_to_stream): Use the specified header write
-	function for each ehader. If one wasn't specified, use the
-	default.
-
-2002-07-29  Charles Kerr  
-
-	* remove strlib.[ch]
-	* use g_strcasecmp instead of strcasecmp
-	* use g_strncasecmp instead of strncasecmp
-	* use g_stpcpy instead of stpcpy
-	* added "#include " where needed
-
-2002-07-29  Charles Kerr  
-
-	* gmime-filter-strip: fix trivial compiler warning.
-	* gmime-message-part.c: same.
-	* gmime-multipart-signed.c: same.
-	* gmime-object.c: same.
-	* gmime-param.c: same.
-	* gmime-session.c: same.
-	* test-iconv.c: same.
-	* test-mbox.c: same.
-	* test-parser.c: same.
-	* test-partial.c: same.
-
-2002-07-29  Jeffrey Stedfast  
-
-	* gmime-parser.c (parser_step_headers): When refilling, make sure
-	that the refilled buffer is larger than the buffer was before
-	refilling, otherwise break out of the loop and parse whatever is
-	left. Fixes bug #89260 on bugzilla.gnome.org
-
-2002-07-27  Jeffrey Stedfast  
-
-	* gmime-stream-cat.c (stream_read): Initialize `n' at the
-	beginning of the while-loop so that it can't be used
-	uninitialized.
-
-	* gmime-parser.c (header_parse): Check to make sure that the
-	header was valid (ie, `colon' == ':'). If not, then set
-	header->value to "".
-
-2002-05-26  Charles Kerr 
-
-	* alloca.c: removed.
-	* gmime-charset.c: use g_alloca instead of alloca.
-	* gmime-filter-from.c: same.
-	* gmime-filter-strip.c: same.
-	* gmime-iconv.c: same.
-	* gmime-param.c: same.
-	* gmime-part.c: same.
-	* gmime-utils.c: same.
-	* memchunk.c: same.
-
-2002-07-21  Jeffrey Stedfast  
-
-	* gmime-filter-crlf.c (filter_filter): Fix to not add an extra \r
-	for pre-canonicalised streams.
-
-2002-07-19  Jeffrey Stedfast  
-
-	* gmime-iconv-utils.c (g_mime_iconv_strndup): Fix a logic mistake
-	in the calculation of the number of bytes converted.
-
-2002-07-18  Jeffrey Stedfast  
-
-	* gmime-part.c (set_disposition): Fix to parse the disposition
-	parameter values rather than assuming it is only the "attachment"
-	or "inline" part of the value.
-
-2002-07-14  Jeffrey Stedfast  
-
-	* configure.in: check for gmtime_r
-
-	* gmime-utils.c (g_mime_utils_header_format_date): Use gmtime_r() if
-	we have this function available to us.
-
-	* gmime-parser.c (parser_step_from): Save the From-line offset.
-	(g_mime_parser_get_from_offset): Newly implemented function used
-	for retrieving the offset of the From-line (for use when parsing
-	mbox files).
-
-2002-07-11  Jeffrey Stedfast  
-
-	* strlib.c (strlcpy): Changed to behave the same as the Solaris
-	strlcpy function.
-	(strlcat): Changed to behave the same as the Solaris strlcat
-	function.
-
-2002-07-04  Jeffrey Stedfast  
-
-	* gmime-iconv-utils.c (g_mime_iconv_strndup): Fix for
-	nul-terminating some multibyte charsets.
-
-2002-06-28  Jeffrey Stedfast  
-
-	* gmime-gpg-context.c (gpg_ctx_op_step): If we get an EOF from the
-	status-fd, then set gpg->complete to TRUE.
-	(gpg_ctx_get_argv): Use --charset=UTF-8 and --keyserver-options to
-	disable auto-key-retrieve rather than the deprecated
-	--no-auto-key-retrieve flag.
-
-2002-06-27  Jeffrey Stedfast  
-
-	* gmime-gpg-context.c (gpg_ctx_op_step): Loop on our reads while
-	errno is EINTR or EAGAIN. Also make sure to completely read stdout
-	and stderr by keeping better state.
-	(gpg_ctx_parse_status): If we encounted a NODATA error from gpg
-	and we have diagnostics output, use that as the exception string.
-	(gpg_ctx_op_exited): New function to determine if the gpg process
-	has exited.
-	(gpg_ctx_op_wait): Reuse any exit status information from
-	gpg_ctx_op_exited().
-	(gpg_verify): Check that the gpg process has not exited each loop.
-
-2002-06-26  Jeffrey Stedfast  
-
-	* gmime-multipart-signed.c (g_mime_multipart_signed_sign): Once
-	we've created the mime-part stream and armored the From lines and
-	such, create a new MIME part based on this stream (since normally
-	our QP encoder will not armor From lines) and use it as the
-	content part for this multipart/signed part rather than the
-	original MIME part.
-	(multipart_signed_write_to_stream): This can now be simplified by
-	calling our parent class's write_to_stream implementation since
-	g_mime_multipart_signed_sign() takes care of all the From
-	armoring.
-
-2002-06-26  Jeffrey Stedfast  
-
-	* test-pgpmime.c: New test suite for the pgp/mime code.
-
-	* gmime-gpg-context.c (gpg_ctx_parse_status): Handle a NODATA
-	status message from gpg.
-
-	* gmime-message.c (g_mime_message_new): Don't set NULL header
-	values via the g_mime_object_set_header interface.
-
-	* gmime-object.c (g_mime_object_add_header): Don't allow value == NULL.
-	(g_mime_object_set_header): Same.
-
-	* gmime.h.in: Updated to #include the new headers related to
-	encryption and digital signatures.
-
-	* gmime.c (g_mime_init): register the multipart/encrypted and
-	multipart/signed cclass types.
-
-	* gmime-multipart-signed.c: Fixed to compile cleanly.
-	(multipart_signed_write_to_stream): We need to handle writing out
-	the subparts ourselves because we need to armor From-lines.
-
-	* gmime-multipart-encrypted.c: Fixed to compile cleanly.
-
-2002-06-25  Jeffrey Stedfast  
-
-	* gmime-param.c (g_string_append_len_quoted): Append length as
-	advertised rather than appending the whole string. Oops.
-
-	* gmime-multipart-encrypted.c
-	(g_mime_multipart_encrypted_decrypt): Ugh, the
-	g_return_val_if_fail()'s should be returning NULL.
-
-	* test-pgp.c: New test suite to make sure that the gpg code works.
-
-	* gmime-gpg-context.c: Keep more state as it seems we needed
-	it. Also keep information such as trust level and whether the
-	signature was found to be valid and such (in case we ever decide
-	to use it).
-
-2002-06-24  Jeffrey Stedfast  
-
-	* gmime-multipart-signed.c (g_mime_multipart_signed_get_type):
-	Register as a subclass of a GMimeMultipart.
-
-	* gmime-multipart-encrypted.c
-	(g_mime_multipart_encrypted_get_type): Same.
-
-	* gmime-gpg-context.[c,h]: A new class implementing the
-	GMimeCipherContext interfaces for GnuPG.
-
-	* gmime-session.[c,h]: New abstract session class for use by the
-	cipher context classes for requesting passphrases/etc.
-
-	* gmime-cipher-context.c (g_mime_cipher_context_finalize): Unref
-	the gmime-session.
-
-2002-06-22  Jeffrey Stedfast  
-
-	* gmime-part.c: Oops, a prototype had the wrong return type.
-
-2002-06-19  Jeffrey Stedfast  
-
-	* gmime-multipart.c: Oops, some prototypes had the wrong return
-	type.
-
-2002-06-15  Jeffrey Stedfast  
-
-	* gmime-parser.c (parser_scan_mime_part_content): Use
-	g_mime_stream_mem_new_with_byte_array() so that the mem stream
-	owns the byte array so we don't leak.
-
-2002-06-12  Jeffrey Stedfast  
-
-	* gen-table.c: Updated.
-
-	* gmime-utils.c (quoted_decode): Oops. ESPECIALs are allowed
-	inside of the encoded-text section of the encoded-word.
-
-	* gmime-message.c (process_header): Add some NULL-protection.
-
-	* gmime-iconv.c (g_mime_iconv_open): If the from charset is
-	"x-unknown", replace it with the user's locale charset.
-
-2002-06-11  Jeffrey Stedfast  
-
-	* gmime-parser.c (parser_scan_mime_part_content): If the parser
-	stream is not seekable, then scan the content into a memory
-	stream.
-
-2002-06-09  Jeffrey Stedfast  
-
-	* gmime-2.0.pc.in: New file for use in pkg-config.
-
-	* gmime-filter-strip.[c,h]: New source files implementing a stream
-	filter for stripping trailing whitespace from lines (needed for
-	PGP/MIME).
-
-	* gmime-exception.[c,h]: New source files implementing generic
-	error reporting functionality.
-
-	* gmime-cipher-context.[c,h]: New abstract class for performing
-	common functionality (such as encryption, decryption, signing,
-	verifying, importing keys, and exporting keys) needed by any MIME
-	cipher suite (PGP/MIME and S/MIME specifically).
-
-	* gmime-multipart-signed.[c,h]: New source files implementing the
-	multipart/signed specification.
-
-	* gmime-multipart-encrypted.[c,h]: New source files implementing
-	the multipart/encrypted specification.
-
-2002-06-06  Jeffrey Stedfast  
-
-	* test-mbox.c (test_parser): Test the new set_header_regex
-	function.
-
-	* gmime-parser.c (g_mime_parser_set_header_regex): New convenience
-	function to allow an application to be notified when a header
-	matching a particular pattern is parsed by the
-	parser. Particularly useful for finding the Status: header when
-	parsing mbox files.
-
-2002-06-04  Jeffrey Stedfast  
-
-	* gmime-iconv-utils.c (g_mime_iconv_strndup): Pull up past fixes
-	from the gmime-1 branch.
-
-2002-06-02  Jeffrey Stedfast  
-
-	* gmime.c (g_mime_init): Register the message-part class.
-
-	* gmime-message-part.c: New class for handling message/* subparts.
-
-	* gmime-parser.c (parser_scan_message_part): Handle mime parts of
-	type message.
-	(parser_construct_leaf_part): Find out if the leaf part is
-	actually a message part.
-
-	* gmime-filter-from.c (g_mime_filter_from_new): Now takes a mode
-	argument to specify how "From "'s should be protected.
-	(filter_filter): If we are to armor the "From " then transform it
-	into "=46rom " otherwise transform it into the normal ">From ".
-
-2002-05-31  Jeffrey Stedfast  
-
-	* gmime/gmime-stream-cat.c (stream_read): Rewritten to work
-	correctly. This was broken worse than I could imagine :-)
-	(stream_write): Fix similarly.
-
-2002-05-30  Jeffrey Stedfast  
-
-	* gmime-stream-cat.c (stream_reset): Same.
-
-	* gmime-stream-file.c (stream_reset): Same.
-
-	* gmime-stream-fs.c (stream_reset): If the stream position is
-	already reset, just return 0.
-
-2002-05-23  Jeffrey Stedfast  
-
-	* doc/*: Updated documentation.
-
-2002-05-22  Jeffrey Stedfast  
-
-	* gmime-multipart.c (multipart_write_to_stream): Avoid adding an
-	extranious newline character when a preface doesn't exist.
-
-2002-05-20  Jeffrey Stedfast  
-
-	* gmime-part.c (g_mime_part_set_content_md5): Fix some compiler
-	warnings as well as doing some more error handling.
-	(g_mime_part_verify_content_md5): Same.
-
-	* md5-utils.c: Removed some compiler warnings.
-
-2002-05-20  Jeffrey Stedfast  
-
-	* gmime-stream-cat.c (stream_seek): Return the absolute offset
-	into the cat stream rather than the relative offset of one of the
-	substreams on success. Fixed a few other things too.
-	(stream_read): Fix the logic here so that we never try reading
-	from a stream that is current at EOS.
-
-2002-05-16  Jeffrey Stedfast  
-
-	* gmime-parser.c (parser_scan_mime_part_content): Only compensate
-	for the '\n' if we found a boundary.
-
-2002-05-16  Charles Kerr 
-
-	* gmime-filter-yenc.c: fixed regression that caused end line of
-	yenc encoding to not be detected.  This was causing crc errors in Pan.
-
-2002-05-14  Jeffrey Stedfast  
-
-	* gmime-stream-filter.c (stream_destroy): Removed.
-
-2002-05-12  Jeffrey Stedfast  
-
-	* gmime-stream-cat.c (stream_read): Don't allow our caller to read
-	past the end of the stream.
-	(stream_write): Same.
-	(stream_seek): Don't forget to add the current source stream's
-	bound_start when seeking on the current source stream.
-
-	* gmime-message-partial.c (g_mime_message_partial_init): Zero our
-	extra fields.
-	(g_mime_message_partial_finalize): Cleanup strdup'd memory.
-	(message_partial_set_content_type): Implemented.
-	(g_mime_message_partial_class_init): Override set_content_type().
-	(g_mime_message_partial_get_id): Simplify.
-	(g_mime_message_partial_get_number): Simplify.
-	(g_mime_message_partial_get_total): Simplify.
-
-	* gmime-multipart.c (multipart_set_content_type): Implement.
-	(g_mime_multipart_class_init): Override set_content_type().
-
-	* gmime-object.c: Make set_content_type() virtual.
-
-2002-05-12  Jeffrey Stedfast  
-
-	* gmime-message-partial.c (partial_compare): Fixed to work
-	properly.
-
-2002-05-12  Jeffrey Stedfast  
-
-	* test-partial.c: New test suite for gmime-message-partial.c.
-
-	* gmime-stream-cat.c: Several fixes.
-	(g_mime_stream_cat_class_init): Overload the seek method.
-
-	* gmime-stream-mmap.c (g_mime_stream_mmap_class_init): Overload
-	the seek method.
-
-	* gmime-stream-buffer.c (g_mime_stream_buffer_class_init):
-	Overload the seek method.
-
-	* gmime-stream-null.c (g_mime_stream_null_class_init): Overload
-	the seek method.
-
-	* gmime-stream-filter.c (g_mime_stream_filter_class_init):
-	Overload the seek method.
-
-	* gmime-stream.c (g_mime_stream_class_init): Overload the seek
-	method.
-
-	* gmime-stream-mem.c (g_mime_stream_mem_class_init): Overload the
-	seek method.
-
-	* gmime-stream-file.c (g_mime_stream_file_class_init): Overload
-	the seek method.
-	(stream_length): The length of the stream is bound_end -
-	bound_start.
-
-	* gmime-stream-fs.c (g_mime_stream_fs_class_init): Overload the
-	seek method.
-	(stream_length): The length of the stream is bound_end -
-	bound_start.
-
-2002-05-10  Jeffrey Stedfast  
-
-	* gmime-stream-cat.c (stream_reset): Use stream_seek().
-	(stream_read): Seek to position before starting our read, this is
-	to protect against one of our source streams being read while we
-	weren't looking and/or a substream related to our cat stream.
-	(stream_write): Same.
-
-2002-05-09  Jeffrey Stedfast  
-
-	* gmime-message-partial.c: New class to handle MIME parts with a
-	content-type of message/partial.
-
-	* gmime.c (g_mime_init): Register the message/partial class.
-
-	* gmime-object.c (g_mime_object_new_type): If we fail to find an
-	appropriate mime object class, try falling back to the */*
-	handler. Only if that fails do we return NULL.
-
-2002-05-08  Jeffrey Stedfast  
-
-	* Makefile.am: Added gmime-stream-cat.c to the build.
-
-	* gmime-stream-cat.c: New stream that acts similar to the Unix
-	`cat` command by concatenating multiple streams.
-
-2002-05-07  Jeffrey Stedfast  
-
-	* gmime-stream-fs.c (stream_write): Do more error handling and
-	also try to write out everything.
-
-2002-05-02  Jeffrey Stedfast  
-
-	* gmime-charset.c (main): Generate the multibyte charsets without
-	the need for using external .dat files. Also attempt to condense
-	the charset-map table a bit.
-
-	* gen-multibyte.c: Removed.
-
-2002-04-30  Jeffrey Stedfast  
-
-	* gmime-charset.c (main): Instead of converting the multibyte
-	charset tables to UTF-8 and then using the unicode functions to
-	convert UTF-8 to UCS4, just convert directly to UCS4. Also fixed a
-	type-o in the Big5.dat filename (it should be Big5.dat not
-	Big5.data).
-
-2002-04-26  Jeffrey Stedfast  
-
-	* gmime-parser.c (parser_fill): Try to align the end of our
-	left-over buffer with realbuf + SCAN_HEAD so that we avoid: 1)
-	completely filling the prespace or 2) reading more than SCAN_BUF
-	bytes per read() call.
-
-2002-04-25  Jeffrey Stedfast  
-
-	* gmime-utils.c (g_mime_utils_base64_decode_step): Only backtrack
-	if we have output data.
-
-2002-04-23  Jeffrey Stedfast  
-
-	* gmime-utils.c (rfc2047_encode_phrase): Fixed a small memory
-	leak. Thanks to the Pan guys for finding this.
-
-2002-04-21  Jeffrey Stedfast  
-
-	* gmime-parser.c (parser_step_from): Fixes to make it work.
-	(g_mime_parser_eos): New function to tell if a parser is at the
-	end of it's stream.
-
-2002-04-20  Jeffrey Stedfast  
-
-	* docs/*: Updated.
-
-	* configure.in: Add $srcdir to the include path so it catches
-	iconv-detect.h.
-
-2002-04-18  Jeffrey Stedfast  
-
-	* gmime-parser.c (parser_step_headers): Take advantage of the same
-	optimization as parser_scan_content.
-
-2002-04-17  Jeffrey Stedfast  
-
-	* gmime-parser.c (parser_scan_content): Optimized by a good 15% by
-	simply changing my inner while-loop. See comment for explanation.
-
-	* gmime-part.c (g_mime_part_encoding_from_string): Added support
-	for the binary encoding.
-	(g_mime_part_encoding_to_string): Same.
-
-	* gmime-utils.h: Added GMIME_PART_ENCODING_BINARY.
-
-2002-04-17  Jeffrey Stedfast  
-
-	* gmime-parser.c (parser_scan_multipart_subparts): Don't leak
-	objects!
-
-2002-04-16  Jeffrey Stedfast  
-
-	* gmime-message.c (process_header): process the headers we care
-	about.
-	(message_add_header): Call process_header.
-	(message_set_header): Same.
-
-	* gmime-part.c (process_header): process the headers we care
-	about.
-	(mime_part_add_header): Call process_header.
-	(mime_part_set_header): Same.
-
-	* gmime-object (process_header): process the headers we care
-	about.
-	(add_header): Call process_header.
-	(set_header): Same.
-
-2002-04-15  Jeffrey Stedfast  
-
-	* gmime-parser.c (g_mime_parser_set_scan_from): New accessor
-	method to set whether or not to scan from-lines.
-	(g_mime_parser_get_scan_from): New accessor method to get the
-	from-line mode.
-
-2002-04-14  Jeffrey Stedfast  
-
-	* gmime-utils.c (datetok): Treat ',' as a token delimeter. Also
-	updated the datetok lookup table.
-
-	* configure.in: Check for off_t, size_t, and ssize_t.
-
-2002-04-15  Jeffrey Stedfast  
-
-	* gmime-parser.[c,h]: Brand spankin' new parser. Seems to work for
-	at least simple messages, needs a lot more love though.
-
-	* gmime-stream*.c: Don't use a base_class init or finalize.
-
-	* gmime-object.c: Same.
-
-	* gmime-part.c: Same here.
-
-	* gmime.c (g_mime_init): Call g_type_init.
-
-	* gmime-utils.c (g_mime_utils_header_fold): Slight bugfix to get
-	rid of extra whitespace at the end of a line.
-
-	* gmime-multipart.c (g_mime_multipart_set_preface): New accesor
-	function to set the multipart preface.
-	(g_mime_multipart_get_preface): New accesor function to get the
-	multipart preface.
-	(g_mime_multipart_set_postface): New accesor function to set the
-	multipart postface.
-	(g_mime_multipart_get_postface): New accesor function to get the
-	multipart postface.
-	(write_to_stream): Don't force a preface if we don't have one.
-
-2002-04-08  Jeffrey Stedfast  
-
-	* gmime-object.c: Don't tie the type-registry lifetime to the
-	GMimeObject lifetime.
-
-	* gmime.c (g_mime_init): Register our generic and multipart/* MIME
-	object classes here.
-
-	* gmime-part.c (g_mime_part_class_init): Don't register ourselves
-	here anymore.
-
-	* gmime-multipart.c (g_mime_multipart_class_init): Don't register
-	ourselves here anymore.
-
-2002-04-07  Jeffrey Stedfast  
-
-	* gmime-utils.c (g_mime_utils_uuencode_close): Fixed a bug that
-	crept in during my simplification.
-
-2002-04-07  Jeffrey Stedfast  
-
-	* gmime-part.c (g_mime_part_set_content_id): Wrap the object
-	set_content_id.
-	(g_mime_part_get_content_id): Same.
-
-	* gmime-multipart.c
-	(g_mime_multipart_get_subpart_from_content_id): Compare the
-	object->content_id's.
-
-	* gmime-object.c (g_mime_object_set_content_id): New function
-	since the Content-Id should really be stored on the object class.
-	(g_mime_object_get_content_id): Same.
-	(set_header): If we are setting the Content-Id header, also set
-	our internal content_id member.
-	(add_header): Same.
-
-	* gmime-content-type.c (g_mime_content_type_set_parameter):
-	Renamed from g_mime_content_type_add_parameter.
-
-	* gmime-multipart.c (g_mime_multipart_new_with_subtype): New
-	convenience function.
-
-	* Makefile.am temporarily removed gmime-parser.c from the
-	build. It needs to be completely rewritten from scratch pretty
-	much.
-
-2002-04-06  Jeffrey Stedfast  
-
-	* gmime-part.c (g_mime_part_add_subpart): Removed.
-	(g_mime_part_set_boundary): Removed.
-	(g_mime_part_get_boundary): Removed.
-
-	* gmime-object.c (g_mime_object_get_content_type_parameter): New
-	function.
-	(g_mime_object_set_content_type_parameter): New function.
-
-	* gmime-multipart.c (g_mime_multipart_new): New function, forgot
-	to implement it before ;-)
-	(multipart_set_boundary): Set the boundary parameter on the
-	content-type.
-
-2002-04-06  Jeffrey Stedfast  
-
-	* gmime-part.c (g_mime_part_foreach): Removed.
-	(g_mime_part_get_subpart_from_content_id): Same.
-
-	* gmime-multipart.c (g_mime_multipart_foreach): Moved here from
-	gmime-part.c:g_mime_part_foreach since this is really only meant
-	to work on multiparts.
-	(g_mime_multipart_get_subpart_from_content_id): Same idea here too.
-
-	* gmime-object.c (g_mime_object_set_content_type): Move
-	g_mime_part_set_content_type up to the GMimeObject abstraction.
-	(g_mime_object_get_content_type): Same.
-
-2002-04-03  Jeffrey Stedfast  
-
-	* gmime-message.c: Initial port to GObject.
-
-2002-04-02  Jeffrey Stedfast  
-
-	* gmime-message.c (g_mime_message_add_recipients_from_string):
-	Destroy the temporary addrlist.
-
-2002-03-29  Jeffrey Stedfast  
-
-	* configure.in: Detect the iconv-friendly formats for iso charsets
-	at configure time and dump them into iconv-detect.h for use in
-	gmime-charset.c.
-
-	* gmime-charset.c: Updated to use iconv-detect.h if it exists.
-
-2002-03-25  Jeffrey Stedfast  
-
-	* gmime-multipart.c: Compile fixes.
-
-	* gmime-header.c (g_mime_header_write_to_stream): Now returns the
-	number of bytes written or -1 on fail.
-
-	* gmime-object.c: Compile fixes.
-
-	* gmime-stream-null.c (g_mime_stream_null_finalize): And finally
-	here.
-
-	* gmime-stream-mmap.c (g_mime_stream_mmap_finalize): Here too.
-
-	* gmime-stream-mem.c (g_mime_stream_mem_finalize): And again...
-
-	* gmime-stream-fs.c (g_mime_stream_fs_finalize): Again here.
-
-	* gmime-stream-filter.c (g_mime_stream_filter_finalize): Here too.
-
-	* gmime-stream-file.c (g_mime_stream_file_finalize): Same.
-
-	* gmime-stream-buffer.c (g_mime_stream_buffer_finalize): Call
-	GObject's finalize function.
-
-2002-03-24  Jeffrey Stedfast  
-
-	* memchunk.c: Make this compile.
-
-	* internet-address.c (decode_mailbox): No longer check
-	gmime_interfaces_utf8 as that was a hack in gmime-1's branch.
-
-	* gmime-charset.c (charset_step): Sync with the gmime-1 branch. We
-	now have multibyte charset detection.
-
-	* gmime-utils.c: Sync with gmime-1's changed.
-	(rfc2047_decode_word): Always convert decoded text to UTF-8.
-	(rfc2047_encode_phrase_get_words): We can always assume our input
-	is in UTF-8 now.
-	(rfc2047_encode_phrase): Sam here.
-	(g_string_append_len): Removed since glib2 now has this function.
-
-	* gmime-param.c (decode_param): Make sure the decoded text is
-	valid UTF-8.
-	(encode_param): Convert to the best charset before encoding.
-	(g_string_append_len): Removed since glib2 now has this function.
-
-	* gmime.c (g_mime_init): Initializes gmime. We no longer care
-	about GMIME_INIT_FLAGS_UTF8 as we now always use UTF-8 interfaces.
-
-2002-03-17  Jeffrey Stedfast  
-
-	* gmime-stream-null.c (g_mime_stream_null_get_type): Use
-	GMIME_TYPE_STREAM as our base class.
-	(g_mime_stream_null_class_init): Our parent class is a
-	GMIME_STREAM_CLASS, not a G_OBJECT_CLASS.
-	(g_mime_stream_null_finalize): Call our parent's finalize, which
-	is GMIME_STREAM_CLASS's finalize, not G_OBJECT_CLASS's finalize.
-
-	* gmime-stream-mmap.c: Same.
-
-	* gmime-stream-filter.c: Here too.
-
-	* gmime-stream-file.c: And here.
-
-	* gmime-stream-fs.c: Again here.
-
-	* gmime-stream-mem.c: And again...
-
-	* gmime-stream-buffer.c: And finally here.
-
-	* gmime-multipart.[c,h]: New class that inherits from GMimeObject
-	that represents a MIME multipart.
-
-2002-03-17  Jeffrey Stedfast  
-
-	* gmime-object.c: Ported to glib2 by subclassing GObject and also
-	added a GMimeHeader data member and methods to access those
-	headers as well as adding abstract methods for getting the headers
-	as one big string buffer and writing the object headers/content to
-	a stream.
-
-	* gmime-stream-*.c (*_class_init): Don't set a destroy handler -
-	we can't, we don't have a virtual function pointer for it!
-
-	* gmime-stream.c (g_mime_stream_substream): Use GET_CLASS since we
-	are passing in an object.
-	(g_mime_stream_length): Same.
-	(g_mime_stream_tell): Here too.
-	(g_mime_stream_seek): And here.
-	(g_mime_stream_reset): And again here.
-	(g_mime_stream_eos): Again.
-	(g_mime_stream_close): Here too.
-	(g_mime_stream_flush): Same.
-	(g_mime_stream_write): Same here.
-	(g_mime_stream_read): And finally here.
-	(g_mime_stream_class_init): Setup default implementations of all
-	the stream methods. Also no longer set a destroy handler.
-
-	* gmime-stream-buffer.[c,h]: Updated to subclass the new
-	GMimeStream based on GObject.
-
-2002-03-16  Jeffrey Stedfast  
-
-	* gmime-stream-filter.[c,h]: Updated to subclass the new
-	GMimeStream based on GObject.
-
-	* gmime-stream-fs.[c,h]: Updated to subclass the new GMimeStream
-	based on GObject.
-
-	* gmime-stream-file.[c,h]: Updated to subclass the new GMimeStream
-	based on GObject.
-
-	* gmime-stream-mmap.[c,h]: Updated to subclass the new GMimeStream
-	based on GObject.
-
-	* gmime-stream-null.[c,h]: Updated to subclass the new GMimeStream
-	based on GObject.
-
-	* gmime-stream-mem.[c,h]: Updated to be based on the new
-	implementation of GMimeStream.
-
-	* gmime-type-utils.h: New file to contain some more-friendly
-	type-cast macros around the glib2 ones.
-
-	* gmime-stream.[c,h]: Now subclasses GObject. Not sure if I got
-	everything right, but I think it's mostly there?
-
-2002-03-15  Charles Kerr 
-
-	* gmime-filter-charset.c: fixed minor compiler warnings.
-	* gmime-iconv-utils.c: same.
-	* test-html.c: same.
-	* test-iconv.c: same.
-	* test-mime.c: same.
-	* test-streams.c: same.
-
-2002-03-15  Jeffrey Stedfast  
-
-	* gmime-utils.c (g_mime_utils_uudecode_step): Fixed a logic
-	mistake. All is good now in the land of UU :-)
-
-2002-03-15  Charles Kerr 
-
-	Syncing up with small changes from Pan...
-
-	* gmime-content-type.c: remove unused #include 
-	* gmime-message.c: same.
-	* gmime-part.c: same.
-	* internet-address.c: same.
-
-	* gmime-filter-basic.c: add #include  (strncmp)
-	* gmime-filter-yenc.c: add #include  (strncmp)
-	* gmime-iconv-utils.c: add #include  (strlen)
-	* gmime-iconv.c: add #include  (strlen)
-	* gmime-iconv.c: add #include  (sprintf)
-	
-2002-03-14  Jeffrey Stedfast  
-
-	* gmime-filter-yenc.c (filter_reset): Added a switch-statement
-	based on direction. Yes, for now the INIT state for encode/decode
-	are both the same but this may change? Probably not but oh well
-	:-)
-	(g_mime_ydecode_step): Sync up with Charles' yenc fixes.
-
-2002-03-13  Jeffrey Stedfast  
-
-	* gmime-filter-yenc.c: Compile fixes.
-
-2002-03-12  Jeffrey Stedfast  
-
-	* gmime-filter-yenc.c (g_mime_filter_yenc_get_pcrc): Finalize the
-	crc before returning.
-	(g_mime_filter_yenc_get_crc): Same.
-
-2002-03-12  Jeffrey Stedfast  
-
-	* gmime-filter-yenc.c: New filter to encode/decode yEnc streams.
-
-2002-03-03  Jeffrey Stedfast  
-
-	Thanks to Carlos Morgado 
-
-	* gmime.spec.in: Fix.
-
-2002-03-03  Jeffrey Stedfast  
-
-	* gmime-part.c (g_mime_part_write_to_stream): Get rid of some
-	extra line feeds.
-
-2002-02-21  Jeffrey Stedfast  
-
-	* doc/*: Updated.
-
-	* configure.in: Updated version to 0.8.0
-
-2002-01-25  Jeffrey Stedfast  
-
-	* gmime-charset.c (g_mime_charset_name): Updated for AIX, HPUX,
-	IRIX, and Sun systems.
-
-2002-01-24  Jeffrey Stedfast  
-
-	* gmime-iconv.c (iconv_cache_bucket_add_node): Fixed an oops.
-	(iconv_cache_bucket_get_first_unused): Fixed another oops.
-
-2002-01-20  Jeffrey Stedfast  
-
-	* gmime-data-wrapper.c (g_mime_data_wrapper_write_to_stream):
-	Handle the x-uuencode encoding type.
-
-	* gmime-utils.c (g_mime_utils_uuencode_close): No longer needs a
-	uulen argument since it is now compacted into the state argument.
-	(g_mime_utils_uuencode_step): Same here.
-
-	* gmime-filter-basic.c (filter_filter): Ignore data until we have
-	found the "begin" line. Also, we no longer need uulen.
-	(filter_complete): Same.
-
-	* gmime-part.c (g_mime_part_encoding_to_string): Handle
-	x-uuencode.
-	(g_mime_part_encoding_from_string): Same.
-	(g_mime_part_set_pre_encoded_content): Here too.
-	(write_content): And again here.
-
-2002-01-19  Jeffrey Stedfast  
-
-	* gmime-iconv.c (iconv_node_new): Return the node - how did I miss
-	this!?
-
-2002-01-18  Jeffrey Stedfast  
-
-	* configure.in: Fixed more silliness.
-
-	* acconfig.h: Added #undef's for some iconv stuff.
-
-	* gmime-filter-charset.c (g_mime_filter_charset_new): Put the
-	charset arguments in the right order.
-
-	* gmime-iconv.c (g_mime_iconv_open): Swap the to/from arguments so
-	that they are in the same order as iconv_open.
-
-	* gmime-iconv-utils.c (iconv_utils_init): Put the to/from
-	arguments in the right order.
-
-2002-01-17  Jeffrey Stedfast  
-
-	* gmime-iconv-utils.c (g_mime_iconv_strndup): If we get an EILSEQ,
-	just return NULL rather than g_strndup'ing the original
-	string. We'd rather get back NULL and know it failed than get back
-	a string thinking everything went okay.
-
-	* configure.in: Fixed some silliness, thanks to Charles Schmidt.
-
-2002-01-16  Jeffrey Stedfast  
-
-	* gmime-iconv-utils.c (g_mime_iconv_strndup): New utility function
-	to iconv n bytes of a string and return a buffer containing the
-	converted string.
-	(g_mime_iconv_strdup): Same but for the whole string.
-	(g_mime_iconv_locale_to_utf8): Converts a string in the locale
-	charset to utf8.
-	(g_mime_iconv_locale_to_utf8_length): Same but for a sublength of
-	the string.
-	(g_mime_iconv_utf8_to_locale): Converts a string from utf8 to the
-	locale charset.
-	(g_mime_iconv_utf8_to_locale_length): Same but for a sublength of
-	the string.
-
-2002-01-15  Jeffrey Stedfast  
-
-	* test-iconv.c: test suite to make sure that the gmime-iconv cache
-	works.
-
-	* gmime-iconv.c (g_mime_iconv_init): Initialize the iconv_node
-	memchunk.
-	(g_mime_iconv_shutdown): Destroy the iconv_node memchunk.
-	(iconv_node_destroy): Use memchunk_free instead of g_free.
-	(iconv_node_new): Use memchunk_alloc.
-	(iconv_node_set_used): Add/Remove the node to the iconv_open_hash.
-
-2002-01-14  Jeffrey Stedfast  
-
-	* configure.in: Bumped the version to 0.7.7
-
-	* doc/*: Updated to document the new gmime-iconv interfaces.
-
-	* gmime-filter-charset.c (g_mime_filter_charset_new): Use
-	g_mime_iconv_open instead of iconv_open. Also no longer need to
-	use g_mime_charset_name() since gmime-iconv does this for us.
-	(filter_destroy): Use g_mime_iconv_close() instead of
-	iconv_close().
-
-	* gmime-iconv.c (g_mime_iconv_open): New wrapper around
-	iconv_open() so that we can cache the results. This'll be a major
-	speedup for systems like Solaris where iconv_open() must dlopen a
-	module for each of the charsets. Also uses g_mime_charset_name()
-	to get the iconv-friendly charset name for you.
-	(g_mime_iconv_close): New wrapper around iconv_close().
-
-2002-01-13  Jeffrey Stedfast  
-
-	* configure.in: Bumped version to 0.7.6
-
-	* doc/*: Updated to document the new charset code.
-
-	* gmime.h.in: Added #includes for gmime-charset.h and
-	gmime-filter-charset.h.
-
-	* gmime-filter-charset.c: New filter for converting text between
-	charsets using iconv.
-
-	* gmime-charset.c (g_mime_charset_name): New function to derive
-	the iconv-friendly name for a given charset.
-
-2002-01-09  Charles Kerr 
-
-	* internet-address.c (internet_address_list_prepend): replaced
-	"g_return_if_fail" with "g_return_val_if_fail".
-	* internet-address.c (internet_address_list_append): same.
-
-	* internet-address.c (internet_address_set_group): removed
-	unused variables to shut up compiler.
-	* gmime-param.c (rfc2184_decode): same.
-
-2002-01-08  Jeffrey Stedfast  
-
-	* config.h.in: Added a #include  if HAVE_ALLOCA_H is
-	defined - this limits the number of places I have to conditionally
-	add #include  in the source files.
-
-2002-01-05  Jeffrey Stedfast  
-
-	* gmime-utils.c (parse_broken_date): Implemented.
-
-2002-01-04  Jeffrey Stedfast  
-
-	* memchunk.c (memchunk_clean): Oops, when tree_search() returns 0
-	we want to prune it, not the other way around :-)
-
-2002-01-02  Jeffrey Stedfast  
-
-	* memchunk.c (memchunk_clean): Fixed a logic mistake that
-	prevented pruning of the head node.
-
-2002-01-01  Charles Kerr 
-
-	* gmime-message (g_mime_message_get_body): added g_return_val_if_fail
-	checks in the entry point.
-
-2001-12-31  Jeffrey Stedfast  
-
-	* internet-address.c (decode_address): Optimized group parsing.
-
-	* doc/*: Updated.
-
-2001-12-31  Jeffrey Stedfast  
-
-	* strlib.c (strncasecmp): Convert the chars to lowercase before
-	diffing.
-
-2001-12-30  Jeffrey Stedfast  
-
-	* configure.in: Bumped version number to 0.7.5 since the
-	internet-address API and bits of the gmime-message API have
-	changed.
-
-	* internet-address.c (internet_address_new): Initialize the
-	refcount to 1.
-	(internet_address_destroy): This is now an internal function.
-	(internet_address_ref): New function to ref an InternetAddress
-	object.
-	(internet_address_unref): New function to unref an InternetAddress
-	object.
-	(internet_address_set_group): Updated to use the new
-	internet_address_list functions.
-	(internet_address_add_member): Same.
-	(internet_address_list_prepend): New function to manipulate a list
-	of InternetAddress objects.
-	(internet_address_list_append): Same.
-	(internet_address_list_concat): Another new function.
-	(internet_address_list_length): Again...
-	(internet_address_list_destroy): Destroy a list of addresses.
-	(internet_address_list_to_string): New utility function to write a
-	list of addresses to a string.
-	(internet_address_parse_string): Optimized slightly by not using
-	GLists' generic append function and also updated to use
-	InternetAddressList.
-
-	* gmime-message.c (recipients_destroy): Updated to call
-	internet_address_list_destroy.
-	(sync_recipient_header): Updated to let the InternetAddress code
-	do the work for us.
-	(g_mime_message_add_recipient): Updated to use the new
-	InternetAddress API.
-	(g_mime_message_add_recipients_from_string): Same.
-	(g_mime_message_get_recipients): Return an InternetaddressList
-	instead of GList.
-
-2001-12-30  Jeffrey Stedfast  
-
-	* strlib.c (strncasecmp): Do null-checking.
-
-	* TODO: Remove features that have already been
-	implemented/fixed/whatever.
-
-2001-12-30  Jeffrey Stedfast  
-
-	* memchunk.c (memchunk_clean): Prune 'cleaned' nodes from our
-	free-node list. Thanks to Charles Kerr for discovering this bug.
-
-	* strlib.c (strncasecmp): Moved the return calculation to within
-	the loop so as to only take a difference if the strings are not
-	identical. This also fixes a bug that would falsely return
-	non-zero for strings that were identical for the first n bytes.
-
-2001-12-20  Jeffrey Stedfast  
-
-	* gmime-stream.c (g_mime_stream_construct): 'type' is now an
-	unsigned int rather than a signed int.
-
-	* memchunk.c (memchunk_clean): Oops. Don't forget to free the tree
-	after we're finished with it...
-
-2001-12-18  Jeffrey Stedfast  
-
-	Various compiler warning fixes to several source files (mostly
-	"unused variable" type stuff).
-
-2001-12-17  Jeffrey Stedfast  
-
-	* gmime-utils.c (datetok): reimplement to not use GLists
-	(appending is slow) and also to not g_strndup the token, instead
-	just remember it's offset and length so we can examine it later.
-	(decode_int): New function to decode an int.
-	(get_wday): Now takes an inlen argument.
-	(get_mday): Same. Also calls decode_int.
-	(get_month): Here too.
-	(get_year): Again here... also calls decode_int.
-	(get_tzone): Modified to use struct _date_token.
-	(get_time): Completely rewritten.
-
-2001-12-16  Jeffrey Stedfast  
-
-	* memchunk.[c,h]: A memchunk library similar to g_mem_chunk's but
-	faster.
-
-2001-12-16  Jeffrey Stedfast  
-
-	* configure.in: Added a --enable-warnings to turn on compiler
-	warnings.
-
-	* gmime-utils.c: Various compiler warning cleanup.
-
-	* gmime-object.c (g_mime_object_construct): Change the type
-	argument to be of type unsigned rather than int.
-
-	* gmime-filter-html.c (url_extract): g_strndup takes an unsigned
-	length argument.
-
-	* gmime-filter-from.c (filter_filter): memcpy takes an unsigned
-	length argument.
-
-	* gmime-disposition.c (g_mime_disposition_new): g_strndup takes an
-	unsigned length argument.
-
-	* gmime-content-type.c (g_mime_content_type_new_from_string):
-	g_strndup takes an unsigned length argument.
-
-	* gmime-charset.c (g_mime_charset_init): g_strndup takes an
-	unsigned length argument.
-
-2001-12-16  Jeffrey Stedfast  
-
-	* gmime-part.c (g_mime_part_destroy): Now an internal-only method.
-
-	* gmime-message.c (g_mime_message_destroy): Now an internal-only
-	method.
-
-2001-12-05  Jeffrey Stedfast  
-
-	* gmime-filter-basic.c (filter_filter):
-	(filter_complete): The outbuf for QP decoding can be up to len + 2
-	bytes and UU decoding outbuf can be up to len + 3 bytes.
-
-2001-12-01  Jeffrey Stedfast  
-
-	* gmime-parser.c (parse_content_headers): Set is_multipart to
-	FALSE.
-	(g_mime_parser_construct_part_internal): Get the inlen properly
-	and do content-offsetting a little better by skipping past the
-	end-of-header marker.
-
-	* gmime-stream-buffer.c (g_mime_stream_buffer_gets): Use the
-	'register' keyword for some variables.
-
-	* gmime-data-wrapper.c (g_mime_data_wrapper_set_stream): Safeguard
-	against NULL streams.
-	(g_mime_data_wrapper_write_to_stream): Reset the stream before
-	writing too.
-
-	* gmime-stream-mem.c (stream_seek): Fix to work like the others.
-	(stream_read): On error, always return -1 (and not just any value
-	less than 0)
-	(stream_write): Same.
-
-2001-11-30  Jeffrey Stedfast  
-
-	* gmime-part.c (write_content): Implemented a slight optimization
-	which bypasses the need to do any encoding in certain
-	circumstances.
-
-2001-11-28  Jeffrey Stedfast  
-
-	* pan-mime-parser.c (parser_read_until_boundary): Make sure
-	boundary is non-NULL before calling strlen on it.
-
-2001-11-26  Jeffrey Stedfast  
-
-	* gmime-parser.c (g_mime_parser_construct_part_internal): Fixed a
-	bug - don't set bounds on the original stream, set the bounds on
-	our temporary memory stream. Also got rid of find_header_end().
-
-	* gmime-filter-from.c (filter_filter): initialize fromcount to 0.
-
-2001-11-25  Jeffrey Stedfast  
-
-	* strlib.c (strlcpy): BSD defines the prototype as returning
-	size_t, the strlen of the resultant string.
-	(strlcat): Same.
-
-	* gmime-stream-buffer.c (stream_flush): Oops, memmove the buffer
-	too and a smidgen of code cleanup.
-	(stream_reset): Fix reset for block write mode.
-
-	* configure.in: Bumped the version to 0.7.4 and added checks for
-	system mmap functions.
-
-	* gmime-stream-mmap.[c,h]: New stream that uses an mmaped buffer.
-
-2001-11-24  Jeffrey Stedfast  
-
-	* doc/gmime-docs.sgml: Added documentation of the use of filters.
-
-2001-11-23  Jeffrey Stedfast  
-
-	* gmime-stream-buffer.c (stream_seek): Implemented.
-
-	* gmime-parser.c (parse_content_headers): Fixed another memory
-	leak here.
-
-	* gmime-param.c (decode_param_list): Fixed a small memory leak.
-
-2001-11-22  Jeffrey stedfast  
-
-	* gmime-filter-from.[c,h]: New filter to escape from-lines.
-
-	* pan-mime-parser.c (parser_read_until_boundary): Slight
-	optimization.
-
-2001-11-21  Jeffrey Stedfast  
-
-	* gmime-utils.c (is_8bit_word_encoded): Make into a macro, we
-	don't need to do a strlen because the atom is a GString which
-	means we have it's length already. This also saves us some
-	overhead of calling a function.
-	(g_mime_utils_8bit_header_decode): Update to pass the len argument
-	to is_8bit_word_encoded.
-
-2001-11-18  Jeffrey Stedfast  
-
-	* configure.in: Bumped version to 0.7.3
-
-	* gmime-param.c: GMimeParam is now a linked list of parameters
-	rather than a single name/value pair.
-	(g_mime_param_new_from_string): Now returns a parameter list based
-	on the input string rather than only returning a single parameter
-	name/value pair. Also updated to handle rfc2184 encoded
-	parameters.
-	(g_mime_param_destroy): Destroy the linked list of params.
-	(g_mime_param_append): Append a new parameter.
-	(g_mime_param_append_param): Append a new parameter object.
-	(g_mime_param_write_to_string): New function (which replaces
-	g_mime_param_to_string) which correctly encodes (either by quoting
-	the value or rfc2184 encoding it) the list of parameters and
-	optionally folds them suitable for header wrapping.
-
-	* gmime-disposition.[c,h]: New source files to handle
-	parsing/generating Content-Disposition headers.
-
-	* gmime-part.c (g_mime_part_destroy): Updated to use
-	g_mime_disposition_destroy.
-	(g_mime_part_set_content_disposition_object): New function for
-	setting the disposition object on a mime part.
-	(g_mime_part_set_content_disposition): Updated to use
-	g_mime_disposition_set.
-	(g_mime_part_get_content_disposition): Updated to use
-	g_mime_disposition_get.
-	(g_mime_part_add_content_disposition_parameter): Updated to use
-	g_mime_disposition_add_parameter.
-	(g_mime_part_get_content_disposition_parameter): Updated to use
-	g_mime_disposition_get_parameter.
-	(g_mime_part_set_filename): Updated to use
-	g_mime_disposition_add_parameter.
-	(g_mime_part_get_filename): Updated to use
-	g_mime_disposition_get_parameter.
-
-	* gmime-content-type.c (g_mime_content_type_new_from_string): Use
-	the gmime-param code to parse any Content-Type parameters.
-	(g_mime_content_type_destroy): Updated to use
-	g_mime_param_destroy.
-	(g_mime_content_type_add_parameter): Updated to use g_mime_param
-	functions.
-
-	* gmime-utils.c (g_mime_utils_header_fold): Fixed a small header
-	folding bug.
-
-	* gmime-parser.c (parse_content_headers): Updated to use the
-	GMimeDisposition parser.
-
-	* pan-mime-parser.c (parse_content_headers): Updated to use the
-	GMimeDisposition parser.
-
-2001-11-16  Jeffrey Stedfast  
-
-	* configure.in: Bumped version to 0.7.2 due to the change-over to
-	refcounted mime objects.
-
-	* gmime-object[c,h]: New source files that implement an abstract
-	Object class.
-
-	* gmime-message.c: Updated to subclass GMimeObject
-
-	* gmime-part.c: Updated to subclass GMimeObject
-	(g_mime_part_set_content_header): Set an arbitrary mime content
-	header.
-	(g_mime_part_get_content_header): Get an arbitrary mime content
-	header.
-	(g_mime_part_add_child): Finally deprecated, please use
-	g_mime_part_add_subpart instead if you aren't already.
-
-	* gmime-parser.c: Updated to unref mime parts where appropriate as
-	well as set unknown content headers on mime parts.
-
-	* pan-mime-parser.c: Same as gmime-parser.c
-
-2001-11-14  Jeffrey Stedfast  
-
-	* gmime-stream-null.c (g_mime_stream_null_new): A new stream,
-	similar to /dev/null basically.
-
-2001-11-10  Jeffrey Stedfast  
-
-	* configure.in: Added checks for strlib functions and bumped the
-	version to 0.7.1 (there won't be an official 0.7.1 release but I
-	figure I should be bumping version numbers whenever I add
-	functionality).
-
-	* strlib.[c,h]: New string library that provides anything that the
-	system libc doesn't (includig strnstr and stpcpy).
-
-	* gmime-filter-html.[c,h]: New filter that converts plain text
-	into HTML suitable for display in things like GtkHTML (makes urls
-	into hyperlinks and preserves whitespace and such).
-
-	* gmime-parser.c (g_strstrbound): Removed.
-	(find_header_part_end): Use strnstr.
-	(g_mime_parser_construct_part_internal): Use strnstr.
-
-2001-10-26  Jeffrey Stedfast  
-
-	* configure.in: Updated the version to 0.7.0
-
-	* doc/*: Updated.
-
-2001-10-25  Jeffrey Stedfast  
-
-	* gmime-message.c (g_mime_message_new): Now takes an
-	"init_headers" argument, it doesn't really matter what value you
-	put here - it's more a "I want my message headers to be in a nice
-	friendly order rather than the order they are set in".
-
-	* gmime-parser.c (g_mime_parser_construct_message): Use
-	!preserve_headers as the init_headers argument to
-	g_mime_message_new ().
-
-	* pan-mime-parser.c (g_mime_parser_construct_message): Same.
-
-2001-10-24  Jeffrey Stedfast  
-
-	* pan-mime-parser.c (construct_message_headers): Use
-	g_mime_header_add instead of g_mime_header_set so we can get
-	multiple of the same header (such as "Received:").
-
-	* gmime-parser.c (construct_headers): Use g_mime_header_add
-	instead of g_mime_header_set so we can get multiple of the same
-	header (such as "Received:") and also move it into the switch
-	statement into the default case.
-
-	* gmime-message.c (g_mime_message_set_header): New function to add
-	a header to a message.
-
-	* gmime-header.c (g_mime_header_add): New function to add a
-	header.
-
-	* gmime-stream.c (g_mime_stream_writev): New function to write a
-	vector to a stream.
-
-2001-10-21  Jeffrey Stedfast  
-
-	* pan-mime-parser.c: Updated to use g_mime_stream_buffer_readln.
-
-	* gmime-stream-buffer.c (g_mime_stream_buffer_readln): New
-	convenience function to read a single line from a stream.
-
-2001-10-12  Jeffrey Stedfast  
-
-	* gmime-part.c (g_mime_part_write_to_stream): No longer takes a
-	'toplevel' argument.
-	(g_mime_part_to_string): No longer takes a 'toplevel' argument.
-
-	* gmime-message.c (g_mime_message_write_to_stream): Write the
-	MIME-Version header here instead of needing to pass a 'toplevel'
-	argument to g_mime_part_write_to_stream().
-
-	* gmime-charset.c (g_mime_charset_init): Fix for Debian and
-	Solaris.
-
-2001-10-09  Charles Kerr 
-
-	* gmime-filter.c (g_mime_filter_construct): make sure outptr is
-	zeroed out before we read it in g_mime_filter_set_size().
-
-2001-10-06  Jeffrey Stedfast  
-
-	* gmime-filter-basic.c (filter_filter): Implemented uuencoding.
-	(filter_complete): Implemented uuencoding.
-
-	* gmime-utils.c (g_mime_utils_uuencode_close): New function to
-	flush the uuencoder.
-	(g_mime_utils_uuencode_step): New function to uuencode a block of
-	data.
-
-2001-10-05  Jeffrey Stedfast  
-
-	Fixes for c++ compilation
-
-	* gmime-stream*.c: s/template/stream_template
-
-	* gmime-filter*.c: s/template/filter_template
-
-2001-10-04  Jeffrey Stedfast  
-
-	* gmime-data-wrapper.c (g_mime_data_wrapper_set_stream): If we
-	just change the order of operations, we can get away without a
-	second stream pointer.
-
-	* gmime-stream.c (g_mime_stream_substream): Revert.
-
-	* gmime-stream-buffer.c (stream_substream): Instead of calling
-	g_mime_stream_substream(), call the source stream's substream
-	method directly. I think this is the better fix for the bug
-	Charles just fixed.
-
-2001-10-04  Charles Kerr 
-
-	* gmime-stream.c (g_mime_stream_substream): fix refcount stealth
-	bug.  Calling this on a buffered stream wound up reffing two
-	streams instead of one because of a nested call to
-	g_mime_stream_substream().  This took a lot of scaffolding to
-	find. :)
-
-	* gmime-data-wrapper.c (g_mime_data_wrapper_set_stream): fix
-	refcount paranoia bug.  ref the new *before* unreffing the old
-	just in case new==old.
-	
-	* gmime-filter-basic.[ch]: fix some compiler warnings that I
-	introduced yesterday.  (Strange how the same version of gcc finds
-	different warnings on different platforms.)
-
-2001-10-03  Charles Kerr 
-
-	* gmime-part.c (g_mime_part_get_content): bugfix for when getting
-	the content from a stream-mem.  We were just returning the
-	stream-mem's gbytearray buffer, but we need to check against the
-	stream's bounds.
-
-	* gmime-filter-basic.[ch]: added support for decoding a uuencoded
-	stream; added a placeholder for uuencoding a stream.
-
-	* md5-utils.c: commented out d(x) macro.
-
-2001-10-02  Jeffrey Stedfast  
-
-	* gmime-stream-buffer.h: buflen should be an ssize_t not a
-	size_t. Thanks to Charles for catching this.
-
-2001-10-01  Charles Kerr 
-
-	* gmime-filter.c: include  to pick up memcpy prototype.
-	* gmime-stream-mem.c: same.
-	* gmime-stream-buffer.c: same.
-	* gmime-stream-filter.c: same.
-
-	* gmime-stream-mem.c (stream_flush): added a retval of 0.
-
-	* gmime-filter-crlf.h (g_mime_filter_crlf_new_type): renamed
-	prototype as g_mime_filter_crlf_new to sync with .c
-
-	* gmime-part.h: added g_mime_part_set_content_object() prototype.
-
-	* gmime-content-type.h: Replaced <> with "" in #include
-	
-
-	* pan-mime-parser.c: added #include gmime-stream-buffer.h to pick
-	up prototype for g_mime_stream_buffer_gets.
-	(g_strstrbound): removed unused func.
-
-	* gmime-utils.c: on calls to ctype functions, explicitly upcast
-	the char arguments as ints to shut up gcc warnings on Solaris.
-	* gmime-param.c: same.
-
-2001-09-29  Jeffrey Stedfast  
-
-	* pan-mime-parser.c: New parser (with exactly the same API as
-	gmime-parser.c) that is meant to parse MIME objects without
-	needing them to be memory mapped. Quite a bit slower on average,
-	but is vastly sped up by using a GMimeStreamBuffer in BLOCK_READ
-	mode.
-
-	* gmime-stream-buffer.c (stream_write): Incremement the stream
-	position by the number of bytes we wrote.
-	(stream_tell): Return stream->position.
-	(stream_substream): Just return a substream of our source stream.
-	(g_mime_stream_buffer_gets): Increment the stream position by the
-	number of bytes read if and only if we are operating on a buffered
-	stream.
-
-2001-09-27  Jeffrey Stedfast  
-
-	* gmime-stream-file.c (stream_tell): Return stream->position here
-	too.
-
-	* gmime-part.c (g_mime_part_set_pre_encoded_content): Don't decode
-	into a stream and then set the data wrapper encoding to the
-	incoming encoding type, instead use filters to decode into the
-	stream and set the data wrapper encoding to the default.
-
-	* gmime-stream.c (g_mime_stream_set_bounds): Don't set the
-	position equal to end if end == -1.
-
-	* gmime-parser.c (g_mime_parser_construct_message): Use the stream
-	functions to find the beginning and end of the stream rather than
-	breaking abstractions. Also reset the mem stream after writing to
-	it.
-	(g_mime_parser_construct_part): Reset the mem stream here too.
-	(g_mime_parser_construct_part_internal): Use the stream interfaces
-	to get the position instead of breaking abstractions.
-
-	* gmime-stream-fs.c (stream_tell): Return stream->position.
-
-	* gmime-stream-mem.c (stream_seek): Return the new syteam
-	position.
-	(stream_tell): Return stream->position.
-
-2001-09-23  Jeffrey Stedfast  
-
-	* doc/gmime-docs.sgml: Documented streams.
-
-	* gmime-stream-fs.c (stream_write): Seek to the position we think
-	we're at before attempting to write, and increment the stream
-	position after the write.
-
-	* gmime-stream-file.c (stream_write): Seek to the position we
-	think we're at... this is just in case we are or have substreams
-	that might have read or written in the meantime. Also remember to
-	increment the stream position after the write.
-	(stream_eos): Only return feof() if our end boundary is unlimited.
-
-	* gmime-stream-mem.c (stream_write): Start writing data at
-	stream->position rather than always appending it to the end of the
-	mem stream. Also don't go writing past the end boundary if it's
-	set.
-	(stream_length): Use a relative bound_end.
-	(stream_seek): Same.
-	(stream_eos): Here too.
-	(stream_write): And here.
-	(stream_read): And here.
-	(stream_substream): Correctly set the bounds.
-	(g_mime_stream_mem_new): Here too.
-	(g_mime_stream_mem_new_with_byte_array): And here.
-	(g_mime_stream_mem_new_with_buffer): Same.
-	(g_mime_stream_mem_set_byte_array): And finally here.
-
-2001-09-22  Jeffrey Stedfast  
-
-	* test-streams.c: New test suite for streams.
-
-	* gmime-stream-buffer.c (stream_read): Fixed some logic bugs
-	(including forgetting a break statement at the end of a case).
-	(g_mime_stream_buffer_gets): Fixed some logic bugs.
-
-	* gmime-stream-mem.c (stream_read): Fixed logic error.
-
-2001-09-21  Jeffrey Stedfast  
-
-	* gmime-stream-buffer.c (g_mime_stream_buffer_gets): Implemented.
-	(stream_reset): Implemented.
-	(stream_eos): Implemented.
-	(stream_write): Reimplemented.
-	(stream_read): Reimplemented.
-
-2001-09-21  Jeffrey Stedfast  
-
-	* gmime-stream-buffer.[c,h]: New stream that buffers reads or
-	writes to/from another stream. Will also implement a gets() method
-	for Charles.
-
-2001-09-20  Jeffrey Stedfast  
-
-	* gmime-stream-mem.c (stream_eos): Check for position >= instead
-	of == bound_end
-
-	* gmime-stream.c (g_mime_stream_eos): Do some simple bounds
-	checking.
-
-	* doc/*: Updated.
-
-	* gmime-part.c (g_mime_part_get_content_object): Added.
-
-2001-09-19  Jeffrey Stedfast  
-
-	* gmime-stream-fs.c (stream_seek): Improve.
-
-	* gmime-stream-file.c (stream_reset): Oops, reset the position
-	pointer on a successful reset.
-	(stream_seek): Fixed.
-
-2001-09-19  Jeffrey Stedfast  
-
-	* gmime-stream-fs.c (stream_reset): Reset the position offset. Doh!
-
-	* gmime-stream.c (g_mime_stream_write_to_stream): Don't increment
-	total if no bytes were read/written.
-
-	* gmime-stream-filter.c (stream_substream): Copy over the filters.
-
-	* gmime-part.c (g_mime_part_verify_content_md5): Updated.
-	(g_mime_part_set_content_md5): Updated.
-	(g_mime_part_get_content): Updated.
-	(write_content): Updated.
-
-	* gmime-data-wrapper.c (g_mime_data_wrapper_write_to_stream):
-	Implemented.
-
-	* gmime-filter-basic.[c,h]: A basic filter that does Base64 and QP
-	encoding/decoding.
-
-	* gmime-filter-crlf.[c,h]: A simple filter that does crlf(/dot)
-	encoding/decoding.
-
-2001-09-19  Jeffrey Stedfast  
-
-	* gmime-data-wrapper.c (g_mime_data_wrapper_new_with_stream): Ref
-	the stream.
-	(g_mime_data_wrapper_set_stream): Same.
-	(g_mime_data_wrapper_get_stream): Return the internal stream.
-	(g_mime_data_wrapper_get_encoding): Return the internal stream's
-	encoding.
-	(g_mime_data_wrapper_write_to_stream): Not-yet-implemented.
-
-	* gmime-filter.[c,h]: Abstract class for filters.
-
-	* gmime-stream-filter.[c,h]: Abstract stream for filtering.
-
-	* gmime-part.c (g_mime_part_set_content): Updated for data-wrapper
-	changes.
-	(g_mime_part_set_content_byte_array): Same.
-	(g_mime_part_set_pre_encoded_content): And here.
-	(g_mime_part_get_content): And here too.
-
-	* gmime-parser.c (g_mime_parser_construct_part_internal): Fix
-	offset calculations.
-	(g_mime_parser_construct_part_internal): Updated for data-wrapper
-	changes.
-
-2001-09-18  Jeffrey Stedfast  
-
-	* test-parser.c (test_parser): Updated.
-
-	* test-mime.c (test_parser): Updated.
-
-	* gmime-utils.h: Move the GMimePartEncodingType enum here.
-
-	* gmime-stream-fs.[c,h]: Implemented.
-
-	* gmime-stream.c (g_mime_stream_construct): New function to
-	initialize the stream data members.
-	(g_mime_stream_substream): New function to get a substream of
-	another stream.
-	(g_mime_stream_unref): If the stream is actually a substream,
-	unref it's "super" stream if we are destroying the substream.
-
-	* gmime-stream-mem.c (stream_substream): Implemented.
-	(g_mime_stream_mem_new): Updated to use g_mime_stream_construct().
-	(g_mime_stream_mem_new_with_byte_array): Same.
-	(g_mime_stream_mem_new_with_buffer): And here too.
-
-	* gmime-stream-file.c (stream_substream): Implemented.
-	(g_mime_stream_file_new): Updated to use
-	g_mime_stream_construct().
-	(g_mime_stream_file_new_with_bounds): Same.
-
-	* gmime-part.c (g_mime_part_set_content_md5): Updated to use
-	streams.
-	(g_mime_part_verify_content_md5): Same.
-	(g_mime_part_set_content): Updated to use streams and data
-	wrappers.
-	(g_mime_part_set_content_byte_array): Same.
-	(g_mime_part_set_pre_encoded_content): And here.
-	(g_mime_part_set_content_object): New function that allows one to
-	set the content object of a MIME part.
-	(g_mime_part_get_content): Updated to use streams.
-	(write_content): Same.
-	(g_mime_part_write_to_stream): Replacement for
-	g_mime_part_write_to_string().
-	(g_mime_part_to_string): Updated to use
-	g_mime_part_write_to_stream().
-	(g_mime_part_destroy): Updated to destroy the content object
-	rather than destroying a GByteArray (since we longer use a
-	GByteArray for the content data).
-
-	* gmime-parser.c (g_mime_parser_construct_message): Now takes a
-	stream argument instead of a string.
-	(g_mime_parser_construct_message_from_file): Deprecated.
-	(g_mime_parser_construct_part): Also takes a stream now.
-
-	* gmime-message.c (g_mime_message_write_to_stream): Replacement
-	for g_mime_message_write_to_string().
-	(g_mime_message_to_string): Updated.
-
-	* gmime-header.c (g_mime_header_write_to_stream): Replacement for
-	g_mime_header_write_to_string().
-	(g_mime_header_to_string): Updated.
-
-2001-09-17  Jeffrey Stedfast  
-
-	* gmime-stream.[c,h]: Abstract stream class.
-
-	* gmime-stream-mem.[c,h]: Memory stream.
-
-	* gmime-stream-file.[c,h]: File stream.
-
-	* gmime-data-wrapper.[c,h]: Data wrapper class. Will be used as
-	the content object in MIME parts.
-
-2001-08-23  Jeffrey Stedfast  
-
-	* gmime-utils.c (encode_8bit_word): Oops. Add the closing ? char.
-	(g_mime_utils_8bit_header_encode): Oops. Make sure we encode *all*
-	lwsp chars.
-	(g_mime_utils_8bit_header_decode): Slightly better fix for the
-	other day.
-
-2001-08-19  Jeffrey Stedfast  
-
-	* doc/*: Updated.
-
-2001-08-18  Jeffrey Stedfast  
-
-	* Makefile.am: Added gmime-charset.[c,h] to the build.
-
-	* gmime-charset.[c,h]: New source files for managing charset
-	related issues.
-	(g_mime_charset_init): New function to retrieve the user's locale
-	information for later use with gmime_charset_locale_name.
-	(g_mime_charset_locale_name): New function to return user's
-	locale.
-
-	* gmime-utils.c (g_mime_utils_8bit_header_decode): linear
-	whitespace isn't the only thing that can delimit atoms.
-	(get_codeset): Removed in favor of the new gmime-charset
-	functions.
-	(g_mime_utils_8bit_header_encode): Use g_mime_charset_locale_name.
-	(encode_8bit_word): And here too.
-
-2001-08-15  Jeffrey Stedfast  
-
-	* internet-address.c (decode_mailbox): When returning due to a
-	missing local part, make sure to set *in to inptr.
-
-2001-08-13  Charles Kerr 
-
-	* gmime-utils.c (encode_8bit_word): query nl_langinfo for the
-	codeset instead of just assuming iso-8859-1.  Thanks to Volodymyr
-	M . Lisivka  for suggesting this patch.
-
-	* gmime-utils.c (g_mime_utils_8bit_header_encode): same.
-
-	* gmime-parser.c (find_header_part_end): new utility function to
-	find the dividing line between body & header.
-	(g_mime_parser_construct_part): sync.
-	(g_mime_parser_construct_message): sync.
-
-	* gmime-parser.c (get_header_block): remove unused func.
-	(rfc822_headers): remove unused static array.
-
-2001-07-02  Jeffrey Stedfast  
-
-	* zentimer.h: Added. Provides some timing macros for performace
-	testing.
-
-	* zenprofiler.h: Added. Extends zentimer.h as a simple profiler
-	that gives nice printouts.
-
-	* test-parser.c: Use zentimer.h
-
-2001-06-23  Jeffrey Stedfast  
-
-	* gmime-header.c (g_mime_header_remove): New function.
-	(g_mime_header_set): Setting header to NULL no longer removes the
-	header. Use g_mime_header_remove instead.
-
-	* gmime-message.c (g_mime_message_write_to_string): No longer have
-	to sync the headers.
-	(g_mime_message_get_headers): Same.
-	(g_mime_message_set_sender): sync the From header.
-	(g_mime_message_set_reply_to): Sync the Reply-To header.
-	(g_mime_message_add_recipient): Sync the recipient header.
-	(g_mime_message_add_recipients_from_string): Same.
-	(g_mime_message_set_subject): Sync the Subject header.
-	(g_mime_message_set_date): Sync the date header.
-	(g_mime_message_set_message_id): Sync the Message-Id header.
-
-2001-06-03  Jeffrey Stedfast  
-
-	* gmime-utils.c (quoted_encode): Minor cleanup.
-
-2001-06-02  Jeffrey Stedfast  
-
-	* gmime-message.c (sync_headers): Oops. Don't place "Cc:" in the
-	header value string :-)
-
-2001-03-31  Charles Kerr 
-
-	* gmime-utils.c (g_mime_utils_8bit_header_decode): big speedups.
-
-	* gmime-utils.c (g_mime_utils_8bit_header_encode): small speedups.
-
-2001-05-29  Jeffrey Stedfast  
-
-	* internet-address.c (decode_mailbox): Oops, test to make sure we
-	won't be running past the end of the buffer when considering a
-	retry. Thanks to Charles Kerr for this fix.
-
-2001-03-29  Charles Kerr 
-
-	* gmime-part.c (g_mime_part_append_pre_encoded_content): fix small
-	bug that crept into the last commit.
-
-2001-05-29  Jeffrey Stedfast  
-
-	Fixes on behalf of Charles Kerr of Pan fame:
-	
-	* gmime-parser.c (g_mime_parser_construct_part_from_file):
-	Use g_mime_part_append_pre_encoded_content().
-
-	* gmime-part.c (g_mime_part_append_pre_encoded_content): New
-	function so that the FILE parser doesn't need to manage it's own
-	content array.
-
-	* gmime-header.[c,h]: const'ify.
-	(g_mime_header_foreach): New function to call a chosen function
-	for each header in the header object.
-
-2001-05-26  Jeffrey Stedfast  
-
-	* configure.in: Updated version to 0.6.0.
-
-	* README: Updated version to 0.6.0.
-
-	* doc/*: Updated again.
-
-	* gmime-header.c (g_mime_header_to_string): New function - mostly
-	for the sake of keeping with the API of the rest of GMime.
-	(g_mime_header_set): Make sure to always encode the header value
-	before we set it.
-
-	* gmime-part.c (g_mime_part_write_to_string): New function to
-	write the mime part to a GString.
-	(g_mime_part_to_string): Use g_mime_part_write_to_string.
-
-	* gmime-message.c (g_mime_message_get_headers): Use the new
-	g_mime_header_to_string function.
-	(g_mime_message_write_to_string): New function to write the
-	message to a GString.
-	(g_mime_message_to_string): Use write_to_string.
-
-2001-05-25  Jeffrey Stedfast  
-
-	* doc/*: Updated.
-
-	* Makefile.am: Add gmime-header.[c,h] to the build.
-
-	* gmime-parser.c: Numerous changes to use gmime-header.
-
-	* gmime-message.c: Numerous changes to use gmime-header.
-	(g_mime_message_add_arbitrary_header): Removed.
-	(g_mime_message_set_header): The replacement for
-	add_arbitrary_header.
-	(g_mime_message_get_header): New function to get a header.
-
-	* gmime-header.[c,h]: New source fies to handle the complicated
-	nature of setting/getting header pairs.
-
-2001-05-24  Jeffrey Stedfast  
-
-	* doc/*: Updated.
-
-	* doc/Makefile.am: Use $(INSTALL) and $(INSTALL_DATA) rather than
-	`install -m 644`
-
-	* alloca.c: New file for systems that do not have alloca().
-
-	* Makefile.am: build alloca.c
-
-	* gmime-utils.c: Don't #include  - this is now handled
-	by config.h.
-
-	* config.h.in: Added alloca define checks.
-
-	* acconfig.h: Remove some extra defines that we don't care about.
-
-2001-05-20  Jeffrey Stedfast  
-
-	* gmime-parser.c (parse_content_headers): Simplified and also
-	unfolded content-headers.
-
-	* gmime-part.c (g_mime_part_get_filename): If there isn't a
-	disposition, make sure that we don't ignore the possibility of a
-	"name" param in the Content-Type header.
-
-2001-05-12  Jeffrey Stedfast  
-
-	* gmime-utils.c (need_quotes): Include '.' as a char to quote.
-
-	* gen-table.c (main): Fixed a type-o.
-
-	* internet-address.c (decode_mailbox): Be a little more forgiving
-	about unexpected chars while parsing the name part of the email
-	address. Skip the bad char and then retry. If we fail again,
-	*then* we abort.
-
-	* gmime-utils.c: #include 
-
-	* gmime-parser.c (g_mime_parser_construct_part): Oops, inend
-	points to the end of the string, not the last char of the string
-	(ie, '\0' not the char before it).
-
-2001-05-08  Jeffrey Stedfast  
-
-	* gmime-table-private.h: Oops, take out the check for isblank().
-
-	* internet-address.c (decode_quoted_string): Get rid of unused
-	variable.
-	(decode_address): Same.
-
-2001-04-03  Jeffrey Stedfast  
-
-	* internet-address.c (decode_domain): Try to only get
-	"fully-qualified" domain names, or ones that "look" like they are
-	at least ;-)
-	(decode_mailbox): If decode_domain() returns NULL, don't append
-	the '@' char. Also make sure that the name is non-empty.
-
-2001-04-01  Jeffrey Stedfast  
-
-	* gmime-utils.c (g_mime_utils_quote_string): Made smarter.
-
-2001-03-31  Jeffrey Stedfast  
-
-	* Makefile.am: Added rules to build gen-table.c and added
-	gmime-table-private.h to the build.
-
-	* gen-table.c: New file to generate gmime-table-private.h if need
-	be.
-
-	* gmime-table-private.h: New file that contains
-	gmime_special_table.
-
-	* gmime-utils.c: Remove the gmime_special_table from here and
-	instead #include gmime-table-private.h.
-
-	* internet-address.c: #include gmime-table-private.h
-
-2001-03-30  Jeffrey Stedfast  
-
-	* gmime-message.c (create_header): Simplified a tad.
-	(g_mime_message_add_recipient): Updated for the new
-	InternetAddress API.
-	(g_mime_message_add_recipients_from_string): Simplified greatly
-	using the new InternetAddress API.
-
-	* internet-address.[c,h]: Completely rewritten to be a lot more
-	rfc0822 compliant.
-
-2001-03-28  Jeffrey Stedfast  
-
-	* README, configure.in: Updated version to 0.5.0
-
-2001-03-29  Charles Kerr 
-
-	* gmime-parser.c (g_mime_parser_construct_message_from_file): new
-	function to read a message from a FILE* instead of a character
-	array.  This can be used to reduce the memory requirements of very
-	large messages.
-
-	* gmime-parser.c (get_next_line): new internal function.
-	* gmime-parser.c (g_mime_parser_construct_part_from_file): same.
-	* gmime-parser.c (parse_content_headers): same.
-	* gmime-parser.c (find_header_end): same.
-	* gmime-parser.c (get_header_block): same.
-	* gmime-parser.c (get_header_block_from_file): same.
-
-2001-03-28  Jeffrey Stedfast  
-
-	* gmime-utils.c (get_time): Fix a compile warning.
-
-2001-03-20  Charles Kerr 
-
-	* gmime-utils.c (get_year): constify the argument list.
-	* gmime-utils.c (get_time): same.
-
-	* gmime-utils.c (get_days_in_month): if #0'ed out unused code.
-	* gmime-utils.c (parse_broken_date): same.
-
-2001-03-15  Jeffrey Stedfast  
-
-	* internet-address.c (internet_address_new_from_string): Try to be
-	a little better about extracting the name, not 100% accurate but
-	better I guess.
-
-2001-03-14  Jeffrey Stedfast  
-
-	* gmime-part.c (g_mime_part_get_content_disposition_parameter):
-	It's okay to have a NULL disposition or a NULL param hash.
-	(g_mime_part_get_filename): Same.
-	(g_mime_part_get_content): It's okay not to have content.
-
-2001-03-13  Jeffrey Stedfast  
-
-	* gmime-utils.c (quoted_decode): Fix a possible buffer overrun.
-
-2001-02-27  Jeffrey Stedfast  
-
-	* gmime-utils.c (parse_rfc822_date): Allow for time token to not
-	have a seconds field.
-
-2001-02-11  Jeffrey Stedfast  
-
-	* gmime-part.c (g_mime_part_to_string): Oops. Don't init
-	content_md5 with the content location string ;-)
-
-	* gmime-parser.c (g_mime_parser_construct_part): Init content to
-	NULL to get rid of a warning (this doesn't really matter as 'len'
-	was init'd to 0)
-
-	* gmime-part.c: #include unistd.h
-
-2001-01-27  Jeffrey Stedfast  
-
-	* gmime-part.c (g_mime_part_set_content_byte_array): So
-	set_content_array() was no good. After inspecting glib it was
-	discovered that there are hidden data members of a GByteArray that
-	hold info like if the data is NUL terminated, how much data is
-	allocated, etc.
-
-2001-01-26  Charles Kerr 
-
-	* gmime-part.c (g_mime_part_set_content_array): new function.
-
-2001-01-25  Charles Kerr 
-
-	* gmime-part.c (g_mime_part_destroy): fix memory leak - the
-	disposition wasn't being g_free()d.
-
-2001-01-24  Charles Kerr 
-
-	* gmime-part.c (g_mime_part_get_filename): Now takes a const
-	GMimePart.
-
-2001-01-17  Jeffrey Stedfast  
-
-	* internet-address.c (encoded_name): Updated.
-
-	* gmime-part.c (g_mime_part_set_pre_encoded_content): Updated to
-	reflect changes to gmime-utils.
-
-	* gmime-utils.c (g_mime_utils_text_is_8bit): Take a len argument.
-	(g_mime_utils_best_encoding): Same.
-	(encode_8bit_word): Updated.
-
-2001-01-14  Jeffrey Stedfast  
-
-	* gmime-parser.c (g_mime_parser_construct_part): Check for NULL
-	returns from g_strstrbound.
-
-2001-01-11  Charles Kerr 
-
-	* gmime-utils.c (get_year): small patch to handle 2-digit year
-	representation a little better -- "71" now translates to 1971,
-	but "01" now translates to 2001.  Thanks to Ihar Viarheichyk for
-	suggesting this change.
-
-2001-01-07  Jeffrey Stedfast  
-
-	* gmime-part.c (g_mime_part_set_content_md5): Don't allow the
-	setting of Content-MD5 headers for multipart/* and message/rfc822
-	types.
-
-	* rfc/rfc1864.txt: Added (Content-MD5 RFC).
-
-2001-01-05  Jeffrey Stedfast  
-
-	* gmime-part.c (g_mime_part_set_content_md5): Oops, didn't quite
-	do this right. It should be correct now.
-	(g_mime_part_verify_content_md5): New function to verify the
-	Content-MD5.
-
-2001-01-04  Jeffrey Stedfast  
-
-	* gmime-parser.c (g_mime_parser_construct_part): Added support for
-	parsing Content-Location and Content-Md5 headers. Trim excess
-	trailing \n's. Also fix a bug where the end boundary would get
-	included as part of the last MIME Part's contents.
-	(g_strstrbound): Bounded strstr.
-
-	* configure.in:
-	* README: Updated version to 0.4.0
-
-	* Makefile.am: Added md5-utils to the build.
-
-	* md5-utils.[c,h]: Added.
-
-	* gmime-part.c (g_mime_part_to_string): Slightly new
-	implementation. Also added in support for Content-Location and
-	Content-Md5 headers.
-	(g_mime_part_destroy): Return if the mime part is
-	NULL. Also free the new content_location and content_md5 headers.
-	(g_mime_part_set_content_md5): Implemented.
-	(g_mime_part_get_content_md5): Implemented.
-	(g_mime_part_set_content_location): Implemented.
-	(g_mime_part_get_content_location): Implemented.
-	(get_content_type): Append a '\n'.
-
-2001-01-01  Jeffrey Stedfast  
-
-	* doc/gmime-sections.txt: Updated.
-
-	* doc/sgml/*: Updated.
-
-	* doc/html/*: Updated.
-
-2000-12-24  Jeffrey Stedfast  
-
-	* gmime-parser.c (g_mime_parser_construct_part): Don't set the
-	boundary if we are able to get the boundary from the content-type
-	because we'll just set the same data over again which is a
-	waste. Also tack a \n onto the ends of the boundary markers so
-	that "blah_" and "blah_D" don't trick the parser. Fix it so that
-	an empty part won't set any contents (since setting a 0-length
-	content stream causes a segfault).
-	(construct_headers): Take an inlen argument so that we can parse
-	headers without needing to strdup before passing into this
-	function.
-	(g_mime_parser_construct_message): Don't strdup the headers since
-	we can just pass in the length to the construct_headers() function
-	now.
-
-2000-12-18  Jeffrey Stedfast  
-
-	* gmime-parser.c (g_mime_parser_construct_part): Moved from being
-	an internal-only function.
-
-2000-12-28  Charles Kerr 
-
-	* gmime-utils.c (g_mime_utils_text_is_8bit): gracefully handle
-	a NULL pointer being passed in.  Thanks to Christophe Lambin for
-	reporting this problem.
-
-2000-12-14  Charles Kerr 
-
-	* gmime-messge.c (g_mime_message_get_message_id):  change
-	g_return_if_fail() to g_return_val_if_fail() to ensure that
-	a value is always returned.
-
-	* gmime-part.h (g_mime_part_get_content_description): make
-	the GMimePart argument const.
-	* gmime-part.h (g_mime_part_get_content): same.
-
-	* test-mime.c (test_addresses): fix bad printf statement.
-
-	* test-parser.c (test_parser): fixed the printf type of a time_t
-	from an int to unsigned long to avoid compiler warnings.
-
-2000-12-13  Jeffrey Stedfast  
-
-	* doc/sgml/*:
-	* doc/html/*:
-	* doc/gmime-sections.txt: Updated.
-
-	* README: Updated version line to 0.3.0
-
-2000-12-12  Jeffrey Stedfast  
-
-	* gmime-part.c (g_mime_part_to_string): Wrap some content-*
-	headers that might sometimes be long.
-
-	* gmime-message.c (create_header): Updated to reflect function
-	name changes/moves.
-
-	* gmime-utils.c (g_mime_utils_header_printf): Moved here from
-	gmime-message.c and slightly renamed ;-)
-	(g_mime_utils_header_fold): Moved from being private to being
-	public.
-
-2000-12-12  Jeffrey Stedfast  
-
-	* gmime-part.c: Hmmm, why weren't multiparts using the internal
-	get_content_type function rather than ...content_type_to_string?
-	Possible FIXME: Should content_type_to_string do what
-	get_content_type does? or should it remain untouched and just
-	return "type/subtype"?
-
-	* gmime-part.h: No more boundary data member.
-
-	* gmime-part.c (g_mime_part_get_boundary): Updated, as we no
-	longer store the boundary on the MIME Part and instead only on the
-	content-type (where it belongs).
-	(g_mime_part_set_boundary): And here too.
-	(g_mime_part_destroy): No longer need to destroy the boundary.
-
-2000-12-11  Jeffrey Stedfast  
-
-	* gmime-part.c (g_mime_part_get_subpart_from_content_id): Erm,
-	smack me. This needs to be recursive (this is what happens when I
-	code really late at night).
-
-2000-12-11  Jeffrey Stedfast  
-
-	* configure.in (GMIME_MINOR_VERSION): Updated to 0.3.0
-
-	* gmime-parser.c (get_mime_part): Updated to reflect the
-	add_subpart API change.
-
-	* test-mime.c (test_multipart): And here too.
-
-	* gmime-part.h (g_mime_part_add_child): Macro added for backward
-	source compatability.
-
-	* gmime-part.c (g_mime_part_get_subpart_from_content_id): Renamed
-	from g_mime_part_get_child_from_content_id as I think I'm gonna
-	start calling them subparts in the API as it's a bit clearer than
-	calling them children. Also fixed up some of the logic (what if
-	the parent mime part had a content-id? The way the code was before
-	it'd never search the subparts). Oh, it also returns const now.
-	(g_mime_part_add_subpart): Renamed from g_mime_part_add_child and
-	also now does some error checking to make sure the parent part is
-	a multipart.
-
-2000-12-10  Charles Kerr 
-
-	* gmime-part.c (g_mime_part_get_child_by_content_id): new
-	utility function.
-
-2000-12-09  Jeffrey Stedfast  
-
-	* gmime-part.c (g_mime_part_set_boundary): Generate a random
-	boundary if passed boundary is NULL.
-
-2000-12-07  Jeffrey Stedfast  
-
-	* gmime-message.c (multipart_get_body): Traverses a MIME Part and
-	'always' extracts the body assuming it exists. Extracts the
-	preffered text type if it exists, otherwise returns the type less
-	preferred.
-	(g_mime_message_get_body): Use multipart_get_body if the toplevel
-	part is a multipart.
-
-2000-12-05  Jeffrey Stedfast  
-
-	* README: Updated with more RFCs, etc.
-
-	* rfc/* Added a bunch more rfcs of interest.
-
-2000-12-04  Jeffrey Stedfast  
-
-	* test-mime.c: Added test code for the address parser.
-
-	* gmime-utils.c (g_mime_utils_quoted_encode_step): Updated. No
-	longer need to special-case whitespace chars as they have been put
-	into the gmime_special_table (a while ago).
-
-2000-12-02  Jeffrey Stedfast  
-
-	* Makefile.am: Install gmime.m4
-
-	* gmime.m4: Added.
-
-2000-12-02  Jeffrey Stedfast  
-
-	* gmime-part.c (g_mime_part_foreach): New convenience function for
-	manipulating each subpart of a mime part.
-
-	* gmime-message.c (g_mime_message_foreach_part): New convenience
-	function for manipulating all mime parts of a message.
-
-2000-12-02  Jeffrey Stedfast  
-
-	* doc/sgml/*:
-	* doc/html/*: Updated.
-
-	* doc/gmime-sections.txt: Add g_mime_message_[g,s]et_message_id.
-
-	* gmime-parser.c (construct_headers): Parse out Message-Id
-	headers.
-
-	* gmime-message.c (g_mime_message_destroy): Free the message id.
-	(g_mime_message_set_message_id): New function to set the message
-	id on a message.
-	(g_mime_message_set_message_id): New accessor function for
-	message-ids.
-	(create_header): Write out the Message-Id if and only if it
-	exists.
-
-2000-11-29  Jeffrey Stedfast  
-
-	* README: Updated.
-
-	* doc/gmime-sections.txt: Added new functions.
-
-	* doc/html/*: Updated.
-
-2000-11-29  Jeffrey Stedfast  
-
-	* configure.in: Bumped the version to 0.2.0 because the API has
-	changed a bit.
-
-	* test-parser.c:
-	* test-mime.c: Updated.
-
-	* gmime-utils.c (BASE64_ENCODE_LEN):
-	(QP_ENCODE_LEN): Macros for determining how much space we need to
-	encode a chunk of data to that encoding (estimate is liberal).
-	(encode_8bit_word): Use the macros to determine the length we
-	need.
-
-	* gmime-message.c (g_mime_message_get_body): Updated to reflect
-	changes to gmime-part.
-
-	* gmime-parser.c (get_mime_part): Updated.
-
-	* gmime-part.c (g_mime_part_set_content): Now takes a len argument
-	and has been updated to reflect the move to GByteArray.
-	(g_mime_part_destroy): Updated.
-	(g_mime_part_set_pre_encoded_content): New convenience function to
-	decode pre-encoded content and set it on the mime part.
-	(g_mime_part_get_content): Renamed from
-	g_mime_part_decode_contents.
-
-	* gmime-part.h: GMimePart->content is now a GByteArray that will
-	hold the raw content (in it's unencoded form).
-
-2000-11-28  Jeffrey Stedfast  
-
-	* gmime-content-type.c (g_mime_content_type_new_from_string):
-	Ignore extranious semicolons between parameters. Handle the event
-	where the content-type doesn't specify a subtype (this is broken
-	but some mailers will send "Content-Type: text" for example).
-	(g_mime_content_type_new): If there isn't a type or subtype, print
-	a warning and try to do some smart defaulting action.
-
-	* gmime-message.c (handle_multipart_alternative): Only remember
-	the last subpart if it was a text part.
-
-2000-11-19  Jeffrey Stedfast  
-
-	* doc/html/*:
-	* doc/sgml/*: Updated.
-
-	* test-mime.c: Updated.
-
-	* gmime-utils.c (g_mime_utils_quote_string): Do the detection on
-	whether or not to wrap the string in quotes here rather than
-	requiring a boolean argument specifying whether the string should
-	be quoted. RFC2045 provides us with a list of characters that are
-	not safe.
-
-	* gmime-param.c (g_mime_param_to_string): Updated to reflect
-	changes to g_mime_utils_quote_string. This function is the main
-	reason for the change - parameter values should really only be
-	quoted if they have to be else they should remain unquoted.
-
-	* internet-address.c (encoded_name): Updated to reflect changes to
-	g_mime_utils_quote_string.
-
-2000-11-19  Jeffrey Stedfast  
-
-	* TODO: Updated.
-
-	* gmime-utils.c: Updated gmime_special_table.
-	(g_mime_utils_8bit_header_encode): Since rfc2047 states that all
-	whitespace between encoded atoms must be ignored, the encoder
-	should therefor make an effort to encode whitespace when it falls
-	between two atoms that will be encoded. Use the IS_ESAFE mask.
-	(quoted_encode): Now takes a safemask argument to specify which
-	chars are safe to leave unencoded and also a arg to save whether
-	or not the word was encoded.
-	(g_mime_utils_8bit_header_encode_phrase): Updated to use the
-	IS_PSAFE mask.
-
-2000-11-19  Jeffrey Stedfast  
-
-	* gmime-parser.c (header_unfold): New function to unfold a header
-	(to be used internally).
-	(construct_headers): Unfold headers as we parse them.
-
-	* configure.in: Changed version to 0.1.1.
-
-	* gmime-part.c (get_content_disposition): Append a ";" before
-	appending any parameters even when there is no disposition
-	text. Also only enter into the param loop if there exist params.
-
-2000-11-16  Jeffrey Stedfast  
-
-	* doc/sgml/*: Added.
-	
-	* doc/gmime-sections.txt: Added g_mime_part_decode_contents and
-	g_mime_header_printf.
-
-	* gmime-message.c (header_fold): New function to fold headers.
-	(g_mime_header_printf): New convenience function to print a
-	formatted header (which will get correctly folded).
-	(create_header): Correctly fold each header.
-
-2000-11-16  Charles Kerr 
-
-	* gmime-utils.c (datetok): don't crash if the date string passed
-	in is NULL.
-
-2000-11-15  Jeffrey Stedfast  
-
-	* gmime-part.c (g_mime_part_decode_contents): New convenience
-	function to decode the contents of a mime part (based on code by
-	Wayne Schuller).
-
-2000-11-14  Jeffrey Stedfast  
-
-	* doc/html/index.sgml: Added - apparently we need this :-)
-
-	* doc/Makefile.am: Updated to pass distcheck
-
-2000-11-10  Jeffrey Stedfast  
-
-	* doc/gmime-docs.sgml: Added a new paragraph explaining the
-	difference between functions that return const and the ones that
-	don't.
-	
-	* doc/html/*.html: Updated.
-
-	* gmime-message.c: 
-	* gmime-part.c: 
-	* gmime-parser.c: 
-	* internet-address.c: 
-	* gmime-param.c: Updated Gtk-Doc comments.
-
-	* gmime-content-type.c: Wrote Gtk-Doc comments.
-
-2000-11-10  Jeffrey Stedfast  
-	
-	* Makefile.am (SUBDIRS): Added doc
-
-	* configure.in: Generate doc/Makefile
-
-	* doc/Makefile.am: Ignore more headers when performaing
-	gtkdoc-scan.
-
-	* doc/gmime-docs.sgml:
-	* doc/gmime-sections.txt: Added.
-
-	* doc/html/*.html: Generated library reference.
-
-2000-11-09  Jeffrey Stedfast  
-
-	* TODO: Updated.
-
-	* test-mime.c: Added test of the new quote/unquote functions.
-	
-	* gmime-message.c (g_mime_message_add_recipients_from_string):
-	Check for escaped quotes.
-	
-	* gmime-part.c (get_content_type): Correctly quote params.
-	(get_content_disposition): Same.
-
-	* gmime-param.c (g_mime_param_new_from_string): Check for escaped
-	quotes. Also use unquote_string() to unquote the value.
-	(g_mime_param_to_string): Correctly quote the value.
-
-	* gmime-parser.c (get_mime_part): Check for escaped quotes and
-	correctly unquote strings where appropriate.
-
-	* gmime-utils.c (g_mime_utils_quote_string): New convenience
-	function to escape and quote a string.
-	(g_mime_utils_unquote_string): New convenience function to
-	un-escape and un-quote a string.
-
-	* internet-address.c (encoded_name): Use quote_string().
-	(internet_address_new): Use unquote_string() to unquote and
-	unescape the name component (it will be re-escaped and re-quoted
-	when it's written to a string later).
-
-2000-11-09  Jeffrey Stedfast  
-
-	* TODO: Updated.
-
-2000-11-08  Jeffrey Stedfast  
-
-	* gmime-parser.c (construct_headers): Oops. Set the subject with
-	the decoded string rather than the encoded one.
-	(get_mime_part): On the chance that we come accross a broken
-	multipart, default the mime type to text/plain and continue on.
-
-2000-11-08  Jeffrey Stedfast  
-
-	* internet-address.c (internet_address_to_string): Moved code
-	around to avoid unecessary warnings.
-
-	* gmime-utils.c: Added Gtk-Doc style comments to all the
-	functions.
-	(g_mime_utils_best_encoding): Return a GMimePartEncodingType
-	instead of gint.
-
-2000-11-01  Jeffrey Stedfast  
-
-	* Makefile.am (INCLUDES): Add -DG_LOG_DOMAIN=\"gmime\"
-
-2000-10-31  Jeffrey Stedfast  
-
-	* test-parser.c (test_parser): Test g_mime_message_get_body() here
-	as well.
-
-	* test-mime.c: Updated to reflect changes to get_body.
-	
-	* gmime-message.c (g_mime_message_get_body): Return an allocated
-	buffer because we want to return the decoded message body rather
-	than the (possibly) encoded form.
-	(create_header): Write out the arbitrary headers first as they may
-	contain headers like "Received:" which really ought to be at the
-	top.
-
-	* gmime-part.c: Removed some old cruft.
-
-2000-10-29  Jeffrey Stedfast  
-
-	* internet-address.c (encoded_name): Use
-	g_mime_utils_8bit_header_encode_phrase() to encode the addrspec.
-
-	* gmime-utils.c (g_mime_utils_8bit_header_decode): Fix to make the
-	decoder more rfc compliant. As stated by rfc2047, all white space
-	between encoded words MUST be ignored.
-	(g_mime_utils_8bit_header_encode_phrase): New rfc2047 encoding
-	function for phrases (see rfc2047 section 5 part 3).
-
-2000-10-28  Jeffrey Stedfast  
-
-	* gmime-utils.c (parse_rfc822_date): Fixed the off-by-one-hour
-	bug.
-
-	* test-mime.c: Updated to reflect changes to
-	g_mime_message_get_body().
-
-	* gmime-message.c (g_mime_message_get_headers): Added Gtk-Doc
-	comment.
-	(g_mime_message_get_body): Modified to return a const pointer to
-	the message body rather than allocating it.
-
-2000-10-28  Charles Kerr 
-
-	* gmime-message.c (g_mime_message_get_headers): New function
-	similar to g_mime_message_get_body.  Useful if you want a raw
-	display of headers separate from the body.
-
-	* gmime-message.[c,h] (g_mime_message_get_body): made const.
-
-2000-10-28  Jeffrey Stedfast  
-
-	* tests/Makefile.am: New automake file (when we make a release,
-	this directory should really be a part of the tarball as it
-	contains data for the test programs).
-
-	* tests/.cvsignore: Added.
-
-	* Makefile.am (SUBDIRS): Add the 'tests' directory
-
-	* configure.in: Generate tests/Makefile
-
-2000-10-27  Jeffrey Stedfast  
-
-	* test-mime.c: Added code to test g_mime_message_get_body()
-
-	* gmime-message.c (g_mime_message_get_body): New convenience
-	function that attempts to get the message body in the requested
-	text format (plain vs html).
-
-	* gmime-parser.c (construct_headers): If the end of a header field
-	is the end of the header, break out of the loop.
-
-	* gmime-content-type.[c,h]: Added const to arguments where
-	appropriate.
-
-	* gmime-utils.h: Fixed a spelling mistake in a comment ;-)
-
-2000-10-26  Charles Kerr 
-
-	* gmime-utils.h: made const the input ptrs for encode/decode
-	funcs.
-
-	* gmime-utils.c: Updated to reflect const changes.
-
-2000-10-26  Jeffrey Stedfast  
-
-	* test-mime.c: Also updated.
-
-	* gmime-parser.c (construct_headers): Updated to reflect name
-	changes.
-
-	* gmime-message.c: Updated to reflect name changes.
-
-	* gmime-message.h: Changed the name of the recipient type
-	#defines.
-
-2000-10-24  Jeffrey Stedfast 
-
-	* Makefile.am (SUBDIRS): Added "."
-
-	* configure.in: Create libgmime.spec
-
-2000-10-24  Charles Kerr 
-
-	* gmime-utils.c: added #include  to pick up atoi.
-
-	* internet-address.c (internet_address_new): removed unused
-	variable `decoded'
-
-2000-10-24  Jeffrey Stedfast  
-
-	Thanks to Charles Kerr of Pan fame for the following fixes.
-
-	* gmime-utils.c (encode_8bit_word): Oops, encode 'word' and not 'ptr'.
-
-	* gmime-part.c (g_mime_part_destroy): Free the content-id.
-
-2000-10-21  Jeffrey Stedfast  
-
-	* gmime.h.in: Wrap definitions in #ifndef __GMIME_H__
-
-2000-10-18  Jeffrey Stedfast  
-
-	* TODO: Updated.
-
-	* test-*.c: Updated to reflect GMime API changes.
-
-	* gmime-part.c: #include "gmime-utils.h"
-
-	* gmime-parser.c (g_mime_parser_construct_message): Now takes a
-	boolean argument 'save_extra_headers' which tells the parser
-	whether it should add unknown headers to the arbitrary header
-	array or ignore them.
-	(construct_headers): Save the extra headers if desired.
-
-	* gmime-message.c (g_mime_message_add_arbitrary_header): Use the
-	new GMimeHeader structure.
-	(g_mime_message_new): Always initialize the arbitrary header array.
-	(g_mime_message_destroy): The arbitrary header array will never
-	be NULL (as it is now pre-initialized) so don't bother
-	checking.
-	(create_header): rfc2047 encode the arbitrary header values.
-
-2000-10-17  Jeffrey Stedfast  
-
-	* rfc/rfc*.txt: MIME specification RFCs
-
-	* README: Updated.
-
-	* TODO: Added a list of tasks that need to be done eventually.
-
-	* gmime-parser.c (get_mime_part): rfc2047 decode the
-	content-description before we set the value.
-
-	* gmime-part.c (g_mime_part_to_string): rfc2047 encode the
-	content-description before we write it to the string.
-
-2000-10-06  Jeffrey Stedfast  
-
-	* gmime-parser.c (construct_headers): rfc2047 decode some headers.
-
-	* internet-address.c (internet_address_to_string): Now takes an
-	argument to rfc2047 encode or not, when not rfc2047 encoding.
-	(internet_address_new_from_string): Rewrote
-
-	* gmime-message.c (create_header): rfc2047 encode addresses and
-	subject headers.
-
-2000-10-05  Jeffrey Stedfast  
-
-	* gmime-utils.c (g_mime_utils_quoted_encode_step): Fixed some
-	non-compliance issues like encoding all spaces as =20 even when
-	they shouldn't have been.
-
-2000-10-04  Jeffrey Stedfast  
-
-	* acconfig.h:
-	* config.h.in: #undef HAVE_ISBLANK
-
-	* configure.in: Check for the isblank() GNU extension function.
-	
-	* gmime-parser.c (get_mime_part): Parse for the Content-Id. Use
-	isblank() instead of isspace() when looking to see if the content
-	header was wrapped. We want it to match only if the next char is
-	either a tab or a space.
-	(isblank): Define an isblank() macro if HAVE_ISBLANK isn't
-	defined.
-
-	* gmime-part.c (g_mime_part_set_content_id): New function to set
-	the Content-ID.
-	(g_mime_part_get_content_id): New function to get the Content-Id.
-	(g_mime_part_to_string): Print content id's if available.
-	(get_content_type): Eek! If there aren't any params, don't assign
-	'string' an empty string! It's already been initialized with a
-	type!
-
-2000-10-04  Jeffrey Stedfast  
-
-	* gmime-utils.c (quoted_decode): New function to decode rfc2047's
-	version of the quoted-printable encoding.
-	(decode_8bit_word): Use quoted_decode()
-	(quoted_encode): New function to encode to rfc2047's version of
-	quoted-printable (removed from the internals of encode_8bit_word)
-	(encode_8bit_word): Use quoted_encode()
-
-2000-10-01  Jeffrey Stedfast  
-
-	* internet-address.c (internet_address_new_from_string): Fixed a
-	logic error that cut off the last char of the name (or address).
-
-	* gmime-parser.c (construct_headers): Optimized.
-
-	* gmime-part.c (get_content_type): If there are no params, don't
-	try to get any. Fixes a segfault.
-
-	* gmime-utils.[c,h]: New utilities functions for use with libgmime
-	(time and encoding/decoding routines)
-	
-	* test-mime.c: test some of the routines in gmime-utils.c
-
-	* gmime.h.in: #include "gmime-utils.h"
-	
-	* configure.in: Added checks for time zone stuff
-
-	* acconfig.h:
-	* config.h.in: Added some #undef's for timezone stuff
-	
-	* Makefile.am: Added gmime-utils.[c,h]
-
-2000-09-24  Jeffrey Stedfast  
-
-	* HACKING: Updated
-
-	* gmime-param.c: Wrote Gtk-docs comments
-
-	* gmime-parser.c: Wrote Gtk-docs comments
-
-	* AUTHORS: Updated
-
-	* autogen.sh: Updated autogen.sh to look for gmime.h.in instead of
-	gmime.h
-
-2000-09-24  Jeffrey Stedfast  
-	
-	* gmime.h: Removed
-
-	* gmime.h.in: Replacement for gmime.h - modified to be dynamically
-	created at build-time.
-
-	* configure.in: Updated to generate gmime.h and also to ignore
-	doc/ until docs are written.
-
-	* Makefile.am: Modified to ignore doc/
-
-	* tests/*: MIME messages that break are likely to break MIME
-	parsers.
-
-2000-09-24  Jeffrey Stedfast  
-
-	* gmime-part.c (get_content_disposition): Put a space between
-	disposition parameters.
-	(get_content_type): New convenience function to dump the content
-	type and it's params to a string (for use internally).
-	(g_mime_part_to_string): Use get_content_type and add print for
-	content-description's.
-
-	* gmime-parser.c (get_mime_part): strip leading/trailing
-	whitespace from the disposition and convert param names to
-	lowercase. Also fixed Content-Transfer-Encoding.
-
-2000-09-23  Jeffrey Stedfast  
-
-	* gmime-part.c (g_mime_part_destroy): Erm, make sure to increment
-	to the next item in the list.
-
-	* gmime-message.c (recipients_destroy): Optimized a bit
-
-	* gmime-content-type.c (g_mime_content_type_new_from_string):
-	Change all parameter names to lowercase, this way we can look them
-	up without having to know which case the original name used (eg
-	boundary).
-
-	* test-mime.c: renamed from mime-test.c
-
-	* test-parser.c: a new test program that allows us to specify a
-	file to get our test email from.
-
-2000-09-22  Jeffrey Stedfast  
-
-	* configure.in: remember glib_cflags and glib_libs so we can dump
-	them into gmime-config later.
-
-	* gmime-config.in: use glib_cflags and glib_libs.
-
-	* gmime.h: add variables for major/minor/micro release
-
-	* Makefile.am: switch to GMIME_ instead of LIBGMIME_ stuff
diff -Nru gmime-2.6.22+dfsg2/config.guess gmime-3.0.1/config.guess
--- gmime-2.6.22+dfsg2/config.guess	1970-01-01 00:00:00.000000000 +0000
+++ gmime-3.0.1/config.guess	2016-06-28 13:40:13.000000000 +0000
@@ -0,0 +1,1421 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright 1992-2015 Free Software Foundation, Inc.
+
+timestamp='2015-01-01'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see .
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+#
+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
+#
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+#
+# Please send patches to .
+
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to ."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright 1992-2015 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > $dummy.c ;
+	for c in cc gcc c89 c99 ; do
+	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+case "${UNAME_SYSTEM}" in
+Linux|GNU|GNU/*)
+	# If the system lacks a compiler, then just pick glibc.
+	# We could probably try harder.
+	LIBC=gnu
+
+	eval $set_cc_for_build
+	cat <<-EOF > $dummy.c
+	#include 
+	#if defined(__UCLIBC__)
+	LIBC=uclibc
+	#elif defined(__dietlibc__)
+	LIBC=dietlibc
+	#else
+	LIBC=gnu
+	#endif
+	EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
+	;;
+esac
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+	# NetBSD (nbsd) targets should (where applicable) match one or
+	# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	#
+	# Note: NetBSD doesn't particularly care about the vendor
+	# portion of the name.  We always set it to "unknown".
+	sysctl="sysctl -n hw.machine_arch"
+	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+	case "${UNAME_MACHINE_ARCH}" in
+	    armeb) machine=armeb-unknown ;;
+	    arm*) machine=arm-unknown ;;
+	    sh3el) machine=shl-unknown ;;
+	    sh3eb) machine=sh-unknown ;;
+	    sh5el) machine=sh5le-unknown ;;
+	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently, or will in the future.
+	case "${UNAME_MACHINE_ARCH}" in
+	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+		eval $set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep -q __ELF__
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+		os=netbsd
+		;;
+	esac
+	# The OS release
+	# Debian GNU/NetBSD machines have a different userland, and
+	# thus, need a distinct triplet. However, they do not need
+	# kernel version information, so it can be replaced with a
+	# suitable tag, in the style of linux-gnu.
+	case "${UNAME_VERSION}" in
+	    Debian*)
+		release='-gnu'
+		;;
+	    *)
+		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		;;
+	esac
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "${machine}-${os}${release}"
+	exit ;;
+    *:Bitrig:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}
+	exit ;;
+    *:OpenBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+	exit ;;
+    *:ekkoBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+	exit ;;
+    *:SolidBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+	exit ;;
+    macppc:MirBSD:*:*)
+	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    *:MirBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    alpha:OSF1:*:*)
+	case $UNAME_RELEASE in
+	*4.0)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+		;;
+	*5.*)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		;;
+	esac
+	# According to Compaq, /usr/sbin/psrinfo has been available on
+	# OSF/1 and Tru64 systems produced since 1995.  I hope that
+	# covers most systems running today.  This code pipes the CPU
+	# types through head -n 1, so we only detect the type of CPU 0.
+	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+	case "$ALPHA_CPU_TYPE" in
+	    "EV4 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV4.5 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "LCA4 (21066/21068)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV5 (21164)")
+		UNAME_MACHINE="alphaev5" ;;
+	    "EV5.6 (21164A)")
+		UNAME_MACHINE="alphaev56" ;;
+	    "EV5.6 (21164PC)")
+		UNAME_MACHINE="alphapca56" ;;
+	    "EV5.7 (21164PC)")
+		UNAME_MACHINE="alphapca57" ;;
+	    "EV6 (21264)")
+		UNAME_MACHINE="alphaev6" ;;
+	    "EV6.7 (21264A)")
+		UNAME_MACHINE="alphaev67" ;;
+	    "EV6.8CB (21264C)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8AL (21264B)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8CX (21264D)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.9A (21264/EV69A)")
+		UNAME_MACHINE="alphaev69" ;;
+	    "EV7 (21364)")
+		UNAME_MACHINE="alphaev7" ;;
+	    "EV7.9 (21364A)")
+		UNAME_MACHINE="alphaev79" ;;
+	esac
+	# A Pn.n version is a patched version.
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+	exitcode=$?
+	trap '' 0
+	exit $exitcode ;;
+    Alpha\ *:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# Should we change UNAME_MACHINE based on the output of uname instead
+	# of the specific Alpha model?
+	echo alpha-pc-interix
+	exit ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-morphos
+	exit ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit ;;
+    *:z/VM:*:*)
+	echo s390-ibm-zvmoe
+	exit ;;
+    *:OS400:*:*)
+	echo powerpc-ibm-os400
+	exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit ;;
+    arm*:riscos:*:*|arm*:RISCOS:*:*)
+	echo arm-unknown-riscos
+	exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit ;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit ;;
+    DRS?6000:unix:4.0:6*)
+	echo sparc-icl-nx6
+	exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+	case `/usr/bin/uname -p` in
+	    sparc) echo sparc-icl-nx7; exit ;;
+	esac ;;
+    s390x:SunOS:*:*)
+	echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+	echo i386-pc-auroraux${UNAME_RELEASE}
+	exit ;;
+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+	eval $set_cc_for_build
+	SUN_ARCH="i386"
+	# If there is a compiler, see if it is configured for 64-bit objects.
+	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+	# This test works for both compilers.
+	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		grep IS_64BIT_ARCH >/dev/null
+	    then
+		SUN_ARCH="x86_64"
+	    fi
+	fi
+	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos${UNAME_RELEASE}
+		;;
+	    sun4)
+		echo sparc-sun-sunos${UNAME_RELEASE}
+		;;
+	esac
+	exit ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+	echo m68k-milan-mint${UNAME_RELEASE}
+	exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+	echo m68k-hades-mint${UNAME_RELEASE}
+	exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+	echo m68k-unknown-mint${UNAME_RELEASE}
+	exit ;;
+    m68k:machten:*:*)
+	echo m68k-apple-machten${UNAME_RELEASE}
+	exit ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+#include   /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c &&
+	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+	  SYSTEM_NAME=`$dummy $dummyarg` &&
+	    { echo "$SYSTEM_NAME"; exit; }
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit ;;
+    Motorola:*:4.3:PL8-*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit ;;
+    AViiON:dgux:*:*)
+	# DG/UX returns AViiON for all architectures
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+	then
+	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+	       [ ${TARGET_BINARY_INTERFACE}x = x ]
+	    then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	    else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	    fi
+	else
+	    echo i586-dg-dgux${UNAME_RELEASE}
+	fi
+	exit ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		eval $set_cc_for_build
+		sed 's/^		//' << EOF >$dummy.c
+		#include 
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+		then
+			echo "$SYSTEM_NAME"
+		else
+			echo rs6000-ibm-aix3.2.5
+		fi
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit ;;
+    *:AIX:*:[4567])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/lslpp ] ; then
+		IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
+			   awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit ;;                             # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit ;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+		if [ -x /usr/bin/getconf ]; then
+		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+		    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+		    case "${sc_cpu_version}" in
+		      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+		      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+		      532)                      # CPU_PA_RISC2_0
+			case "${sc_kernel_bits}" in
+			  32) HP_ARCH="hppa2.0n" ;;
+			  64) HP_ARCH="hppa2.0w" ;;
+			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+			esac ;;
+		    esac
+		fi
+		if [ "${HP_ARCH}" = "" ]; then
+		    eval $set_cc_for_build
+		    sed 's/^		//' << EOF >$dummy.c
+
+		#define _HPUX_SOURCE
+		#include 
+		#include 
+
+		int main ()
+		{
+		#if defined(_SC_KERNEL_BITS)
+		    long bits = sysconf(_SC_KERNEL_BITS);
+		#endif
+		    long cpu  = sysconf (_SC_CPU_VERSION);
+
+		    switch (cpu)
+			{
+			case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+			case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+			case CPU_PA_RISC2_0:
+		#if defined(_SC_KERNEL_BITS)
+			    switch (bits)
+				{
+				case 64: puts ("hppa2.0w"); break;
+				case 32: puts ("hppa2.0n"); break;
+				default: puts ("hppa2.0"); break;
+				} break;
+		#else  /* !defined(_SC_KERNEL_BITS) */
+			    puts ("hppa2.0"); break;
+		#endif
+			default: puts ("hppa1.0"); break;
+			}
+		    exit (0);
+		}
+EOF
+		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+		    test -z "$HP_ARCH" && HP_ARCH=hppa
+		fi ;;
+	esac
+	if [ ${HP_ARCH} = "hppa2.0w" ]
+	then
+	    eval $set_cc_for_build
+
+	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+	    # generating 64-bit code.  GNU and HP use different nomenclature:
+	    #
+	    # $ CC_FOR_BUILD=cc ./config.guess
+	    # => hppa2.0w-hp-hpux11.23
+	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+	    # => hppa64-hp-hpux11.23
+
+	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+		grep -q __LP64__
+	    then
+		HP_ARCH="hppa2.0w"
+	    else
+		HP_ARCH="hppa64"
+	    fi
+	fi
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux${HPUX_REV}
+	exit ;;
+    3050*:HI-UX:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include 
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+		{ echo "$SYSTEM_NAME"; exit; }
+	echo unknown-hitachi-hiuxwe2
+	exit ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+	exit ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+	exit ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+	exit ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+	exit ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    *:UNICOS/mp:*:*)
+	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+	FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+	echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    5000:UNIX_System_V:4.*:*)
+	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+	FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+	echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:FreeBSD:*:*)
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
+	case ${UNAME_PROCESSOR} in
+	    amd64)
+		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    *)
+		echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	esac
+	exit ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit ;;
+    *:MINGW64*:*)
+	echo ${UNAME_MACHINE}-pc-mingw64
+	exit ;;
+    *:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit ;;
+    *:MSYS*:*)
+	echo ${UNAME_MACHINE}-pc-msys
+	exit ;;
+    i*:windows32*:*)
+	# uname -m includes "-pc" on this system.
+	echo ${UNAME_MACHINE}-mingw32
+	exit ;;
+    i*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	exit ;;
+    *:Interix*:*)
+	case ${UNAME_MACHINE} in
+	    x86)
+		echo i586-pc-interix${UNAME_RELEASE}
+		exit ;;
+	    authenticamd | genuineintel | EM64T)
+		echo x86_64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	    IA64)
+		echo ia64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	esac ;;
+    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+	echo i${UNAME_MACHINE}-pc-mks
+	exit ;;
+    8664:Windows_NT:*)
+	echo x86_64-pc-mks
+	exit ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+	# UNAME_MACHINE based on the output of uname instead of i386?
+	echo i586-pc-interix
+	exit ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+	echo x86_64-unknown-cygwin
+	exit ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin
+	exit ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    *:GNU:*:*)
+	# the GNU system
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit ;;
+    *:GNU/*:*:*)
+	# other systems with GNU libc and userland
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
+	exit ;;
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit ;;
+    aarch64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    aarch64_be:Linux:*:*)
+	UNAME_MACHINE=aarch64_be
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev68 ;;
+	esac
+	objdump --private-headers /bin/sh | grep -q ld.so.1
+	if test "$?" = 0 ; then LIBC="gnulibc1" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    arc:Linux:*:* | arceb:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    arm*:Linux:*:*)
+	eval $set_cc_for_build
+	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+	    | grep -q __ARM_EABI__
+	then
+	    echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	else
+	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+		| grep -q __ARM_PCS_VFP
+	    then
+		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi
+	    else
+		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf
+	    fi
+	fi
+	exit ;;
+    avr32*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    cris:Linux:*:*)
+	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
+	exit ;;
+    crisv32:Linux:*:*)
+	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
+	exit ;;
+    frv:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    hexagon:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    i*86:Linux:*:*)
+	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
+	exit ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    m32r*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    mips:Linux:*:* | mips64:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef ${UNAME_MACHINE}
+	#undef ${UNAME_MACHINE}el
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=${UNAME_MACHINE}el
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=${UNAME_MACHINE}
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
+	;;
+    openrisc*:Linux:*:*)
+	echo or1k-unknown-linux-${LIBC}
+	exit ;;
+    or32:Linux:*:* | or1k*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    padre:Linux:*:*)
+	echo sparc-unknown-linux-${LIBC}
+	exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-${LIBC}
+	exit ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;
+	  PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;
+	  *)    echo hppa-unknown-linux-${LIBC} ;;
+	esac
+	exit ;;
+    ppc64:Linux:*:*)
+	echo powerpc64-unknown-linux-${LIBC}
+	exit ;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-${LIBC}
+	exit ;;
+    ppc64le:Linux:*:*)
+	echo powerpc64le-unknown-linux-${LIBC}
+	exit ;;
+    ppcle:Linux:*:*)
+	echo powerpcle-unknown-linux-${LIBC}
+	exit ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
+	exit ;;
+    sh64*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    tile*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    vax:Linux:*:*)
+	echo ${UNAME_MACHINE}-dec-linux-${LIBC}
+	exit ;;
+    x86_64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    xtensa*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	echo i386-sequent-sysv4
+	exit ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+	# Unixware is an offshoot of SVR4, but it has its own version
+	# number series starting with 2...
+	# I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+	# Use sysv4.2uw... so that sysv4* matches it.
+	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+	exit ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo ${UNAME_MACHINE}-pc-os2-emx
+	exit ;;
+    i*86:XTS-300:*:STOP)
+	echo ${UNAME_MACHINE}-unknown-stop
+	exit ;;
+    i*86:atheos:*:*)
+	echo ${UNAME_MACHINE}-unknown-atheos
+	exit ;;
+    i*86:syllable:*:*)
+	echo ${UNAME_MACHINE}-pc-syllable
+	exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    i*86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+	else
+		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+	fi
+	exit ;;
+    i*86:*:5:[678]*)
+	# UnixWare 7.x, OpenUNIX and OpenServer 6.
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	exit ;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+	# uname -m prints for DJGPP always 'pc', but it prints nothing about
+	# the processor, so we play safe by assuming i586.
+	# Note: whatever this is, it MUST be the same as what config.sub
+	# prints for the "djgpp" host, or else GDB configury will decide that
+	# this is a cross-build.
+	echo i586-pc-msdosdjgpp
+	exit ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+	echo m68k-convergent-sysv
+	exit ;;
+    M680?0:D-NIX:5.3:*)
+	echo m68k-diab-dnix
+	exit ;;
+    M68*:*:R3V[5678]*:*)
+	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4; exit; } ;;
+    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+	OS_REL='.3'
+	test -r /etc/.relid \
+	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit ;;
+    PENTIUM:*:4.0*:*)	# Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+			# says 
+	echo i586-unisys-sysv4
+	exit ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes .
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit ;;
+    *:*:*:FTX*)
+	# From seanf@swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit ;;
+    i*86:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo ${UNAME_MACHINE}-stratus-vos
+	exit ;;
+    *:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo hppa1.1-stratus-vos
+	exit ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+		echo mips-nec-sysv${UNAME_RELEASE}
+	else
+		echo mips-unknown-sysv${UNAME_RELEASE}
+	fi
+	exit ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit ;;
+    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
+	echo i586-pc-haiku
+	exit ;;
+    x86_64:Haiku:*:*)
+	echo x86_64-unknown-haiku
+	exit ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-6:SUPER-UX:*:*)
+	echo sx6-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-7:SUPER-UX:*:*)
+	echo sx7-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8:SUPER-UX:*:*)
+	echo sx8-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8R:SUPER-UX:*:*)
+	echo sx8r-nec-superux${UNAME_RELEASE}
+	exit ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Darwin:*:*)
+	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+	eval $set_cc_for_build
+	if test "$UNAME_PROCESSOR" = unknown ; then
+	    UNAME_PROCESSOR=powerpc
+	fi
+	if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then
+	    if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+		if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+		    (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		    grep IS_64BIT_ARCH >/dev/null
+		then
+		    case $UNAME_PROCESSOR in
+			i386) UNAME_PROCESSOR=x86_64 ;;
+			powerpc) UNAME_PROCESSOR=powerpc64 ;;
+		    esac
+		fi
+	    fi
+	elif test "$UNAME_PROCESSOR" = i386 ; then
+	    # Avoid executing cc on OS X 10.9, as it ships with a stub
+	    # that puts up a graphical alert prompting to install
+	    # developer tools.  Any system running Mac OS X 10.7 or
+	    # later (Darwin 11 and later) is required to have a 64-bit
+	    # processor. This is not true of the ARM version of Darwin
+	    # that Apple uses in portable devices.
+	    UNAME_PROCESSOR=x86_64
+	fi
+	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+	exit ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	UNAME_PROCESSOR=`uname -p`
+	if test "$UNAME_PROCESSOR" = "x86"; then
+		UNAME_PROCESSOR=i386
+		UNAME_MACHINE=pc
+	fi
+	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+	exit ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit ;;
+    NEO-?:NONSTOP_KERNEL:*:*)
+	echo neo-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSE-*:NONSTOP_KERNEL:*:*)
+	echo nse-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSR-?:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "$cputype" = "386"; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo ${UNAME_MACHINE}-unknown-plan9
+	exit ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit ;;
+    SEI:*:*:SEIUX)
+	echo mips-sei-seiux${UNAME_RELEASE}
+	exit ;;
+    *:DragonFly:*:*)
+	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit ;;
+    *:*VMS:*:*)
+	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	case "${UNAME_MACHINE}" in
+	    A*) echo alpha-dec-vms ; exit ;;
+	    I*) echo ia64-dec-vms ; exit ;;
+	    V*) echo vax-dec-vms ; exit ;;
+	esac ;;
+    *:XENIX:*:SysV)
+	echo i386-pc-xenix
+	exit ;;
+    i*86:skyos:*:*)
+	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+	exit ;;
+    i*86:rdos:*:*)
+	echo ${UNAME_MACHINE}-pc-rdos
+	exit ;;
+    i*86:AROS:*:*)
+	echo ${UNAME_MACHINE}-pc-aros
+	exit ;;
+    x86_64:VMkernel:*:*)
+	echo ${UNAME_MACHINE}-unknown-esx
+	exit ;;
+esac
+
+cat >&2 < in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff -Nru gmime-2.6.22+dfsg2/config.h.in gmime-3.0.1/config.h.in
--- gmime-2.6.22+dfsg2/config.h.in	2017-04-28 17:43:42.000000000 +0000
+++ gmime-3.0.1/config.h.in	2017-05-21 16:32:02.000000000 +0000
@@ -1,10 +1,7 @@
 /* config.h.in.  Generated from configure.ac by autoheader.  */
 
-/* Define if cryptography in GMime is enabled. */
-#undef ENABLE_CRYPTOGRAPHY
-
-/* Define if GMime should enable experimental S/MIME support. */
-#undef ENABLE_SMIME
+/* Define if GMime should enable GpgME PGP and S/MIME support. */
+#undef ENABLE_CRYPTO
 
 /* Define if GMime should enable warning output. */
 #undef ENABLE_WARNINGS
@@ -12,9 +9,6 @@
 /* Define to the GMime version */
 #undef GMIME_VERSION
 
-/* Define if libc defines an altzone variable */
-#undef HAVE_ALTZONE
-
 /* Define to 1 if you have the  header file. */
 #undef HAVE_DLFCN_H
 
@@ -37,21 +31,12 @@
 /* Define to 1 if you have the `getpagesize' function. */
 #undef HAVE_GETPAGESIZE
 
-/* Define to 1 if you have the `gmtime_r' function. */
-#undef HAVE_GMTIME_R
-
-/* Define to 1 if you have the `gmtime_s' function. */
-#undef HAVE_GMTIME_S
-
 /* Define to 1 to use auto-detected iconv-friendly charset names. */
 #undef HAVE_ICONV_DETECT_H
 
 /* Define to 1 if you have the  header file. */
 #undef HAVE_INTTYPES_H
 
-/* Define to 1 if you have the `localtime' function. */
-#undef HAVE_LOCALTIME
-
 /* Define to 1 if you have the  header file. */
 #undef HAVE_MEMORY_H
 
@@ -73,9 +58,6 @@
 /* Define to 1 if you have the  header file. */
 #undef HAVE_POLL_H
 
-/* Define to 1 if you have the  header file. */
-#undef HAVE_REGEX_H
-
 /* Define to 1 if you have the `select' function. */
 #undef HAVE_SELECT
 
@@ -85,9 +67,6 @@
 /* Define to 1 if you have the  header file. */
 #undef HAVE_STDLIB_H
 
-/* Define to 1 if you have the `strftime' function. */
-#undef HAVE_STRFTIME
-
 /* Define to 1 if you have the  header file. */
 #undef HAVE_STRINGS_H
 
@@ -106,15 +85,9 @@
 /* Define to 1 if you have the  header file. */
 #undef HAVE_SYS_TYPES_H
 
-/* Define if libc defines a timezone variable */
-#undef HAVE_TIMEZONE
-
 /* Define to 1 if you have the  header file. */
 #undef HAVE_TIME_H
 
-/* Define if struct tm has a tm_gmtoff member */
-#undef HAVE_TM_GMTOFF
-
 /* Define to 1 if you have the  header file. */
 #undef HAVE_UNISTD_H
 
@@ -124,8 +97,8 @@
 /* Define to 1 if you have the  header file. */
 #undef HAVE_WINSOCK2_H
 
-/* Define if libc defines a _timezone variable */
-#undef HAVE__TIMEZONE
+/* Define to 1 if GNU Libidn should be used. */
+#undef LIBIDN
 
 /* Define to the sub-directory where libtool stores uninstalled libraries. */
 #undef LT_OBJDIR
@@ -136,9 +109,6 @@
 /* Define to 0 if your system does not have the O_LARGEFILE flag */
 #undef O_LARGEFILE
 
-/* Name of package */
-#undef PACKAGE
-
 /* Define to the address where bug reports for this package should be sent. */
 #undef PACKAGE_BUGREPORT
 
@@ -169,18 +139,12 @@
 /* Define to 1 if you have the ANSI C header files. */
 #undef STDC_HEADERS
 
-/* Define if GMime should enable stricter parsing rules. */
-#undef STRICT_PARSER
-
 /* Using GNU libiconv */
 #undef USE_LIBICONV_GNU
 
 /* Using a native implementation of iconv in a separate library */
 #undef USE_LIBICONV_NATIVE
 
-/* Version number of package */
-#undef VERSION
-
 /* Enable large inode numbers on Mac OS X 10.5.  */
 #ifndef _DARWIN_USE_64_BIT_INODE
 # define _DARWIN_USE_64_BIT_INODE 1
diff -Nru gmime-2.6.22+dfsg2/config.sub gmime-3.0.1/config.sub
--- gmime-2.6.22+dfsg2/config.sub	1970-01-01 00:00:00.000000000 +0000
+++ gmime-3.0.1/config.sub	2016-06-28 13:40:13.000000000 +0000
@@ -0,0 +1,1807 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright 1992-2015 Free Software Foundation, Inc.
+
+timestamp='2015-01-01'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see .
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+
+
+# Please send patches to .
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to ."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright 1992-2015 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+  linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+  knetbsd*-gnu* | netbsd*-gnu* | \
+  kopensolaris*-gnu* | \
+  storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  android-linux)
+    os=-linux-android
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple | -axis | -knuth | -cray | -microblaze*)
+		os=
+		basic_machine=$1
+		;;
+	-bluegene*)
+		os=-cnk
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+	-chorusrdb)
+		os=-chorusrdb
+		basic_machine=$1
+		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco6)
+		os=-sco5v6
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5)
+		os=-sco3.2v5
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5v6*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-udk*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*178)
+		os=-lynxos178
+		;;
+	-lynx*5)
+		os=-lynxos5
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+	-mint | -mint[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	1750a | 580 \
+	| a29k \
+	| aarch64 | aarch64_be \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
+	| arc | arceb \
+	| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
+	| avr | avr32 \
+	| be32 | be64 \
+	| bfin \
+	| c4x | c8051 | clipper \
+	| d10v | d30v | dlx | dsp16xx \
+	| epiphany \
+	| fido | fr30 | frv | ft32 \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| hexagon \
+	| i370 | i860 | i960 | ia64 \
+	| ip2k | iq2000 \
+	| k1om \
+	| le32 | le64 \
+	| lm32 \
+	| m32c | m32r | m32rle | m68000 | m68k | m88k \
+	| maxq | mb | microblaze | microblazeel | mcore | mep | metag \
+	| mips | mipsbe | mipseb | mipsel | mipsle \
+	| mips16 \
+	| mips64 | mips64el \
+	| mips64octeon | mips64octeonel \
+	| mips64orion | mips64orionel \
+	| mips64r5900 | mips64r5900el \
+	| mips64vr | mips64vrel \
+	| mips64vr4100 | mips64vr4100el \
+	| mips64vr4300 | mips64vr4300el \
+	| mips64vr5000 | mips64vr5000el \
+	| mips64vr5900 | mips64vr5900el \
+	| mipsisa32 | mipsisa32el \
+	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa32r6 | mipsisa32r6el \
+	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64r6 | mipsisa64r6el \
+	| mipsisa64sb1 | mipsisa64sb1el \
+	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipsr5900 | mipsr5900el \
+	| mipstx39 | mipstx39el \
+	| mn10200 | mn10300 \
+	| moxie \
+	| mt \
+	| msp430 \
+	| nds32 | nds32le | nds32be \
+	| nios | nios2 | nios2eb | nios2el \
+	| ns16k | ns32k \
+	| open8 | or1k | or1knd | or32 \
+	| pdp10 | pdp11 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle \
+	| pyramid \
+	| riscv32 | riscv64 \
+	| rl78 | rx \
+	| score \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh64 | sh64le \
+	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+	| spu \
+	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
+	| ubicom32 \
+	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+	| visium \
+	| we32k \
+	| x86 | xc16x | xstormy16 | xtensa \
+	| z8k | z80)
+		basic_machine=$basic_machine-unknown
+		;;
+	c54x)
+		basic_machine=tic54x-unknown
+		;;
+	c55x)
+		basic_machine=tic55x-unknown
+		;;
+	c6x)
+		basic_machine=tic6x-unknown
+		;;
+	leon|leon[3-9])
+		basic_machine=sparc-$basic_machine
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
+	ms1)
+		basic_machine=mt-unknown
+		;;
+
+	strongarm | thumb | xscale)
+		basic_machine=arm-unknown
+		;;
+	xgate)
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	xscaleeb)
+		basic_machine=armeb-unknown
+		;;
+
+	xscaleel)
+		basic_machine=armel-unknown
+		;;
+
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	580-* \
+	| a29k-* \
+	| aarch64-* | aarch64_be-* \
+	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
+	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+	| avr-* | avr32-* \
+	| be32-* | be64-* \
+	| bfin-* | bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* \
+	| c8051-* | clipper-* | craynv-* | cydra-* \
+	| d10v-* | d30v-* | dlx-* \
+	| elxsi-* \
+	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| hexagon-* \
+	| i*86-* | i860-* | i960-* | ia64-* \
+	| ip2k-* | iq2000-* \
+	| k1om-* \
+	| le32-* | le64-* \
+	| lm32-* \
+	| m32c-* | m32r-* | m32rle-* \
+	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
+	| microblaze-* | microblazeel-* \
+	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+	| mips16-* \
+	| mips64-* | mips64el-* \
+	| mips64octeon-* | mips64octeonel-* \
+	| mips64orion-* | mips64orionel-* \
+	| mips64r5900-* | mips64r5900el-* \
+	| mips64vr-* | mips64vrel-* \
+	| mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* \
+	| mips64vr5000-* | mips64vr5000el-* \
+	| mips64vr5900-* | mips64vr5900el-* \
+	| mipsisa32-* | mipsisa32el-* \
+	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa32r6-* | mipsisa32r6el-* \
+	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64r6-* | mipsisa64r6el-* \
+	| mipsisa64sb1-* | mipsisa64sb1el-* \
+	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipsr5900-* | mipsr5900el-* \
+	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
+	| mt-* \
+	| msp430-* \
+	| nds32-* | nds32le-* | nds32be-* \
+	| nios-* | nios2-* | nios2eb-* | nios2el-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
+	| open8-* \
+	| or1k*-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
+	| pyramid-* \
+	| rl78-* | romp-* | rs6000-* | rx-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+	| sparclite-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
+	| tahoe-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+	| tile*-* \
+	| tron-* \
+	| ubicom32-* \
+	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
+	| vax-* \
+	| visium-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xc16x-* | xps100-* \
+	| xstormy16-* | xtensa*-* \
+	| ymp-* \
+	| z8k-* | z80-*)
+		;;
+	# Recognize the basic CPU types without company name, with glob match.
+	xtensa*)
+		basic_machine=$basic_machine-unknown
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	386bsd)
+		basic_machine=i386-unknown
+		os=-bsd
+		;;
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	a29khif)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	abacus)
+		basic_machine=abacus-unknown
+		;;
+	adobe68k)
+		basic_machine=m68010-adobe
+		os=-scout
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amd64)
+		basic_machine=x86_64-pc
+		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-unknown
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-unknown
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-unknown
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	apollo68bsd)
+		basic_machine=m68k-apollo
+		os=-bsd
+		;;
+	aros)
+		basic_machine=i386-pc
+		os=-aros
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	blackfin)
+		basic_machine=bfin-unknown
+		os=-linux
+		;;
+	blackfin-*)
+		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	bluegene*)
+		basic_machine=powerpc-ibm
+		os=-cnk
+		;;
+	c54x-*)
+		basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c55x-*)
+		basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c6x-*)
+		basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c90)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+	cegcc)
+		basic_machine=arm-unknown
+		os=-cegcc
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | j90)
+		basic_machine=j90-cray
+		os=-unicos
+		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16 | cr16-*)
+		basic_machine=cr16-unknown
+		os=-elf
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	decsystem10* | dec10*)
+		basic_machine=pdp10-dec
+		os=-tops10
+		;;
+	decsystem20* | dec20*)
+		basic_machine=pdp10-dec
+		os=-tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	dicos)
+		basic_machine=i686-pc
+		os=-dicos
+		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2* | dpx2*-bull)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	es1800 | OSE68k | ose68k | ose | OSE)
+		basic_machine=m68k-ericsson
+		os=-ose
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	h8300xray)
+		basic_machine=h8300-hitachi
+		os=-xray
+		;;
+	h8500hms)
+		basic_machine=h8500-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hppa-next)
+		os=-nextstep3
+		;;
+	hppaosf)
+		basic_machine=hppa1.1-hp
+		os=-osf
+		;;
+	hppro)
+		basic_machine=hppa1.1-hp
+		os=-proelf
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		;;
+	i*86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i*86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i*86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i*86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
+		;;
+	i386mach)
+		basic_machine=i386-mach
+		os=-mach
+		;;
+	i386-vsta | vsta)
+		basic_machine=i386-unknown
+		os=-vsta
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	leon-*|leon[3-9]-*)
+		basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'`
+		;;
+	m68knommu)
+		basic_machine=m68k-unknown
+		os=-linux
+		;;
+	m68knommu-*)
+		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	microblaze*)
+		basic_machine=microblaze-xilinx
+		;;
+	mingw64)
+		basic_machine=x86_64-pc
+		os=-mingw64
+		;;
+	mingw32)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	mingw32ce)
+		basic_machine=arm-unknown
+		os=-mingw32ce
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	morphos)
+		basic_machine=powerpc-unknown
+		os=-morphos
+		;;
+	moxiebox)
+		basic_machine=moxie-unknown
+		os=-moxiebox
+		;;
+	msdos)
+		basic_machine=i386-pc
+		os=-msdos
+		;;
+	ms1-*)
+		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+		;;
+	msys)
+		basic_machine=i686-pc
+		os=-msys
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	nacl)
+		basic_machine=le32-unknown
+		os=-nacl
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	netbsd386)
+		basic_machine=i386-unknown
+		os=-netbsd
+		;;
+	netwinder)
+		basic_machine=armv4l-rebel
+		os=-linux
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	necv70)
+		basic_machine=v70-nec
+		os=-sysv
+		;;
+	next | m*-next )
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	mon960)
+		basic_machine=i960-intel
+		os=-mon960
+		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	neo-tandem)
+		basic_machine=neo-tandem
+		;;
+	nse-tandem)
+		basic_machine=nse-tandem
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	openrisc | openrisc-*)
+		basic_machine=or32-unknown
+		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
+		;;
+	OSE68000 | ose68000)
+		basic_machine=m68000-ericsson
+		os=-ose
+		;;
+	os68k)
+		basic_machine=m68k-none
+		os=-os68k
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	parisc)
+		basic_machine=hppa-unknown
+		os=-linux
+		;;
+	parisc-*)
+		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+	pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pc98)
+		basic_machine=i386-pc
+		;;
+	pc98-*)
+		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium | p5 | k5 | k6 | nexgen | viac3)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2 | pentiumiii | pentium3)
+		basic_machine=i686-pc
+		;;
+	pentium4)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium4-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=power-ibm
+		;;
+	ppc | ppcbe)	basic_machine=powerpc-unknown
+		;;
+	ppc-* | ppcbe-*)
+		basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle | ppc-le | powerpc-little)
+		basic_machine=powerpcle-unknown
+		;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64)	basic_machine=powerpc64-unknown
+		;;
+	ppc64-* | ppc64p7-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+		basic_machine=powerpc64le-unknown
+		;;
+	ppc64le-* | powerpc64little-*)
+		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
+		;;
+	rdos | rdos64)
+		basic_machine=x86_64-pc
+		os=-rdos
+		;;
+	rdos32)
+		basic_machine=i386-pc
+		os=-rdos
+		;;
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	s390 | s390-*)
+		basic_machine=s390-ibm
+		;;
+	s390x | s390x-*)
+		basic_machine=s390x-ibm
+		;;
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	sb1)
+		basic_machine=mipsisa64sb1-unknown
+		;;
+	sb1el)
+		basic_machine=mipsisa64sb1el-unknown
+		;;
+	sde)
+		basic_machine=mipsisa32-sde
+		os=-elf
+		;;
+	sei)
+		basic_machine=mips-sei
+		os=-seiux
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sh5el)
+		basic_machine=sh5le-unknown
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	sparclite-wrs | simso-wrs)
+		basic_machine=sparclite-wrs
+		os=-vxworks
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	st2000)
+		basic_machine=m68k-tandem
+		;;
+	stratus)
+		basic_machine=i860-stratus
+		os=-sysv4
+		;;
+	strongarm-* | thumb-*)
+		basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=alphaev5-cray
+		os=-unicos
+		;;
+	t90)
+		basic_machine=t90-cray
+		os=-unicos
+		;;
+	tile*)
+		basic_machine=$basic_machine-unknown
+		os=-linux-gnu
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	toad1)
+		basic_machine=pdp10-xkl
+		os=-tops20
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	v810 | necv810)
+		basic_machine=v810-nec
+		os=-none
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vpp*|vx|vx-*)
+		basic_machine=f301-fujitsu
+		;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	w65*)
+		basic_machine=w65-wdc
+		os=-none
+		;;
+	w89k-*)
+		basic_machine=hppa1.1-winbond
+		os=-proelf
+		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	xscale-* | xscalee[bl]-*)
+		basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
+		;;
+	ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	z8k-*-coff)
+		basic_machine=z8k-unknown
+		os=-sim
+		;;
+	z80-*-coff)
+		basic_machine=z80-unknown
+		os=-sim
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		basic_machine=hppa1.1-winbond
+		;;
+	op50n)
+		basic_machine=hppa1.1-oki
+		;;
+	op60c)
+		basic_machine=hppa1.1-oki
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	mmix)
+		basic_machine=mmix-knuth
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp10)
+		# there are many clones, so DEC is not a safe bet
+		basic_machine=pdp10-unknown
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+		basic_machine=sh-unknown
+		;;
+	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+		basic_machine=sparc-sun
+		;;
+	cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	mac | mpw | mac-mpw)
+		basic_machine=m68k-apple
+		;;
+	pmac | pmac-mpw)
+		basic_machine=powerpc-apple
+		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+	# First match some system type aliases
+	# that might get confused with valid system types.
+	# -solaris* is a basic system type, with this one exception.
+	-auroraux)
+		os=-auroraux
+		;;
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-svr4*)
+		os=-sysv4
+		;;
+	-unixware*)
+		os=-sysv4.2uw
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# First accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST END IN A *, to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+	      | -sym* | -kopensolaris* | -plan9* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* | -aros* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+	      | -bitrig* | -openbsd* | -solidbsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -chorusos* | -chorusrdb* | -cegcc* \
+	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
+	      | -linux-newlib* | -linux-musl* | -linux-uclibc* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
+	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i*86-*)
+			;;
+		    *)
+			os=-nto$os
+			;;
+		esac
+		;;
+	-nto-qnx*)
+		;;
+	-nto*)
+		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
+	-linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-opened*)
+		os=-openedition
+		;;
+	-os400*)
+		os=-os400
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-atheos*)
+		os=-atheos
+		;;
+	-syllable*)
+		os=-syllable
+		;;
+	-386bsd)
+		os=-bsd
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-nova*)
+		os=-rtmk-nova
+		;;
+	-ns2 )
+		os=-nextstep2
+		;;
+	-nsk*)
+		os=-nsk
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+	-tpf*)
+		os=-tpf
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-ose*)
+		os=-ose
+		;;
+	-es1800*)
+		os=-ose
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+		os=-mint
+		;;
+	-aros*)
+		os=-aros
+		;;
+	-zvmoe)
+		os=-zvmoe
+		;;
+	-dicos*)
+		os=-dicos
+		;;
+	-nacl*)
+		;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+	score-*)
+		os=-elf
+		;;
+	spu-*)
+		os=-elf
+		;;
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+	c4x-* | tic4x-*)
+		os=-coff
+		;;
+	c8051-*)
+		os=-elf
+		;;
+	hexagon-*)
+		os=-elf
+		;;
+	tic54x-*)
+		os=-coff
+		;;
+	tic55x-*)
+		os=-coff
+		;;
+	tic6x-*)
+		os=-coff
+		;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=-tops20
+		;;
+	pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		;;
+	m68*-cisco)
+		os=-aout
+		;;
+	mep-*)
+		os=-elf
+		;;
+	mips*-cisco)
+		os=-elf
+		;;
+	mips*-*)
+		os=-elf
+		;;
+	or32-*)
+		os=-coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-be)
+		os=-beos
+		;;
+	*-haiku)
+		os=-haiku
+		;;
+	*-ibm)
+		os=-aix
+		;;
+	*-knuth)
+		os=-mmixware
+		;;
+	*-wec)
+		os=-proelf
+		;;
+	*-winbond)
+		os=-proelf
+		;;
+	*-oki)
+		os=-proelf
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigaos
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-next )
+		os=-nextstep
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+	*-gould)
+		os=-sysv
+		;;
+	*-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+	*-sgi)
+		os=-irix
+		;;
+	*-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=-uxpv
+		;;
+	*-rom68k)
+		os=-coff
+		;;
+	*-*bug)
+		os=-coff
+		;;
+	*-apple)
+		os=-macos
+		;;
+	*-atari*)
+		os=-mint
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-cnk*|-aix*)
+				vendor=ibm
+				;;
+			-beos*)
+				vendor=be
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-mpeix*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs* | -opened*)
+				vendor=ibm
+				;;
+			-os400*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-tpf*)
+				vendor=ibm
+				;;
+			-vxsim* | -vxworks* | -windiss*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+			-hms*)
+				vendor=hitachi
+				;;
+			-mpw* | -macos*)
+				vendor=apple
+				;;
+			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+				vendor=atari
+				;;
+			-vos*)
+				vendor=stratus
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff -Nru gmime-2.6.22+dfsg2/configure gmime-3.0.1/configure
--- gmime-2.6.22+dfsg2/configure	1970-01-01 00:00:00.000000000 +0000
+++ gmime-3.0.1/configure	2017-05-21 16:31:30.000000000 +0000
@@ -0,0 +1,21864 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.69 for gmime 3.0.1.
+#
+# Report bugs to .
+#
+#
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# Use a proper internal environment variable to ensure we don't fall
+  # into an infinite loop, continuously re-executing ourselves.
+  if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+    _as_can_reexec=no; export _as_can_reexec;
+    # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+  fi
+  # We don't want this to propagate to other subprocesses.
+          { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+"
+  as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+  exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
+  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1
+
+  test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
+    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    PATH=/empty FPATH=/empty; export PATH FPATH
+    test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
+      || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1"
+  if (eval "$as_required") 2>/dev/null; then :
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  as_found=:
+  case $as_dir in #(
+	 /*)
+	   for as_base in sh bash ksh sh5; do
+	     # Try only shells that exist, to save several forks.
+	     as_shell=$as_dir/$as_base
+	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  CONFIG_SHELL=$as_shell as_have_required=yes
+		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  break 2
+fi
+fi
+	   done;;
+       esac
+  as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+  CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+      if test "x$CONFIG_SHELL" != x; then :
+  export CONFIG_SHELL
+             # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+    if test x$as_have_required = xno; then :
+  $as_echo "$0: This script requires a shell more modern than all"
+  $as_echo "$0: the shells that I found on your system."
+  if test x${ZSH_VERSION+set} = xset ; then
+    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+  else
+    $as_echo "$0: Please tell bug-autoconf@gnu.org and
+$0: https://github.com/jstedfast/gmime/issues about your
+$0: system, including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+  fi
+  exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+  as_lineno_1=$LINENO as_lineno_1a=$LINENO
+  as_lineno_2=$LINENO as_lineno_2a=$LINENO
+  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+  # already done that, so ensure we don't try to do so again and fall
+  # in an infinite loop.  This has already happened in practice.
+  _as_can_reexec=no; export _as_can_reexec
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -pR'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -pR'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -pR'
+  fi
+else
+  as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+
+test -n "$DJDIR" || exec 7<&0 &1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='gmime'
+PACKAGE_TARNAME='gmime'
+PACKAGE_VERSION='3.0.1'
+PACKAGE_STRING='gmime 3.0.1'
+PACKAGE_BUGREPORT='https://github.com/jstedfast/gmime/issues'
+PACKAGE_URL=''
+
+ac_unique_file="README.md"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include 
+#ifdef HAVE_SYS_TYPES_H
+# include 
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include 
+#endif
+#ifdef STDC_HEADERS
+# include 
+# include 
+#else
+# ifdef HAVE_STDLIB_H
+#  include 
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+#  include 
+# endif
+# include 
+#endif
+#ifdef HAVE_STRINGS_H
+# include 
+#endif
+#ifdef HAVE_INTTYPES_H
+# include 
+#endif
+#ifdef HAVE_STDINT_H
+# include 
+#endif
+#ifdef HAVE_UNISTD_H
+# include 
+#endif"
+
+ac_header_list=
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIBOBJS
+GMIME_LIBS
+GMIME_CFLAGS
+GMIME_LIBS_PRIVATE
+GMIME_INCLUDEDIR
+GMIME_LIBDIR
+LTP_GENHTML
+LTP
+SHTOOL
+ENABLE_VAPIGEN_FALSE
+ENABLE_VAPIGEN_TRUE
+VAPIGEN_MAKEFILE
+VAPIGEN_VAPIDIR
+VAPIGEN
+HAVE_INTROSPECTION_FALSE
+HAVE_INTROSPECTION_TRUE
+INTROSPECTION_MAKEFILE
+INTROSPECTION_LIBS
+INTROSPECTION_CFLAGS
+INTROSPECTION_TYPELIBDIR
+INTROSPECTION_GIRDIR
+INTROSPECTION_GENERATE
+INTROSPECTION_COMPILER
+INTROSPECTION_SCANNER
+LIBIDN_LIBS
+LIBIDN_CFLAGS
+ENABLE_CRYPTO_FALSE
+ENABLE_CRYPTO_TRUE
+GPGME_PTHREAD_LIBS
+GPGME_PTHREAD_CFLAGS
+GPGME_CONFIG
+ENABLE_LARGEFILE_FALSE
+ENABLE_LARGEFILE_TRUE
+SYSTEM_GETOPT_FALSE
+SYSTEM_GETOPT_TRUE
+GLIB_COMPILE_RESOURCES
+GLIB_MKENUMS
+GOBJECT_QUERY
+GLIB_GENMARSHAL
+GLIB_LIBS
+GLIB_CFLAGS
+ZLIB_LIBS
+ZLIB_CFLAGS
+ICONV_LIBS
+HAVE_DOCBOOK_FALSE
+HAVE_DOCBOOK_TRUE
+DB2HTML
+GTK_DOC_USE_REBASE_FALSE
+GTK_DOC_USE_REBASE_TRUE
+GTK_DOC_USE_LIBTOOL_FALSE
+GTK_DOC_USE_LIBTOOL_TRUE
+GTK_DOC_BUILD_PDF_FALSE
+GTK_DOC_BUILD_PDF_TRUE
+GTK_DOC_BUILD_HTML_FALSE
+GTK_DOC_BUILD_HTML_TRUE
+ENABLE_GTK_DOC_FALSE
+ENABLE_GTK_DOC_TRUE
+HAVE_GTK_DOC_FALSE
+HAVE_GTK_DOC_TRUE
+GTKDOC_DEPS_LIBS
+GTKDOC_DEPS_CFLAGS
+HTML_DIR
+GTKDOC_MKPDF
+GTKDOC_REBASE
+GTKDOC_CHECK_PATH
+GTKDOC_CHECK
+PKG_CONFIG_LIBDIR
+PKG_CONFIG_PATH
+PKG_CONFIG
+LTCXXCOMPILE
+LTCOMPILE
+DOLT_BASH
+LT_SYS_LIBRARY_PATH
+OTOOL64
+OTOOL
+LIPO
+NMEDIT
+DSYMUTIL
+MANIFEST_TOOL
+ac_ct_AR
+AR
+DLLTOOL
+OBJDUMP
+ac_ct_DUMPBIN
+DUMPBIN
+LD
+FGREP
+SED
+LIBTOOL
+TAR
+MV
+RM
+LN_S
+EGREP
+GREP
+CPP
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+am__nodep
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__quote
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+MS_LIB_AVAILABLE_FALSE
+MS_LIB_AVAILABLE_TRUE
+ms_librarian
+RANLIB
+NM
+WINDRES
+OS_WIN32_X64_FALSE
+OS_WIN32_X64_TRUE
+OS_WIN32_FALSE
+OS_WIN32_TRUE
+PLATFORM_WIN32_FALSE
+PLATFORM_WIN32_TRUE
+LIB_EXE_MACHINE_FLAG
+LT_CURRENT_MINUS_AGE
+LT_AGE
+LT_REVISION
+LT_CURRENT
+LT_RELEASE
+GMIME_BINARY_AGE
+GMIME_INTERFACE_AGE
+GMIME_VERSION
+GMIME_API_VERSION
+GMIME_MICRO_VERSION
+GMIME_MINOR_VERSION
+GMIME_MAJOR_VERSION
+MAINT
+MAINTAINER_MODE_FALSE
+MAINTAINER_MODE_TRUE
+ACLOCAL_AMFLAGS
+AM_BACKSLASH
+AM_DEFAULT_VERBOSITY
+AM_DEFAULT_V
+AM_V
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_os
+target_vendor
+target_cpu
+target
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_silent_rules
+enable_maintainer_mode
+enable_dependency_tracking
+enable_shared
+enable_static
+with_pic
+enable_fast_install
+with_aix_soname
+with_gnu_ld
+with_sysroot
+enable_libtool_lock
+with_html_dir
+enable_gtk_doc
+enable_gtk_doc_html
+enable_gtk_doc_pdf
+enable_profiling
+enable_warnings
+with_libiconv
+enable_glibtest
+enable_largefile
+enable_crypto
+with_gpgme_prefix
+with_libidn
+enable_introspection
+enable_vala
+enable_coverage
+'
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP
+LT_SYS_LIBRARY_PATH
+PKG_CONFIG
+PKG_CONFIG_PATH
+PKG_CONFIG_LIBDIR
+GTKDOC_DEPS_CFLAGS
+GTKDOC_DEPS_LIBS
+ZLIB_CFLAGS
+ZLIB_LIBS
+LIBIDN_CFLAGS
+LIBIDN_LIBS'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *=)   ac_optarg= ;;
+  *)    ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    case $ac_envvar in #(
+      '' | [0-9]* | *[!_$as_cr_alnum]* )
+      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+    esac
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
+		datadir sysconfdir sharedstatedir localstatedir includedir \
+		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+		libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_myself" : 'X\(//\)[^/]' \| \
+	 X"$as_myself" : 'X\(//\)$' \| \
+	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+	pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures gmime 3.0.1 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking ...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+  --docdir=DIR            documentation root [DATAROOTDIR/doc/gmime]
+  --htmldir=DIR           html documentation [DOCDIR]
+  --dvidir=DIR            dvi documentation [DOCDIR]
+  --pdfdir=DIR            pdf documentation [DOCDIR]
+  --psdir=DIR             ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+  --target=TARGET   configure for building compilers for TARGET [HOST]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of gmime 3.0.1:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-option-checking  ignore unrecognized --enable/--with options
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --enable-silent-rules   less verbose build output (undo: "make V=1")
+  --disable-silent-rules  verbose build output (undo: "make V=0")
+  --enable-maintainer-mode
+                          enable make rules and dependencies not useful (and
+                          sometimes confusing) to the casual installer
+  --enable-dependency-tracking
+                          do not reject slow dependency extractors
+  --disable-dependency-tracking
+                          speeds up one-time build
+  --enable-shared[=PKGS]  build shared libraries [default=yes]
+  --enable-static[=PKGS]  build static libraries [default=yes]
+  --enable-fast-install[=PKGS]
+                          optimize for fast installation [default=yes]
+  --disable-libtool-lock  avoid locking (might break parallel builds)
+  --enable-gtk-doc        use gtk-doc to build documentation [[default=no]]
+  --enable-gtk-doc-html   build documentation in html format [[default=yes]]
+  --enable-gtk-doc-pdf    build documentation in pdf format [[default=no]]
+  --enable-profiling      enable profiling compile flags [[default=no]]
+  --enable-warnings       enable g_warning output when invalid MIME is
+                          encountered [[default=no]]
+  --disable-glibtest      do not try to compile and run a test GLIB program
+  --enable-largefile      enable support for large files [[default=yes]]
+  --disable-largefile     omit support for large files
+  --enable-crypto         enable PGP and S/MIME support [[default=yes]]
+  --enable-introspection=[no/auto/yes]
+                          Enable introspection for this build
+  --enable-vala=[no/auto/yes]
+                          build Vala bindings [default=auto]
+  --enable-coverage       enable coverage testing with gcov
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use
+                          both]
+  --with-aix-soname=aix|svr4|both
+                          shared library versioning (aka "SONAME") variant to
+                          provide on AIX, [default=aix].
+  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
+  --with-sysroot[=DIR]    Search for dependent libraries within DIR (or the
+                          compiler's sysroot if not specified).
+  --with-html-dir=PATH    path to installed docs
+  --with-libiconv=[no/gnu/native]
+                          use the libiconv library
+  --with-gpgme-prefix=PFX prefix where GPGME is installed (optional)
+  --with-libidn=DIR       Support IDN (needs GNU Libidn)
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L if you have libraries in a
+              nonstandard directory 
+  LIBS        libraries to pass to the linker, e.g. -l
+  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I if
+              you have headers in a nonstandard directory 
+  CPP         C preprocessor
+  LT_SYS_LIBRARY_PATH
+              User-defined run-time library search path.
+  PKG_CONFIG  path to pkg-config utility
+  PKG_CONFIG_PATH
+              directories to add to pkg-config's search path
+  PKG_CONFIG_LIBDIR
+              path overriding pkg-config's built-in search path
+  GTKDOC_DEPS_CFLAGS
+              C compiler flags for GTKDOC_DEPS, overriding pkg-config
+  GTKDOC_DEPS_LIBS
+              linker flags for GTKDOC_DEPS, overriding pkg-config
+  ZLIB_CFLAGS C compiler flags for ZLIB, overriding pkg-config
+  ZLIB_LIBS   linker flags for ZLIB, overriding pkg-config
+  LIBIDN_CFLAGS
+              C compiler flags for LIBIDN, overriding pkg-config
+  LIBIDN_LIBS linker flags for LIBIDN, overriding pkg-config
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to .
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" ||
+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+      continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+gmime configure 3.0.1
+generated by GNU Autoconf 2.69
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 test -x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } > conftest.i && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+       $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=$ac_status
+fi
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+/* Define $2 to an innocuous variant, in case  declares $2.
+   For example, HP-UX 11i  declares gettimeofday.  */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $2 (); below.
+    Prefer  to  if __STDC__ is defined, since
+     exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include 
+#else
+# include 
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_c_check_header_mongrel ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if eval \${$3+:} false; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_header_compiler=yes
+else
+  ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <$2>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  ac_header_preproc=yes
+else
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
+  yes:no: )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+( $as_echo "## -------------------------------------------------------- ##
+## Report this to https://github.com/jstedfast/gmime/issues ##
+## -------------------------------------------------------- ##"
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_mongrel
+
+# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
+# -------------------------------------------
+# Tests whether TYPE exists after having included INCLUDES, setting cache
+# variable VAR accordingly.
+ac_fn_c_check_type ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=no"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+if (sizeof ($2))
+	 return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+if (sizeof (($2)))
+	    return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  eval "$3=yes"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_type
+
+# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
+# --------------------------------------------
+# Tries to find the compile-time value of EXPR in a program that includes
+# INCLUDES, setting VAR accordingly. Returns whether the value could be
+# computed
+ac_fn_c_compute_int ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if test "$cross_compiling" = yes; then
+    # Depending upon the size, compute the lo and hi bounds.
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= 0)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=$ac_mid; break
+else
+  as_fn_arith $ac_mid + 1 && ac_lo=$as_val
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) < 0)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_lo=$ac_mid; break
+else
+  as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  ac_lo= ac_hi=
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=$ac_mid
+else
+  as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in #((
+?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
+'') ac_retval=1 ;;
+esac
+  else
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+static long int longval () { return $2; }
+static unsigned long int ulongval () { return $2; }
+#include 
+#include 
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    return 1;
+  if (($2) < 0)
+    {
+      long int i = longval ();
+      if (i != ($2))
+	return 1;
+      fprintf (f, "%ld", i);
+    }
+  else
+    {
+      unsigned long int i = ulongval ();
+      if (i != ($2))
+	return 1;
+      fprintf (f, "%lu", i);
+    }
+  /* Do not output a trailing newline, as this causes \r\n confusion
+     on some platforms.  */
+  return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  echo >>conftest.val; read $3 config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by gmime $as_me 3.0.1, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    $as_echo "PATH: $as_dir"
+  done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+    2)
+      as_fn_append ac_configure_args1 " '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+	ac_must_keep_next=false # Got value, back to normal.
+      else
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
+      fi
+      as_fn_append ac_configure_args " '$ac_arg'"
+      ;;
+    esac
+  done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+	"s/'\''/'\''\\\\'\'''\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      $as_echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=\$$ac_var
+	case $ac_val in
+	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	esac
+	$as_echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      $as_echo "$as_me: caught signal $ac_signal"
+    $as_echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+  # We do not want a PATH search for config.site.
+  case $CONFIG_SITE in #((
+    -*)  ac_site_file1=./$CONFIG_SITE;;
+    */*) ac_site_file1=$CONFIG_SITE;;
+    *)   ac_site_file1=./$CONFIG_SITE;;
+  esac
+elif test "x$prefix" != xNONE; then
+  ac_site_file1=$prefix/share/config.site
+  ac_site_file2=$prefix/etc/config.site
+else
+  ac_site_file1=$ac_default_prefix/share/config.site
+  ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+  test "x$ac_site_file" = xNONE && continue
+  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file" \
+      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special files
+  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
+  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+as_fn_append ac_header_list " stdlib.h"
+as_fn_append ac_header_list " unistd.h"
+as_fn_append ac_header_list " sys/param.h"
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+	# differences in whitespace do not lead to failure.
+	ac_old_val_w=`echo x $ac_old_val`
+	ac_new_val_w=`echo x $ac_new_val`
+	if test "$ac_old_val_w" != "$ac_new_val_w"; then
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	  ac_cache_corrupted=:
+	else
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+	  eval $ac_var=\$ac_old_val
+	fi
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
+$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
+$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
+$as_echo_n "checking target system type... " >&6; }
+if ${ac_cv_target+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$target_alias" = x; then
+  ac_cv_target=$ac_cv_host
+else
+  ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
+$as_echo "$ac_cv_target" >&6; }
+case $ac_cv_target in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;;
+esac
+target=$ac_cv_target
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_target
+shift
+target_cpu=$1
+target_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+target_os=$*
+IFS=$ac_save_IFS
+case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
+
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+test -n "$target_alias" &&
+  test "$program_prefix$program_suffix$program_transform_name" = \
+    NONENONEs,x,x, &&
+  program_prefix=${target_alias}-
+
+
+
+# Save this value here, since automake will set cflags later
+cflags_set=${CFLAGS+set}
+
+am__api_version='1.15'
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+  ./ | .// | /[cC]/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    rm -rf conftest.one conftest.two conftest.dir
+	    echo one > conftest.one
+	    echo two > conftest.two
+	    mkdir conftest.dir
+	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+	      test -s conftest.one && test -s conftest.two &&
+	      test -s conftest.dir/conftest.one &&
+	      test -s conftest.dir/conftest.two
+	    then
+	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	      break 3
+	    fi
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+
+  done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[\\\"\#\$\&\'\`$am_lf]*)
+    as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
+    as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   am_has_slept=no
+   for am_try in 1 2; do
+     echo "timestamp, slept: $am_has_slept" > conftest.file
+     set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+     if test "$*" = "X"; then
+	# -L didn't work.
+	set X `ls -t "$srcdir/configure" conftest.file`
+     fi
+     if test "$*" != "X $srcdir/configure conftest.file" \
+	&& test "$*" != "X conftest.file $srcdir/configure"; then
+
+	# If neither matched, then we have a broken ls.  This can happen
+	# if, for instance, CONFIG_SHELL is bash and it inherits a
+	# broken ls alias from the environment.  This has actually
+	# happened.  Such a system could not be considered "sane".
+	as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
+  alias in your environment" "$LINENO" 5
+     fi
+     if test "$2" = conftest.file || test $am_try -eq 2; then
+       break
+     fi
+     # Just in case.
+     sleep 1
+     am_has_slept=yes
+   done
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+  ( sleep 1 ) &
+  am_sleep_pid=$!
+fi
+
+rm -f conftest.file
+
+test "$program_prefix" != NONE &&
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+  am_missing_run="$MISSING "
+else
+  am_missing_run=
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip".  However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+  if ${ac_cv_path_mkdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in mkdir gmkdir; do
+	 for ac_exec_ext in '' $ac_executable_extensions; do
+	   as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
+	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+	     'mkdir (GNU coreutils) '* | \
+	     'mkdir (coreutils) '* | \
+	     'mkdir (fileutils) '4.1*)
+	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+	       break 3;;
+	   esac
+	 done
+       done
+  done
+IFS=$as_save_IFS
+
+fi
+
+  test -d ./--version && rmdir ./--version
+  if test "${ac_cv_path_mkdir+set}" = set; then
+    MKDIR_P="$ac_cv_path_mkdir -p"
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for MKDIR_P within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    MKDIR_P="$ac_install_sh -d"
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AWK+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AWK="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  SET_MAKE=
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# Check whether --enable-silent-rules was given.
+if test "${enable_silent_rules+set}" = set; then :
+  enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in # (((
+  yes) AM_DEFAULT_VERBOSITY=0;;
+   no) AM_DEFAULT_VERBOSITY=1;;
+    *) AM_DEFAULT_VERBOSITY=1;;
+esac
+am_make=${MAKE-make}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
+if ${am_cv_make_support_nested_variables+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if $as_echo 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+	@$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+  am_cv_make_support_nested_variables=yes
+else
+  am_cv_make_support_nested_variables=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+$as_echo "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+    AM_V='$(V)'
+  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+  AM_V=$AM_DEFAULT_VERBOSITY
+  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  am__isrc=' -I$(srcdir)'
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='gmime'
+ VERSION='3.0.1'
+
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# For better backward compatibility.  To be removed once Automake 1.9.x
+# dies out for good.  For more background, see:
+# 
+# 
+mkdir_p='$(MKDIR_P)'
+
+# We need awk for the "check" target (and possibly the TAP driver).  The
+# system "awk" is bad on some platforms.
+# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
+
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar plaintar pax cpio none'
+
+# The POSIX 1988 'ustar' format is defined with fixed-size fields.
+      # There is notably a 21 bits limit for the UID and the GID.  In fact,
+      # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
+      # and bug#13588).
+      am_max_uid=2097151 # 2^21 - 1
+      am_max_gid=$am_max_uid
+      # The $UID and $GID variables are not portable, so we need to resort
+      # to the POSIX-mandated id(1) utility.  Errors in the 'id' calls
+      # below are definitely unexpected, so allow the users to see them
+      # (that is, avoid stderr redirection).
+      am_uid=`id -u || echo unknown`
+      am_gid=`id -g || echo unknown`
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether UID '$am_uid' is supported by ustar format" >&5
+$as_echo_n "checking whether UID '$am_uid' is supported by ustar format... " >&6; }
+      if test $am_uid -le $am_max_uid; then
+         { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+      else
+         { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+         _am_tools=none
+      fi
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether GID '$am_gid' is supported by ustar format" >&5
+$as_echo_n "checking whether GID '$am_gid' is supported by ustar format... " >&6; }
+      if test $am_gid -le $am_max_gid; then
+         { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+      else
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+        _am_tools=none
+      fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to create a ustar tar archive" >&5
+$as_echo_n "checking how to create a ustar tar archive... " >&6; }
+
+  # Go ahead even if we have the value already cached.  We do so because we
+  # need to set the values for the 'am__tar' and 'am__untar' variables.
+  _am_tools=${am_cv_prog_tar_ustar-$_am_tools}
+
+  for _am_tool in $_am_tools; do
+    case $_am_tool in
+    gnutar)
+      for _am_tar in tar gnutar gtar; do
+        { echo "$as_me:$LINENO: $_am_tar --version" >&5
+   ($_am_tar --version) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); } && break
+      done
+      am__tar="$_am_tar --format=ustar -chf - "'"$$tardir"'
+      am__tar_="$_am_tar --format=ustar -chf - "'"$tardir"'
+      am__untar="$_am_tar -xf -"
+      ;;
+    plaintar)
+      # Must skip GNU tar: if it does not support --format= it doesn't create
+      # ustar tarball either.
+      (tar --version) >/dev/null 2>&1 && continue
+      am__tar='tar chf - "$$tardir"'
+      am__tar_='tar chf - "$tardir"'
+      am__untar='tar xf -'
+      ;;
+    pax)
+      am__tar='pax -L -x ustar -w "$$tardir"'
+      am__tar_='pax -L -x ustar -w "$tardir"'
+      am__untar='pax -r'
+      ;;
+    cpio)
+      am__tar='find "$$tardir" -print | cpio -o -H ustar -L'
+      am__tar_='find "$tardir" -print | cpio -o -H ustar -L'
+      am__untar='cpio -i -H ustar -d'
+      ;;
+    none)
+      am__tar=false
+      am__tar_=false
+      am__untar=false
+      ;;
+    esac
+
+    # If the value was cached, stop now.  We just wanted to have am__tar
+    # and am__untar set.
+    test -n "${am_cv_prog_tar_ustar}" && break
+
+    # tar/untar a dummy directory, and stop if the command works.
+    rm -rf conftest.dir
+    mkdir conftest.dir
+    echo GrepMe > conftest.dir/file
+    { echo "$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar" >&5
+   (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); }
+    rm -rf conftest.dir
+    if test -s conftest.tar; then
+      { echo "$as_me:$LINENO: $am__untar &5
+   ($am__untar &5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); }
+      { echo "$as_me:$LINENO: cat conftest.dir/file" >&5
+   (cat conftest.dir/file) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); }
+      grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+    fi
+  done
+  rm -rf conftest.dir
+
+  if ${am_cv_prog_tar_ustar+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  am_cv_prog_tar_ustar=$_am_tool
+fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_tar_ustar" >&5
+$as_echo "$am_cv_prog_tar_ustar" >&6; }
+
+
+
+
+
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes.  So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+  cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present.  This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: 
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message.  This
+can help us improve future automake versions.
+
+END
+  if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+    echo 'Configuration will proceed anyway, since you have set the' >&2
+    echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+    echo >&2
+  else
+    cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: .
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+    as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
+  fi
+fi
+
+ACLOCAL_AMFLAGS="-I m4 \${ACLOCAL_FLAGS}"
+
+# Check whether --enable-silent-rules was given.
+if test "${enable_silent_rules+set}" = set; then :
+  enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in # (((
+  yes) AM_DEFAULT_VERBOSITY=0;;
+   no) AM_DEFAULT_VERBOSITY=1;;
+    *) AM_DEFAULT_VERBOSITY=0;;
+esac
+am_make=${MAKE-make}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
+if ${am_cv_make_support_nested_variables+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if $as_echo 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+	@$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+  am_cv_make_support_nested_variables=yes
+else
+  am_cv_make_support_nested_variables=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+$as_echo "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+    AM_V='$(V)'
+  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+  AM_V=$AM_DEFAULT_VERBOSITY
+  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
+ac_config_headers="$ac_config_headers config.h"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
+$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
+    # Check whether --enable-maintainer-mode was given.
+if test "${enable_maintainer_mode+set}" = set; then :
+  enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
+else
+  USE_MAINTAINER_MODE=no
+fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5
+$as_echo "$USE_MAINTAINER_MODE" >&6; }
+   if test $USE_MAINTAINER_MODE = yes; then
+  MAINTAINER_MODE_TRUE=
+  MAINTAINER_MODE_FALSE='#'
+else
+  MAINTAINER_MODE_TRUE='#'
+  MAINTAINER_MODE_FALSE=
+fi
+
+  MAINT=$MAINTAINER_MODE_TRUE
+
+
+
+
+GMIME_MAJOR_VERSION=3
+GMIME_MINOR_VERSION=0
+GMIME_MICRO_VERSION=1
+GMIME_INTERFACE_AGE=1
+GMIME_BINARY_AGE=1
+GMIME_API_VERSION=3.0
+GMIME_VERSION=3.0.1
+
+
+
+
+
+
+
+
+
+
+$as_echo "#define GMIME_VERSION \"3.0.1\"" >>confdefs.h
+
+
+# libtool versioning
+LT_RELEASE=3.0
+LT_CURRENT=0
+LT_REVISION=1
+LT_AGE=0
+LT_CURRENT_MINUS_AGE=0
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if building for Win32" >&5
+$as_echo_n "checking if building for Win32... " >&6; }
+LIB_EXE_MACHINE_FLAG=X86
+case "$host" in
+  *-*-mingw*)
+    platform_win32="yes"
+    native_win32="yes"
+    case "$host" in
+    x86_64-*-*)
+      LIB_EXE_MACHINE_FLAG=X64
+      ;;
+    esac
+    ;;
+  *)
+    platform_win32="no"
+    native_win32="no"
+    ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $platform_win32" >&5
+$as_echo "$platform_win32" >&6; }
+
+
+
+ if test "x$platform_win32" = "xyes"; then
+  PLATFORM_WIN32_TRUE=
+  PLATFORM_WIN32_FALSE='#'
+else
+  PLATFORM_WIN32_TRUE='#'
+  PLATFORM_WIN32_FALSE=
+fi
+
+ if test "$native_win32" = "xyes"; then
+  OS_WIN32_TRUE=
+  OS_WIN32_FALSE='#'
+else
+  OS_WIN32_TRUE='#'
+  OS_WIN32_FALSE=
+fi
+
+ if test "$LIB_EXE_MACHINE_FLAG" = "X64"; then
+  OS_WIN32_X64_TRUE=
+  OS_WIN32_X64_FALSE='#'
+else
+  OS_WIN32_X64_TRUE='#'
+  OS_WIN32_X64_FALSE=
+fi
+
+
+if test "$glib_native_win32" = "yes"; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args.
+set dummy ${ac_tool_prefix}windres; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_WINDRES+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$WINDRES"; then
+  ac_cv_prog_WINDRES="$WINDRES" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_WINDRES="${ac_tool_prefix}windres"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+WINDRES=$ac_cv_prog_WINDRES
+if test -n "$WINDRES"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WINDRES" >&5
+$as_echo "$WINDRES" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_WINDRES"; then
+  ac_ct_WINDRES=$WINDRES
+  # Extract the first word of "windres", so it can be a program name with args.
+set dummy windres; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_WINDRES+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_WINDRES"; then
+  ac_cv_prog_ac_ct_WINDRES="$ac_ct_WINDRES" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_WINDRES="windres"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_WINDRES=$ac_cv_prog_ac_ct_WINDRES
+if test -n "$ac_ct_WINDRES"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_WINDRES" >&5
+$as_echo "$ac_ct_WINDRES" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_WINDRES" = x; then
+    WINDRES="no"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    WINDRES=$ac_ct_WINDRES
+  fi
+else
+  WINDRES="$ac_cv_prog_WINDRES"
+fi
+
+  if test "$WINDRES" = no; then
+    as_fn_error $? "*** Could not find an implementation of windres in your PATH." "$LINENO" 5
+  fi
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}nm", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nm; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_NM+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NM"; then
+  ac_cv_prog_NM="$NM" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_NM="${ac_tool_prefix}nm"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+NM=$ac_cv_prog_NM
+if test -n "$NM"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NM" >&5
+$as_echo "$NM" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_NM"; then
+  ac_ct_NM=$NM
+  # Extract the first word of "nm", so it can be a program name with args.
+set dummy nm; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_NM+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_NM"; then
+  ac_cv_prog_ac_ct_NM="$ac_ct_NM" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_NM="nm"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_NM=$ac_cv_prog_ac_ct_NM
+if test -n "$ac_ct_NM"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NM" >&5
+$as_echo "$ac_ct_NM" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_NM" = x; then
+    NM="no"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    NM=$ac_ct_NM
+  fi
+else
+  NM="$ac_cv_prog_NM"
+fi
+
+  if test "$NM" = no; then
+    as_fn_error $? "*** Could not find an implementation of nm in your PATH." "$LINENO" 5
+  fi
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+  # Extract the first word of "lib.exe", so it can be a program name with args.
+set dummy lib.exe; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ms_librarian+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ms_librarian"; then
+  ac_cv_prog_ms_librarian="$ms_librarian" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ms_librarian="yes"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_prog_ms_librarian" && ac_cv_prog_ms_librarian="no"
+fi
+fi
+ms_librarian=$ac_cv_prog_ms_librarian
+if test -n "$ms_librarian"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ms_librarian" >&5
+$as_echo "$ms_librarian" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+ if test x$ms_librarian = xyes; then
+  MS_LIB_AVAILABLE_TRUE=
+  MS_LIB_AVAILABLE_FALSE='#'
+else
+  MS_LIB_AVAILABLE_TRUE='#'
+  MS_LIB_AVAILABLE_FALSE=
+fi
+
+
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
+$as_echo_n "checking for style of include used by $am_make... " >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from 'make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
+$as_echo "$_am_result" >&6; }
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+  enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+  am__nodep='_no'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+	then :; else
+	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	fi
+	# We set ac_cv_exeext here because the later test for it is not
+	# safe: cross compilers may not add the suffix if given an `-o'
+	# argument, so we may need to know it at that point already.
+	# Even if this section looks crufty: it has the advantage of
+	# actually working.
+	break;;
+    * )
+	break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+if test -z "$ac_file"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include 
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+  { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+  if { ac_try='./conftest$ac_cv_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+    fi
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include 
+#include 
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+$as_echo_n "checking whether $CC understands -c and -o together... " >&6; }
+if ${am_cv_prog_cc_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+  # Make sure it works both with $CC and with simple cc.
+  # Following AC_PROG_CC_C_O, we do the test twice because some
+  # compilers refuse to overwrite an existing .o file with -o,
+  # though they will create one.
+  am_cv_prog_cc_c_o=yes
+  for am_i in 1 2; do
+    if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+   ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); } \
+         && test -f conftest2.$ac_objext; then
+      : OK
+    else
+      am_cv_prog_cc_c_o=no
+      break
+    fi
+  done
+  rm -f core conftest*
+  unset am_i
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+$as_echo "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+depcc="$CC"   am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named 'D' -- because '-MD' means "put the output
+  # in D".
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+      # Solaris 10 /bin/sh.
+      echo '/* dummy */' > sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with '-c' and '-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle '-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs.
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # After this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested.
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok '-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing strerror" >&5
+$as_echo_n "checking for library containing strerror... " >&6; }
+if ${ac_cv_search_strerror+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char strerror ();
+int
+main ()
+{
+return strerror ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' cposix; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_strerror=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_strerror+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_strerror+:} false; then :
+
+else
+  ac_cv_search_strerror=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_strerror" >&5
+$as_echo "$ac_cv_search_strerror" >&6; }
+ac_res=$ac_cv_search_strerror
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include 
+#include 
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+$as_echo_n "checking whether $CC understands -c and -o together... " >&6; }
+if ${am_cv_prog_cc_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+  # Make sure it works both with $CC and with simple cc.
+  # Following AC_PROG_CC_C_O, we do the test twice because some
+  # compilers refuse to overwrite an existing .o file with -o,
+  # though they will create one.
+  am_cv_prog_cc_c_o=yes
+  for am_i in 1 2; do
+    if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+   ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); } \
+         && test -f conftest2.$ac_objext; then
+      : OK
+    else
+      am_cv_prog_cc_c_o=no
+      break
+    fi
+  done
+  rm -f core conftest*
+  unset am_i
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+$as_echo "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+depcc="$CC"   am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named 'D' -- because '-MD' means "put the output
+  # in D".
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+      # Solaris 10 /bin/sh.
+      echo '/* dummy */' > sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with '-c' and '-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle '-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs.
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # After this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested.
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok '-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include 
+#include 
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+$as_echo_n "checking whether $CC understands -c and -o together... " >&6; }
+if ${am_cv_prog_cc_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+  # Make sure it works both with $CC and with simple cc.
+  # Following AC_PROG_CC_C_O, we do the test twice because some
+  # compilers refuse to overwrite an existing .o file with -o,
+  # though they will create one.
+  am_cv_prog_cc_c_o=yes
+  for am_i in 1 2; do
+    if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+   ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); } \
+         && test -f conftest2.$ac_objext; then
+      : OK
+    else
+      am_cv_prog_cc_c_o=no
+      break
+    fi
+  done
+  rm -f core conftest*
+  unset am_i
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+$as_echo "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+depcc="$CC"   am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named 'D' -- because '-MD' means "put the output
+  # in D".
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+      # Solaris 10 /bin/sh.
+      echo '/* dummy */' > sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with '-c' and '-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle '-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs.
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # After this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested.
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok '-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+am_cv_prog_cc_stdc=$ac_cv_prog_cc_stdc
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
+$as_echo_n "checking for inline... " >&6; }
+if ${ac_cv_c_inline+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifndef __cplusplus
+typedef int foo_t;
+static $ac_kw foo_t static_foo () {return 0; }
+$ac_kw foo_t foo () {return 0; }
+#endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_inline=$ac_kw
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  test "$ac_cv_c_inline" != no && break
+done
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5
+$as_echo "$ac_cv_c_inline" >&6; }
+
+case $ac_cv_c_inline in
+  inline | yes) ;;
+  *)
+    case $ac_cv_c_inline in
+      no) ac_val=;;
+      *) ac_val=$ac_cv_c_inline;;
+    esac
+    cat >>confdefs.h <<_ACEOF
+#ifndef __cplusplus
+#define inline $ac_val
+#endif
+_ACEOF
+    ;;
+esac
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if ${ac_cv_prog_CPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer  to  if __STDC__ is defined, since
+  #  exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include 
+#else
+# include 
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include 
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer  to  if __STDC__ is defined, since
+  #  exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include 
+#else
+# include 
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include 
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$GREP"; then
+  ac_path_GREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in grep ggrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_GREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_GREP"; then
+    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     if test -z "$EGREP"; then
+  ac_path_EGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in egrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_EGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_EGREP"; then
+    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include 
+#include 
+#include 
+#include 
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_stdc=yes
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include 
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include 
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then :
+  :
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include 
+#include 
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+		   (('a' <= (c) && (c) <= 'i') \
+		     || ('j' <= (c) && (c) <= 'r') \
+		     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+	|| toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+$as_echo_n "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+$as_echo "no, using $LN_S" >&6; }
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  SET_MAKE=
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+# Extract the first word of "rm", so it can be a program name with args.
+set dummy rm; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_RM+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $RM in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_RM="$RM" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_RM="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_RM" && ac_cv_path_RM="/bin/rm"
+  ;;
+esac
+fi
+RM=$ac_cv_path_RM
+if test -n "$RM"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RM" >&5
+$as_echo "$RM" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+# Extract the first word of "mv", so it can be a program name with args.
+set dummy mv; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_MV+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MV in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_MV="$MV" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_MV="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_MV" && ac_cv_path_MV="/bin/mv"
+  ;;
+esac
+fi
+MV=$ac_cv_path_MV
+if test -n "$MV"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MV" >&5
+$as_echo "$MV" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+# Extract the first word of "tar", so it can be a program name with args.
+set dummy tar; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_TAR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $TAR in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_TAR="$TAR" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_TAR="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_TAR" && ac_cv_path_TAR="/bin/tar"
+  ;;
+esac
+fi
+TAR=$ac_cv_path_TAR
+if test -n "$TAR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TAR" >&5
+$as_echo "$TAR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+
+case `pwd` in
+  *\ * | *\	*)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
+$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
+esac
+
+
+
+macro_version='2.4.6'
+macro_revision='2.4.6'
+
+
+
+
+
+
+
+
+
+
+
+
+
+ltmain=$ac_aux_dir/ltmain.sh
+
+# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
+$as_echo_n "checking how to print strings... " >&6; }
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
+else
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO ""
+}
+
+case $ECHO in
+  printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
+$as_echo "printf" >&6; } ;;
+  print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
+$as_echo "print -r" >&6; } ;;
+  *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
+$as_echo "cat" >&6; } ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if ${ac_cv_path_SED+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+     for ac_i in 1 2 3 4 5 6 7; do
+       ac_script="$ac_script$as_nl$ac_script"
+     done
+     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+     { ac_script=; unset ac_script;}
+     if test -z "$SED"; then
+  ac_path_SED_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+  # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo '' >> "conftest.nl"
+    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_SED_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_SED="$ac_path_SED"
+      ac_path_SED_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_SED_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_SED"; then
+    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+  fi
+else
+  ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+  rm -f conftest.sed
+
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
+$as_echo_n "checking for fgrep... " >&6; }
+if ${ac_cv_path_FGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+   then ac_cv_path_FGREP="$GREP -F"
+   else
+     if test -z "$FGREP"; then
+  ac_path_FGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in fgrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_FGREP" || continue
+# Check for GNU ac_path_FGREP and select it if it is found.
+  # Check for GNU $ac_path_FGREP
+case `"$ac_path_FGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'FGREP' >> "conftest.nl"
+    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_FGREP="$ac_path_FGREP"
+      ac_path_FGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_FGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_FGREP"; then
+    as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_FGREP=$FGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
+$as_echo "$ac_cv_path_FGREP" >&6; }
+ FGREP="$ac_cv_path_FGREP"
+
+
+test -z "$GREP" && GREP=grep
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+  withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test yes = "$GCC"; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return, which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD=$ac_prog
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test yes = "$with_gnu_ld"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${lt_cv_path_LD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS=$lt_save_ifs
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD=$ac_dir/$ac_prog
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 &5
+$as_echo "$LD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${lt_cv_prog_gnu_ld+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 &5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
+$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
+if ${lt_cv_path_NM+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM=$NM
+else
+  lt_nm_to_check=${ac_tool_prefix}nm
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS=$lt_save_ifs
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm=$ac_dir/$lt_tmp_nm
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the 'sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	# MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+	case $build_os in
+	mingw*) lt_bad_file=conftest.nm/nofile ;;
+	*) lt_bad_file=/dev/null ;;
+	esac
+	case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in
+	*$lt_bad_file* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break 2
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break 2
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS=$lt_save_ifs
+  done
+  : ${lt_cv_path_NM=no}
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
+$as_echo "$lt_cv_path_NM" >&6; }
+if test no != "$lt_cv_path_NM"; then
+  NM=$lt_cv_path_NM
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in dumpbin "link -dump"
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DUMPBIN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DUMPBIN"; then
+  ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DUMPBIN=$ac_cv_prog_DUMPBIN
+if test -n "$DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
+$as_echo "$DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$DUMPBIN" && break
+  done
+fi
+if test -z "$DUMPBIN"; then
+  ac_ct_DUMPBIN=$DUMPBIN
+  for ac_prog in dumpbin "link -dump"
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DUMPBIN"; then
+  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
+if test -n "$ac_ct_DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
+$as_echo "$ac_ct_DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_DUMPBIN" && break
+done
+
+  if test "x$ac_ct_DUMPBIN" = x; then
+    DUMPBIN=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DUMPBIN=$ac_ct_DUMPBIN
+  fi
+fi
+
+    case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols -headers"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
+
+  if test : != "$DUMPBIN"; then
+    NM=$DUMPBIN
+  fi
+fi
+test -z "$NM" && NM=nm
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
+$as_echo_n "checking the name lister ($NM) interface... " >&6; }
+if ${lt_cv_nm_interface+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: output\"" >&5)
+  cat conftest.out >&5
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
+$as_echo "$lt_cv_nm_interface" >&6; }
+
+# find the maximum length of command line arguments
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
+$as_echo_n "checking the maximum length of command line arguments... " >&6; }
+if ${lt_cv_sys_max_cmd_len+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+    i=0
+  teststring=ABCD
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  os2*)
+    # The test takes a long time on OS/2.
+    lt_cv_sys_max_cmd_len=8192
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[	 ]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len" && \
+       test undefined != "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test X`env echo "$teststring$teststring" 2>/dev/null` \
+	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test 17 != "$i" # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+
+fi
+
+if test -n "$lt_cv_sys_max_cmd_len"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
+$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
+$as_echo "none" >&6; }
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+
+
+
+
+
+: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+
+
+
+
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
+$as_echo_n "checking how to convert $build file names to $host format... " >&6; }
+if ${lt_cv_to_host_file_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+        ;;
+    esac
+    ;;
+  *-*-cygwin* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_noop
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+        ;;
+    esac
+    ;;
+  * ) # unhandled hosts (and "normal" native builds)
+    lt_cv_to_host_file_cmd=func_convert_file_noop
+    ;;
+esac
+
+fi
+
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
+$as_echo "$lt_cv_to_host_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
+$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; }
+if ${lt_cv_to_tool_file_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  #assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+        ;;
+    esac
+    ;;
+esac
+
+fi
+
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
+$as_echo "$lt_cv_to_tool_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
+$as_echo_n "checking for $LD option to reload object files... " >&6; }
+if ${lt_cv_ld_reload_flag+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_reload_flag='-r'
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
+$as_echo "$lt_cv_ld_reload_flag" >&6; }
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    if test yes != "$GCC"; then
+      reload_cmds=false
+    fi
+    ;;
+  darwin*)
+    if test yes = "$GCC"; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OBJDUMP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OBJDUMP"; then
+  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+$as_echo "$OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+  ac_ct_OBJDUMP=$OBJDUMP
+  # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OBJDUMP"; then
+  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OBJDUMP="objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+$as_echo "$ac_ct_OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OBJDUMP" = x; then
+    OBJDUMP="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OBJDUMP=$ac_ct_OBJDUMP
+  fi
+else
+  OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
+$as_echo_n "checking how to recognize dependent libraries... " >&6; }
+if ${lt_cv_deplibs_check_method+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# 'unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# that responds to the $file_magic_cmd with a given extended regex.
+# If you have 'file' or equivalent on your system and you're not sure
+# whether 'pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[4-9]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[45]*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  if ( file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    # Keep this pattern in sync with the one in func_win32_libid.
+    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc*)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[3-9]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd* | bitrig*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+os2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
+$as_echo "$lt_cv_deplibs_check_method" >&6; }
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+  case $host_os in
+  mingw* | pw32*)
+    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+      want_nocaseglob=yes
+    else
+      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"`
+    fi
+    ;;
+  esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DLLTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DLLTOOL"; then
+  ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+$as_echo "$DLLTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DLLTOOL"; then
+  ac_ct_DLLTOOL=$DLLTOOL
+  # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DLLTOOL"; then
+  ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+$as_echo "$ac_ct_DLLTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DLLTOOL" = x; then
+    DLLTOOL="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DLLTOOL=$ac_ct_DLLTOOL
+  fi
+else
+  DLLTOOL="$ac_cv_prog_DLLTOOL"
+fi
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
+$as_echo_n "checking how to associate runtime and link libraries... " >&6; }
+if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+  # two different shell functions defined in ltmain.sh;
+  # decide which one to use based on capabilities of $DLLTOOL
+  case `$DLLTOOL --help 2>&1` in
+  *--identify-strict*)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+    ;;
+  *)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+    ;;
+  esac
+  ;;
+*)
+  # fallback: assume linklib IS sharedlib
+  lt_cv_sharedlib_from_linklib_cmd=$ECHO
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
+$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in ar
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+$as_echo "$AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$AR" && break
+  done
+fi
+if test -z "$AR"; then
+  ac_ct_AR=$AR
+  for ac_prog in ar
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_AR="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+$as_echo "$ac_ct_AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_AR" && break
+done
+
+  if test "x$ac_ct_AR" = x; then
+    AR="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    AR=$ac_ct_AR
+  fi
+fi
+
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
+$as_echo_n "checking for archiver @FILE support... " >&6; }
+if ${lt_cv_ar_at_file+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ar_at_file=no
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  echo conftest.$ac_objext > conftest.lst
+      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
+      { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+  (eval $lt_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+      if test 0 -eq "$ac_status"; then
+	# Ensure the archiver fails upon bogus file names.
+	rm -f conftest.$ac_objext libconftest.a
+	{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+  (eval $lt_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	if test 0 -ne "$ac_status"; then
+          lt_cv_ar_at_file=@
+        fi
+      fi
+      rm -f conftest.* libconftest.a
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
+$as_echo "$lt_cv_ar_at_file" >&6; }
+
+if test no = "$lt_cv_ar_at_file"; then
+  archiver_list_spec=
+else
+  archiver_list_spec=$lt_cv_ar_at_file
+fi
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+test -z "$STRIP" && STRIP=:
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+test -z "$RANLIB" && RANLIB=:
+
+
+
+
+
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  bitrig* | openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
+$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
+if ${lt_cv_sys_global_symbol_pipe+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[BCDT]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[ABCDGISTW]'
+  ;;
+hpux*)
+  if test ia64 = "$host_cpu"; then
+    symcode='[ABCDEGRST]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[BCDEGRST]'
+  ;;
+osf*)
+  symcode='[BCDEGQRST]'
+  ;;
+solaris*)
+  symcode='[BDRT]'
+  ;;
+sco3.2v5*)
+  symcode='[DT]'
+  ;;
+sysv4.2uw2*)
+  symcode='[DT]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[ABDT]'
+  ;;
+sysv4)
+  symcode='[DFNSTU]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[ABCDGIRSTW]' ;;
+esac
+
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  # Gets list of data symbols to import.
+  lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
+  # Adjust the below global symbol transforms to fixup imported variables.
+  lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
+  lt_c_name_hook=" -e 's/^I .* \(.*\)$/  {\"\1\", (void *) 0},/p'"
+  lt_c_name_lib_hook="\
+  -e 's/^I .* \(lib.*\)$/  {\"\1\", (void *) 0},/p'\
+  -e 's/^I .* \(.*\)$/  {\"lib\1\", (void *) 0},/p'"
+else
+  # Disable hooks by default.
+  lt_cv_sys_global_symbol_to_import=
+  lt_cdecl_hook=
+  lt_c_name_hook=
+  lt_c_name_lib_hook=
+fi
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n"\
+$lt_cdecl_hook\
+" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n"\
+$lt_c_name_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/p'"
+
+# Transform an extracted symbol line into symbol name with lib prefix and
+# symbol address.
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\
+$lt_c_name_lib_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(lib.*\)$/  {\"\1\", (void *) \&\1},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"lib\1\", (void *) \&\1},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function,
+    # D for any global variable and I for any imported variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK '"\
+"     {last_section=section; section=\$ 3};"\
+"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
+"     /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
+"     /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
+"     {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
+"     s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
+  (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT_DLSYM_CONST
+#elif defined __osf__
+/* This system does not cope well with relocations in const data.  */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+LT_DLSYM_CONST struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_globsym_save_LIBS=$LIBS
+	  lt_globsym_save_CFLAGS=$CFLAGS
+	  LIBS=conftstm.$ac_objext
+	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest$ac_exeext; then
+	    pipe_works=yes
+	  fi
+	  LIBS=$lt_globsym_save_LIBS
+	  CFLAGS=$lt_globsym_save_CFLAGS
+	else
+	  echo "cannot find nm_test_func in $nlist" >&5
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&5
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+    fi
+  else
+    echo "$progname: failed program was:" >&5
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test yes = "$pipe_works"; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+
+fi
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
+$as_echo "failed" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+$as_echo "ok" >&6; }
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then
+  nm_file_list_spec='@'
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
+$as_echo_n "checking for sysroot... " >&6; }
+
+# Check whether --with-sysroot was given.
+if test "${with_sysroot+set}" = set; then :
+  withval=$with_sysroot;
+else
+  with_sysroot=no
+fi
+
+
+lt_sysroot=
+case $with_sysroot in #(
+ yes)
+   if test yes = "$GCC"; then
+     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+   fi
+   ;; #(
+ /*)
+   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+   ;; #(
+ no|'')
+   ;; #(
+ *)
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5
+$as_echo "$with_sysroot" >&6; }
+   as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
+   ;;
+esac
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
+$as_echo "${lt_sysroot:-no}" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5
+$as_echo_n "checking for a working dd... " >&6; }
+if ${ac_cv_path_lt_DD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+: ${lt_DD:=$DD}
+if test -z "$lt_DD"; then
+  ac_path_lt_DD_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in dd; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_lt_DD" || continue
+if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
+fi
+      $ac_path_lt_DD_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_lt_DD"; then
+    :
+  fi
+else
+  ac_cv_path_lt_DD=$lt_DD
+fi
+
+rm -f conftest.i conftest2.i conftest.out
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5
+$as_echo "$ac_cv_path_lt_DD" >&6; }
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5
+$as_echo_n "checking how to truncate binary pipes... " >&6; }
+if ${lt_cv_truncate_bin+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+lt_cv_truncate_bin=
+if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
+fi
+rm -f conftest.i conftest2.i conftest.out
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5
+$as_echo "$lt_cv_truncate_bin" >&6; }
+
+
+
+
+
+
+
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+    for cc_temp in $*""; do
+      case $cc_temp in
+        compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+        distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+        \-*) ;;
+        *) break;;
+      esac
+    done
+    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+# Check whether --enable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then :
+  enableval=$enable_libtool_lock;
+fi
+
+test no = "$enable_libtool_lock" || enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out what ABI is being produced by ac_compile, and set mode
+  # options accordingly.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE=32
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE=64
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    if test yes = "$lt_cv_prog_gnu_ld"; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+mips64*-*linux*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    emul=elf
+    case `/usr/bin/file conftest.$ac_objext` in
+      *32-bit*)
+	emul="${emul}32"
+	;;
+      *64-bit*)
+	emul="${emul}64"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *MSB*)
+	emul="${emul}btsmip"
+	;;
+      *LSB*)
+	emul="${emul}ltsmip"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *N32*)
+	emul="${emul}n32"
+	;;
+    esac
+    LD="${LD-ld} -m $emul"
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.  Note that the listed cases only cover the
+  # situations where additional linker options are needed (such as when
+  # doing 32-bit compilation for a host where ld defaults to 64-bit, or
+  # vice versa); the common cases where no linker options are needed do
+  # not appear in the list.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    case `/usr/bin/file conftest.o` in
+	      *x86-64*)
+		LD="${LD-ld} -m elf32_x86_64"
+		;;
+	      *)
+		LD="${LD-ld} -m elf_i386"
+		;;
+	    esac
+	    ;;
+	  powerpc64le-*linux*)
+	    LD="${LD-ld} -m elf32lppclinux"
+	    ;;
+	  powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  powerpcle-*linux*)
+	    LD="${LD-ld} -m elf64lppc"
+	    ;;
+	  powerpc-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS=$CFLAGS
+  CFLAGS="$CFLAGS -belf"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
+$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
+if ${lt_cv_cc_needs_belf+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_cc_needs_belf=yes
+else
+  lt_cv_cc_needs_belf=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+     ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
+$as_echo "$lt_cv_cc_needs_belf" >&6; }
+  if test yes != "$lt_cv_cc_needs_belf"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS=$SAVE_CFLAGS
+  fi
+  ;;
+*-*solaris*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*)
+        case $host in
+        i?86-*-solaris*|x86_64-*-solaris*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        sparc*-*-solaris*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+        esac
+        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
+        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+          LD=${LD-ld}_sol2
+        fi
+        ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks=$enable_libtool_lock
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
+set dummy ${ac_tool_prefix}mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_MANIFEST_TOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$MANIFEST_TOOL"; then
+  ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
+if test -n "$MANIFEST_TOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
+$as_echo "$MANIFEST_TOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
+  ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
+  # Extract the first word of "mt", so it can be a program name with args.
+set dummy mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_MANIFEST_TOOL"; then
+  ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
+if test -n "$ac_ct_MANIFEST_TOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
+$as_echo "$ac_ct_MANIFEST_TOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_MANIFEST_TOOL" = x; then
+    MANIFEST_TOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
+  fi
+else
+  MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL"
+fi
+
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
+$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
+if ${lt_cv_path_mainfest_tool+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_path_mainfest_tool=no
+  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
+  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+  cat conftest.err >&5
+  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+    lt_cv_path_mainfest_tool=yes
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
+$as_echo "$lt_cv_path_mainfest_tool" >&6; }
+if test yes != "$lt_cv_path_mainfest_tool"; then
+  MANIFEST_TOOL=:
+fi
+
+
+
+
+
+
+  case $host_os in
+    rhapsody* | darwin*)
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DSYMUTIL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DSYMUTIL"; then
+  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DSYMUTIL=$ac_cv_prog_DSYMUTIL
+if test -n "$DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
+$as_echo "$DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DSYMUTIL"; then
+  ac_ct_DSYMUTIL=$DSYMUTIL
+  # Extract the first word of "dsymutil", so it can be a program name with args.
+set dummy dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DSYMUTIL"; then
+  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
+if test -n "$ac_ct_DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
+$as_echo "$ac_ct_DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DSYMUTIL" = x; then
+    DSYMUTIL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DSYMUTIL=$ac_ct_DSYMUTIL
+  fi
+else
+  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_NMEDIT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NMEDIT"; then
+  ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+NMEDIT=$ac_cv_prog_NMEDIT
+if test -n "$NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
+$as_echo "$NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_NMEDIT"; then
+  ac_ct_NMEDIT=$NMEDIT
+  # Extract the first word of "nmedit", so it can be a program name with args.
+set dummy nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_NMEDIT"; then
+  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_NMEDIT="nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
+if test -n "$ac_ct_NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
+$as_echo "$ac_ct_NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_NMEDIT" = x; then
+    NMEDIT=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    NMEDIT=$ac_ct_NMEDIT
+  fi
+else
+  NMEDIT="$ac_cv_prog_NMEDIT"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
+set dummy ${ac_tool_prefix}lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_LIPO+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$LIPO"; then
+  ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+LIPO=$ac_cv_prog_LIPO
+if test -n "$LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
+$as_echo "$LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_LIPO"; then
+  ac_ct_LIPO=$LIPO
+  # Extract the first word of "lipo", so it can be a program name with args.
+set dummy lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_LIPO+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_LIPO"; then
+  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_LIPO="lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
+if test -n "$ac_ct_LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
+$as_echo "$ac_ct_LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_LIPO" = x; then
+    LIPO=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    LIPO=$ac_ct_LIPO
+  fi
+else
+  LIPO="$ac_cv_prog_LIPO"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL"; then
+  ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL=$ac_cv_prog_OTOOL
+if test -n "$OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
+$as_echo "$OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL"; then
+  ac_ct_OTOOL=$OTOOL
+  # Extract the first word of "otool", so it can be a program name with args.
+set dummy otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL"; then
+  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OTOOL="otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
+if test -n "$ac_ct_OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
+$as_echo "$ac_ct_OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL" = x; then
+    OTOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL=$ac_ct_OTOOL
+  fi
+else
+  OTOOL="$ac_cv_prog_OTOOL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL64+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL64"; then
+  ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL64=$ac_cv_prog_OTOOL64
+if test -n "$OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
+$as_echo "$OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL64"; then
+  ac_ct_OTOOL64=$OTOOL64
+  # Extract the first word of "otool64", so it can be a program name with args.
+set dummy otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL64"; then
+  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OTOOL64="otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
+if test -n "$ac_ct_OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
+$as_echo "$ac_ct_OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL64" = x; then
+    OTOOL64=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL64=$ac_ct_OTOOL64
+  fi
+else
+  OTOOL64="$ac_cv_prog_OTOOL64"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
+$as_echo_n "checking for -single_module linker flag... " >&6; }
+if ${lt_cv_apple_cc_single_mod+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_apple_cc_single_mod=no
+      if test -z "$LT_MULTI_MODULE"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&5
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	# If there is a non-empty error log, and "single_module"
+	# appears in it, assume the flag caused a linker warning
+        if test -s conftest.err && $GREP single_module conftest.err; then
+	  cat conftest.err >&5
+	# Otherwise, if the output was created with a 0 exit code from
+	# the compiler, it worked.
+	elif test -f libconftest.dylib && test 0 = "$_lt_result"; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&5
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
+$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
+$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
+if ${lt_cv_ld_exported_symbols_list+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_ld_exported_symbols_list=yes
+else
+  lt_cv_ld_exported_symbols_list=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+	LDFLAGS=$save_LDFLAGS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
+$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
+$as_echo_n "checking for -force_load linker flag... " >&6; }
+if ${lt_cv_ld_force_load+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
+      echo "$AR cru libconftest.a conftest.o" >&5
+      $AR cru libconftest.a conftest.o 2>&5
+      echo "$RANLIB libconftest.a" >&5
+      $RANLIB libconftest.a 2>&5
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -s conftest.err && $GREP force_load conftest.err; then
+	cat conftest.err >&5
+      elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then
+	lt_cv_ld_force_load=yes
+      else
+	cat conftest.err >&5
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
+$as_echo "$lt_cv_ld_force_load" >&6; }
+    case $host_os in
+    rhapsody* | darwin1.[012])
+      _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+	10.[012][,.]*)
+	  _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test yes = "$lt_cv_apple_cc_single_mod"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test yes = "$lt_cv_ld_exported_symbols_list"; then
+      _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'
+    fi
+    if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+#       string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+#       string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+#       "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+#       VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+    case x$2 in
+    x)
+        ;;
+    *:)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+        ;;
+    x:*)
+        eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    *::*)
+        eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+        eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+        ;;
+    *)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    esac
+}
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+		  inttypes.h stdint.h unistd.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in dlfcn.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_dlfcn_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DLFCN_H 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+
+# Set options
+
+
+
+        enable_dlopen=no
+
+
+  enable_win32_dll=no
+
+
+            # Check whether --enable-shared was given.
+if test "${enable_shared+set}" = set; then :
+  enableval=$enable_shared; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for pkg in $enableval; do
+	IFS=$lt_save_ifs
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac
+else
+  enable_shared=yes
+fi
+
+
+
+
+
+
+
+
+
+  # Check whether --enable-static was given.
+if test "${enable_static+set}" = set; then :
+  enableval=$enable_static; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for pkg in $enableval; do
+	IFS=$lt_save_ifs
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac
+else
+  enable_static=yes
+fi
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-pic was given.
+if test "${with_pic+set}" = set; then :
+  withval=$with_pic; lt_p=${PACKAGE-default}
+    case $withval in
+    yes|no) pic_mode=$withval ;;
+    *)
+      pic_mode=default
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for lt_pkg in $withval; do
+	IFS=$lt_save_ifs
+	if test "X$lt_pkg" = "X$lt_p"; then
+	  pic_mode=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac
+else
+  pic_mode=default
+fi
+
+
+
+
+
+
+
+
+  # Check whether --enable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then :
+  enableval=$enable_fast_install; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for pkg in $enableval; do
+	IFS=$lt_save_ifs
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac
+else
+  enable_fast_install=yes
+fi
+
+
+
+
+
+
+
+
+  shared_archive_member_spec=
+case $host,$enable_shared in
+power*-*-aix[5-9]*,yes)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5
+$as_echo_n "checking which variant of shared library versioning to provide... " >&6; }
+
+# Check whether --with-aix-soname was given.
+if test "${with_aix_soname+set}" = set; then :
+  withval=$with_aix_soname; case $withval in
+    aix|svr4|both)
+      ;;
+    *)
+      as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5
+      ;;
+    esac
+    lt_cv_with_aix_soname=$with_aix_soname
+else
+  if ${lt_cv_with_aix_soname+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_with_aix_soname=aix
+fi
+
+    with_aix_soname=$lt_cv_with_aix_soname
+fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5
+$as_echo "$with_aix_soname" >&6; }
+  if test aix != "$with_aix_soname"; then
+    # For the AIX way of multilib, we name the shared archive member
+    # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
+    # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
+    # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
+    # the AIX toolchain works better with OBJECT_MODE set (default 32).
+    if test 64 = "${OBJECT_MODE-32}"; then
+      shared_archive_member_spec=shr_64
+    else
+      shared_archive_member_spec=shr
+    fi
+  fi
+  ;;
+*)
+  with_aix_soname=aix
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS=$ltmain
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+test -z "$LN_S" && LN_S="ln -s"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "${ZSH_VERSION+set}"; then
+   setopt NO_GLOB_SUBST
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
+$as_echo_n "checking for objdir... " >&6; }
+if ${lt_cv_objdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
+$as_echo "$lt_cv_objdir" >&6; }
+objdir=$lt_cv_objdir
+
+
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define LT_OBJDIR "$lt_cv_objdir/"
+_ACEOF
+
+
+
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test set != "${COLLECT_NAMES+set}"; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a '.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+old_CC=$CC
+old_CFLAGS=$CFLAGS
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
+
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
+$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD=$MAGIC_CMD
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS=$lt_save_ifs
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/${ac_tool_prefix}file"; then
+      lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS=$lt_save_ifs
+  MAGIC_CMD=$lt_save_MAGIC_CMD
+  ;;
+esac
+fi
+
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
+$as_echo_n "checking for file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD=$MAGIC_CMD
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS=$lt_save_ifs
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/file"; then
+      lt_cv_path_MAGIC_CMD=$ac_dir/"file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS=$lt_save_ifs
+  MAGIC_CMD=$lt_save_MAGIC_CMD
+  ;;
+esac
+fi
+
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  else
+    MAGIC_CMD=:
+  fi
+fi
+
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+
+lt_save_CC=$CC
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+
+lt_prog_compiler_no_builtin_flag=
+
+if test yes = "$GCC"; then
+  case $cc_basename in
+  nvcc*)
+    lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
+  *)
+    lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
+  esac
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
+if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_rtti_exceptions=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="-fno-rtti -fno-exceptions"  ## exclude from sc_useless_quotes_in_assignment
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_rtti_exceptions=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then
+    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+    :
+fi
+
+fi
+
+
+
+
+
+
+  lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+
+  if test yes = "$GCC"; then
+    lt_prog_compiler_wl='-Wl,'
+    lt_prog_compiler_static='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test ia64 = "$host_cpu"; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      lt_prog_compiler_pic='-fPIC'
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
+            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      case $host_os in
+      os2*)
+	lt_prog_compiler_static='$wl-static'
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      lt_prog_compiler_static=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      lt_prog_compiler_pic='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      lt_prog_compiler_wl='-Xlinker '
+      if test -n "$lt_prog_compiler_pic"; then
+        lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
+      fi
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl='-Wl,'
+      if test ia64 = "$host_cpu"; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      else
+	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      case $cc_basename in
+      nagfor*)
+        # NAG Fortran compiler
+        lt_prog_compiler_wl='-Wl,-Wl,,'
+        lt_prog_compiler_pic='-PIC'
+        lt_prog_compiler_static='-Bstatic'
+        ;;
+      esac
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      case $host_os in
+      os2*)
+	lt_prog_compiler_static='$wl-static'
+	;;
+      esac
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static='$wl-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+      case $cc_basename in
+      # old Intel for x86_64, which still supported -KPIC.
+      ecc*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-KPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='--shared'
+	lt_prog_compiler_static='--static'
+	;;
+      nagfor*)
+	# NAG Fortran compiler
+	lt_prog_compiler_wl='-Wl,-Wl,,'
+	lt_prog_compiler_pic='-PIC'
+	lt_prog_compiler_static='-Bstatic'
+	;;
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fPIC'
+	lt_prog_compiler_static='-static'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fpic'
+	lt_prog_compiler_static='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-qpic'
+	lt_prog_compiler_static='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl=''
+	  ;;
+	*Sun\ F* | *Sun*Fortran*)
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl='-Qoption ld '
+	  ;;
+	*Sun\ C*)
+	  # Sun C 5.9
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl='-Wl,'
+	  ;;
+        *Intel*\ [CF]*Compiler*)
+	  lt_prog_compiler_wl='-Wl,'
+	  lt_prog_compiler_pic='-fPIC'
+	  lt_prog_compiler_static='-static'
+	  ;;
+	*Portland\ Group*)
+	  lt_prog_compiler_wl='-Wl,'
+	  lt_prog_compiler_pic='-fpic'
+	  lt_prog_compiler_static='-Bstatic'
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    rdos*)
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    solaris*)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+	lt_prog_compiler_wl='-Qoption ld ';;
+      *)
+	lt_prog_compiler_wl='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      lt_prog_compiler_wl='-Qoption ld '
+      lt_prog_compiler_pic='-PIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic='-Kconform_pic'
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    unicos*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_can_build_shared=no
+      ;;
+
+    uts4*)
+      lt_prog_compiler_pic='-pic'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *)
+      lt_prog_compiler_can_build_shared=no
+      ;;
+    esac
+  fi
+
+case $host_os in
+  # For platforms that do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic=
+    ;;
+  *)
+    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
+    ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
+$as_echo "$lt_cv_prog_compiler_pic" >&6; }
+lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
+if ${lt_cv_prog_compiler_pic_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_works=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"  ## exclude from sc_useless_quotes_in_assignment
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_pic_works"; then
+    case $lt_prog_compiler_pic in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+     esac
+else
+    lt_prog_compiler_pic=
+     lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if ${lt_cv_prog_compiler_static_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_static_works=no
+   save_LDFLAGS=$LDFLAGS
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS=$save_LDFLAGS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
+$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_static_works"; then
+    :
+else
+    lt_prog_compiler_static=
+fi
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then
+  # do not overwrite the value of need_locks provided by the user
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+  if test no = "$hard_links"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+  runpath_var=
+  allow_undefined_flag=
+  always_export_symbols=no
+  archive_cmds=
+  archive_expsym_cmds=
+  compiler_needs_object=no
+  enable_shared_with_static_runtimes=no
+  export_dynamic_flag_spec=
+  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  hardcode_automatic=no
+  hardcode_direct=no
+  hardcode_direct_absolute=no
+  hardcode_libdir_flag_spec=
+  hardcode_libdir_separator=
+  hardcode_minus_L=no
+  hardcode_shlibpath_var=unsupported
+  inherit_rpath=no
+  link_all_deplibs=unknown
+  module_cmds=
+  module_expsym_cmds=
+  old_archive_from_new_cmds=
+  old_archive_from_expsyms_cmds=
+  thread_safe_flag_spec=
+  whole_archive_flag_spec=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  include_expsyms=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ' (' and ')$', so one must not match beginning or
+  # end of line.  Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
+  # as well as any symbol that contains 'd'.
+  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test yes != "$GCC"; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd* | bitrig*)
+    with_gnu_ld=no
+    ;;
+  esac
+
+  ld_shlibs=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test yes = "$with_gnu_ld"; then
+    case $host_os in
+      aix*)
+	# The AIX port of GNU ld has always aspired to compatibility
+	# with the native linker.  However, as the warning in the GNU ld
+	# block says, versions before 2.19.5* couldn't really create working
+	# shared libraries, regardless of the interface used.
+	case `$LD -v 2>&1` in
+	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+	  *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
+	  *\ \(GNU\ Binutils\)\ [3-9]*) ;;
+	  *)
+	    lt_use_gnu_ld_interface=yes
+	    ;;
+	esac
+	;;
+      *)
+	lt_use_gnu_ld_interface=yes
+	;;
+    esac
+  fi
+
+  if test yes = "$lt_use_gnu_ld_interface"; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='$wl'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+    export_dynamic_flag_spec='$wl--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+    else
+      whole_archive_flag_spec=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[3-9]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test ia64 != "$host_cpu"; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	allow_undefined_flag=unsupported
+	# Joseph Beckenbach  says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec='-L$libdir'
+      export_dynamic_flag_spec='$wl--export-all-symbols'
+      allow_undefined_flag=unsupported
+      always_export_symbols=no
+      enable_shared_with_static_runtimes=yes
+      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+      exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file, use it as
+	# is; otherwise, prepend EXPORTS...
+	archive_expsym_cmds='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+          cp $export_symbols $output_objdir/$soname.def;
+        else
+          echo EXPORTS > $output_objdir/$soname.def;
+          cat $export_symbols >> $output_objdir/$soname.def;
+        fi~
+        $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    haiku*)
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+      link_all_deplibs=yes
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      allow_undefined_flag=unsupported
+      shrext_cmds=.dll
+      archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      enable_shared_with_static_runtimes=yes
+      ;;
+
+    interix[3-9]*)
+      hardcode_direct=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+      export_dynamic_flag_spec='$wl-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test linux-dietlibc = "$host_os"; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test no = "$tmp_diet"
+      then
+	tmp_addflag=' $pic_flag'
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95* | pgfortran*)
+					# Portland Group f77 and f90 compilers
+	  whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  whole_archive_flag_spec=
+	  tmp_sharedflag='--shared' ;;
+        nagfor*)                        # NAGFOR 5.3
+          tmp_sharedflag='-Wl,-shared' ;;
+	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	nvcc*)	# Cuda Compiler Driver 2.2
+	  whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  compiler_needs_object=yes
+	  ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  compiler_needs_object=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+
+        if test yes = "$supports_anon_versioning"; then
+          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+            cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+            echo "local: *; };" >> $output_objdir/$libname.ver~
+            $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	tcc*)
+	  export_dynamic_flag_spec='-rdynamic'
+	  ;;
+	xlf* | bgf* | bgxlf* | mpixlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
+	  hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+	  archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+	  if test yes = "$supports_anon_versioning"; then
+	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+              cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+              echo "local: *; };" >> $output_objdir/$libname.ver~
+              $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        ld_shlibs=no
+      fi
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    ld_shlibs=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+    esac
+
+    if test no = "$ld_shlibs"; then
+      runpath_var=
+      hardcode_libdir_flag_spec=
+      export_dynamic_flag_spec=
+      whole_archive_flag_spec=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag=unsupported
+      always_export_symbols=yes
+      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L=yes
+      if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	hardcode_direct=unsupported
+      fi
+      ;;
+
+    aix[4-9]*)
+      if test ia64 = "$host_cpu"; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to GNU nm, but means don't demangle to AIX nm.
+	# Without the "-l" option, or with the "-B" option, AIX nm treats
+	# weak defined symbols like other global defined symbols, whereas
+	# GNU nm marks them as "W".
+	# While the 'weak' keyword is ignored in the Export File, we need
+	# it in the Import File for the 'aix-soname' feature, so we have
+	# to replace the "-B" option with "-P" for AIX nm.
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+	else
+	  export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# have runtime linking enabled, and use it for executables.
+	# For shared libraries, we enable/disable runtime linking
+	# depending on the kind of the shared library created -
+	# when "with_aix_soname,aix_use_runtimelinking" is:
+	# "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "aix,yes"  lib.so          shared, rtl:yes, for executables
+	#            lib.a           static archive
+	# "both,no"  lib.so.V(shr.o) shared, rtl:yes
+	#            lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a(lib.so.V) shared, rtl:no
+	# "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a           static archive
+	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+	    # With aix-soname=svr4, we create the lib.so.V shared archives only,
+	    # so we don't have lib.a shared libs to link our executables.
+	    # We have to force runtime linking in this case.
+	    aix_use_runtimelinking=yes
+	    LDFLAGS="$LDFLAGS -Wl,-brtl"
+	  fi
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      archive_cmds=''
+      hardcode_direct=yes
+      hardcode_direct_absolute=yes
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      file_list_spec='$wl-f,'
+      case $with_aix_soname,$aix_use_runtimelinking in
+      aix,*) ;; # traditional, no import file
+      svr4,* | *,yes) # use import file
+	# The Import File defines what to hardcode.
+	hardcode_direct=no
+	hardcode_direct_absolute=no
+	;;
+      esac
+
+      if test yes = "$GCC"; then
+	case $host_os in aix4.[012]|aix4.[012].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`$CC -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  hardcode_direct=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  hardcode_minus_L=yes
+	  hardcode_libdir_flag_spec='-L$libdir'
+	  hardcode_libdir_separator=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test yes = "$aix_use_runtimelinking"; then
+	  shared_flag="$shared_flag "'$wl-G'
+	fi
+	# Need to ensure runtime linking is disabled for the traditional
+	# shared library, or the linker may eventually find shared libraries
+	# /with/ Import File - we do not want to mix them.
+	shared_flag_aix='-shared'
+	shared_flag_svr4='-shared $wl-G'
+      else
+	# not using gcc
+	if test ia64 = "$host_cpu"; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test yes = "$aix_use_runtimelinking"; then
+	    shared_flag='$wl-G'
+	  else
+	    shared_flag='$wl-bM:SRE'
+	  fi
+	  shared_flag_aix='$wl-bM:SRE'
+	  shared_flag_svr4='$wl-G'
+	fi
+      fi
+
+      export_dynamic_flag_spec='$wl-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols=yes
+      if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	allow_undefined_flag='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        if test set = "${lt_cv_aix_libpath+set}"; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath_+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=/usr/lib:/lib
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath_
+fi
+
+        hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
+        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+      else
+	if test ia64 = "$host_cpu"; then
+	  hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib'
+	  allow_undefined_flag="-z nodefs"
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 if test set = "${lt_cv_aix_libpath+set}"; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath_+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=/usr/lib:/lib
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath_
+fi
+
+	 hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  no_undefined_flag=' $wl-bernotok'
+	  allow_undefined_flag=' $wl-berok'
+	  if test yes = "$with_gnu_ld"; then
+	    # We only use this code for GNU lds that support --whole-archive.
+	    whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive'
+	  else
+	    # Exported symbols can be pulled into shared objects from archives
+	    whole_archive_flag_spec='$convenience'
+	  fi
+	  archive_cmds_need_lc=yes
+	  archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+	  # -brtl affects multiple linker settings, -berok does not and is overridden later
+	  compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+	  if test svr4 != "$with_aix_soname"; then
+	    # This is similar to how AIX traditionally builds its shared libraries.
+	    archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+	  fi
+	  if test aix != "$with_aix_soname"; then
+	    archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+	  else
+	    # used by -dlpreopen to get the symbols
+	    archive_expsym_cmds="$archive_expsym_cmds"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+	  fi
+	  archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[45]*)
+      export_dynamic_flag_spec=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      case $cc_basename in
+      cl*)
+	# Native MSVC
+	hardcode_libdir_flag_spec=' '
+	allow_undefined_flag=unsupported
+	always_export_symbols=yes
+	file_list_spec='@'
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=.dll
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+	archive_expsym_cmds='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+            cp "$export_symbols" "$output_objdir/$soname.def";
+            echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+          else
+            $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+          fi~
+          $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+          linknames='
+	# The linker will not automatically build a static lib if we build a DLL.
+	# _LT_TAGVAR(old_archive_from_new_cmds, )='true'
+	enable_shared_with_static_runtimes=yes
+	exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+	export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+	# Don't use ranlib
+	old_postinstall_cmds='chmod 644 $oldlib'
+	postlink_cmds='lt_outputfile="@OUTPUT@"~
+          lt_tool_outputfile="@TOOL_OUTPUT@"~
+          case $lt_outputfile in
+            *.exe|*.EXE) ;;
+            *)
+              lt_outputfile=$lt_outputfile.exe
+              lt_tool_outputfile=$lt_tool_outputfile.exe
+              ;;
+          esac~
+          if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+            $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+            $RM "$lt_outputfile.manifest";
+          fi'
+	;;
+      *)
+	# Assume MSVC wrapper
+	hardcode_libdir_flag_spec=' '
+	allow_undefined_flag=unsupported
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=.dll
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+	# The linker will automatically build a .lib file if we build a DLL.
+	old_archive_from_new_cmds='true'
+	# FIXME: Should let the user specify the lib program.
+	old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+	enable_shared_with_static_runtimes=yes
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc=no
+  hardcode_direct=no
+  hardcode_automatic=yes
+  hardcode_shlibpath_var=unsupported
+  if test yes = "$lt_cv_ld_force_load"; then
+    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+  else
+    whole_archive_flag_spec=''
+  fi
+  link_all_deplibs=yes
+  allow_undefined_flag=$_lt_dar_allow_undefined
+  case $cc_basename in
+     ifort*|nagfor*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test yes = "$_lt_dar_can_shared"; then
+    output_verbose_link_cmd=func_echo_all
+    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+    archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+    module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+
+  else
+  ld_shlibs=no
+  fi
+
+      ;;
+
+    dgux*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    hpux9*)
+      if test yes = "$GCC"; then
+	archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+      else
+	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+      hardcode_libdir_separator=:
+      hardcode_direct=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L=yes
+      export_dynamic_flag_spec='$wl-E'
+      ;;
+
+    hpux10*)
+      if test yes,no = "$GCC,$with_gnu_ld"; then
+	archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test no = "$with_gnu_ld"; then
+	hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+	hardcode_libdir_separator=:
+	hardcode_direct=yes
+	hardcode_direct_absolute=yes
+	export_dynamic_flag_spec='$wl-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	hardcode_minus_L=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test yes,no = "$GCC,$with_gnu_ld"; then
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+
+	  # Older versions of the 11.00 compiler do not understand -b yet
+	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
+$as_echo_n "checking if $CC understands -b... " >&6; }
+if ${lt_cv_prog_compiler__b+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler__b=no
+   save_LDFLAGS=$LDFLAGS
+   LDFLAGS="$LDFLAGS -b"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler__b=yes
+       fi
+     else
+       lt_cv_prog_compiler__b=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS=$save_LDFLAGS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
+$as_echo "$lt_cv_prog_compiler__b" >&6; }
+
+if test yes = "$lt_cv_prog_compiler__b"; then
+    archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+else
+    archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+fi
+
+	  ;;
+	esac
+      fi
+      if test no = "$with_gnu_ld"; then
+	hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+	hardcode_libdir_separator=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  hardcode_direct=no
+	  hardcode_shlibpath_var=no
+	  ;;
+	*)
+	  hardcode_direct=yes
+	  hardcode_direct_absolute=yes
+	  export_dynamic_flag_spec='$wl-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  hardcode_minus_L=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test yes = "$GCC"; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+	# This should be the same for all languages, so no per-tag cache variable.
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
+$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
+if ${lt_cv_irix_exported_symbol+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  save_LDFLAGS=$LDFLAGS
+	   LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
+	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int foo (void) { return 0; }
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_irix_exported_symbol=yes
+else
+  lt_cv_irix_exported_symbol=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+           LDFLAGS=$save_LDFLAGS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
+$as_echo "$lt_cv_irix_exported_symbol" >&6; }
+	if test yes = "$lt_cv_irix_exported_symbol"; then
+          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
+	fi
+      else
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+      hardcode_libdir_separator=:
+      inherit_rpath=yes
+      link_all_deplibs=yes
+      ;;
+
+    linux*)
+      case $cc_basename in
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	ld_shlibs=yes
+	archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+      esac
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    newsos6)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+      hardcode_libdir_separator=:
+      hardcode_shlibpath_var=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd* | bitrig*)
+      if test -f /usr/libexec/ld.so; then
+	hardcode_direct=yes
+	hardcode_shlibpath_var=no
+	hardcode_direct_absolute=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
+	  hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+	  export_dynamic_flag_spec='$wl-E'
+	else
+	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+	fi
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      allow_undefined_flag=unsupported
+      shrext_cmds=.dll
+      archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      enable_shared_with_static_runtimes=yes
+      ;;
+
+    osf3*)
+      if test yes = "$GCC"; then
+	allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+	archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+      hardcode_libdir_separator=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test yes = "$GCC"; then
+	allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+	archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+          $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	hardcode_libdir_flag_spec='-rpath $libdir'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_separator=:
+      ;;
+
+    solaris*)
+      no_undefined_flag=' -z defs'
+      if test yes = "$GCC"; then
+	wlarc='$wl'
+	archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+          $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+            $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='$wl'
+	  archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+            $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_shlibpath_var=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands '-z linker_flag'.  GCC discards it without '$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test yes = "$GCC"; then
+	  whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+	else
+	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      link_all_deplibs=yes
+      ;;
+
+    sunos4*)
+      if test sequent = "$host_vendor"; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  reload_cmds='$CC -r -o $output$reload_objs'
+	  hardcode_direct=no
+        ;;
+	motorola)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4.3*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var=no
+      export_dynamic_flag_spec='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	hardcode_shlibpath_var=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	ld_shlibs=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag='$wl-z,text'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      runpath_var='LD_RUN_PATH'
+
+      if test yes = "$GCC"; then
+	archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We CANNOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag='$wl-z,text'
+      allow_undefined_flag='$wl-z,nodefs'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='$wl-R,$libdir'
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      export_dynamic_flag_spec='$wl-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test yes = "$GCC"; then
+	archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      ld_shlibs=no
+      ;;
+    esac
+
+    if test sni = "$host_vendor"; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	export_dynamic_flag_spec='$wl-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
+$as_echo "$ld_shlibs" >&6; }
+test no = "$ld_shlibs" && can_build_shared=no
+
+with_gnu_ld=$with_gnu_ld
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc=yes
+
+  if test yes,yes = "$GCC,$enable_shared"; then
+    case $archive_cmds in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  $RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$lt_prog_compiler_wl
+	  pic_flag=$lt_prog_compiler_pic
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$allow_undefined_flag
+	  allow_undefined_flag=
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+  (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	  then
+	    lt_cv_archive_cmds_need_lc=no
+	  else
+	    lt_cv_archive_cmds_need_lc=yes
+	  fi
+	  allow_undefined_flag=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
+      archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+if test yes = "$GCC"; then
+  case $host_os in
+    darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;
+    *) lt_awk_arg='/^libraries:/' ;;
+  esac
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;;
+    *) lt_sed_strip_eq='s|=/|/|g' ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary...
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  # ...but if some path component already ends with the multilib dir we assume
+  # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
+  case "$lt_multi_os_dir; $lt_search_path_spec " in
+  "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
+    lt_multi_os_dir=
+    ;;
+  esac
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir"
+    elif test -n "$lt_multi_os_dir"; then
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS = " "; FS = "/|\n";} {
+  lt_foo = "";
+  lt_count = 0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo = "/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[lt_foo]++; }
+  if (lt_freq[lt_foo] == 1) { print lt_foo; }
+}'`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's|/\([A-Za-z]:\)|\1|g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=.so
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='$libname$release$shared_ext$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test ia64 = "$host_cpu"; then
+    # AIX 5 supports IA64
+    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line '#! .'.  This would cause the generated library to
+    # depend on '.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # Using Import Files as archive members, it is possible to support
+    # filename-based versioning of shared library archives on AIX. While
+    # this would work for both with and without runtime linking, it will
+    # prevent static linking of such archives. So we do filename-based
+    # shared library versioning with .so extension only, which is used
+    # when both runtime linking and shared linking is enabled.
+    # Unfortunately, runtime linking may impact performance, so we do
+    # not want this to be the default eventually. Also, we use the
+    # versioned .so libs for executables only if there is the -brtl
+    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+    # To allow for filename-based versioning support, we need to create
+    # libNAME.so.V as an archive file, containing:
+    # *) an Import File, referring to the versioned filename of the
+    #    archive as well as the shared archive member, telling the
+    #    bitwidth (32 or 64) of that shared object, and providing the
+    #    list of exported symbols of that shared object, eventually
+    #    decorated with the 'weak' keyword
+    # *) the shared object with the F_LOADONLY flag set, to really avoid
+    #    it being seen by the linker.
+    # At run time we better use the real file rather than another symlink,
+    # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+    case $with_aix_soname,$aix_use_runtimelinking in
+    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    aix,yes) # traditional libtool
+      dynamic_linker='AIX unversionable lib.so'
+      # If using run time linking (on AIX 4.2 or later) use lib.so
+      # instead of lib.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      ;;
+    aix,no) # traditional AIX only
+      dynamic_linker='AIX lib.a(lib.so.V)'
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      ;;
+    svr4,*) # full svr4 only
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,yes) # both, prefer svr4
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # unpreferred sharedlib libNAME.a needs extra handling
+      postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,no) # both, prefer aix
+      dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+      postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+      postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+      ;;
+    esac
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='$libname$shared_ext'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+    library_names_spec='$libname.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec=$LIB
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$major$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[23].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      soname_spec='$libname$release$shared_ext$major'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    if test 32 = "$HPUX_IA64_MODE"; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux32
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux64
+    fi
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[3-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test yes = "$lt_cv_prog_gnu_ld"; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+  sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+linux*android*)
+  version_type=none # Android doesn't support versioned libraries.
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext'
+  soname_spec='$libname$release$shared_ext'
+  finish_cmds=
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  dynamic_linker='Android linker'
+  # Don't embed -rpath directories since the linker doesn't support them.
+  hardcode_libdir_flag_spec='-L$libdir'
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
+	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+  lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+
+fi
+
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Add ABI-specific directories to the system library path.
+  sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
+
+  # Ideally, we could use ldconfig to report *all* directores which are
+  # searched for libraries, however this is still not possible.  Aside from not
+  # being certain /sbin/ldconfig is available, command
+  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+  # even though it is searched at run-time.  Try to do the best guess by
+  # appending ld.so.conf contents (and includes) to the search path.
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd* | bitrig*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec=/usr/lib
+  need_lib_prefix=no
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    need_version=no
+  else
+    need_version=yes
+  fi
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+os2*)
+  libname_spec='$name'
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
+  need_lib_prefix=no
+  # OS/2 can only load a DLL with a base name of 8 characters or less.
+  soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+    v=$($ECHO $release$versuffix | tr -d .-);
+    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+    $ECHO $n$v`$shared_ext'
+  library_names_spec='${libname}_dll.$libext'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=BEGINLIBPATH
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  postinstall_cmds='base_file=`basename \$file`~
+    dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+    dldir=$destdir/`dirname \$dlpath`~
+    test -d \$dldir || mkdir -p \$dldir~
+    $install_prog $dir/$dlname \$dldir/$dlname~
+    chmod a+x \$dldir/$dlname~
+    if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+      eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+    fi'
+  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+    dlpath=$dir/\$dldll~
+    $RM \$dlpath'
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test yes = "$with_gnu_ld"; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec; then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+    soname_spec='$libname$shared_ext.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=sco
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test yes = "$with_gnu_ld"; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test no = "$dynamic_linker" && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test yes = "$GCC"; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
+fi
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
+fi
+
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" ||
+   test -n "$runpath_var" ||
+   test yes = "$hardcode_automatic"; then
+
+  # We can hardcode non-existent directories.
+  if test no != "$hardcode_direct" &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" &&
+     test no != "$hardcode_minus_L"; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
+$as_echo "$hardcode_action" >&6; }
+
+if test relink = "$hardcode_action" ||
+   test yes = "$inherit_rpath"; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test yes = "$shlibpath_overrides_runpath" ||
+     test no = "$enable_shared"; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+
+
+
+
+  if test yes != "$enable_dlopen"; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen=load_add_on
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen=LoadLibrary
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen=dlopen
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+    # if libdl is installed we need to link against it
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
+else
+
+    lt_cv_dlopen=dyld
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+
+fi
+
+    ;;
+
+  tpf*)
+    # Don't try to run any link tests for TPF.  We know it's impossible
+    # because TPF is a cross-compiler, and we know how we open DSOs.
+    lt_cv_dlopen=dlopen
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=no
+    ;;
+
+  *)
+    ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
+if test "x$ac_cv_func_shl_load" = xyes; then :
+  lt_cv_dlopen=shl_load
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
+$as_echo_n "checking for shl_load in -ldld... " >&6; }
+if ${ac_cv_lib_dld_shl_load+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load ();
+int
+main ()
+{
+return shl_load ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_shl_load=yes
+else
+  ac_cv_lib_dld_shl_load=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
+$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
+if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
+  lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld
+else
+  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
+if test "x$ac_cv_func_dlopen" = xyes; then :
+  lt_cv_dlopen=dlopen
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
+$as_echo_n "checking for dlopen in -lsvld... " >&6; }
+if ${ac_cv_lib_svld_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_svld_dlopen=yes
+else
+  ac_cv_lib_svld_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
+$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
+if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
+  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
+$as_echo_n "checking for dld_link in -ldld... " >&6; }
+if ${ac_cv_lib_dld_dld_link+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dld_link ();
+int
+main ()
+{
+return dld_link ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_dld_link=yes
+else
+  ac_cv_lib_dld_dld_link=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
+$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
+if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
+  lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+    ;;
+  esac
+
+  if test no = "$lt_cv_dlopen"; then
+    enable_dlopen=no
+  else
+    enable_dlopen=yes
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS=$CPPFLAGS
+    test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS=$LDFLAGS
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS=$LIBS
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
+$as_echo_n "checking whether a program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  	  if test yes = "$cross_compiling"; then :
+  lt_cv_dlopen_self=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include 
+#endif
+
+#include 
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisibility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
+$as_echo "$lt_cv_dlopen_self" >&6; }
+
+    if test yes = "$lt_cv_dlopen_self"; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
+$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self_static+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  	  if test yes = "$cross_compiling"; then :
+  lt_cv_dlopen_self_static=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include 
+#endif
+
+#include 
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisibility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self_static=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
+$as_echo "$lt_cv_dlopen_self_static" >&6; }
+    fi
+
+    CPPFLAGS=$save_CPPFLAGS
+    LDFLAGS=$save_LDFLAGS
+    LIBS=$save_LIBS
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+striplib=
+old_striplib=
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
+$as_echo_n "checking whether stripping libraries is possible... " >&6; }
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP"; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    fi
+    ;;
+  *)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+  # Report what library types will actually be built
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+$as_echo_n "checking if libtool supports shared libraries... " >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+$as_echo "$can_build_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+$as_echo_n "checking whether to build shared libraries... " >&6; }
+  test no = "$can_build_shared" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test yes = "$enable_shared" && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[4-9]*)
+    if test ia64 != "$host_cpu"; then
+      case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+      yes,aix,yes) ;;			# shared object as lib.so file only
+      yes,svr4,*) ;;			# shared object as lib.so archive member only
+      yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+      esac
+    fi
+    ;;
+  esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+$as_echo "$enable_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+$as_echo_n "checking whether to build static libraries... " >&6; }
+  # Make sure either enable_shared or enable_static is yes.
+  test yes = "$enable_shared" || enable_static=yes
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+$as_echo "$enable_static" >&6; }
+
+
+
+
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC=$lt_save_CC
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+        ac_config_commands="$ac_config_commands libtool"
+
+
+
+
+# Only expand once:
+
+
+: ${CONFIG_LT=./config.lt}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_LT" >&5
+$as_echo "$as_me: creating $CONFIG_LT" >&6;}
+as_write_fail=0
+cat >"$CONFIG_LT" <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate a libtool stub with the current configuration.
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>"$CONFIG_LT" <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -pR'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -pR'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -pR'
+  fi
+else
+  as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## --------------------------------- ##
+## Main body of "$CONFIG_LT" script. ##
+## --------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x "$CONFIG_LT"
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+lt_cl_silent=false
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+
+lt_cl_help="\
+'$as_me' creates a local libtool stub from the current configuration,
+for use in further configure time tests before the real libtool is
+generated.
+
+Usage: $0 [OPTIONS]
+
+  -h, --help      print this help, then exit
+  -V, --version   print version number, then exit
+  -q, --quiet     do not print progress messages
+  -d, --debug     don't remove temporary files
+
+Report bugs to ."
+
+lt_cl_version="\
+gmime config.lt 3.0.1
+configured by $0, generated by GNU Autoconf 2.69.
+
+Copyright (C) 2011 Free Software Foundation, Inc.
+This config.lt script is free software; the Free Software Foundation
+gives unlimited permision to copy, distribute and modify it."
+
+while test 0 != $#
+do
+  case $1 in
+    --version | --v* | -V )
+      echo "$lt_cl_version"; exit 0 ;;
+    --help | --h* | -h )
+      echo "$lt_cl_help"; exit 0 ;;
+    --debug | --d* | -d )
+      debug=: ;;
+    --quiet | --q* | --silent | --s* | -q )
+      lt_cl_silent=: ;;
+
+    -*) as_fn_error $? "unrecognized option: $1
+Try '$0 --help' for more information." "$LINENO" 5 ;;
+
+    *) as_fn_error $? "unrecognized argument: $1
+Try '$0 --help' for more information." "$LINENO" 5 ;;
+  esac
+  shift
+done
+
+if $lt_cl_silent; then
+  exec 6>/dev/null
+fi
+_LTEOF
+
+cat >>"$CONFIG_LT" <<_LTEOF
+
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`'
+SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
+ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
+host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
+host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
+host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
+build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
+build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
+build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
+SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
+Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
+GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
+EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
+FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
+LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
+NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
+LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
+exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
+file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
+want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
+DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
+sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
+AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
+archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
+STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
+lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
+CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
+compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
+GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`'
+nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
+lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`'
+objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
+need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
+MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
+LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
+libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
+postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
+need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
+version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
+install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
+configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`'
+configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
+striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in SHELL \
+ECHO \
+PATH_SEPARATOR \
+SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+OBJDUMP \
+deplibs_check_method \
+file_magic_cmd \
+file_magic_glob \
+want_nocaseglob \
+DLLTOOL \
+sharedlib_from_linklib_cmd \
+AR \
+AR_FLAGS \
+archiver_list_spec \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_import \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+lt_cv_nm_interface \
+nm_file_list_spec \
+lt_cv_truncate_bin \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_pic \
+lt_prog_compiler_wl \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+MANIFEST_TOOL \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_separator \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+install_override_mode \
+finish_eval \
+old_striplib \
+striplib; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postlink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+configure_time_dlsearch_path \
+configure_time_lt_sys_library_path; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+ac_aux_dir='$ac_aux_dir'
+
+# See if we are running on zsh, and set the options that allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}"; then
+   setopt NO_GLOB_SUBST
+fi
+
+
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    RM='$RM'
+    ofile='$ofile'
+
+
+
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $ofile" >&5
+$as_echo "$as_me: creating $ofile" >&6;}
+
+
+    # See if we are running on zsh, and set the options that allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}"; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile=${ofile}T
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+# Generated automatically by $as_me ($PACKAGE) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the  same
+# distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see .
+
+
+# The names of the tagged configurations supported by this script.
+available_tags=''
+
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# What type of objects to build.
+pic_mode=$pic_mode
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# Shared archive member basename,for filename based shared library versioning on AIX.
+shared_archive_member_spec=$shared_archive_member_spec
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that protects backslashes.
+ECHO=$lt_ECHO
+
+# The PATH separator for the build system.
+PATH_SEPARATOR=$lt_PATH_SEPARATOR
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP=$lt_GREP
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# A literal string matcher.
+FGREP=$lt_FGREP
+
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
+
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
+
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
+
+# Object file suffix (normally "o").
+objext=$ac_objext
+
+# Executable file suffix (normally "").
+exeext=$exeext
+
+# whether the shell understands "unset".
+lt_unset=$lt_unset
+
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
+
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
+
+# convert \$build file names to \$host format.
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+
+# convert \$build files to toolchain format.
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+
+# An object symbol dumper.
+OBJDUMP=$lt_OBJDUMP
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method = "file_magic".
+file_magic_cmd=$lt_file_magic_cmd
+
+# How to find potential files when deplibs_check_method = "file_magic".
+file_magic_glob=$lt_file_magic_glob
+
+# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
+want_nocaseglob=$lt_want_nocaseglob
+
+# DLL creation program.
+DLLTOOL=$lt_DLLTOOL
+
+# Command to associate shared and link libraries.
+sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
+
+# The archiver.
+AR=$lt_AR
+
+# Flags to create an archive.
+AR_FLAGS=$lt_AR_FLAGS
+
+# How to feed a file listing to the archiver.
+archiver_list_spec=$lt_archiver_list_spec
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
+
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=$lock_old_archive_extraction
+
+# A C compiler.
+LTCC=$lt_CC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm into a list of symbols to manually relocate.
+global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+
+# The name lister interface.
+nm_interface=$lt_lt_cv_nm_interface
+
+# Specify filename containing input files for \$NM.
+nm_file_list_spec=$lt_nm_file_list_spec
+
+# The root where to search for dependent libraries,and where our libraries should be installed.
+lt_sysroot=$lt_sysroot
+
+# Command to truncate a binary pipe.
+lt_truncate_bin=$lt_lt_cv_truncate_bin
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Manifest tool.
+MANIFEST_TOOL=$lt_MANIFEST_TOOL
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
+
+# Old archive suffix (normally "a").
+libext=$libext
+
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
+
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Library versioning type.
+version_type=$version_type
+
+# Shared library runtime path variable.
+runpath_var=$runpath_var
+
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Permission mode override for installation of shared libraries.
+install_override_mode=$lt_install_override_mode
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Detected run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path
+
+# Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
+configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
+
+# A language specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+    cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+#       string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+#       string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+#       "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+#       VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+    case x$2 in
+    x)
+        ;;
+    *:)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+        ;;
+    x:*)
+        eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    *::*)
+        eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+        eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+        ;;
+    *)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    esac
+}
+
+
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+    for cc_temp in $*""; do
+      case $cc_temp in
+        compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+        distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+        \-*) ;;
+        *) break;;
+      esac
+    done
+    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test set != "${COLLECT_NAMES+set}"; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+
+ltmain=$ac_aux_dir/ltmain.sh
+
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
+
+   mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+
+
+as_fn_exit 0
+_LTEOF
+chmod +x "$CONFIG_LT"
+
+# configure is writing to config.log, but config.lt does its own redirection,
+# appending to config.log, which fails on DOS, as config.log is still kept
+# open by configure.  Here we exec the FD to /dev/null, effectively closing
+# config.log, so it can be properly (re)opened and appended to by config.lt.
+lt_cl_success=:
+test yes = "$silent" &&
+  lt_config_lt_args="$lt_config_lt_args --quiet"
+exec 5>/dev/null
+$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
+exec 5>>config.log
+$lt_cl_success || as_fn_exit 1
+
+
+
+# dolt, a replacement for libtool
+# Josh Triplett 
+# Extract the first word of "bash", so it can be a program name with args.
+set dummy bash; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_DOLT_BASH+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $DOLT_BASH in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_DOLT_BASH="$DOLT_BASH" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_DOLT_BASH="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+DOLT_BASH=$ac_cv_path_DOLT_BASH
+if test -n "$DOLT_BASH"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DOLT_BASH" >&5
+$as_echo "$DOLT_BASH" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if dolt supports this host" >&5
+$as_echo_n "checking if dolt supports this host... " >&6; }
+dolt_supported=yes
+if test x$DOLT_BASH = x; then
+    dolt_supported=no
+fi
+if test x$GCC != xyes; then
+    dolt_supported=no
+fi
+case $host in
+i?86-*-linux*|x86_64-*-linux*|powerpc-*-linux* \
+|amd64-*-freebsd*|i?86-*-freebsd*|ia64-*-freebsd*)
+    pic_options='-fPIC'
+    ;;
+i?86-apple-darwin*)
+    pic_options='-fno-common'
+    ;;
+*)
+    dolt_supported=no
+    ;;
+esac
+if test x$dolt_supported = xno ; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, falling back to libtool" >&5
+$as_echo "no, falling back to libtool" >&6; }
+    LTCOMPILE='$(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(COMPILE)'
+    LTCXXCOMPILE='$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXXCOMPILE)'
+else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, replacing libtool" >&5
+$as_echo "yes, replacing libtool" >&6; }
+
+    cat <<__DOLTCOMPILE__EOF__ >doltcompile
+#!$DOLT_BASH
+__DOLTCOMPILE__EOF__
+    cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
+args=("$@")
+for ((arg=0; arg<${#args[@]}; arg++)) ; do
+    if test x"${args[$arg]}" = x-o ; then
+        objarg=$((arg+1))
+        break
+    fi
+done
+if test x$objarg = x ; then
+    echo 'Error: no -o on compiler command line' 1>&2
+    exit 1
+fi
+lo="${args[$objarg]}"
+obj="${lo%.lo}"
+if test x"$lo" = x"$obj" ; then
+    echo "Error: libtool object file name \"$lo\" does not end in .lo" 1>&2
+    exit 1
+fi
+objbase="${obj##*/}"
+__DOLTCOMPILE__EOF__
+
+    if test x$enable_shared = xyes; then
+        cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
+libobjdir="${obj%$objbase}.libs"
+if test ! -d "$libobjdir" ; then
+    mkdir_out="$(mkdir "$libobjdir" 2>&1)"
+    mkdir_ret=$?
+    if test "$mkdir_ret" -ne 0 && test ! -d "$libobjdir" ; then
+	echo "$mkdir_out" 1>&2
+        exit $mkdir_ret
+    fi
+fi
+pic_object="$libobjdir/$objbase.o"
+args[$objarg]="$pic_object"
+__DOLTCOMPILE__EOF__
+    cat <<__DOLTCOMPILE__EOF__ >>doltcompile
+"\${args[@]}" $pic_options -DPIC || exit \$?
+__DOLTCOMPILE__EOF__
+    fi
+
+    if test x$enable_static = xyes; then
+        cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
+non_pic_object="$obj.o"
+args[$objarg]="$non_pic_object"
+__DOLTCOMPILE__EOF__
+        if test x$enable_shared = xyes; then
+            cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
+"${args[@]}" >/dev/null 2>&1 || exit $?
+__DOLTCOMPILE__EOF__
+        else
+            cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
+"${args[@]}" || exit $?
+__DOLTCOMPILE__EOF__
+        fi
+    fi
+
+    cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
+{
+echo "# $lo - a libtool object file"
+echo "# Generated by doltcompile, not libtool"
+__DOLTCOMPILE__EOF__
+
+    if test x$enable_shared = xyes; then
+        cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
+echo "pic_object='.libs/${objbase}.o'"
+__DOLTCOMPILE__EOF__
+    else
+        cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
+echo pic_object=none
+__DOLTCOMPILE__EOF__
+    fi
+
+    if test x$enable_static = xyes; then
+        cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
+echo "non_pic_object='${objbase}.o'"
+__DOLTCOMPILE__EOF__
+    else
+        cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
+echo non_pic_object=none
+__DOLTCOMPILE__EOF__
+    fi
+
+    cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
+} > "$lo"
+__DOLTCOMPILE__EOF__
+
+    chmod +x doltcompile
+    LTCOMPILE='$(top_builddir)/doltcompile $(COMPILE)'
+    LTCXXCOMPILE='$(top_builddir)/doltcompile $(CXXCOMPILE)'
+
+    cat <<__DOLTLIBTOOL__EOF__ > doltlibtool
+#!$DOLT_BASH
+__DOLTLIBTOOL__EOF__
+    cat <<'__DOLTLIBTOOL__EOF__' >>doltlibtool
+top_builddir_slash="${0%%doltlibtool}"
+: ${top_builddir_slash:=./}
+args=()
+modeok=false
+tagok=false
+for arg in "$@"; do
+    case "$arg" in
+        --mode=compile) modeok=true ;;
+        --tag=CC|--tag=CXX) tagok=true ;;
+        *) args[${#args[@]}]="$arg" ;;
+    esac
+done
+if $modeok && $tagok ; then
+    . ${top_builddir_slash}doltcompile "${args[@]}"
+else
+    exec ${top_builddir_slash}libtool "$@"
+fi
+__DOLTLIBTOOL__EOF__
+
+    chmod +x doltlibtool
+    LIBTOOL='$(top_builddir)/doltlibtool'
+fi
+
+
+# end dolt
+
+
+for ac_header in sys/mman.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_mman_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_SYS_MMAN_H 1
+_ACEOF
+
+fi
+
+done
+
+for ac_header in sys/param.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_param_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_SYS_PARAM_H 1
+_ACEOF
+
+fi
+
+done
+
+for ac_header in winsock2.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default"
+if test "x$ac_cv_header_winsock2_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_WINSOCK2_H 1
+_ACEOF
+
+fi
+
+done
+
+for ac_header in string.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default"
+if test "x$ac_cv_header_string_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_STRING_H 1
+_ACEOF
+
+fi
+
+done
+
+for ac_header in stdlib.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default"
+if test "x$ac_cv_header_stdlib_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_STDLIB_H 1
+_ACEOF
+
+fi
+
+done
+
+for ac_header in netdb.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "netdb.h" "ac_cv_header_netdb_h" "$ac_includes_default"
+if test "x$ac_cv_header_netdb_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_NETDB_H 1
+_ACEOF
+
+fi
+
+done
+
+for ac_header in time.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "time.h" "ac_cv_header_time_h" "$ac_includes_default"
+if test "x$ac_cv_header_time_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_TIME_H 1
+_ACEOF
+
+fi
+
+done
+
+for ac_header in poll.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "poll.h" "ac_cv_header_poll_h" "$ac_includes_default"
+if test "x$ac_cv_header_poll_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_POLL_H 1
+_ACEOF
+
+fi
+
+done
+
+
+ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default"
+if test "x$ac_cv_type_off_t" = xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define off_t long int
+_ACEOF
+
+fi
+
+ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
+if test "x$ac_cv_type_size_t" = xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define size_t unsigned int
+_ACEOF
+
+fi
+
+ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default"
+if test "x$ac_cv_type_ssize_t" = xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define ssize_t int
+_ACEOF
+
+fi
+
+ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_default"
+if test "x$ac_cv_type_mode_t" = xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define mode_t int
+_ACEOF
+
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for nfds_t" >&5
+$as_echo_n "checking for nfds_t... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+	#include 
+	#include 
+
+int
+main ()
+{
+
+	nfds_t nfds = 1;
+	return nfds;
+
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+else
+
+$as_echo "#define nfds_t unsigned long int" >>confdefs.h
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+
+
+
+  for ac_header in $ac_header_list
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+
+
+
+
+for ac_func in getpagesize
+do :
+  ac_fn_c_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize"
+if test "x$ac_cv_func_getpagesize" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_GETPAGESIZE 1
+_ACEOF
+
+fi
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5
+$as_echo_n "checking for working mmap... " >&6; }
+if ${ac_cv_func_mmap_fixed_mapped+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "$cross_compiling" = yes; then :
+  ac_cv_func_mmap_fixed_mapped=no
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+/* malloc might have been renamed as rpl_malloc. */
+#undef malloc
+
+/* Thanks to Mike Haertel and Jim Avera for this test.
+   Here is a matrix of mmap possibilities:
+	mmap private not fixed
+	mmap private fixed at somewhere currently unmapped
+	mmap private fixed at somewhere already mapped
+	mmap shared not fixed
+	mmap shared fixed at somewhere currently unmapped
+	mmap shared fixed at somewhere already mapped
+   For private mappings, we should verify that changes cannot be read()
+   back from the file, nor mmap's back from the file at a different
+   address.  (There have been systems where private was not correctly
+   implemented like the infamous i386 svr4.0, and systems where the
+   VM page cache was not coherent with the file system buffer cache
+   like early versions of FreeBSD and possibly contemporary NetBSD.)
+   For shared mappings, we should conversely verify that changes get
+   propagated back to all the places they're supposed to be.
+
+   Grep wants private fixed already mapped.
+   The main things grep needs to know about mmap are:
+   * does it exist and is it safe to write into the mmap'd area
+   * how to use it (BSD variants)  */
+
+#include 
+#include 
+
+#if !defined STDC_HEADERS && !defined HAVE_STDLIB_H
+char *malloc ();
+#endif
+
+/* This mess was copied from the GNU getpagesize.h.  */
+#ifndef HAVE_GETPAGESIZE
+# ifdef _SC_PAGESIZE
+#  define getpagesize() sysconf(_SC_PAGESIZE)
+# else /* no _SC_PAGESIZE */
+#  ifdef HAVE_SYS_PARAM_H
+#   include 
+#   ifdef EXEC_PAGESIZE
+#    define getpagesize() EXEC_PAGESIZE
+#   else /* no EXEC_PAGESIZE */
+#    ifdef NBPG
+#     define getpagesize() NBPG * CLSIZE
+#     ifndef CLSIZE
+#      define CLSIZE 1
+#     endif /* no CLSIZE */
+#    else /* no NBPG */
+#     ifdef NBPC
+#      define getpagesize() NBPC
+#     else /* no NBPC */
+#      ifdef PAGESIZE
+#       define getpagesize() PAGESIZE
+#      endif /* PAGESIZE */
+#     endif /* no NBPC */
+#    endif /* no NBPG */
+#   endif /* no EXEC_PAGESIZE */
+#  else /* no HAVE_SYS_PARAM_H */
+#   define getpagesize() 8192	/* punt totally */
+#  endif /* no HAVE_SYS_PARAM_H */
+# endif /* no _SC_PAGESIZE */
+
+#endif /* no HAVE_GETPAGESIZE */
+
+int
+main ()
+{
+  char *data, *data2, *data3;
+  const char *cdata2;
+  int i, pagesize;
+  int fd, fd2;
+
+  pagesize = getpagesize ();
+
+  /* First, make a file with some known garbage in it. */
+  data = (char *) malloc (pagesize);
+  if (!data)
+    return 1;
+  for (i = 0; i < pagesize; ++i)
+    *(data + i) = rand ();
+  umask (0);
+  fd = creat ("conftest.mmap", 0600);
+  if (fd < 0)
+    return 2;
+  if (write (fd, data, pagesize) != pagesize)
+    return 3;
+  close (fd);
+
+  /* Next, check that the tail of a page is zero-filled.  File must have
+     non-zero length, otherwise we risk SIGBUS for entire page.  */
+  fd2 = open ("conftest.txt", O_RDWR | O_CREAT | O_TRUNC, 0600);
+  if (fd2 < 0)
+    return 4;
+  cdata2 = "";
+  if (write (fd2, cdata2, 1) != 1)
+    return 5;
+  data2 = (char *) mmap (0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd2, 0L);
+  if (data2 == MAP_FAILED)
+    return 6;
+  for (i = 0; i < pagesize; ++i)
+    if (*(data2 + i))
+      return 7;
+  close (fd2);
+  if (munmap (data2, pagesize))
+    return 8;
+
+  /* Next, try to mmap the file at a fixed address which already has
+     something else allocated at it.  If we can, also make sure that
+     we see the same garbage.  */
+  fd = open ("conftest.mmap", O_RDWR);
+  if (fd < 0)
+    return 9;
+  if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE,
+		     MAP_PRIVATE | MAP_FIXED, fd, 0L))
+    return 10;
+  for (i = 0; i < pagesize; ++i)
+    if (*(data + i) != *(data2 + i))
+      return 11;
+
+  /* Finally, make sure that changes to the mapped area do not
+     percolate back to the file as seen by read().  (This is a bug on
+     some variants of i386 svr4.0.)  */
+  for (i = 0; i < pagesize; ++i)
+    *(data2 + i) = *(data2 + i) + 1;
+  data3 = (char *) malloc (pagesize);
+  if (!data3)
+    return 12;
+  if (read (fd, data3, pagesize) != pagesize)
+    return 13;
+  for (i = 0; i < pagesize; ++i)
+    if (*(data + i) != *(data3 + i))
+      return 14;
+  close (fd);
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  ac_cv_func_mmap_fixed_mapped=yes
+else
+  ac_cv_func_mmap_fixed_mapped=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5
+$as_echo "$ac_cv_func_mmap_fixed_mapped" >&6; }
+if test $ac_cv_func_mmap_fixed_mapped = yes; then
+
+$as_echo "#define HAVE_MMAP 1" >>confdefs.h
+
+fi
+rm -f conftest.mmap conftest.txt
+
+for ac_func in munmap msync
+do :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+for ac_func in select poll
+do :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+
+
+
+
+
+
+
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+	if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PKG_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
+$as_echo "$PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+  ac_pt_PKG_CONFIG=$PKG_CONFIG
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $ac_pt_PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
+$as_echo "$ac_pt_PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_pt_PKG_CONFIG" = x; then
+    PKG_CONFIG=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    PKG_CONFIG=$ac_pt_PKG_CONFIG
+  fi
+else
+  PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+fi
+if test -n "$PKG_CONFIG"; then
+	_pkg_min_version=0.9.0
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
+$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
+	if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	else
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+		PKG_CONFIG=""
+	fi
+fi
+
+
+
+  gtk_doc_requires="gtk-doc >= 1.8"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gtk-doc" >&5
+$as_echo_n "checking for gtk-doc... " >&6; }
+  if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$gtk_doc_requires\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "$gtk_doc_requires") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  have_gtk_doc=yes
+else
+  have_gtk_doc=no
+fi
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_gtk_doc" >&5
+$as_echo "$have_gtk_doc" >&6; }
+
+  if test "$have_gtk_doc" = "no"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING:
+  You will not be able to create source packages with 'make dist'
+  because $gtk_doc_requires is not found." >&5
+$as_echo "$as_me: WARNING:
+  You will not be able to create source packages with 'make dist'
+  because $gtk_doc_requires is not found." >&2;}
+  fi
+
+            # Extract the first word of "gtkdoc-check", so it can be a program name with args.
+set dummy gtkdoc-check; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_GTKDOC_CHECK+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$GTKDOC_CHECK"; then
+  ac_cv_prog_GTKDOC_CHECK="$GTKDOC_CHECK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_GTKDOC_CHECK="gtkdoc-check.test"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+GTKDOC_CHECK=$ac_cv_prog_GTKDOC_CHECK
+if test -n "$GTKDOC_CHECK"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_CHECK" >&5
+$as_echo "$GTKDOC_CHECK" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  # Extract the first word of "gtkdoc-check", so it can be a program name with args.
+set dummy gtkdoc-check; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_GTKDOC_CHECK_PATH+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $GTKDOC_CHECK_PATH in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GTKDOC_CHECK_PATH="$GTKDOC_CHECK_PATH" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_GTKDOC_CHECK_PATH="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+GTKDOC_CHECK_PATH=$ac_cv_path_GTKDOC_CHECK_PATH
+if test -n "$GTKDOC_CHECK_PATH"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_CHECK_PATH" >&5
+$as_echo "$GTKDOC_CHECK_PATH" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  for ac_prog in gtkdoc-rebase
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_GTKDOC_REBASE+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $GTKDOC_REBASE in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GTKDOC_REBASE="$GTKDOC_REBASE" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_GTKDOC_REBASE="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+GTKDOC_REBASE=$ac_cv_path_GTKDOC_REBASE
+if test -n "$GTKDOC_REBASE"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_REBASE" >&5
+$as_echo "$GTKDOC_REBASE" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$GTKDOC_REBASE" && break
+done
+test -n "$GTKDOC_REBASE" || GTKDOC_REBASE="true"
+
+  # Extract the first word of "gtkdoc-mkpdf", so it can be a program name with args.
+set dummy gtkdoc-mkpdf; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_GTKDOC_MKPDF+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $GTKDOC_MKPDF in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GTKDOC_MKPDF="$GTKDOC_MKPDF" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_GTKDOC_MKPDF="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+GTKDOC_MKPDF=$ac_cv_path_GTKDOC_MKPDF
+if test -n "$GTKDOC_MKPDF"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_MKPDF" >&5
+$as_echo "$GTKDOC_MKPDF" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+
+# Check whether --with-html-dir was given.
+if test "${with_html_dir+set}" = set; then :
+  withval=$with_html_dir;
+else
+  with_html_dir='${datadir}/gtk-doc/html'
+fi
+
+  HTML_DIR="$with_html_dir"
+
+
+    # Check whether --enable-gtk-doc was given.
+if test "${enable_gtk_doc+set}" = set; then :
+  enableval=$enable_gtk_doc;
+else
+  enable_gtk_doc=no
+fi
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build gtk-doc documentation" >&5
+$as_echo_n "checking whether to build gtk-doc documentation... " >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_gtk_doc" >&5
+$as_echo "$enable_gtk_doc" >&6; }
+
+  if test "x$enable_gtk_doc" = "xyes" && test "$have_gtk_doc" = "no"; then
+    as_fn_error $? "
+  You must have $gtk_doc_requires installed to build documentation for
+  $PACKAGE_NAME. Please install gtk-doc or disable building the
+  documentation by adding '--disable-gtk-doc' to '$0'." "$LINENO" 5
+  fi
+
+    if test "x$PACKAGE_NAME" != "xglib"; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTKDOC_DEPS" >&5
+$as_echo_n "checking for GTKDOC_DEPS... " >&6; }
+
+if test -n "$GTKDOC_DEPS_CFLAGS"; then
+    pkg_cv_GTKDOC_DEPS_CFLAGS="$GTKDOC_DEPS_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GTKDOC_DEPS_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$GTKDOC_DEPS_LIBS"; then
+    pkg_cv_GTKDOC_DEPS_LIBS="$GTKDOC_DEPS_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GTKDOC_DEPS_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+   	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        GTKDOC_DEPS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0" 2>&1`
+        else
+	        GTKDOC_DEPS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0" 2>&1`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$GTKDOC_DEPS_PKG_ERRORS" >&5
+
+	:
+elif test $pkg_failed = untried; then
+     	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	:
+else
+	GTKDOC_DEPS_CFLAGS=$pkg_cv_GTKDOC_DEPS_CFLAGS
+	GTKDOC_DEPS_LIBS=$pkg_cv_GTKDOC_DEPS_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+  fi
+
+    # Check whether --enable-gtk-doc-html was given.
+if test "${enable_gtk_doc_html+set}" = set; then :
+  enableval=$enable_gtk_doc_html;
+else
+  enable_gtk_doc_html=yes
+fi
+
+    # Check whether --enable-gtk-doc-pdf was given.
+if test "${enable_gtk_doc_pdf+set}" = set; then :
+  enableval=$enable_gtk_doc_pdf;
+else
+  enable_gtk_doc_pdf=no
+fi
+
+
+  if test -z "$GTKDOC_MKPDF"; then
+    enable_gtk_doc_pdf=no
+  fi
+
+  if test -z "$AM_DEFAULT_VERBOSITY"; then
+    AM_DEFAULT_VERBOSITY=1
+  fi
+
+
+   if test x$have_gtk_doc = xyes; then
+  HAVE_GTK_DOC_TRUE=
+  HAVE_GTK_DOC_FALSE='#'
+else
+  HAVE_GTK_DOC_TRUE='#'
+  HAVE_GTK_DOC_FALSE=
+fi
+
+   if test x$enable_gtk_doc = xyes; then
+  ENABLE_GTK_DOC_TRUE=
+  ENABLE_GTK_DOC_FALSE='#'
+else
+  ENABLE_GTK_DOC_TRUE='#'
+  ENABLE_GTK_DOC_FALSE=
+fi
+
+   if test x$enable_gtk_doc_html = xyes; then
+  GTK_DOC_BUILD_HTML_TRUE=
+  GTK_DOC_BUILD_HTML_FALSE='#'
+else
+  GTK_DOC_BUILD_HTML_TRUE='#'
+  GTK_DOC_BUILD_HTML_FALSE=
+fi
+
+   if test x$enable_gtk_doc_pdf = xyes; then
+  GTK_DOC_BUILD_PDF_TRUE=
+  GTK_DOC_BUILD_PDF_FALSE='#'
+else
+  GTK_DOC_BUILD_PDF_TRUE='#'
+  GTK_DOC_BUILD_PDF_FALSE=
+fi
+
+   if test -n "$LIBTOOL"; then
+  GTK_DOC_USE_LIBTOOL_TRUE=
+  GTK_DOC_USE_LIBTOOL_FALSE='#'
+else
+  GTK_DOC_USE_LIBTOOL_TRUE='#'
+  GTK_DOC_USE_LIBTOOL_FALSE=
+fi
+
+   if test -n "$GTKDOC_REBASE"; then
+  GTK_DOC_USE_REBASE_TRUE=
+  GTK_DOC_USE_REBASE_FALSE='#'
+else
+  GTK_DOC_USE_REBASE_TRUE='#'
+  GTK_DOC_USE_REBASE_FALSE=
+fi
+
+
+
+for ac_prog in db2html docbook2html
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_DB2HTML+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $DB2HTML in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_DB2HTML="$DB2HTML" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_DB2HTML="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+DB2HTML=$ac_cv_path_DB2HTML
+if test -n "$DB2HTML"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DB2HTML" >&5
+$as_echo "$DB2HTML" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$DB2HTML" && break
+done
+
+ if test -n "$DB2HTML"; then
+  HAVE_DOCBOOK_TRUE=
+  HAVE_DOCBOOK_FALSE='#'
+else
+  HAVE_DOCBOOK_TRUE='#'
+  HAVE_DOCBOOK_FALSE=
+fi
+
+
+ if test "x$enable_gtk_doc" = "xyes"; then
+  ENABLE_GTK_DOC_TRUE=
+  ENABLE_GTK_DOC_FALSE='#'
+else
+  ENABLE_GTK_DOC_TRUE='#'
+  ENABLE_GTK_DOC_FALSE=
+fi
+
+
+# Check whether --enable-profiling was given.
+if test "${enable_profiling+set}" = set; then :
+  enableval=$enable_profiling;
+else
+  enable_profiling="no"
+fi
+
+if test "x$enable_profiling" = "xyes"; then
+# CFLAGS="-O0 -g -pg -fprofile-arcs -ftest-coverage"
+  CFLAGS="-O0 -g -pg"
+fi
+
+# Check whether --enable-warnings was given.
+if test "${enable_warnings+set}" = set; then :
+  enableval=$enable_warnings;
+else
+  enable_warnings="no"
+fi
+
+if test "x$enable_warnings" = "xyes"; then
+
+$as_echo "#define ENABLE_WARNINGS 1" >>confdefs.h
+
+fi
+
+
+
+if  test x"$glib_native_win32" = xyes; then :
+
+  with_libiconv=native
+
+else
+
+
+# Check whether --with-libiconv was given.
+if test "${with_libiconv+set}" = set; then :
+  withval=$with_libiconv;
+else
+  with_libiconv=maybe
+fi
+
+
+  found_iconv=no
+  case $with_libiconv in
+    maybe)
+      # Check in the C library first
+      ac_fn_c_check_func "$LINENO" "iconv_open" "ac_cv_func_iconv_open"
+if test "x$ac_cv_func_iconv_open" = xyes; then :
+  with_libiconv=no; found_iconv=yes
+fi
+
+      # Check if we have GNU libiconv
+      if test $found_iconv = "no"; then
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libiconv_open in -liconv" >&5
+$as_echo_n "checking for libiconv_open in -liconv... " >&6; }
+if ${ac_cv_lib_iconv_libiconv_open+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-liconv  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char libiconv_open ();
+int
+main ()
+{
+return libiconv_open ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_iconv_libiconv_open=yes
+else
+  ac_cv_lib_iconv_libiconv_open=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_iconv_libiconv_open" >&5
+$as_echo "$ac_cv_lib_iconv_libiconv_open" >&6; }
+if test "x$ac_cv_lib_iconv_libiconv_open" = xyes; then :
+  with_libiconv=gnu; found_iconv=yes
+fi
+
+      fi
+      # Check if we have a iconv in -liconv, possibly from vendor
+      if test $found_iconv = "no"; then
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv_open in -liconv" >&5
+$as_echo_n "checking for iconv_open in -liconv... " >&6; }
+if ${ac_cv_lib_iconv_iconv_open+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-liconv  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char iconv_open ();
+int
+main ()
+{
+return iconv_open ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_iconv_iconv_open=yes
+else
+  ac_cv_lib_iconv_iconv_open=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_iconv_iconv_open" >&5
+$as_echo "$ac_cv_lib_iconv_iconv_open" >&6; }
+if test "x$ac_cv_lib_iconv_iconv_open" = xyes; then :
+  with_libiconv=native; found_iconv=yes
+fi
+
+      fi
+      ;;
+    no)
+      ac_fn_c_check_func "$LINENO" "iconv_open" "ac_cv_func_iconv_open"
+if test "x$ac_cv_func_iconv_open" = xyes; then :
+  with_libiconv=no; found_iconv=yes
+fi
+
+      ;;
+    gnu|yes)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libiconv_open in -liconv" >&5
+$as_echo_n "checking for libiconv_open in -liconv... " >&6; }
+if ${ac_cv_lib_iconv_libiconv_open+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-liconv  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char libiconv_open ();
+int
+main ()
+{
+return libiconv_open ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_iconv_libiconv_open=yes
+else
+  ac_cv_lib_iconv_libiconv_open=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_iconv_libiconv_open" >&5
+$as_echo "$ac_cv_lib_iconv_libiconv_open" >&6; }
+if test "x$ac_cv_lib_iconv_libiconv_open" = xyes; then :
+  with_libiconv=gnu; found_iconv=yes
+fi
+
+      ;;
+    native)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv_open in -liconv" >&5
+$as_echo_n "checking for iconv_open in -liconv... " >&6; }
+if ${ac_cv_lib_iconv_iconv_open+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-liconv  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char iconv_open ();
+int
+main ()
+{
+return iconv_open ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_iconv_iconv_open=yes
+else
+  ac_cv_lib_iconv_iconv_open=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_iconv_iconv_open" >&5
+$as_echo "$ac_cv_lib_iconv_iconv_open" >&6; }
+if test "x$ac_cv_lib_iconv_iconv_open" = xyes; then :
+  with_libiconv=native; found_iconv=yes
+fi
+
+      ;;
+  esac
+
+  if test "x$found_iconv" = "xno" ; then
+     as_fn_error $? "*** No iconv() implementation found in C library or libiconv" "$LINENO" 5
+  fi
+
+fi
+
+
+if test x"$glib_native_win32" != xyes; then :
+
+  if test x$with_libiconv != xno ; then
+    case " $INTLLIBS " in
+    *[\ \	]-liconv[\ \	]*) ;;
+    *) ICONV_LIBS="-liconv" ;;
+    esac
+  fi
+
+fi
+
+
+case $with_libiconv in
+  gnu)
+
+$as_echo "#define USE_LIBICONV_GNU 1" >>confdefs.h
+
+    ;;
+  native)
+
+$as_echo "#define USE_LIBICONV_NATIVE 1" >>confdefs.h
+
+    ;;
+esac
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ZLIB" >&5
+$as_echo_n "checking for ZLIB... " >&6; }
+
+if test -n "$ZLIB_CFLAGS"; then
+    pkg_cv_ZLIB_CFLAGS="$ZLIB_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"zlib\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "zlib") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_ZLIB_CFLAGS=`$PKG_CONFIG --cflags "zlib" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$ZLIB_LIBS"; then
+    pkg_cv_ZLIB_LIBS="$ZLIB_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"zlib\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "zlib") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_ZLIB_LIBS=`$PKG_CONFIG --libs "zlib" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+   	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        ZLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "zlib" 2>&1`
+        else
+	        ZLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "zlib" 2>&1`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$ZLIB_PKG_ERRORS" >&5
+
+	found_zlib=no
+elif test $pkg_failed = untried; then
+     	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	found_zlib=no
+else
+	ZLIB_CFLAGS=$pkg_cv_ZLIB_CFLAGS
+	ZLIB_LIBS=$pkg_cv_ZLIB_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	found_zlib=yes
+fi
+if test "x$found_zlib" = "xno"; then :
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inflate in -lz" >&5
+$as_echo_n "checking for inflate in -lz... " >&6; }
+if ${ac_cv_lib_z_inflate+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lz  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char inflate ();
+int
+main ()
+{
+return inflate ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_z_inflate=yes
+else
+  ac_cv_lib_z_inflate=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_inflate" >&5
+$as_echo "$ac_cv_lib_z_inflate" >&6; }
+if test "x$ac_cv_lib_z_inflate" = xyes; then :
+  ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default"
+if test "x$ac_cv_header_zlib_h" = xyes; then :
+  found_zlib=yes
+fi
+
+
+fi
+
+  if test "x$found_zlib" = "xno" ; then
+    as_fn_error $? "*** Working zlib library and headers not found ***" "$LINENO" 5
+  fi
+  ZLIB_LIBS='-lz'
+
+
+fi
+
+# Check whether --enable-glibtest was given.
+if test "${enable_glibtest+set}" = set; then :
+  enableval=$enable_glibtest;
+else
+  enable_glibtest=yes
+fi
+
+
+  pkg_config_args=glib-2.0
+  for module in . gobject gmodule gthread gio
+  do
+      case "$module" in
+         gmodule)
+             pkg_config_args="$pkg_config_args gmodule-2.0"
+         ;;
+         gmodule-no-export)
+             pkg_config_args="$pkg_config_args gmodule-no-export-2.0"
+         ;;
+         gobject)
+             pkg_config_args="$pkg_config_args gobject-2.0"
+         ;;
+         gthread)
+             pkg_config_args="$pkg_config_args gthread-2.0"
+         ;;
+         gio*)
+             pkg_config_args="$pkg_config_args $module-2.0"
+         ;;
+      esac
+  done
+
+
+
+
+
+
+
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+	if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PKG_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
+$as_echo "$PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+  ac_pt_PKG_CONFIG=$PKG_CONFIG
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $ac_pt_PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
+$as_echo "$ac_pt_PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_pt_PKG_CONFIG" = x; then
+    PKG_CONFIG=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    PKG_CONFIG=$ac_pt_PKG_CONFIG
+  fi
+else
+  PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+fi
+if test -n "$PKG_CONFIG"; then
+	_pkg_min_version=0.16
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
+$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
+	if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	else
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+		PKG_CONFIG=""
+	fi
+fi
+
+  no_glib=""
+
+  if test "x$PKG_CONFIG" = x ; then
+    no_glib=yes
+    PKG_CONFIG=no
+  fi
+
+  min_glib_version=2.32.0
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLIB - version >= $min_glib_version" >&5
+$as_echo_n "checking for GLIB - version >= $min_glib_version... " >&6; }
+
+  if test x$PKG_CONFIG != xno ; then
+    ## don't try to run the test against uninstalled libtool libs
+    if $PKG_CONFIG --uninstalled $pkg_config_args; then
+	  echo "Will use uninstalled version of GLib found in PKG_CONFIG_PATH"
+	  enable_glibtest=no
+    fi
+
+    if $PKG_CONFIG --atleast-version $min_glib_version $pkg_config_args; then
+	  :
+    else
+	  no_glib=yes
+    fi
+  fi
+
+  if test x"$no_glib" = x ; then
+    GLIB_GENMARSHAL=`$PKG_CONFIG --variable=glib_genmarshal glib-2.0`
+    GOBJECT_QUERY=`$PKG_CONFIG --variable=gobject_query glib-2.0`
+    GLIB_MKENUMS=`$PKG_CONFIG --variable=glib_mkenums glib-2.0`
+    GLIB_COMPILE_RESOURCES=`$PKG_CONFIG --variable=glib_compile_resources gio-2.0`
+
+    GLIB_CFLAGS=`$PKG_CONFIG --cflags $pkg_config_args`
+    GLIB_LIBS=`$PKG_CONFIG --libs $pkg_config_args`
+    glib_config_major_version=`$PKG_CONFIG --modversion glib-2.0 | \
+           sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'`
+    glib_config_minor_version=`$PKG_CONFIG --modversion glib-2.0 | \
+           sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'`
+    glib_config_micro_version=`$PKG_CONFIG --modversion glib-2.0 | \
+           sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'`
+    if test "x$enable_glibtest" = "xyes" ; then
+      ac_save_CFLAGS="$CFLAGS"
+      ac_save_LIBS="$LIBS"
+      CFLAGS="$CFLAGS $GLIB_CFLAGS"
+      LIBS="$GLIB_LIBS $LIBS"
+      rm -f conf.glibtest
+      if test "$cross_compiling" = yes; then :
+  echo $ac_n "cross compiling; assumed OK... $ac_c"
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include 
+#include 
+#include 
+
+int
+main ()
+{
+  unsigned int major, minor, micro;
+
+  fclose (fopen ("conf.glibtest", "w"));
+
+  if (sscanf("$min_glib_version", "%u.%u.%u", &major, &minor, µ) != 3) {
+     printf("%s, bad version string\n", "$min_glib_version");
+     exit(1);
+   }
+
+  if ((glib_major_version != $glib_config_major_version) ||
+      (glib_minor_version != $glib_config_minor_version) ||
+      (glib_micro_version != $glib_config_micro_version))
+    {
+      printf("\n*** 'pkg-config --modversion glib-2.0' returned %d.%d.%d, but GLIB (%d.%d.%d)\n",
+             $glib_config_major_version, $glib_config_minor_version, $glib_config_micro_version,
+             glib_major_version, glib_minor_version, glib_micro_version);
+      printf ("*** was found! If pkg-config was correct, then it is best\n");
+      printf ("*** to remove the old version of GLib. You may also be able to fix the error\n");
+      printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
+      printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
+      printf("*** required on your system.\n");
+      printf("*** If pkg-config was wrong, set the environment variable PKG_CONFIG_PATH\n");
+      printf("*** to point to the correct configuration files\n");
+    }
+  else if ((glib_major_version != GLIB_MAJOR_VERSION) ||
+	   (glib_minor_version != GLIB_MINOR_VERSION) ||
+           (glib_micro_version != GLIB_MICRO_VERSION))
+    {
+      printf("*** GLIB header files (version %d.%d.%d) do not match\n",
+	     GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION);
+      printf("*** library (version %d.%d.%d)\n",
+	     glib_major_version, glib_minor_version, glib_micro_version);
+    }
+  else
+    {
+      if ((glib_major_version > major) ||
+        ((glib_major_version == major) && (glib_minor_version > minor)) ||
+        ((glib_major_version == major) && (glib_minor_version == minor) && (glib_micro_version >= micro)))
+      {
+        return 0;
+       }
+     else
+      {
+        printf("\n*** An old version of GLIB (%u.%u.%u) was found.\n",
+               glib_major_version, glib_minor_version, glib_micro_version);
+        printf("*** You need a version of GLIB newer than %u.%u.%u. The latest version of\n",
+	       major, minor, micro);
+        printf("*** GLIB is always available from ftp://ftp.gtk.org.\n");
+        printf("***\n");
+        printf("*** If you have already installed a sufficiently new version, this error\n");
+        printf("*** probably means that the wrong copy of the pkg-config shell script is\n");
+        printf("*** being found. The easiest way to fix this is to remove the old version\n");
+        printf("*** of GLIB, but you can also set the PKG_CONFIG environment to point to the\n");
+        printf("*** correct copy of pkg-config. (In this case, you will have to\n");
+        printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
+        printf("*** so that the correct libraries are found at run-time))\n");
+      }
+    }
+  return 1;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+  no_glib=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+       CFLAGS="$ac_save_CFLAGS"
+       LIBS="$ac_save_LIBS"
+     fi
+  fi
+  if test "x$no_glib" = x ; then
+     { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (version $glib_config_major_version.$glib_config_minor_version.$glib_config_micro_version)" >&5
+$as_echo "yes (version $glib_config_major_version.$glib_config_minor_version.$glib_config_micro_version)" >&6; }
+     :
+  else
+     { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+     if test "$PKG_CONFIG" = "no" ; then
+       echo "*** A new enough version of pkg-config was not found."
+       echo "*** See http://www.freedesktop.org/software/pkgconfig/"
+     else
+       if test -f conf.glibtest ; then
+        :
+       else
+          echo "*** Could not run GLIB test program, checking why..."
+          ac_save_CFLAGS="$CFLAGS"
+          ac_save_LIBS="$LIBS"
+          CFLAGS="$CFLAGS $GLIB_CFLAGS"
+          LIBS="$LIBS $GLIB_LIBS"
+          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include 
+#include 
+
+int
+main ()
+{
+ return ((glib_major_version) || (glib_minor_version) || (glib_micro_version));
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+   echo "*** The test program compiled, but did not run. This usually means"
+          echo "*** that the run-time linker is not finding GLIB or finding the wrong"
+          echo "*** version of GLIB. If it is not finding GLIB, you'll need to set your"
+          echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+          echo "*** to the installed location  Also, make sure you have run ldconfig if that"
+          echo "*** is required on your system"
+	  echo "***"
+          echo "*** If you have an old version installed, it is best to remove it, although"
+          echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"
+else
+   echo "*** The test program failed to compile or link. See the file config.log for the"
+          echo "*** exact error that occured. This usually means GLIB is incorrectly installed."
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+          CFLAGS="$ac_save_CFLAGS"
+          LIBS="$ac_save_LIBS"
+       fi
+     fi
+     GLIB_CFLAGS=""
+     GLIB_LIBS=""
+     GLIB_GENMARSHAL=""
+     GOBJECT_QUERY=""
+     GLIB_MKENUMS=""
+     GLIB_COMPILE_RESOURCES=""
+     as_fn_error $? "Cannot find GLIB: Is pkg-config in your path?" "$LINENO" 5
+  fi
+
+
+
+
+
+
+  rm -f conf.glibtest
+
+
+CFLAGS_save="$CFLAGS"
+CFLAGS="$CFLAGS -I$srcdir"
+LIBS_save="$LIBS"
+LIBS="$LIBS $ICONV_LIBS"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking preferred charset formats for system iconv" >&5
+$as_echo_n "checking preferred charset formats for system iconv... " >&6; }
+if ${ac_cv_have_iconv_detect_h+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+	if test "$cross_compiling" = yes; then :
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: cannot run test program while cross compiling" >&5
+$as_echo "cannot run test program while cross compiling" >&6; }
+		as_fn_error $? "Copy target system's iconv-detect.h to . and configure with ac_cv_have_iconv_detect_h=yes" "$LINENO" 5
+
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+		#define CONFIGURE_IN
+		#include "iconv-detect.c"
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  ac_cv_have_iconv_detect_h=yes
+else
+  ac_cv_have_iconv_detect_h=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_iconv_detect_h" >&5
+$as_echo "$ac_cv_have_iconv_detect_h" >&6; }
+if test "x$ac_cv_have_iconv_detect_h" = xyes; then
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
+$as_echo "found" >&6; }
+
+$as_echo "#define HAVE_ICONV_DETECT_H 1" >>confdefs.h
+
+else
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found
+	*** The iconv-detect program was unable to determine the
+	*** preferred charset formats recognized by your system
+	*** iconv library. It is suggested that you install a
+	*** working iconv library such as the one found at
+	*** ftp://ftp.gnu.org/pub/gnu/libiconv
+	***
+	*** Default charset formats will be used.
+	" >&5
+$as_echo "not found
+	*** The iconv-detect program was unable to determine the
+	*** preferred charset formats recognized by your system
+	*** iconv library. It is suggested that you install a
+	*** working iconv library such as the one found at
+	*** ftp://ftp.gnu.org/pub/gnu/libiconv
+	***
+	*** Default charset formats will be used.
+	" >&6; }
+fi
+
+CFLAGS="$CFLAGS_save"
+LIBS="$LIBS_save"
+
+ac_fn_c_check_header_mongrel "$LINENO" "getopt.h" "ac_cv_header_getopt_h" "$ac_includes_default"
+if test "x$ac_cv_header_getopt_h" = xyes; then :
+
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU getopt_long" >&5
+$as_echo_n "checking for GNU getopt_long... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+	#include 
+	#include 
+	#define _GNU_SOURCE
+	#include 
+
+int
+main ()
+{
+
+	return getopt_long (0, NULL, NULL, NULL, NULL);
+
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_GETOPT_H 1" >>confdefs.h
+
+	have_getopt="yes"
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	have_getopt="no"
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ if test "x$have_getopt" = "xyes"; then
+  SYSTEM_GETOPT_TRUE=
+  SYSTEM_GETOPT_FALSE='#'
+else
+  SYSTEM_GETOPT_TRUE='#'
+  SYSTEM_GETOPT_FALSE=
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fsync" >&5
+$as_echo_n "checking for fsync... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+	#include 
+
+int
+main ()
+{
+
+	fsync(0);
+
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_FSYNC 1" >>confdefs.h
+
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for MAXHOSTNAMELEN" >&5
+$as_echo_n "checking for MAXHOSTNAMELEN... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+	#include 
+
+int
+main ()
+{
+
+	return MAXHOSTNAMELEN;
+
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+else
+
+$as_echo "#define MAXHOSTNAMELEN 64" >>confdefs.h
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no; defined as 64" >&5
+$as_echo "no; defined as 64" >&6; }
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for domainname in struct utsname" >&5
+$as_echo_n "checking for domainname in struct utsname... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+	#define _GNU_SOURCE
+	#include 
+
+int
+main ()
+{
+
+	struct utsname unam;
+
+	unam.domainname[0] = '\0';
+
+	return unam.domainname[0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_UTSNAME_DOMAINNAME 1" >>confdefs.h
+
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+# Check whether --enable-largefile was given.
+if test "${enable_largefile+set}" = set; then :
+  enableval=$enable_largefile;
+else
+  enable_largefile="yes"
+fi
+
+if test "x$enable_largefile" != "xno"; then
+    # Check whether --enable-largefile was given.
+if test "${enable_largefile+set}" = set; then :
+  enableval=$enable_largefile;
+fi
+
+if test "$enable_largefile" != no; then
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5
+$as_echo_n "checking for special C compiler options needed for large files... " >&6; }
+if ${ac_cv_sys_largefile_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_sys_largefile_CC=no
+     if test "$GCC" != yes; then
+       ac_save_CC=$CC
+       while :; do
+	 # IRIX 6.2 and later do not support large files by default,
+	 # so use the C compiler's -n32 option if that helps.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include 
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+	 if ac_fn_c_try_compile "$LINENO"; then :
+  break
+fi
+rm -f core conftest.err conftest.$ac_objext
+	 CC="$CC -n32"
+	 if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_largefile_CC=' -n32'; break
+fi
+rm -f core conftest.err conftest.$ac_objext
+	 break
+       done
+       CC=$ac_save_CC
+       rm -f conftest.$ac_ext
+    fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5
+$as_echo "$ac_cv_sys_largefile_CC" >&6; }
+  if test "$ac_cv_sys_largefile_CC" != no; then
+    CC=$CC$ac_cv_sys_largefile_CC
+  fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
+if ${ac_cv_sys_file_offset_bits+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  while :; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include 
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_file_offset_bits=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define _FILE_OFFSET_BITS 64
+#include 
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_file_offset_bits=64; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_cv_sys_file_offset_bits=unknown
+  break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5
+$as_echo "$ac_cv_sys_file_offset_bits" >&6; }
+case $ac_cv_sys_file_offset_bits in #(
+  no | unknown) ;;
+  *)
+cat >>confdefs.h <<_ACEOF
+#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
+_ACEOF
+;;
+esac
+rm -rf conftest*
+  if test $ac_cv_sys_file_offset_bits = unknown; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5
+$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; }
+if ${ac_cv_sys_large_files+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  while :; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include 
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_large_files=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define _LARGE_FILES 1
+#include 
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_large_files=1; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_cv_sys_large_files=unknown
+  break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5
+$as_echo "$ac_cv_sys_large_files" >&6; }
+case $ac_cv_sys_large_files in #(
+  no | unknown) ;;
+  *)
+cat >>confdefs.h <<_ACEOF
+#define _LARGE_FILES $ac_cv_sys_large_files
+_ACEOF
+;;
+esac
+rm -rf conftest*
+  fi
+
+
+fi
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE64_SOURCE value needed for large files" >&5
+$as_echo_n "checking for _LARGEFILE64_SOURCE value needed for large files... " >&6; }
+if ${ac_cv_largefile64_source+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+		#include 
+		#include 
+		#include 
+
+int
+main ()
+{
+
+		return open ("__o_largefile", O_CREAT | O_RDWR | O_LARGEFILE, 0644);
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+		ac_cv_largefile64_source="no"
+
+else
+
+		cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+			#define _LARGEFILE64_SOURCE
+			#include 
+			#include 
+			#include 
+
+int
+main ()
+{
+
+			return open ("__o_largefile", O_CREAT | O_RDWR | O_LARGEFILE, 0644);
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+			ac_cv_largefile64_source="yes"
+
+else
+
+			ac_cv_largefile64_source="unknown"
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_largefile64_source" >&5
+$as_echo "$ac_cv_largefile64_source" >&6; }
+
+    enable_largefile="no"
+
+    if test "x$ac_cv_largefile64_source" = "xyes"; then
+        LFS_CFLAGS="-D_LARGEFILE64_SOURCE"
+        enable_largefile="yes"
+    elif test "x$ac_cv_largefile64_source" = "xunknown"; then
+
+$as_echo "#define O_LARGEFILE 0" >>confdefs.h
+
+    fi
+
+    if test -n "$ac_cv_sys_large_files" -a "x$ac_cv_sys_large_files" != "xno"; then
+        LFS_CFLAGS="$LFS_CFLAGS -D_LARGE_FILES"
+        enable_largefile="yes"
+    fi
+
+    if test "x$ac_cv_sys_file_offset_bits" != "xno"; then
+        LFS_CFLAGS="$LFS_CFLAGS -D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits"
+        enable_largefile="yes"
+    fi
+else
+    LFS_CFLAGS=""
+fi
+ if test "x$enable_largefile" = "xyes"; then
+  ENABLE_LARGEFILE_TRUE=
+  ENABLE_LARGEFILE_FALSE='#'
+else
+  ENABLE_LARGEFILE_TRUE='#'
+  ENABLE_LARGEFILE_FALSE=
+fi
+
+
+CFLAGS_save="$CFLAGS"
+CFLAGS="$CFLAGS $LFS_CFLAGS"
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of ssize_t" >&5
+$as_echo_n "checking size of ssize_t... " >&6; }
+if ${ac_cv_sizeof_ssize_t+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (ssize_t))" "ac_cv_sizeof_ssize_t"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_ssize_t" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (ssize_t)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_ssize_t=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_ssize_t" >&5
+$as_echo "$ac_cv_sizeof_ssize_t" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_SSIZE_T $ac_cv_sizeof_ssize_t
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of size_t" >&5
+$as_echo_n "checking size of size_t... " >&6; }
+if ${ac_cv_sizeof_size_t+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (size_t))" "ac_cv_sizeof_size_t"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_size_t" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (size_t)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_size_t=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_size_t" >&5
+$as_echo "$ac_cv_sizeof_size_t" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_SIZE_T $ac_cv_sizeof_size_t
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of off_t" >&5
+$as_echo_n "checking size of off_t... " >&6; }
+if ${ac_cv_sizeof_off_t+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (off_t))" "ac_cv_sizeof_off_t"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_off_t" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (off_t)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_off_t=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_off_t" >&5
+$as_echo "$ac_cv_sizeof_off_t" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_OFF_T $ac_cv_sizeof_off_t
+_ACEOF
+
+
+CFLAGS="$CFLAGS_save"
+
+for ac_func in gethostname getdomainname getaddrinfo
+do :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+LIBSOCKET=""
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for getaddrinfo in -lsocket" >&5
+$as_echo_n "checking for getaddrinfo in -lsocket... " >&6; }
+if ${ac_cv_lib_socket_getaddrinfo+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsocket  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char getaddrinfo ();
+int
+main ()
+{
+return getaddrinfo ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_socket_getaddrinfo=yes
+else
+  ac_cv_lib_socket_getaddrinfo=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_getaddrinfo" >&5
+$as_echo "$ac_cv_lib_socket_getaddrinfo" >&6; }
+if test "x$ac_cv_lib_socket_getaddrinfo" = xyes; then :
+  LIBSOCKET="-lsocket"
+fi
+
+
+LIBNSL=""
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for getaddrinfo in -lnsl" >&5
+$as_echo_n "checking for getaddrinfo in -lnsl... " >&6; }
+if ${ac_cv_lib_nsl_getaddrinfo+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnsl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char getaddrinfo ();
+int
+main ()
+{
+return getaddrinfo ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_nsl_getaddrinfo=yes
+else
+  ac_cv_lib_nsl_getaddrinfo=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_getaddrinfo" >&5
+$as_echo "$ac_cv_lib_nsl_getaddrinfo" >&6; }
+if test "x$ac_cv_lib_nsl_getaddrinfo" = xyes; then :
+  LIBNSL="-lnsl"
+fi
+
+
+# Check whether --enable-crypto was given.
+if test "${enable_crypto+set}" = set; then :
+  enableval=$enable_crypto;
+else
+  enable_crypto="yes"
+fi
+
+
+
+
+# Check whether --with-gpgme-prefix was given.
+if test "${with_gpgme_prefix+set}" = set; then :
+  withval=$with_gpgme_prefix; gpgme_config_prefix="$withval"
+else
+  gpgme_config_prefix=""
+fi
+
+  if test x"${GPGME_CONFIG}" = x ; then
+     if test x"${gpgme_config_prefix}" != x ; then
+        GPGME_CONFIG="${gpgme_config_prefix}/bin/gpgme-config"
+     else
+       case "${SYSROOT}" in
+         /*)
+           if test -x "${SYSROOT}/bin/gpgme-config" ; then
+             GPGME_CONFIG="${SYSROOT}/bin/gpgme-config"
+           fi
+           ;;
+         '')
+           ;;
+          *)
+           { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring \$SYSROOT as it is not an absolute path." >&5
+$as_echo "$as_me: WARNING: Ignoring \$SYSROOT as it is not an absolute path." >&2;}
+           ;;
+       esac
+     fi
+  fi
+
+  # Extract the first word of "gpgme-config", so it can be a program name with args.
+set dummy gpgme-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_GPGME_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $GPGME_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GPGME_CONFIG="$GPGME_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_GPGME_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_GPGME_CONFIG" && ac_cv_path_GPGME_CONFIG="no"
+  ;;
+esac
+fi
+GPGME_CONFIG=$ac_cv_path_GPGME_CONFIG
+if test -n "$GPGME_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GPGME_CONFIG" >&5
+$as_echo "$GPGME_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+  if test "$GPGME_CONFIG" != "no" ; then
+    gpgme_version=`$GPGME_CONFIG --version`
+  fi
+  gpgme_version_major=`echo $gpgme_version | \
+               sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1/'`
+  gpgme_version_minor=`echo $gpgme_version | \
+               sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\2/'`
+  gpgme_version_micro=`echo $gpgme_version | \
+               sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\3/'`
+
+if test "x$enable_crypto" = "xyes"; then :
+
+      tmp=1.2.0
+  if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then
+     req_gpgme_api=`echo "$tmp"     | sed 's/\(.*\):\(.*\)/\1/'`
+     min_gpgme_version=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\2/'`
+  else
+     req_gpgme_api=0
+     min_gpgme_version="$tmp"
+  fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GPGME pthread - version >= $min_gpgme_version" >&5
+$as_echo_n "checking for GPGME pthread - version >= $min_gpgme_version... " >&6; }
+  ok=no
+  if test "$GPGME_CONFIG" != "no" ; then
+    if `$GPGME_CONFIG --thread=pthread 2> /dev/null` ; then
+      req_major=`echo $min_gpgme_version | \
+               sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1/'`
+      req_minor=`echo $min_gpgme_version | \
+               sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\2/'`
+      req_micro=`echo $min_gpgme_version | \
+               sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\3/'`
+      if test "$gpgme_version_major" -gt "$req_major"; then
+        ok=yes
+      else
+        if test "$gpgme_version_major" -eq "$req_major"; then
+          if test "$gpgme_version_minor" -gt "$req_minor"; then
+            ok=yes
+          else
+            if test "$gpgme_version_minor" -eq "$req_minor"; then
+              if test "$gpgme_version_micro" -ge "$req_micro"; then
+                ok=yes
+              fi
+            fi
+          fi
+        fi
+      fi
+    fi
+  fi
+  if test $ok = yes; then
+     # If we have a recent GPGME, we should also check that the
+     # API is compatible.
+     if test "$req_gpgme_api" -gt 0 ; then
+        tmp=`$GPGME_CONFIG --api-version 2>/dev/null || echo 0`
+        if test "$tmp" -gt 0 ; then
+           if test "$req_gpgme_api" -ne "$tmp" ; then
+             ok=no
+           fi
+        fi
+     fi
+  fi
+  if test $ok = yes; then
+    GPGME_PTHREAD_CFLAGS=`$GPGME_CONFIG --thread=pthread --cflags`
+    GPGME_PTHREAD_LIBS=`$GPGME_CONFIG --thread=pthread --libs`
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    enable_crypto="yes (via GpgME)"
+
+    gpgme_config_host=`$GPGME_CONFIG --host 2>/dev/null || echo none`
+    if test x"$gpgme_config_host" != xnone ; then
+      if test x"$gpgme_config_host" != x"$host" ; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING:
+***
+*** The config script $GPGME_CONFIG was
+*** built for $gpgme_config_host and thus may not match the
+*** used host $host.
+*** You may want to use the configure option --with-gpgme-prefix
+*** to specify a matching config script or use \$SYSROOT.
+***" >&5
+$as_echo "$as_me: WARNING:
+***
+*** The config script $GPGME_CONFIG was
+*** built for $gpgme_config_host and thus may not match the
+*** used host $host.
+*** You may want to use the configure option --with-gpgme-prefix
+*** to specify a matching config script or use \$SYSROOT.
+***" >&2;}
+        gpg_config_script_warn="$gpg_config_script_warn gpgme"
+      fi
+    fi
+
+  else
+    GPGME_PTHREAD_CFLAGS=""
+    GPGME_PTHREAD_LIBS=""
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    enable_crypto="no"
+  fi
+
+
+
+   if test "x$enable_crypto" != "xno"; then
+
+$as_echo "#define ENABLE_CRYPTO 1" >>confdefs.h
+
+   fi
+
+fi
+
+ if test "x$enable_crypto" != "xno"; then
+  ENABLE_CRYPTO_TRUE=
+  ENABLE_CRYPTO_FALSE='#'
+else
+  ENABLE_CRYPTO_TRUE='#'
+  ENABLE_CRYPTO_FALSE=
+fi
+
+
+
+# Check whether --with-libidn was given.
+if test "${with_libidn+set}" = set; then :
+  withval=$with_libidn; libidn=$withval
+else
+  libidn=yes
+fi
+
+if test "$libidn" != "no" ; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBIDN" >&5
+$as_echo_n "checking for LIBIDN... " >&6; }
+
+if test -n "$LIBIDN_CFLAGS"; then
+    pkg_cv_LIBIDN_CFLAGS="$LIBIDN_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libidn >= 0.0.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "libidn >= 0.0.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_LIBIDN_CFLAGS=`$PKG_CONFIG --cflags "libidn >= 0.0.0" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$LIBIDN_LIBS"; then
+    pkg_cv_LIBIDN_LIBS="$LIBIDN_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libidn >= 0.0.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "libidn >= 0.0.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_LIBIDN_LIBS=`$PKG_CONFIG --libs "libidn >= 0.0.0" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+   	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        LIBIDN_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libidn >= 0.0.0" 2>&1`
+        else
+	        LIBIDN_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libidn >= 0.0.0" 2>&1`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$LIBIDN_PKG_ERRORS" >&5
+
+	libidn=no
+elif test $pkg_failed = untried; then
+     	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	libidn=no
+else
+	LIBIDN_CFLAGS=$pkg_cv_LIBIDN_CFLAGS
+	LIBIDN_LIBS=$pkg_cv_LIBIDN_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	libidn=yes
+fi
+  if test "$libidn" != "yes" ; then
+    libidn=no
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libidn not found" >&5
+$as_echo "$as_me: WARNING: Libidn not found" >&2;}
+  else
+    libidn=yes
+
+$as_echo "#define LIBIDN 1" >>confdefs.h
+
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if Libidn should be used" >&5
+$as_echo_n "checking if Libidn should be used... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libidn" >&5
+$as_echo "$libidn" >&6; }
+
+
+
+
+                # Check whether --enable-introspection was given.
+if test "${enable_introspection+set}" = set; then :
+  enableval=$enable_introspection;
+else
+  enable_introspection=auto
+fi
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gobject-introspection" >&5
+$as_echo_n "checking for gobject-introspection... " >&6; }
+
+        case $enable_introspection in #(
+  no) :
+            found_introspection="no (disabled, use --enable-introspection to enable)"
+     ;; #(
+      yes) :
+            if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  :
+else
+  as_fn_error $? "gobject-introspection-1.0 is not installed" "$LINENO" 5
+fi
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0 >= 1.30.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0 >= 1.30.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  found_introspection=yes
+else
+  as_fn_error $? "You need to have gobject-introspection >= 1.30.0 installed to build gmime" "$LINENO" 5
+fi
+     ;; #(
+      auto) :
+            if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0 >= 1.30.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0 >= 1.30.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  found_introspection=yes
+else
+  found_introspection=no
+fi
+		enable_introspection=$found_introspection
+     ;; #(
+  *) :
+                as_fn_error $? "invalid argument passed to --enable-introspection, should be one of [no/auto/yes]" "$LINENO" 5
+     ;;
+esac
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $found_introspection" >&5
+$as_echo "$found_introspection" >&6; }
+
+    INTROSPECTION_SCANNER=
+    INTROSPECTION_COMPILER=
+    INTROSPECTION_GENERATE=
+    INTROSPECTION_GIRDIR=
+    INTROSPECTION_TYPELIBDIR=
+    if test "x$found_introspection" = "xyes"; then
+       INTROSPECTION_SCANNER=`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0`
+       INTROSPECTION_COMPILER=`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0`
+       INTROSPECTION_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0`
+       INTROSPECTION_GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0`
+       INTROSPECTION_TYPELIBDIR="$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)"
+       INTROSPECTION_CFLAGS=`$PKG_CONFIG --cflags gobject-introspection-1.0`
+       INTROSPECTION_LIBS=`$PKG_CONFIG --libs gobject-introspection-1.0`
+       INTROSPECTION_MAKEFILE=`$PKG_CONFIG --variable=datadir gobject-introspection-1.0`/gobject-introspection-1.0/Makefile.introspection
+    fi
+
+
+
+
+
+
+
+
+
+     if test "x$found_introspection" = "xyes"; then
+  HAVE_INTROSPECTION_TRUE=
+  HAVE_INTROSPECTION_FALSE='#'
+else
+  HAVE_INTROSPECTION_TRUE='#'
+  HAVE_INTROSPECTION_FALSE=
+fi
+
+
+
+
+  if test "x" != "xyes"; then :
+
+
+
+fi
+
+  # Check whether --enable-vala was given.
+if test "${enable_vala+set}" = set; then :
+  enableval=$enable_vala;
+else
+
+      if test "x" = "x"; then :
+
+          enable_vala=auto
+
+else
+
+          enable_vala=
+
+fi
+
+fi
+
+
+  case $enable_vala in #(
+  no) :
+    enable_vala=no ;; #(
+  yes) :
+
+        if test "x" != "xyes" -a "x$found_introspection" != "xyes"; then :
+
+            as_fn_error $? "Vala bindings require GObject Introspection" "$LINENO" 5
+
+fi
+       ;; #(
+  auto) :
+
+        if test "x" != "xyes" -a "x$found_introspection" != "xyes"; then :
+
+            enable_vala=no
+
+fi
+       ;; #(
+  *) :
+
+        as_fn_error $? "Invalid argument passed to --enable-vala, should be one of [no/auto/yes]" "$LINENO" 5
+       ;;
+esac
+
+  if test "x" = "x"; then :
+
+      vapigen_pkg_name=vapigen
+
+else
+
+      vapigen_pkg_name=vapigen-
+
+fi
+  if test "x" = "x"; then :
+
+      vapigen_pkg="$vapigen_pkg_name"
+
+else
+
+      vapigen_pkg="$vapigen_pkg_name >= "
+
+fi
+
+
+
+
+
+
+
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+	if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PKG_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
+$as_echo "$PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+  ac_pt_PKG_CONFIG=$PKG_CONFIG
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $ac_pt_PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
+$as_echo "$ac_pt_PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_pt_PKG_CONFIG" = x; then
+    PKG_CONFIG=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    PKG_CONFIG=$ac_pt_PKG_CONFIG
+  fi
+else
+  PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+fi
+if test -n "$PKG_CONFIG"; then
+	_pkg_min_version=0.9.0
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
+$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
+	if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	else
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+		PKG_CONFIG=""
+	fi
+fi
+
+  if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$vapigen_pkg\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "$vapigen_pkg") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+
+      if test "$enable_vala" = "auto"; then :
+
+          enable_vala=yes
+
+fi
+
+else
+
+      case $enable_vala in #(
+  yes) :
+
+          as_fn_error $? "$vapigen_pkg not found" "$LINENO" 5
+         ;; #(
+  auto) :
+
+          enable_vala=no
+         ;; #(
+  *) :
+     ;;
+esac
+
+fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for vapigen" >&5
+$as_echo_n "checking for vapigen... " >&6; }
+
+  case $enable_vala in #(
+  yes) :
+
+      VAPIGEN=`$PKG_CONFIG --variable=vapigen $vapigen_pkg_name`
+      VAPIGEN_MAKEFILE=`$PKG_CONFIG --variable=datadir $vapigen_pkg_name`/vala/Makefile.vapigen
+      if test "x" = "x"; then :
+
+          VAPIGEN_VAPIDIR=`$PKG_CONFIG --variable=vapidir $vapigen_pkg_name`
+
+else
+
+          VAPIGEN_VAPIDIR=`$PKG_CONFIG --variable=vapidir_versioned $vapigen_pkg_name`
+
+fi
+     ;; #(
+  *) :
+     ;;
+esac
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_vala" >&5
+$as_echo "$enable_vala" >&6; }
+
+
+
+
+
+   if test "x$enable_vala" = "xyes"; then
+  ENABLE_VAPIGEN_TRUE=
+  ENABLE_VAPIGEN_FALSE='#'
+else
+  ENABLE_VAPIGEN_TRUE='#'
+  ENABLE_VAPIGEN_FALSE=
+fi
+
+
+
+
+# Check whether --enable-coverage was given.
+if test "${enable_coverage+set}" = set; then :
+  enableval=$enable_coverage; enable_coverage=$enableval
+else
+  enable_coverage=no
+fi
+
+
+if  test "x$enable_coverage" = "xyes"; then :
+
+    if test "$GCC" != "yes"; then
+    as_fn_error $? "GCC is required for --enable-coverage" "$LINENO" 5
+  fi
+
+    # Extract the first word of "shtool", so it can be a program name with args.
+set dummy shtool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_SHTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$SHTOOL"; then
+  ac_cv_prog_SHTOOL="$SHTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_SHTOOL="shtool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+SHTOOL=$ac_cv_prog_SHTOOL
+if test -n "$SHTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SHTOOL" >&5
+$as_echo "$SHTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  case `$SHTOOL path $CC` in
+    *ccache*) gcc_ccache=yes;;
+    *) gcc_ccache=no;;
+  esac
+
+  if test "$gcc_ccache" = "yes" && (test -z "$CCACHE_DISABLE" || test "$CCACHE_DISABLE" != "1"); then
+    as_fn_error $? "ccache must be disabled when --enable-coverage option is used. You can disable ccache by setting environment variable CCACHE_DISABLE=1." "$LINENO" 5
+  fi
+
+  ltp_version_list="1.6 1.7 1.8 1.9 1.10 1.11 1.12 1.13"
+  # Extract the first word of "lcov", so it can be a program name with args.
+set dummy lcov; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_LTP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$LTP"; then
+  ac_cv_prog_LTP="$LTP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_LTP="lcov"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+LTP=$ac_cv_prog_LTP
+if test -n "$LTP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LTP" >&5
+$as_echo "$LTP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  # Extract the first word of "genhtml", so it can be a program name with args.
+set dummy genhtml; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_LTP_GENHTML+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$LTP_GENHTML"; then
+  ac_cv_prog_LTP_GENHTML="$LTP_GENHTML" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_LTP_GENHTML="genhtml"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+LTP_GENHTML=$ac_cv_prog_LTP_GENHTML
+if test -n "$LTP_GENHTML"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LTP_GENHTML" >&5
+$as_echo "$LTP_GENHTML" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+  if  test "$LTP" ; then :
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ltp version" >&5
+$as_echo_n "checking for ltp version... " >&6; }
+if ${glib_cv_ltp_version+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+      glib_cv_ltp_version=invalid
+      ltp_version=`$LTP -v 2>/dev/null | $SED -e 's/^.* //'`
+      for ltp_check_version in $ltp_version_list; do
+        if test "$ltp_version" = "$ltp_check_version"; then
+          glib_cv_ltp_version="$ltp_check_version (ok)"
+        fi
+      done
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_ltp_version" >&5
+$as_echo "$glib_cv_ltp_version" >&6; }
+
+else
+
+    ltp_msg="To enable code coverage reporting you must have one of the following LTP versions installed: $ltp_version_list"
+    as_fn_error $? "$ltp_msg" "$LINENO" 5
+
+fi
+
+  case $glib_cv_ltp_version in
+    ""|invalid)
+      ltp_msg="You must have one of the following versions of LTP: $ltp_version_list (found: $ltp_version)."
+      as_fn_error $? "$ltp_msg" "$LINENO" 5
+      LTP="exit 0;"
+      ;;
+  esac
+
+  if test -z "$LTP_GENHTML"; then
+    as_fn_error $? "Could not find genhtml from the LTP package" "$LINENO" 5
+  fi
+
+
+  CFLAGS=`echo "$CFLAGS" | $SED -e 's/-O[0-9]*//g'`
+
+
+    CFLAGS="$CFLAGS -O0 -fprofile-arcs -ftest-coverage"
+  LDFLAGS="$LDFLAGS -lgcov"
+
+fi
+
+EXTRA_LIBS="$ZLIB_LIBS"
+if test "x$LIBSOCKET" != "x"; then
+	EXTRA_LIBS="$EXTRA_LIBS $LIBSOCKET"
+fi
+if test "x$LIBNSL" != "x"; then
+	EXTRA_LIBS="$EXTRA_LIBS $LIBNSL"
+fi
+if test "x$ICONV_LIBS" != "x"; then
+	EXTRA_LIBS="$EXTRA_LIBS $ICONV_LIBS"
+fi
+if test "x$GPGME_PTHREAD_LIBS" != "x"; then
+	EXTRA_LIBS="$EXTRA_LIBS $GPGME_PTHREAD_LIBS"
+fi
+if test "x$LIBIDN_LIBS" != "x"; then
+   	EXTRA_LIBS="$EXTRA_LIBS $LIBIDN_LIBS"
+fi
+
+CFLAGS="$CFLAGS -fno-strict-aliasing"
+LIBS="$LIBS $EXTRA_LIBS"
+
+
+
+
+GMIME_CFLAGS="$LFS_CFLAGS $GPGME_PTHREAD_CFLAGS $LIBIDN_CFLAGS"
+GMIME_LIBDIR="-L${libdir}"
+GMIME_INCLUDEDIR="-I${includedir}/gmime-$GMIME_API_VERSION"
+GMIME_LIBS_PRIVATE="$EXTRA_LIBS"
+GMIME_LIBS="-lgmime-$GMIME_API_VERSION"
+
+
+
+
+
+
+
+ac_config_files="$ac_config_files Makefile m4/Makefile build/Makefile build/vs2008/Makefile build/vs2008/config-win32.h build/vs2010/Makefile build/vs2010/config-win32.h docs/Makefile docs/reference/Makefile docs/tutorial/Makefile examples/Makefile util/Makefile gmime/Makefile gmime/gmime-version.h tests/Makefile tools/Makefile gmime.spec gmime.pc"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes: double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \.
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    if test "x$cache_file" != "x/dev/null"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+      if test ! -f "$cache_file" || test -h "$cache_file"; then
+	cat confcache >"$cache_file"
+      else
+        case $cache_file in #(
+        */* | ?:*)
+	  mv -f confcache "$cache_file"$$ &&
+	  mv -f "$cache_file"$$ "$cache_file" ;; #(
+        *)
+	  mv -f confcache "$cache_file" ;;
+	esac
+      fi
+    fi
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
+$as_echo_n "checking that generated files are newer than configure... " >&6; }
+   if test -n "$am_sleep_pid"; then
+     # Hide warnings about reused PIDs.
+     wait $am_sleep_pid 2>/dev/null
+   fi
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5
+$as_echo "done" >&6; }
+ if test -n "$EXEEXT"; then
+  am__EXEEXT_TRUE=
+  am__EXEEXT_FALSE='#'
+else
+  am__EXEEXT_TRUE='#'
+  am__EXEEXT_FALSE=
+fi
+
+if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
+  as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${PLATFORM_WIN32_TRUE}" && test -z "${PLATFORM_WIN32_FALSE}"; then
+  as_fn_error $? "conditional \"PLATFORM_WIN32\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${OS_WIN32_TRUE}" && test -z "${OS_WIN32_FALSE}"; then
+  as_fn_error $? "conditional \"OS_WIN32\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${OS_WIN32_X64_TRUE}" && test -z "${OS_WIN32_X64_FALSE}"; then
+  as_fn_error $? "conditional \"OS_WIN32_X64\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${MS_LIB_AVAILABLE_TRUE}" && test -z "${MS_LIB_AVAILABLE_FALSE}"; then
+  as_fn_error $? "conditional \"MS_LIB_AVAILABLE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_GTK_DOC_TRUE}" && test -z "${HAVE_GTK_DOC_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_GTK_DOC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_GTK_DOC_TRUE}" && test -z "${ENABLE_GTK_DOC_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_GTK_DOC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GTK_DOC_BUILD_HTML_TRUE}" && test -z "${GTK_DOC_BUILD_HTML_FALSE}"; then
+  as_fn_error $? "conditional \"GTK_DOC_BUILD_HTML\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GTK_DOC_BUILD_PDF_TRUE}" && test -z "${GTK_DOC_BUILD_PDF_FALSE}"; then
+  as_fn_error $? "conditional \"GTK_DOC_BUILD_PDF\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GTK_DOC_USE_LIBTOOL_TRUE}" && test -z "${GTK_DOC_USE_LIBTOOL_FALSE}"; then
+  as_fn_error $? "conditional \"GTK_DOC_USE_LIBTOOL\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GTK_DOC_USE_REBASE_TRUE}" && test -z "${GTK_DOC_USE_REBASE_FALSE}"; then
+  as_fn_error $? "conditional \"GTK_DOC_USE_REBASE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_DOCBOOK_TRUE}" && test -z "${HAVE_DOCBOOK_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_DOCBOOK\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_GTK_DOC_TRUE}" && test -z "${ENABLE_GTK_DOC_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_GTK_DOC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${SYSTEM_GETOPT_TRUE}" && test -z "${SYSTEM_GETOPT_FALSE}"; then
+  as_fn_error $? "conditional \"SYSTEM_GETOPT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_LARGEFILE_TRUE}" && test -z "${ENABLE_LARGEFILE_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_LARGEFILE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_CRYPTO_TRUE}" && test -z "${ENABLE_CRYPTO_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_CRYPTO\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_INTROSPECTION_TRUE}" && test -z "${HAVE_INTROSPECTION_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_INTROSPECTION\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_VAPIGEN_TRUE}" && test -z "${ENABLE_VAPIGEN_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_VAPIGEN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -pR'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -pR'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -pR'
+  fi
+else
+  as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by gmime $as_me 3.0.1, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration.  Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+      --config     print configuration, then exit
+  -q, --quiet, --silent
+                   do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+      --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+      --header=FILE[:TEMPLATE]
+                   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to ."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+gmime config.status 3.0.1
+configured by $0, generated by GNU Autoconf 2.69,
+  with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=?*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  --*=)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    $as_echo "$ac_cs_version"; exit ;;
+  --config | --confi | --conf | --con | --co | --c )
+    $as_echo "$ac_cs_config"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    '') as_fn_error $? "missing file argument" ;;
+    esac
+    as_fn_append CONFIG_FILES " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+  --help | --hel | -h )
+    $as_echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+  *) as_fn_append ac_config_targets " $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+  set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  shift
+  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  CONFIG_SHELL='$SHELL'
+  export CONFIG_SHELL
+  exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`'
+SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
+ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
+host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
+host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
+host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
+build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
+build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
+build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
+SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
+Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
+GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
+EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
+FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
+LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
+NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
+LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
+exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
+file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
+want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
+DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
+sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
+AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
+archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
+STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
+lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
+CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
+compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
+GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`'
+nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
+lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`'
+objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
+need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
+MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
+LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
+libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
+postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
+need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
+version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
+install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
+configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`'
+configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
+striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in SHELL \
+ECHO \
+PATH_SEPARATOR \
+SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+OBJDUMP \
+deplibs_check_method \
+file_magic_cmd \
+file_magic_glob \
+want_nocaseglob \
+DLLTOOL \
+sharedlib_from_linklib_cmd \
+AR \
+AR_FLAGS \
+archiver_list_spec \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_import \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+lt_cv_nm_interface \
+nm_file_list_spec \
+lt_cv_truncate_bin \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_pic \
+lt_prog_compiler_wl \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+MANIFEST_TOOL \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_separator \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+install_override_mode \
+finish_eval \
+old_striplib \
+striplib; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postlink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+configure_time_dlsearch_path \
+configure_time_lt_sys_library_path; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+ac_aux_dir='$ac_aux_dir'
+
+# See if we are running on zsh, and set the options that allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}"; then
+   setopt NO_GLOB_SUBST
+fi
+
+
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    RM='$RM'
+    ofile='$ofile'
+
+ac_aux_dir='$ac_aux_dir'
+
+
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "m4/Makefile") CONFIG_FILES="$CONFIG_FILES m4/Makefile" ;;
+    "build/Makefile") CONFIG_FILES="$CONFIG_FILES build/Makefile" ;;
+    "build/vs2008/Makefile") CONFIG_FILES="$CONFIG_FILES build/vs2008/Makefile" ;;
+    "build/vs2008/config-win32.h") CONFIG_FILES="$CONFIG_FILES build/vs2008/config-win32.h" ;;
+    "build/vs2010/Makefile") CONFIG_FILES="$CONFIG_FILES build/vs2010/Makefile" ;;
+    "build/vs2010/config-win32.h") CONFIG_FILES="$CONFIG_FILES build/vs2010/config-win32.h" ;;
+    "docs/Makefile") CONFIG_FILES="$CONFIG_FILES docs/Makefile" ;;
+    "docs/reference/Makefile") CONFIG_FILES="$CONFIG_FILES docs/reference/Makefile" ;;
+    "docs/tutorial/Makefile") CONFIG_FILES="$CONFIG_FILES docs/tutorial/Makefile" ;;
+    "examples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;;
+    "util/Makefile") CONFIG_FILES="$CONFIG_FILES util/Makefile" ;;
+    "gmime/Makefile") CONFIG_FILES="$CONFIG_FILES gmime/Makefile" ;;
+    "gmime/gmime-version.h") CONFIG_FILES="$CONFIG_FILES gmime/gmime-version.h" ;;
+    "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;;
+    "tools/Makefile") CONFIG_FILES="$CONFIG_FILES tools/Makefile" ;;
+    "gmime.spec") CONFIG_FILES="$CONFIG_FILES gmime.spec" ;;
+    "gmime.pc") CONFIG_FILES="$CONFIG_FILES gmime.pc" ;;
+
+  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp= ac_tmp=
+  trap 'exit_status=$?
+  : "${ac_tmp:=$tmp}"
+  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+  trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+  eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+  ac_cs_awk_cr='\\r'
+else
+  ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+  echo "cat >conf$$subs.awk <<_ACEOF" &&
+  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+  echo "_ACEOF"
+} >conf$$subs.sh ||
+  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  . ./conf$$subs.sh ||
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' >$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+  for (key in S) S_is_set[key] = 1
+  FS = ""
+
+}
+{
+  line = $ 0
+  nfields = split(line, field, "@")
+  substed = 0
+  len = length(field[1])
+  for (i = 2; i < nfields; i++) {
+    key = field[i]
+    keylen = length(key)
+    if (S_is_set[key]) {
+      value = S[key]
+      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+      len += length(value) + length(field[++i])
+      substed = 1
+    } else
+      len += 1 + keylen
+  }
+
+  print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+  cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=[	 ]*/{
+h
+s///
+s/^/:/
+s/[	 ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[	 ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[	 ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+  ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+  if test -z "$ac_tt"; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any.  Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' >$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  for (key in D) D_is_set[key] = 1
+  FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+  line = \$ 0
+  split(line, arg, " ")
+  if (arg[1] == "#") {
+    defundef = arg[2]
+    mac1 = arg[3]
+  } else {
+    defundef = substr(arg[1], 2)
+    mac1 = arg[2]
+  }
+  split(mac1, mac2, "(") #)
+  macro = mac2[1]
+  prefix = substr(line, 1, index(line, defundef) - 1)
+  if (D_is_set[macro]) {
+    # Preserve the white space surrounding the "#".
+    print prefix "define", macro P[macro] D[macro]
+    next
+  } else {
+    # Replace #undef with comments.  This is necessary, for example,
+    # in the case of _POSIX_SOURCE, which is predefined and required
+    # on some systems where configure will not decide to define it.
+    if (defundef == "undef") {
+      print "/*", prefix defundef, macro, "*/"
+      next
+    }
+  }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+  as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$ac_tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
+	 # because $ac_f cannot contain `:'.
+	 test -f "$ac_f" ||
+	   case $ac_f in
+	   [\\/$]*) false;;
+	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+	   esac ||
+	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+      esac
+      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      as_fn_append ac_file_inputs " '$ac_f'"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input='Generated from '`
+	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+	`' by configure.'
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+    fi
+    # Neutralize special characters interpreted by sed in replacement strings.
+    case $configure_input in #(
+    *\&* | *\|* | *\\* )
+       ac_sed_conf_input=`$as_echo "$configure_input" |
+       sed 's/[\\\\&|]/\\\\&/g'`;; #(
+    *) ac_sed_conf_input=$configure_input;;
+    esac
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$ac_tmp/stdin" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  as_dir="$ac_dir"; as_fn_mkdir_p
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+  ac_MKDIR_P=$MKDIR_P
+  case $MKDIR_P in
+  [\\/$]* | ?:[\\/]* ) ;;
+  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+  s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' \
+      "$ac_tmp/out"`; test -z "$ac_out"; } &&
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&2;}
+
+  rm -f "$ac_tmp/stdin"
+  case $ac_file in
+  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+  esac \
+  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
+  if test x"$ac_file" != x-; then
+    {
+      $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+    } >"$ac_tmp/config.h" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      rm -f "$ac_file"
+      mv "$ac_tmp/config.h" "$ac_file" \
+	|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    fi
+  else
+    $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+      || as_fn_error $? "could not create -" "$LINENO" 5
+  fi
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$_am_arg" : 'X\(//\)[^/]' \| \
+	 X"$_am_arg" : 'X\(//\)$' \| \
+	 X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$_am_arg" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
+
+
+  case $ac_file$ac_mode in
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+  # Older Autoconf quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named 'Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`$as_dirname -- "$mf" ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$mf" : 'X\(//\)[^/]' \| \
+	 X"$mf" : 'X\(//\)$' \| \
+	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running 'make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "$am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`$as_dirname -- "$file" ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$file" : 'X\(//\)[^/]' \| \
+	 X"$file" : 'X\(//\)$' \| \
+	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      as_dir=$dirpart/$fdir; as_fn_mkdir_p
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+ ;;
+    "libtool":C)
+
+    # See if we are running on zsh, and set the options that allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}"; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile=${ofile}T
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+# Generated automatically by $as_me ($PACKAGE) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the  same
+# distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see .
+
+
+# The names of the tagged configurations supported by this script.
+available_tags=''
+
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# What type of objects to build.
+pic_mode=$pic_mode
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# Shared archive member basename,for filename based shared library versioning on AIX.
+shared_archive_member_spec=$shared_archive_member_spec
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that protects backslashes.
+ECHO=$lt_ECHO
+
+# The PATH separator for the build system.
+PATH_SEPARATOR=$lt_PATH_SEPARATOR
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP=$lt_GREP
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# A literal string matcher.
+FGREP=$lt_FGREP
+
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
+
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
+
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
+
+# Object file suffix (normally "o").
+objext=$ac_objext
+
+# Executable file suffix (normally "").
+exeext=$exeext
+
+# whether the shell understands "unset".
+lt_unset=$lt_unset
+
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
+
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
+
+# convert \$build file names to \$host format.
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+
+# convert \$build files to toolchain format.
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+
+# An object symbol dumper.
+OBJDUMP=$lt_OBJDUMP
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method = "file_magic".
+file_magic_cmd=$lt_file_magic_cmd
+
+# How to find potential files when deplibs_check_method = "file_magic".
+file_magic_glob=$lt_file_magic_glob
+
+# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
+want_nocaseglob=$lt_want_nocaseglob
+
+# DLL creation program.
+DLLTOOL=$lt_DLLTOOL
+
+# Command to associate shared and link libraries.
+sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
+
+# The archiver.
+AR=$lt_AR
+
+# Flags to create an archive.
+AR_FLAGS=$lt_AR_FLAGS
+
+# How to feed a file listing to the archiver.
+archiver_list_spec=$lt_archiver_list_spec
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
+
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=$lock_old_archive_extraction
+
+# A C compiler.
+LTCC=$lt_CC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm into a list of symbols to manually relocate.
+global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+
+# The name lister interface.
+nm_interface=$lt_lt_cv_nm_interface
+
+# Specify filename containing input files for \$NM.
+nm_file_list_spec=$lt_nm_file_list_spec
+
+# The root where to search for dependent libraries,and where our libraries should be installed.
+lt_sysroot=$lt_sysroot
+
+# Command to truncate a binary pipe.
+lt_truncate_bin=$lt_lt_cv_truncate_bin
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Manifest tool.
+MANIFEST_TOOL=$lt_MANIFEST_TOOL
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
+
+# Old archive suffix (normally "a").
+libext=$libext
+
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
+
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Library versioning type.
+version_type=$version_type
+
+# Shared library runtime path variable.
+runpath_var=$runpath_var
+
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Permission mode override for installation of shared libraries.
+install_override_mode=$lt_install_override_mode
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Detected run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path
+
+# Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
+configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
+
+# A language specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+    cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+#       string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+#       string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+#       "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+#       VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+    case x$2 in
+    x)
+        ;;
+    *:)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+        ;;
+    x:*)
+        eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    *::*)
+        eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+        eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+        ;;
+    *)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    esac
+}
+
+
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+    for cc_temp in $*""; do
+      case $cc_temp in
+        compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+        distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+        \-*) ;;
+        *) break;;
+      esac
+    done
+    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test set != "${COLLECT_NAMES+set}"; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+
+ltmain=$ac_aux_dir/ltmain.sh
+
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
+
+   mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+
+ ;;
+
+  esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
+
+echo "
+
+Configuration:
+
+  Source code location: ${srcdir}
+  Install prefix:       ${prefix}
+  Compiler:             ${CC}
+
+  Documentation:        ${enable_gtk_doc}
+
+  Profiling enabled:    ${enable_profiling}
+  Coverage enabled:     ${enable_coverage}
+
+  Large file support:   ${enable_largefile}
+  Console warnings:     ${enable_warnings}
+  PGP/MIME support:     ${enable_crypto}
+  S/MIME support:       ${enable_crypto}
+  libidn support:       ${libidn}
+
+  Vala bindings:        ${enable_vala}
+"
diff -Nru gmime-2.6.22+dfsg2/configure.ac gmime-3.0.1/configure.ac
--- gmime-2.6.22+dfsg2/configure.ac	2017-04-28 17:43:42.000000000 +0000
+++ gmime-3.0.1/configure.ac	2017-05-21 16:30:23.000000000 +0000
@@ -10,18 +10,18 @@
 # if backwards compatibility has been broken,
 # set gmime_binary_age _and_ gmime_interface_age to 0.
 #
-m4_define([gmime_major_version], [2])
-m4_define([gmime_minor_version], [6])
-m4_define([gmime_micro_version], [22])
-m4_define([gmime_interface_age], [0])
+m4_define([gmime_major_version], [3])
+m4_define([gmime_minor_version], [0])
+m4_define([gmime_micro_version], [1])
+m4_define([gmime_interface_age], [1])
 m4_define([gmime_binary_age],
           [m4_eval(100 * gmime_minor_version + gmime_micro_version)])
 m4_define([gmime_version],
           [gmime_major_version.gmime_minor_version.gmime_micro_version])
 
 # the API version is the major.minor since the last API breakage
-m4_define([gmime_api_major], [2])
-m4_define([gmime_api_minor], [6])
+m4_define([gmime_api_major], [3])
+m4_define([gmime_api_minor], [0])
 m4_define([gmime_api_version], [gmime_api_major.gmime_api_minor])
 
 # libtool version related macros
@@ -40,9 +40,9 @@
 
 
 AC_INIT(gmime, [gmime_version],
-        [http://bugzilla.gnome.org/enter_bug.cgi?product=gmime])
+        [https://github.com/jstedfast/gmime/issues])
 
-AC_CONFIG_SRCDIR([README])
+AC_CONFIG_SRCDIR([README.md])
 AC_CONFIG_MACRO_DIR([m4])
 AC_CANONICAL_SYSTEM
 AC_CANONICAL_HOST
@@ -50,7 +50,7 @@
 # Save this value here, since automake will set cflags later
 cflags_set=${CFLAGS+set}
 
-AM_INIT_AUTOMAKE([1.9 dist-bzip2 tar-ustar no-dist-gzip foreign -Wno-portability])
+AM_INIT_AUTOMAKE([1.9 -Wno-portability no-define no-dist-gzip dist-xz tar-ustar])
 AC_SUBST([ACLOCAL_AMFLAGS], ["-I m4 \${ACLOCAL_FLAGS}"])
 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])],
          [AC_SUBST([AM_DEFAULT_VERBOSITY], [1])])
@@ -159,7 +159,6 @@
 AC_CHECK_HEADERS(string.h)
 AC_CHECK_HEADERS(stdlib.h)
 AC_CHECK_HEADERS(netdb.h)
-AC_CHECK_HEADERS(regex.h)
 AC_CHECK_HEADERS(time.h)
 AC_CHECK_HEADERS(poll.h)
 
@@ -184,9 +183,6 @@
 	AC_MSG_RESULT(no)
 )
 
-dnl Check for some time functions
-AC_CHECK_FUNCS(strftime localtime gmtime_r gmtime_s)
-
 dnl Check for working mmap
 AC_FUNC_MMAP
 AC_CHECK_FUNCS(munmap msync)
@@ -226,25 +222,6 @@
   AC_DEFINE(ENABLE_WARNINGS, 1, [Define if GMime should enable warning output.])
 fi
 
-dnl Enable stricter MIME parsing rules
-AC_ARG_ENABLE(strict-parser,
-              AC_HELP_STRING([--enable-strict-parser],
-	      [enable stricter MIME parser rules [[default=no]]]),,
-	      [enable_strict_parser="no"])
-if test "x$enable_strict_parser" = "xyes"; then
-  AC_DEFINE(STRICT_PARSER, 1, [Define if GMime should enable stricter parsing rules.])
-fi
-
-dnl Disable cryptography support
-AC_ARG_ENABLE(cryptography,
-              AC_HELP_STRING([--enable-cryptography],
-	      [enable cryptography support [[default=yes]]]),,
-	      [enable_cryptography="yes"])
-AM_CONDITIONAL(ENABLE_CRYPTOGRAPHY, test "x$enable_cryptography" = "xyes")
-if test "x$enable_cryptography" = "xyes"; then
-  AC_DEFINE(ENABLE_CRYPTOGRAPHY, 1, [Define if cryptography in GMime is enabled.])
-fi
-
 dnl ***********************
 dnl *** Tests for iconv ***
 dnl ***********************
@@ -433,50 +410,6 @@
 	AC_MSG_RESULT(no)
 )
 
-dnl Timezone checks
-AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
-	AC_TRY_COMPILE([
-		#include 
-		], [
-		struct tm tm;
-		tm.tm_gmtoff = 1;
-		return tm.tm_gmtoff;
-		], ac_cv_struct_tm_gmtoff="yes", ac_cv_struct_tm_gmtoff="no"))
-if test "$ac_cv_struct_tm_gmtoff" = "yes"; then
-	AC_DEFINE(HAVE_TM_GMTOFF, 1, [Define if struct tm has a tm_gmtoff member])
-else
-	AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
-		AC_TRY_COMPILE([
-			#include 
-		], [
-			timezone = 1;
-		], ac_cv_var_timezone="yes", ac_cv_var_timezone="no"))
-	if test "$ac_cv_var_timezone" = "yes"; then
-		AC_DEFINE(HAVE_TIMEZONE, 1, [Define if libc defines a timezone variable])
-		AC_CACHE_CHECK(for altzone variable, ac_cv_var_altzone,
-			AC_TRY_COMPILE([
-				#include 
-			], [
-				altzone = 1;
-			], ac_cv_var_altzone="yes", ac_cv_var_altzone="no"))
-		if test "$ac_cv_var_altzone" = "yes"; then
-			AC_DEFINE(HAVE_ALTZONE, 1, [Define if libc defines an altzone variable])
-		fi
-	else
-		AC_CACHE_CHECK(for _timezone variable, ac_cv_var__timezone,
-			AC_TRY_COMPILE([
-				#include 
-			], [
-				_timezone = 1;
-			], ac_cv_var__timezone="yes", ac_cv_var__timezone="no"))
-		if test "$ac_cv_var__timezone" = "yes"; then
-			AC_DEFINE(HAVE__TIMEZONE, 1, [Define if libc defines a _timezone variable])
-		else
-			AC_ERROR(unable to find a way to determine timezone)
-		fi
-	fi
-fi
-
 dnl *************************************
 dnl *** Checks for large file support ***
 dnl *************************************
@@ -558,114 +491,114 @@
 LIBNSL=""
 AC_CHECK_LIB(nsl, getaddrinfo, LIBNSL="-lnsl")
 
-dnl ******************************************
-dnl *** Checks for GpgME needed for S/MIME ***
-dnl ******************************************
-AC_ARG_ENABLE([smime], 
-	      AC_HELP_STRING([--enable-smime],
-	      [enable S/MIME support [[default=yes]]]),,
-	      [enable_smime="yes"])
-
-if test "x$enable_cryptography" != "xyes"; then
-   enable_smime="no"
-fi
+dnl **************************************************
+dnl *** Checks for GpgME needed for PGP and S/MIME ***
+dnl **************************************************
+AC_ARG_ENABLE([crypto], 
+	      AC_HELP_STRING([--enable-crypto],
+	      [enable PGP and S/MIME support [[default=yes]]]),,
+	      [enable_crypto="yes"])
 
 m4_ifdef([AM_PATH_GPGME_PTHREAD], [
-AS_IF([test "x$enable_smime" = "xyes"], [
-   AM_PATH_GPGME_PTHREAD(1.1.6, enable_smime="yes (via GpgME)", enable_smime="no")
-   if test "x$enable_smime" != "xno"; then
-      AC_DEFINE(ENABLE_SMIME, 1, [Define if GMime should enable experimental S/MIME support.])
+AS_IF([test "x$enable_crypto" = "xyes"], [
+   AM_PATH_GPGME_PTHREAD(1.2.0, enable_crypto="yes (via GpgME)", enable_crypto="no")
+   if test "x$enable_crypto" != "xno"; then
+      AC_DEFINE(ENABLE_CRYPTO, 1, [Define if GMime should enable GpgME PGP and S/MIME support.])
    fi
 ])
 ])
+AM_CONDITIONAL(ENABLE_CRYPTO, test "x$enable_crypto" != "xno")
 
-dnl ****************************
-dnl *** Enable Mono bindings ***
-dnl ****************************
-AC_ARG_ENABLE([mono], 
-	      AC_HELP_STRING([--enable-mono],
-	      [enable Mono bindings [[default=auto]]]),,
-	      [enable_mono="auto"])
-if test "x$enable_mono" != "xno"; then
-	AC_PATH_PROG(CSC, mcs, no)
-	# if we found mcs, make sure it's mono and not something else named
-	# mcs, such as Tru64's /usr/bin/mcs, for manipulating object file
-	# comment sections of eCOFF object files.
-	if test "x$CSC" != "xno"; then
-		AC_MSG_CHECKING([whether $CSC is GNU Mono])
-		$CSC --version > /dev/null 2>&1
-		if test $? -ne 0; then
-			CSC=no
-			AC_MSG_RESULT([no])
-		else
-			AC_MSG_RESULT([yes])
-		fi
-	fi
-else
-	CSC="no"
-fi
-
-if test "x$CSC" = "xno"; then
-	dnl error out if the user has explicitly requested mono bindings
-	if test "x$enable_mono" = "xyes"; then
-		AC_MSG_ERROR([Could not find mcs])
-	fi
-	
-	enable_mono="no"
-	AM_CONDITIONAL(ENABLE_MONO, false)
-else
-	enable_mono="yes"
-	AM_CONDITIONAL(ENABLE_MONO, true)
+dnl *****************************
+dnl *** Checks for GNU Libidn ***
+dnl *****************************
+AC_ARG_WITH(libidn, AC_HELP_STRING([--with-libidn=[DIR]],
+                                [Support IDN (needs GNU Libidn)]),
+  libidn=$withval, libidn=yes)
+if test "$libidn" != "no" ; then
+  PKG_CHECK_MODULES(LIBIDN, libidn >= 0.0.0, [libidn=yes], [libidn=no])
+  if test "$libidn" != "yes" ; then
+    libidn=no
+    AC_MSG_WARN([Libidn not found])
+  else
+    libidn=yes
+    AC_DEFINE(LIBIDN, 1, [Define to 1 if GNU Libidn should be used.])
+  fi
 fi
-
-if test "x$enable_mono" = "xyes"; then
-	AC_PATH_PROG(GACUTIL, gacutil, no)
-	if test "x$GACUTIL" = "xno"; then
-		AC_MSG_ERROR([Your mono installation doesn't expose gacutil])
-	fi
-	
-	AC_SUBST(CSC)
-	AC_SUBST(GACUTIL)
-	
-	PKG_CHECK_MODULES(GLIB_SHARP, glib-sharp-2.0 >= 2.4.0)
-	AC_SUBST(GLIB_SHARP_LIBS)
-	
-	PKG_CHECK_MODULES(GAPI_TOOLS, gapi-2.0)
-	AC_PATH_PROG(GAPI_CODEGEN, gapi2-codegen, no)
-	if test "x$GAPI_CODEGEN" = "xno"; then
-        	AC_MSG_ERROR([You need to install gtk-sharp2-gapi])
-	fi
-	
-	AC_PATH_PROG(GAPI_FIXUP, gapi2-fixup, no)
-	if test "x$GAPI_FIXUP" = "xno"; then
-        	AC_MSG_ERROR([You need to install gtk-sharp2-gapi])
-	fi
-	
-	AC_PATH_PROG(GAPI_PARSER, gapi2-parser, no)
-	if test "x$GAPI_PARSER" = "xno"; then
-        	AC_MSG_ERROR([You need to install gtk-sharp2-gapi])
-	fi
-	
-	dnl The version should be along the lines of
-	dnl "..0.", where major and minor are
-	dnl the current major and minor gmime versions, and interface count is
-	dnl incremented any time the mono API changes, which should really
-	dnl only happen within development series.
-	MONO_INTERFACE_VERSION=0
-	API_VERSION="$GMIME_MAJOR_VERSION.$GMIME_MINOR_VERSION.0.$MONO_INTERFACE_VERSION"
-	AC_SUBST(API_VERSION)
-fi
-
-AC_ARG_WITH([gacdir], AC_HELP_STRING([--with-gacdir], [Specify the Global Assembly Cache root directory]),
-            [[with_gacdir=$withval]],
-            [[with_gacdir=\${prefix}/lib]])
-gacdir=$with_gacdir
-AC_SUBST(gacdir)
+AC_MSG_CHECKING([if Libidn should be used])
+AC_MSG_RESULT($libidn)
 
 dnl Check for GObject introspection and Vala binding generator
 GOBJECT_INTROSPECTION_CHECK([1.30.0])
 VAPIGEN_CHECK
 
+dnl ************************************
+dnl *** Enable lcov coverage reports ***
+dnl ************************************
+
+AC_ARG_ENABLE(coverage,
+  AS_HELP_STRING([--enable-coverage],
+		 [enable coverage testing with gcov]),
+  [enable_coverage=$enableval], [enable_coverage=no])
+
+AS_IF([ test "x$enable_coverage" = "xyes"], [
+  dnl we need gcc:
+  if test "$GCC" != "yes"; then
+    AC_MSG_ERROR([GCC is required for --enable-coverage])
+  fi
+
+  dnl Check if ccache is being used
+  AC_CHECK_PROG(SHTOOL, shtool, shtool)
+  case `$SHTOOL path $CC` in
+    *ccache*[)] gcc_ccache=yes;;
+    *[)] gcc_ccache=no;;
+  esac
+
+  if test "$gcc_ccache" = "yes" && (test -z "$CCACHE_DISABLE" || test "$CCACHE_DISABLE" != "1"); then
+    AC_MSG_ERROR([ccache must be disabled when --enable-coverage option is used. You can disable ccache by setting environment variable CCACHE_DISABLE=1.])
+  fi
+
+  ltp_version_list="1.6 1.7 1.8 1.9 1.10 1.11 1.12 1.13"
+  AC_CHECK_PROG(LTP, lcov, lcov)
+  AC_CHECK_PROG(LTP_GENHTML, genhtml, genhtml)
+
+  AS_IF([ test "$LTP" ], [
+    AC_CACHE_CHECK([for ltp version], glib_cv_ltp_version, [
+      glib_cv_ltp_version=invalid
+      ltp_version=`$LTP -v 2>/dev/null | $SED -e 's/^.* //'`
+      for ltp_check_version in $ltp_version_list; do
+        if test "$ltp_version" = "$ltp_check_version"; then
+          glib_cv_ltp_version="$ltp_check_version (ok)"
+        fi
+      done
+    ])
+  ], [
+    ltp_msg="To enable code coverage reporting you must have one of the following LTP versions installed: $ltp_version_list"
+    AC_MSG_ERROR([$ltp_msg])
+  ])
+
+  case $glib_cv_ltp_version in
+    ""|invalid[)]
+      ltp_msg="You must have one of the following versions of LTP: $ltp_version_list (found: $ltp_version)."
+      AC_MSG_ERROR([$ltp_msg])
+      LTP="exit 0;"
+      ;;
+  esac
+
+  if test -z "$LTP_GENHTML"; then
+    AC_MSG_ERROR([Could not find genhtml from the LTP package])
+  fi
+
+  dnl Remove all optimization flags from CFLAGS
+  changequote({,})
+  CFLAGS=`echo "$CFLAGS" | $SED -e 's/-O[0-9]*//g'`
+  changequote([,])
+
+  dnl Add the special gcc flags
+  CFLAGS="$CFLAGS -O0 -fprofile-arcs -ftest-coverage"
+  LDFLAGS="$LDFLAGS -lgcov"
+])
+
 dnl Extra libs
 EXTRA_LIBS="$ZLIB_LIBS"
 if test "x$LIBSOCKET" != "x"; then
@@ -680,6 +613,9 @@
 if test "x$GPGME_PTHREAD_LIBS" != "x"; then
 	EXTRA_LIBS="$EXTRA_LIBS $GPGME_PTHREAD_LIBS"
 fi
+if test "x$LIBIDN_LIBS" != "x"; then
+   	EXTRA_LIBS="$EXTRA_LIBS $LIBIDN_LIBS"
+fi
 
 CFLAGS="$CFLAGS -fno-strict-aliasing"
 LIBS="$LIBS $EXTRA_LIBS"
@@ -687,7 +623,7 @@
 AC_SUBST(CFLAGS)
 AC_SUBST(LIBS)
 
-GMIME_CFLAGS="$LFS_CFLAGS $GPGME_PTHREAD_CFLAGS"
+GMIME_CFLAGS="$LFS_CFLAGS $GPGME_PTHREAD_CFLAGS $LIBIDN_CFLAGS"
 GMIME_LIBDIR="-L${libdir}"
 GMIME_INCLUDEDIR="-I${includedir}/gmime-$GMIME_API_VERSION"
 GMIME_LIBS_PRIVATE="$EXTRA_LIBS"
@@ -714,10 +650,6 @@
 util/Makefile
 gmime/Makefile
 gmime/gmime-version.h
-mono/Makefile
-mono/AssemblyInfo.cs
-mono/gmime-sharp.dll.config
-mono/gmime-sharp.pc
 tests/Makefile
 tools/Makefile
 gmime.spec
@@ -732,14 +664,16 @@
   Install prefix:       ${prefix}
   Compiler:             ${CC}
 
+  Documentation:        ${enable_gtk_doc}
+
   Profiling enabled:    ${enable_profiling}
+  Coverage enabled:     ${enable_coverage}
 
   Large file support:   ${enable_largefile}
   Console warnings:     ${enable_warnings}
-  PGP/MIME support:     ${enable_cryptography}
-  S/MIME support:       ${enable_smime}
-  Strict parser:        ${enable_strict_parser}
+  PGP/MIME support:     ${enable_crypto}
+  S/MIME support:       ${enable_crypto}
+  libidn support:       ${libidn}
 
-  Mono bindings:        ${enable_mono}
   Vala bindings:        ${enable_vala}
 "
diff -Nru gmime-2.6.22+dfsg2/debian/changelog gmime-3.0.1/debian/changelog
--- gmime-2.6.22+dfsg2/debian/changelog	2017-04-28 17:58:25.000000000 +0000
+++ gmime-3.0.1/debian/changelog	2017-07-27 18:16:08.000000000 +0000
@@ -1,8 +1,45 @@
-gmime (2.6.22+dfsg2-1) unstable; urgency=medium
+gmime (3.0.1-3) unstable; urgency=medium
 
-  * another new dfsg-free upstream tarball (Closes: #861296)
+  * clean up gbp.conf
+  * include bugfixes and patches from upstream (Closes: #869736)
+  * no need for explicit use of autoreconf (already covered by dh 10)
 
- -- Daniel Kahn Gillmor   Fri, 28 Apr 2017 10:58:25 -0700
+ -- Daniel Kahn Gillmor   Thu, 27 Jul 2017 14:16:08 -0400
+
+gmime (3.0.1-2) unstable; urgency=medium
+
+  * move to unstable
+  * imported upstream bugfixes
+  * bump Standards-Version to 4.0.0 (no changes needed)
+  * use upstream-preferred homepage
+
+ -- Daniel Kahn Gillmor   Wed, 05 Jul 2017 18:07:28 -0400
+
+gmime (3.0.1-1) experimental; urgency=medium
+
+  [ David Bremner ]
+  * Upstream bugfix release: fix upstream bug #782915 (duplicated header
+    names)
+
+  [ Daniel Kahn Gillmor ]
+  * added debian/README.source
+
+ -- Daniel Kahn Gillmor   Mon, 22 May 2017 12:51:06 -0400
+
+gmime (3.0.0+dfsg1-1) experimental; urgency=medium
+
+  * upload with dfsg-free tarball (Closes: #861296)
+
+ -- Daniel Kahn Gillmor   Fri, 28 Apr 2017 14:26:17 -0700
+
+gmime (3.0.0-1) experimental; urgency=medium
+
+  * New upstream major version -- gmime 3.0
+  * ABI/API changes from 2.6 to 3.0
+  * move to experimental for now
+  * drop all C#/mono/.net -- upstream prefers MimeKit instead
+
+ -- Daniel Kahn Gillmor   Tue, 25 Apr 2017 13:05:45 -0400
 
 gmime (2.6.22+dfsg1-1) unstable; urgency=medium
 
diff -Nru gmime-2.6.22+dfsg2/debian/clean gmime-3.0.1/debian/clean
--- gmime-2.6.22+dfsg2/debian/clean	2017-04-28 17:51:48.000000000 +0000
+++ gmime-3.0.1/debian/clean	1970-01-01 00:00:00.000000000 +0000
@@ -1,3 +0,0 @@
-mono/gmime-sharp-2.6.tree
-mono/gmime-sharp-2.6.zip
-mono/monodocer/
diff -Nru gmime-2.6.22+dfsg2/debian/control gmime-3.0.1/debian/control
--- gmime-2.6.22+dfsg2/debian/control	2017-04-28 17:51:48.000000000 +0000
+++ gmime-3.0.1/debian/control	2017-07-27 18:16:08.000000000 +0000
@@ -7,9 +7,7 @@
 Build-Depends:
  autoconf,
  automake,
- autotools-dev,
  debhelper (>= 10~),
- dh-autoreconf,
  dh-exec,
  docbook-utils,
  dpkg-dev (>= 1.17.14~),
@@ -22,25 +20,19 @@
  libtool,
  valac,
  zlib1g-dev,
-Build-Depends-Indep:
- cli-common-dev (>= 0.8~),
- gtk-sharp2-gapi (>= 2.4.0),
- libglib2.0-cil-dev (>= 2.4.0),
- mono-devel (>= 2.4.3),
- monodoc-base (>= 2.0),
-Standards-Version: 3.9.8
-Homepage: http://spruce.sourceforge.net/gmime/
+Standards-Version: 4.0.0
+Homepage: https://github.com/jstedfast/gmime/
 Vcs-Git: https://anonscm.debian.org/git/collab-maint/gmime.git
 Vcs-Browser: https://anonscm.debian.org/git/collab-maint/gmime.git
 
-Package: libgmime-2.6-dev
+Package: libgmime-3.0-dev
 Architecture: any
 Section: libdevel
 Depends:
- gir1.2-gmime-2.6 (= ${binary:Version}),
+ gir1.2-gmime-3.0 (= ${binary:Version}),
  libc6-dev,
  libglib2.0-dev,
- libgmime-2.6-0 (= ${binary:Version}),
+ libgmime-3.0-0 (= ${binary:Version}),
  ${misc:Depends},
 Description: MIME message parser and creator library - development files
  GMime provides a core library and set of utilities which may be used for the
@@ -50,7 +42,7 @@
  This package contains the development files of GMime for programmers
  using C or Vala.
 
-Package: gir1.2-gmime-2.6
+Package: gir1.2-gmime-3.0
 Architecture: any
 Multi-Arch: same
 Section: introspection
@@ -65,7 +57,7 @@
  This package contains data for using GMime under GObject
  introspection (e.g. Python).
 
-Package: libgmime-2.6-doc
+Package: libgmime-3.0-doc
 Architecture: all
 Section: doc
 Depends:
@@ -77,7 +69,7 @@
  .
  This package contains the documentation and examples of GMime.
 
-Package: libgmime-2.6-0
+Package: libgmime-3.0-0
 Architecture: any
 Multi-Arch: same
 Pre-Depends:
@@ -96,7 +88,7 @@
 Architecture: any
 Section: utils
 Depends:
- libgmime-2.6-0 (= ${binary:Version}),
+ libgmime-3.0-0 (= ${binary:Version}),
  ${misc:Depends},
  ${shlibs:Depends},
 Description: MIME message parser and creator library - runtime binaries
@@ -105,46 +97,3 @@
  Extension (MIME).
  .
  This package contains binary tools for encoding and decoding messages.
-
-Package: libgmime2.6-cil
-Architecture: all
-Section: cli-mono
-Depends:
- ${cli:Depends},
- ${misc:Depends},
- ${shlibs:Depends},
-Description: CLI binding for the GMime library
- GMime provides a core library and set of utilities which may be used for the
- creation and parsing of messages using the Multipurpose Internet Mail
- Extension (MIME).
- .
- This package contains the CLI binding for the GMime library.
-
-Package: libgmime2.6-cil-dev
-Architecture: all
-Section: cli-mono
-Depends:
- libgmime2.6-cil (= ${binary:Version}),
- ${cli:Depends},
- ${misc:Depends},
- ${shlibs:Depends},
-Description: CLI binding for the GMime library -- development files
- GMime provides a core library and set of utilities which may be used for the
- creation and parsing of messages using the Multipurpose Internet Mail
- Extension (MIME).
- .
- This package contains development files for the gmime-sharp library, and
- should be used for compilation.
-
-Package: monodoc-gmime2.6-manual
-Section: doc
-Architecture: all
-Depends:
- monodoc-browser | monodoc-viewer,
- ${misc:Depends},
-Description: compiled XML documentation for GMime
- GMime provides a core library and set of utilities which may be used for the
- creation and parsing of messages using the Multipurpose Internet Mail
- Extension (MIME).
- .
- This package contains the compiled XML documentation for GMime.
diff -Nru gmime-2.6.22+dfsg2/debian/copyright gmime-3.0.1/debian/copyright
--- gmime-2.6.22+dfsg2/debian/copyright	2017-04-28 17:51:48.000000000 +0000
+++ gmime-3.0.1/debian/copyright	2017-07-27 18:14:17.000000000 +0000
@@ -4,36 +4,47 @@
 Source: http://ftp.gnome.org/pub/GNOME/sources/gmime/
 
 Files: *
-Copyright: Copyright (C) 2000-2011 Jeffrey Stedfast
+Copyright: 2000-2017 Jeffrey Stedfast
 License: LGPL-2.1+
 
 Files: examples/getopt.* examples/getopt1.c
-Copyright: Copyright (C) 1987-1998 Free Software Foundation, Inc.
+Copyright: 1987-1998 Free Software Foundation, Inc.
 License: GPL-2+
 
 Files: gmime/gmime-encodings.c
-Copyright: Copyright (C) 2000-2011 Jeffrey Stedfast and Michael Zucchi
+Copyright: 2000-2017 Jeffrey Stedfast and Michael Zucchi
 License: LGPL-2.1+
 
-Files: util/md5-utils.*
-Copyright: Colin Plumb in 1993, no copyright is claimed
-License: PD
- The algorithm is due to Ron Rivest.  This code was
- written by Colin Plumb in 1993, no copyright is claimed.
- This code is in the public domain; do with it what you wish.
+Files: zentimer.h
+Copyright: 2000-2017 Jeffrey Stedfast
+License: BSD-like
+ Permission is hereby granted, free of charge, to any person
+ obtaining a copy of this software and associated documentation
+ files (the "Software"), to deal in the Software without
+ restriction, including without limitation the rights to use, copy,
+ modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
  .
- parts of this file are:
- Written March 1993 by Branko Lankester
- Modified June 1993 by Colin Plumb for altered md5.c.
- Modified October 1995 by Erik Troan for RPM
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+ .
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ DEALINGS IN THE SOFTWARE.
 
 Files: debian/*
-Copyright: Copyright (c) 2009-2012 Mirco Bauer ,
-  2012-2016 Daniel Kahn Gillmor 
+Copyright: 2009-2012 Mirco Bauer ,
+  2012-2017 Daniel Kahn Gillmor 
 License: GPL-3+
 
 Files: debian/gmime-uuencode.1 debian/gmime-uudecode.1
-Copyright: Copyright (c) 2012 Daniel Kahn Gillmor 
+Copyright: 2012,2017 Daniel Kahn Gillmor 
 License: LGPL-2.1+
 
 License: LGPL-2.1+
diff -Nru gmime-2.6.22+dfsg2/debian/gbp.conf gmime-3.0.1/debian/gbp.conf
--- gmime-2.6.22+dfsg2/debian/gbp.conf	2017-04-28 17:53:03.000000000 +0000
+++ gmime-3.0.1/debian/gbp.conf	2017-07-27 18:14:17.000000000 +0000
@@ -19,3 +19,5 @@
  'missing',
  ]
 filter-pristine-tar = False
+upstream-vcs-tag = %(version)s
+pristine-tar = True
diff -Nru gmime-2.6.22+dfsg2/debian/gir1.2-gmime-2.6.examples gmime-3.0.1/debian/gir1.2-gmime-2.6.examples
--- gmime-2.6.22+dfsg2/debian/gir1.2-gmime-2.6.examples	2017-04-28 17:51:48.000000000 +0000
+++ gmime-3.0.1/debian/gir1.2-gmime-2.6.examples	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-debian/gir-examples/*
diff -Nru gmime-2.6.22+dfsg2/debian/gir1.2-gmime-2.6.install gmime-3.0.1/debian/gir1.2-gmime-2.6.install
--- gmime-2.6.22+dfsg2/debian/gir1.2-gmime-2.6.install	2017-04-28 17:51:48.000000000 +0000
+++ gmime-3.0.1/debian/gir1.2-gmime-2.6.install	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-usr/lib/*/girepository-1.0/*.typelib
diff -Nru gmime-2.6.22+dfsg2/debian/gir1.2-gmime-3.0.examples gmime-3.0.1/debian/gir1.2-gmime-3.0.examples
--- gmime-2.6.22+dfsg2/debian/gir1.2-gmime-3.0.examples	1970-01-01 00:00:00.000000000 +0000
+++ gmime-3.0.1/debian/gir1.2-gmime-3.0.examples	2017-07-27 18:14:17.000000000 +0000
@@ -0,0 +1 @@
+debian/gir-examples/*
diff -Nru gmime-2.6.22+dfsg2/debian/gir1.2-gmime-3.0.install gmime-3.0.1/debian/gir1.2-gmime-3.0.install
--- gmime-2.6.22+dfsg2/debian/gir1.2-gmime-3.0.install	1970-01-01 00:00:00.000000000 +0000
+++ gmime-3.0.1/debian/gir1.2-gmime-3.0.install	2017-07-27 18:14:17.000000000 +0000
@@ -0,0 +1 @@
+usr/lib/*/girepository-1.0/*.typelib
diff -Nru gmime-2.6.22+dfsg2/debian/gir-examples/gmime-example.py gmime-3.0.1/debian/gir-examples/gmime-example.py
--- gmime-2.6.22+dfsg2/debian/gir-examples/gmime-example.py	2017-04-28 17:51:48.000000000 +0000
+++ gmime-3.0.1/debian/gir-examples/gmime-example.py	2017-07-27 18:14:17.000000000 +0000
@@ -6,11 +6,11 @@
 # License: GPL-3+
 
 import gi
-gi.require_version('GMime', '2.6')
+gi.require_version('GMime', '3.0')
 from gi.repository import GMime
 GMime.init(0)
 
-f = GMime.StreamFile.new_for_path('/usr/share/doc/gir1.2-gmime-2.6/examples/example.eml', 'r')
+f = GMime.StreamFile.new_for_path('/usr/share/doc/gir1.2-gmime-3.0/examples/example.eml', 'r')
 parser = GMime.Parser.new_with_stream(f)
 msg = parser.construct_message()
 
diff -Nru gmime-2.6.22+dfsg2/debian/gir-examples/README.txt gmime-3.0.1/debian/gir-examples/README.txt
--- gmime-2.6.22+dfsg2/debian/gir-examples/README.txt	2017-04-28 17:51:48.000000000 +0000
+++ gmime-3.0.1/debian/gir-examples/README.txt	2017-07-27 18:14:17.000000000 +0000
@@ -4,7 +4,7 @@
 If you want to suggest an example in another language, please submit
 it to the debian BTS using:
 
-   reportbug gir1.2-gmime-2.6
+   reportbug gir1.2-gmime-3.0
 
 or mail it to:
 
diff -Nru gmime-2.6.22+dfsg2/debian/gmime-sharp-2.6.source gmime-3.0.1/debian/gmime-sharp-2.6.source
--- gmime-2.6.22+dfsg2/debian/gmime-sharp-2.6.source	2017-04-28 17:51:48.000000000 +0000
+++ gmime-3.0.1/debian/gmime-sharp-2.6.source	1970-01-01 00:00:00.000000000 +0000
@@ -1,5 +0,0 @@
-
-
-  
-  
-
diff -Nru gmime-2.6.22+dfsg2/debian/gmime-uudecode.1 gmime-3.0.1/debian/gmime-uudecode.1
--- gmime-2.6.22+dfsg2/debian/gmime-uudecode.1	2017-04-28 17:51:48.000000000 +0000
+++ gmime-3.0.1/debian/gmime-uudecode.1	2017-07-27 18:14:17.000000000 +0000
@@ -1,4 +1,4 @@
-.TH GMIME-UUDECODE "1" "January 2012" "gmime-uudecode - GMime 2.6.4" "User Commands"
+.TH GMIME-UUDECODE "1" "April 2017" "gmime-uudecode - GMime 3.0.0" "User Commands"
 .SH NAME
 gmime-uudecode \- decode a uuencoded stream to its binary form
 .SH SYNOPSIS
diff -Nru gmime-2.6.22+dfsg2/debian/gmime-uuencode.1 gmime-3.0.1/debian/gmime-uuencode.1
--- gmime-2.6.22+dfsg2/debian/gmime-uuencode.1	2017-04-28 17:51:48.000000000 +0000
+++ gmime-3.0.1/debian/gmime-uuencode.1	2017-07-27 18:14:17.000000000 +0000
@@ -1,4 +1,4 @@
-.TH GMIME-UUENCODE "1" "January 2012" "gmime-uuencode - GMime 2.6.4" "User Commands"
+.TH GMIME-UUENCODE "1" "April 2017" "gmime-uuencode - GMime 3.0.0" "User Commands"
 .SH NAME
 gmime-uuencode \- encode a binary file to a text stream
 .SH SYNOPSIS
diff -Nru gmime-2.6.22+dfsg2/debian/libgmime-2.6-0.install gmime-3.0.1/debian/libgmime-2.6-0.install
--- gmime-2.6.22+dfsg2/debian/libgmime-2.6-0.install	2017-04-28 17:51:48.000000000 +0000
+++ gmime-3.0.1/debian/libgmime-2.6-0.install	1970-01-01 00:00:00.000000000 +0000
@@ -1,2 +0,0 @@
-usr/lib/*/libgmime-2.6.so.0
-usr/lib/*/libgmime-2.6.so.0.*
diff -Nru gmime-2.6.22+dfsg2/debian/libgmime-2.6-0.symbols gmime-3.0.1/debian/libgmime-2.6-0.symbols
--- gmime-2.6.22+dfsg2/debian/libgmime-2.6-0.symbols	2017-04-28 17:51:48.000000000 +0000
+++ gmime-3.0.1/debian/libgmime-2.6-0.symbols	1970-01-01 00:00:00.000000000 +0000
@@ -1,550 +0,0 @@
-libgmime-2.6.so.0 libgmime-2.6-0 #MINVER#
- _g_mime_charset_lock@Base 2.6.16
- _g_mime_charset_unlock@Base 2.6.16
- _g_mime_enable_rfc2047_workarounds@Base 2.6.4
- _g_mime_get_gpg_version@Base 2.6.21
- _g_mime_header_list_get_changed_event@Base 2.6.4
- _g_mime_iconv_cache_lock@Base 2.6.16
- _g_mime_iconv_cache_unlock@Base 2.6.16
- _g_mime_iconv_utils_lock@Base 2.6.16
- _g_mime_iconv_utils_unlock@Base 2.6.16
- _g_mime_msgid_lock@Base 2.6.16
- _g_mime_msgid_unlock@Base 2.6.16
- _g_mime_object_set_content_type@Base 2.6.4
- _g_mime_use_only_user_charsets@Base 2.6.16
- _g_mime_utils_structured_header_fold@Base 2.6.16
- _g_mime_utils_unstructured_header_fold@Base 2.6.16
- g_mime_certificate_get_created@Base 2.6.4
- g_mime_certificate_get_digest_algo@Base 2.6.4
- g_mime_certificate_get_email@Base 2.6.4
- g_mime_certificate_get_expires@Base 2.6.4
- g_mime_certificate_get_fingerprint@Base 2.6.4
- g_mime_certificate_get_issuer_name@Base 2.6.4
- g_mime_certificate_get_issuer_serial@Base 2.6.4
- g_mime_certificate_get_key_id@Base 2.6.4
- g_mime_certificate_get_name@Base 2.6.4
- g_mime_certificate_get_pubkey_algo@Base 2.6.4
- g_mime_certificate_get_trust@Base 2.6.4
- g_mime_certificate_get_type@Base 2.6.4
- g_mime_certificate_list_add@Base 2.6.4
- g_mime_certificate_list_clear@Base 2.6.4
- g_mime_certificate_list_contains@Base 2.6.4
- g_mime_certificate_list_get_certificate@Base 2.6.4
- g_mime_certificate_list_get_type@Base 2.6.4
- g_mime_certificate_list_index_of@Base 2.6.4
- g_mime_certificate_list_insert@Base 2.6.4
- g_mime_certificate_list_length@Base 2.6.4
- g_mime_certificate_list_new@Base 2.6.4
- g_mime_certificate_list_remove@Base 2.6.4
- g_mime_certificate_list_remove_at@Base 2.6.4
- g_mime_certificate_list_set_certificate@Base 2.6.4
- g_mime_certificate_new@Base 2.6.4
- g_mime_certificate_set_created@Base 2.6.4
- g_mime_certificate_set_digest_algo@Base 2.6.4
- g_mime_certificate_set_email@Base 2.6.4
- g_mime_certificate_set_expires@Base 2.6.4
- g_mime_certificate_set_fingerprint@Base 2.6.4
- g_mime_certificate_set_issuer_name@Base 2.6.4
- g_mime_certificate_set_issuer_serial@Base 2.6.4
- g_mime_certificate_set_key_id@Base 2.6.4
- g_mime_certificate_set_name@Base 2.6.4
- g_mime_certificate_set_pubkey_algo@Base 2.6.4
- g_mime_certificate_set_trust@Base 2.6.4
- g_mime_charset_best@Base 2.6.4
- g_mime_charset_best_name@Base 2.6.4
- g_mime_charset_can_encode@Base 2.6.4
- g_mime_charset_canon_name@Base 2.6.4
- g_mime_charset_iconv_name@Base 2.6.4
- g_mime_charset_init@Base 2.6.4
- g_mime_charset_iso_to_windows@Base 2.6.4
- g_mime_charset_language@Base 2.6.4
- g_mime_charset_locale_name@Base 2.6.4
- g_mime_charset_map_init@Base 2.6.4
- g_mime_charset_map_shutdown@Base 2.6.4
- g_mime_charset_name@Base 2.6.4
- g_mime_charset_step@Base 2.6.4
- g_mime_check_version@Base 2.6.4
- g_mime_content_disposition_get_disposition@Base 2.6.4
- g_mime_content_disposition_get_parameter@Base 2.6.4
- g_mime_content_disposition_get_params@Base 2.6.4
- g_mime_content_disposition_get_type@Base 2.6.4
- g_mime_content_disposition_is_attachment@Base 2.6.21
- g_mime_content_disposition_new@Base 2.6.4
- g_mime_content_disposition_new_from_string@Base 2.6.4
- g_mime_content_disposition_set_disposition@Base 2.6.4
- g_mime_content_disposition_set_parameter@Base 2.6.4
- g_mime_content_disposition_set_params@Base 2.6.4
- g_mime_content_disposition_to_string@Base 2.6.4
- g_mime_content_encoding_from_string@Base 2.6.4
- g_mime_content_encoding_to_string@Base 2.6.4
- g_mime_content_type_get_media_subtype@Base 2.6.4
- g_mime_content_type_get_media_type@Base 2.6.4
- g_mime_content_type_get_parameter@Base 2.6.4
- g_mime_content_type_get_params@Base 2.6.4
- g_mime_content_type_get_type@Base 2.6.4
- g_mime_content_type_is_type@Base 2.6.4
- g_mime_content_type_new@Base 2.6.4
- g_mime_content_type_new_from_string@Base 2.6.4
- g_mime_content_type_set_media_subtype@Base 2.6.4
- g_mime_content_type_set_media_type@Base 2.6.4
- g_mime_content_type_set_parameter@Base 2.6.4
- g_mime_content_type_set_params@Base 2.6.4
- g_mime_content_type_to_string@Base 2.6.4
- g_mime_crypto_context_decrypt@Base 2.6.4
- g_mime_crypto_context_decrypt_session@Base 2.6.21
- g_mime_crypto_context_digest_id@Base 2.6.4
- g_mime_crypto_context_digest_name@Base 2.6.4
- g_mime_crypto_context_encrypt@Base 2.6.4
- g_mime_crypto_context_export_keys@Base 2.6.4
- g_mime_crypto_context_get_encryption_protocol@Base 2.6.4
- g_mime_crypto_context_get_key_exchange_protocol@Base 2.6.4
- g_mime_crypto_context_get_request_password@Base 2.6.4
- g_mime_crypto_context_get_retrieve_session_key@Base 2.6.21
- g_mime_crypto_context_get_signature_protocol@Base 2.6.4
- g_mime_crypto_context_get_type@Base 2.6.4
- g_mime_crypto_context_import_keys@Base 2.6.4
- g_mime_crypto_context_set_request_password@Base 2.6.4
- g_mime_crypto_context_set_retrieve_session_key@Base 2.6.21
- g_mime_crypto_context_sign@Base 2.6.4
- g_mime_crypto_context_verify@Base 2.6.4
- g_mime_data_wrapper_get_encoding@Base 2.6.4
- g_mime_data_wrapper_get_stream@Base 2.6.4
- g_mime_data_wrapper_get_type@Base 2.6.4
- g_mime_data_wrapper_new@Base 2.6.4
- g_mime_data_wrapper_new_with_stream@Base 2.6.4
- g_mime_data_wrapper_set_encoding@Base 2.6.4
- g_mime_data_wrapper_set_stream@Base 2.6.4
- g_mime_data_wrapper_write_to_stream@Base 2.6.4
- g_mime_decrypt_result_get_cipher@Base 2.6.4
- g_mime_decrypt_result_get_mdc@Base 2.6.22
- g_mime_decrypt_result_get_recipients@Base 2.6.4
- g_mime_decrypt_result_get_session_key@Base 2.6.22
- g_mime_decrypt_result_get_signatures@Base 2.6.4
- g_mime_decrypt_result_get_type@Base 2.6.4
- g_mime_decrypt_result_new@Base 2.6.4
- g_mime_decrypt_result_set_cipher@Base 2.6.4
- g_mime_decrypt_result_set_mdc@Base 2.6.4
- g_mime_decrypt_result_set_recipients@Base 2.6.4
- g_mime_decrypt_result_set_session_key@Base 2.6.21
- g_mime_decrypt_result_set_signatures@Base 2.6.4
- g_mime_decryption_result_get_mdc@Base 2.6.4
- g_mime_decryption_result_get_session_key@Base 2.6.21
- g_mime_encoding_base64_decode_step@Base 2.6.4
- g_mime_encoding_base64_encode_close@Base 2.6.4
- g_mime_encoding_base64_encode_step@Base 2.6.4
- g_mime_encoding_flush@Base 2.6.4
- g_mime_encoding_init_decode@Base 2.6.4
- g_mime_encoding_init_encode@Base 2.6.4
- g_mime_encoding_outlen@Base 2.6.4
- g_mime_encoding_quoted_decode_step@Base 2.6.4
- g_mime_encoding_quoted_encode_close@Base 2.6.4
- g_mime_encoding_quoted_encode_step@Base 2.6.4
- g_mime_encoding_reset@Base 2.6.4
- g_mime_encoding_step@Base 2.6.4
- g_mime_encoding_uudecode_step@Base 2.6.4
- g_mime_encoding_uuencode_close@Base 2.6.4
- g_mime_encoding_uuencode_step@Base 2.6.4
- g_mime_filter_backup@Base 2.6.4
- g_mime_filter_basic_get_type@Base 2.6.4
- g_mime_filter_basic_new@Base 2.6.4
- g_mime_filter_best_charset@Base 2.6.4
- g_mime_filter_best_encoding@Base 2.6.4
- g_mime_filter_best_get_type@Base 2.6.4
- g_mime_filter_best_new@Base 2.6.4
- g_mime_filter_charset_get_type@Base 2.6.4
- g_mime_filter_charset_new@Base 2.6.4
- g_mime_filter_complete@Base 2.6.4
- g_mime_filter_copy@Base 2.6.4
- g_mime_filter_crlf_get_type@Base 2.6.4
- g_mime_filter_crlf_new@Base 2.6.4
- g_mime_filter_enriched_get_type@Base 2.6.4
- g_mime_filter_enriched_new@Base 2.6.4
- g_mime_filter_filter@Base 2.6.4
- g_mime_filter_from_get_type@Base 2.6.4
- g_mime_filter_from_new@Base 2.6.4
- g_mime_filter_get_type@Base 2.6.4
- g_mime_filter_gzip_get_type@Base 2.6.4
- g_mime_filter_gzip_new@Base 2.6.4
- g_mime_filter_html_get_type@Base 2.6.4
- g_mime_filter_html_new@Base 2.6.4
- g_mime_filter_md5_get_digest@Base 2.6.4
- g_mime_filter_md5_get_type@Base 2.6.4
- g_mime_filter_md5_new@Base 2.6.4
- g_mime_filter_reset@Base 2.6.4
- g_mime_filter_set_size@Base 2.6.4
- g_mime_filter_strip_get_type@Base 2.6.4
- g_mime_filter_strip_new@Base 2.6.4
- g_mime_filter_windows_get_type@Base 2.6.4
- g_mime_filter_windows_is_windows_charset@Base 2.6.4
- g_mime_filter_windows_new@Base 2.6.4
- g_mime_filter_windows_real_charset@Base 2.6.4
- g_mime_filter_yenc_get_crc@Base 2.6.4
- g_mime_filter_yenc_get_pcrc@Base 2.6.4
- g_mime_filter_yenc_get_type@Base 2.6.4
- g_mime_filter_yenc_new@Base 2.6.4
- g_mime_filter_yenc_set_crc@Base 2.6.4
- g_mime_filter_yenc_set_state@Base 2.6.4
- g_mime_gpg_context_get_always_trust@Base 2.6.4
- g_mime_gpg_context_get_auto_key_retrieve@Base 2.6.4
- g_mime_gpg_context_get_type@Base 2.6.4
- g_mime_gpg_context_get_use_agent@Base 2.6.4
- g_mime_gpg_context_new@Base 2.6.4
- g_mime_gpg_context_set_always_trust@Base 2.6.4
- g_mime_gpg_context_set_auto_key_retrieve@Base 2.6.4
- g_mime_gpg_context_set_use_agent@Base 2.6.4
- g_mime_header_iter_copy@Base 2.6.4
- g_mime_header_iter_copy_to@Base 2.6.4
- g_mime_header_iter_equal@Base 2.6.4
- g_mime_header_iter_first@Base 2.6.4
- g_mime_header_iter_free@Base 2.6.4
- g_mime_header_iter_get_name@Base 2.6.4
- g_mime_header_iter_get_value@Base 2.6.4
- g_mime_header_iter_is_valid@Base 2.6.4
- g_mime_header_iter_last@Base 2.6.4
- g_mime_header_iter_new@Base 2.6.4
- g_mime_header_iter_next@Base 2.6.4
- g_mime_header_iter_prev@Base 2.6.4
- g_mime_header_iter_remove@Base 2.6.4
- g_mime_header_iter_set_value@Base 2.6.4
- g_mime_header_list_append@Base 2.6.4
- g_mime_header_list_clear@Base 2.6.4
- g_mime_header_list_contains@Base 2.6.4
- g_mime_header_list_destroy@Base 2.6.4
- g_mime_header_list_foreach@Base 2.6.4
- g_mime_header_list_get@Base 2.6.4
- g_mime_header_list_get_iter@Base 2.6.4
- g_mime_header_list_get_stream@Base 2.6.4
- g_mime_header_list_new@Base 2.6.4
- g_mime_header_list_prepend@Base 2.6.4
- g_mime_header_list_register_writer@Base 2.6.4
- g_mime_header_list_remove@Base 2.6.4
- g_mime_header_list_set@Base 2.6.4
- g_mime_header_list_set_stream@Base 2.6.4
- g_mime_header_list_to_string@Base 2.6.4
- g_mime_header_list_write_to_stream@Base 2.6.4
- g_mime_iconv_close@Base 2.6.4
- g_mime_iconv_init@Base 2.6.4
- g_mime_iconv_locale_to_utf8@Base 2.6.4
- g_mime_iconv_locale_to_utf8_length@Base 2.6.4
- g_mime_iconv_open@Base 2.6.4
- g_mime_iconv_shutdown@Base 2.6.4
- g_mime_iconv_strdup@Base 2.6.4
- g_mime_iconv_strndup@Base 2.6.4
- g_mime_iconv_utf8_to_locale@Base 2.6.4
- g_mime_iconv_utf8_to_locale_length@Base 2.6.4
- g_mime_iconv_utils_init@Base 2.6.16
- g_mime_iconv_utils_shutdown@Base 2.6.16
- g_mime_init@Base 2.6.4
- g_mime_locale_charset@Base 2.6.4
- g_mime_locale_language@Base 2.6.4
- g_mime_message_add_recipient@Base 2.6.4
- g_mime_message_foreach@Base 2.6.4
- g_mime_message_get_all_recipients@Base 2.6.4
- g_mime_message_get_body@Base 2.6.4
- g_mime_message_get_date@Base 2.6.4
- g_mime_message_get_date_as_string@Base 2.6.4
- g_mime_message_get_message_id@Base 2.6.4
- g_mime_message_get_mime_part@Base 2.6.4
- g_mime_message_get_recipients@Base 2.6.4
- g_mime_message_get_reply_to@Base 2.6.4
- g_mime_message_get_sender@Base 2.6.4
- g_mime_message_get_subject@Base 2.6.4
- g_mime_message_get_type@Base 2.6.4
- g_mime_message_new@Base 2.6.4
- g_mime_message_part_get_message@Base 2.6.4
- g_mime_message_part_get_type@Base 2.6.4
- g_mime_message_part_new@Base 2.6.4
- g_mime_message_part_new_with_message@Base 2.6.4
- g_mime_message_part_set_message@Base 2.6.4
- g_mime_message_partial_get_id@Base 2.6.4
- g_mime_message_partial_get_number@Base 2.6.4
- g_mime_message_partial_get_total@Base 2.6.4
- g_mime_message_partial_get_type@Base 2.6.4
- g_mime_message_partial_new@Base 2.6.4
- g_mime_message_partial_reconstruct_message@Base 2.6.4
- g_mime_message_partial_split_message@Base 2.6.4
- g_mime_message_set_date@Base 2.6.4
- g_mime_message_set_date_as_string@Base 2.6.4
- g_mime_message_set_message_id@Base 2.6.4
- g_mime_message_set_mime_part@Base 2.6.4
- g_mime_message_set_reply_to@Base 2.6.4
- g_mime_message_set_sender@Base 2.6.4
- g_mime_message_set_subject@Base 2.6.4
- g_mime_multipart_add@Base 2.6.4
- g_mime_multipart_clear@Base 2.6.4
- g_mime_multipart_contains@Base 2.6.4
- g_mime_multipart_encrypted_decrypt@Base 2.6.4
- g_mime_multipart_encrypted_decrypt_session@Base 2.6.21
- g_mime_multipart_encrypted_encrypt@Base 2.6.4
- g_mime_multipart_encrypted_get_type@Base 2.6.4
- g_mime_multipart_encrypted_new@Base 2.6.4
- g_mime_multipart_foreach@Base 2.6.4
- g_mime_multipart_get_boundary@Base 2.6.4
- g_mime_multipart_get_count@Base 2.6.4
- g_mime_multipart_get_part@Base 2.6.4
- g_mime_multipart_get_postface@Base 2.6.4
- g_mime_multipart_get_preface@Base 2.6.4
- g_mime_multipart_get_subpart_from_content_id@Base 2.6.4
- g_mime_multipart_get_type@Base 2.6.4
- g_mime_multipart_index_of@Base 2.6.4
- g_mime_multipart_insert@Base 2.6.4
- g_mime_multipart_new@Base 2.6.4
- g_mime_multipart_new_with_subtype@Base 2.6.4
- g_mime_multipart_remove@Base 2.6.4
- g_mime_multipart_remove_at@Base 2.6.4
- g_mime_multipart_replace@Base 2.6.4
- g_mime_multipart_set_boundary@Base 2.6.4
- g_mime_multipart_set_postface@Base 2.6.4
- g_mime_multipart_set_preface@Base 2.6.4
- g_mime_multipart_signed_get_type@Base 2.6.4
- g_mime_multipart_signed_new@Base 2.6.4
- g_mime_multipart_signed_sign@Base 2.6.4
- g_mime_multipart_signed_verify@Base 2.6.4
- g_mime_object_append_header@Base 2.6.4
- g_mime_object_encode@Base 2.6.4
- g_mime_object_get_content_disposition@Base 2.6.4
- g_mime_object_get_content_disposition_parameter@Base 2.6.4
- g_mime_object_get_content_id@Base 2.6.4
- g_mime_object_get_content_type@Base 2.6.4
- g_mime_object_get_content_type_parameter@Base 2.6.4
- g_mime_object_get_disposition@Base 2.6.4
- g_mime_object_get_header@Base 2.6.4
- g_mime_object_get_header_list@Base 2.6.4
- g_mime_object_get_headers@Base 2.6.4
- g_mime_object_get_type@Base 2.6.4
- g_mime_object_new@Base 2.6.4
- g_mime_object_new_type@Base 2.6.4
- g_mime_object_prepend_header@Base 2.6.4
- g_mime_object_register_type@Base 2.6.4
- g_mime_object_remove_header@Base 2.6.4
- g_mime_object_set_content_disposition@Base 2.6.4
- g_mime_object_set_content_disposition_parameter@Base 2.6.4
- g_mime_object_set_content_id@Base 2.6.4
- g_mime_object_set_content_type@Base 2.6.4
- g_mime_object_set_content_type_parameter@Base 2.6.4
- g_mime_object_set_disposition@Base 2.6.4
- g_mime_object_set_header@Base 2.6.4
- g_mime_object_to_string@Base 2.6.4
- g_mime_object_write_to_stream@Base 2.6.4
- g_mime_param_append@Base 2.6.4
- g_mime_param_append_param@Base 2.6.4
- g_mime_param_destroy@Base 2.6.4
- g_mime_param_get_name@Base 2.6.4
- g_mime_param_get_value@Base 2.6.4
- g_mime_param_new@Base 2.6.4
- g_mime_param_new_from_string@Base 2.6.4
- g_mime_param_next@Base 2.6.4
- g_mime_param_write_to_string@Base 2.6.4
- g_mime_parser_construct_message@Base 2.6.4
- g_mime_parser_construct_part@Base 2.6.4
- g_mime_parser_eos@Base 2.6.4
- g_mime_parser_get_from@Base 2.6.4
- g_mime_parser_get_from_offset@Base 2.6.4
- g_mime_parser_get_headers_begin@Base 2.6.4
- g_mime_parser_get_headers_end@Base 2.6.4
- g_mime_parser_get_persist_stream@Base 2.6.4
- g_mime_parser_get_respect_content_length@Base 2.6.4
- g_mime_parser_get_scan_from@Base 2.6.4
- g_mime_parser_get_type@Base 2.6.4
- g_mime_parser_init_with_stream@Base 2.6.4
- g_mime_parser_new@Base 2.6.4
- g_mime_parser_new_with_stream@Base 2.6.4
- g_mime_parser_set_header_regex@Base 2.6.4
- g_mime_parser_set_persist_stream@Base 2.6.4
- g_mime_parser_set_respect_content_length@Base 2.6.4
- g_mime_parser_set_scan_from@Base 2.6.4
- g_mime_parser_tell@Base 2.6.4
- g_mime_part_get_best_content_encoding@Base 2.6.4
- g_mime_part_get_content_description@Base 2.6.4
- g_mime_part_get_content_encoding@Base 2.6.4
- g_mime_part_get_content_id@Base 2.6.4
- g_mime_part_get_content_location@Base 2.6.4
- g_mime_part_get_content_md5@Base 2.6.4
- g_mime_part_get_content_object@Base 2.6.4
- g_mime_part_get_filename@Base 2.6.4
- g_mime_part_get_type@Base 2.6.4
- g_mime_part_is_attachment@Base 2.6.21
- g_mime_part_iter_free@Base 2.6.4
- g_mime_part_iter_get_current@Base 2.6.4
- g_mime_part_iter_get_parent@Base 2.6.4
- g_mime_part_iter_get_path@Base 2.6.4
- g_mime_part_iter_get_toplevel@Base 2.6.4
- g_mime_part_iter_is_valid@Base 2.6.4
- g_mime_part_iter_jump_to@Base 2.6.4
- g_mime_part_iter_new@Base 2.6.4
- g_mime_part_iter_next@Base 2.6.4
- g_mime_part_iter_prev@Base 2.6.4
- g_mime_part_iter_remove@Base 2.6.4
- g_mime_part_iter_replace@Base 2.6.4
- g_mime_part_iter_reset@Base 2.6.4
- g_mime_part_new@Base 2.6.4
- g_mime_part_new_with_type@Base 2.6.4
- g_mime_part_set_content_description@Base 2.6.4
- g_mime_part_set_content_encoding@Base 2.6.4
- g_mime_part_set_content_id@Base 2.6.4
- g_mime_part_set_content_location@Base 2.6.4
- g_mime_part_set_content_md5@Base 2.6.4
- g_mime_part_set_content_object@Base 2.6.4
- g_mime_part_set_filename@Base 2.6.4
- g_mime_part_verify_content_md5@Base 2.6.4
- g_mime_pkcs7_context_get_always_trust@Base 2.6.4
- g_mime_pkcs7_context_get_type@Base 2.6.4
- g_mime_pkcs7_context_new@Base 2.6.4
- g_mime_pkcs7_context_set_always_trust@Base 2.6.4
- g_mime_references_append@Base 2.6.4
- g_mime_references_clear@Base 2.6.4
- g_mime_references_decode@Base 2.6.4
- g_mime_references_free@Base 2.6.4
- g_mime_references_get_message_id@Base 2.6.4
- g_mime_references_get_next@Base 2.6.4
- g_mime_set_user_charsets@Base 2.6.4
- g_mime_shutdown@Base 2.6.4
- g_mime_signature_get_certificate@Base 2.6.4
- g_mime_signature_get_created@Base 2.6.4
- g_mime_signature_get_errors@Base 2.6.4
- g_mime_signature_get_expires@Base 2.6.4
- g_mime_signature_get_status@Base 2.6.4
- g_mime_signature_get_type@Base 2.6.4
- g_mime_signature_list_add@Base 2.6.4
- g_mime_signature_list_clear@Base 2.6.4
- g_mime_signature_list_contains@Base 2.6.4
- g_mime_signature_list_get_signature@Base 2.6.4
- g_mime_signature_list_get_type@Base 2.6.4
- g_mime_signature_list_index_of@Base 2.6.4
- g_mime_signature_list_insert@Base 2.6.4
- g_mime_signature_list_length@Base 2.6.4
- g_mime_signature_list_new@Base 2.6.4
- g_mime_signature_list_remove@Base 2.6.4
- g_mime_signature_list_remove_at@Base 2.6.4
- g_mime_signature_list_set_signature@Base 2.6.4
- g_mime_signature_new@Base 2.6.4
- g_mime_signature_set_certificate@Base 2.6.4
- g_mime_signature_set_created@Base 2.6.4
- g_mime_signature_set_errors@Base 2.6.4
- g_mime_signature_set_expires@Base 2.6.4
- g_mime_signature_set_status@Base 2.6.4
- g_mime_stream_buffer_get_type@Base 2.6.4
- g_mime_stream_buffer_gets@Base 2.6.4
- g_mime_stream_buffer_new@Base 2.6.4
- g_mime_stream_buffer_readln@Base 2.6.4
- g_mime_stream_cat_add_source@Base 2.6.4
- g_mime_stream_cat_get_type@Base 2.6.4
- g_mime_stream_cat_new@Base 2.6.4
- g_mime_stream_close@Base 2.6.4
- g_mime_stream_construct@Base 2.6.4
- g_mime_stream_eos@Base 2.6.4
- g_mime_stream_file_get_owner@Base 2.6.4
- g_mime_stream_file_get_type@Base 2.6.4
- g_mime_stream_file_new@Base 2.6.4
- g_mime_stream_file_new_for_path@Base 2.6.18
- g_mime_stream_file_new_with_bounds@Base 2.6.4
- g_mime_stream_file_set_owner@Base 2.6.4
- g_mime_stream_filter_add@Base 2.6.4
- g_mime_stream_filter_get_type@Base 2.6.4
- g_mime_stream_filter_new@Base 2.6.4
- g_mime_stream_filter_remove@Base 2.6.4
- g_mime_stream_flush@Base 2.6.4
- g_mime_stream_fs_get_owner@Base 2.6.4
- g_mime_stream_fs_get_type@Base 2.6.4
- g_mime_stream_fs_new@Base 2.6.4
- g_mime_stream_fs_new_for_path@Base 2.6.18
- g_mime_stream_fs_new_with_bounds@Base 2.6.4
- g_mime_stream_fs_set_owner@Base 2.6.4
- g_mime_stream_get_type@Base 2.6.4
- g_mime_stream_gio_get_owner@Base 2.6.4
- g_mime_stream_gio_get_type@Base 2.6.4
- g_mime_stream_gio_new@Base 2.6.4
- g_mime_stream_gio_new_with_bounds@Base 2.6.4
- g_mime_stream_gio_set_owner@Base 2.6.4
- g_mime_stream_length@Base 2.6.4
- g_mime_stream_mem_get_byte_array@Base 2.6.4
- g_mime_stream_mem_get_owner@Base 2.6.4
- g_mime_stream_mem_get_type@Base 2.6.4
- g_mime_stream_mem_new@Base 2.6.4
- g_mime_stream_mem_new_with_buffer@Base 2.6.4
- g_mime_stream_mem_new_with_byte_array@Base 2.6.4
- g_mime_stream_mem_set_byte_array@Base 2.6.4
- g_mime_stream_mem_set_owner@Base 2.6.4
- g_mime_stream_mmap_get_type@Base 2.6.4
- g_mime_stream_mmap_new@Base 2.6.4
- g_mime_stream_mmap_new_with_bounds@Base 2.6.4
- g_mime_stream_null_get_type@Base 2.6.4
- g_mime_stream_null_new@Base 2.6.4
- g_mime_stream_pipe_get_owner@Base 2.6.4
- g_mime_stream_pipe_get_type@Base 2.6.4
- g_mime_stream_pipe_new@Base 2.6.4
- g_mime_stream_pipe_set_owner@Base 2.6.4
- g_mime_stream_printf@Base 2.6.4
- g_mime_stream_read@Base 2.6.4
- g_mime_stream_reset@Base 2.6.4
- g_mime_stream_seek@Base 2.6.4
- g_mime_stream_set_bounds@Base 2.6.4
- g_mime_stream_substream@Base 2.6.4
- g_mime_stream_tell@Base 2.6.4
- g_mime_stream_write@Base 2.6.4
- g_mime_stream_write_string@Base 2.6.4
- g_mime_stream_write_to_stream@Base 2.6.4
- g_mime_stream_writev@Base 2.6.4
- g_mime_user_charsets@Base 2.6.4
- g_mime_utils_best_encoding@Base 2.6.4
- g_mime_utils_decode_8bit@Base 2.6.4
- g_mime_utils_decode_message_id@Base 2.6.4
- g_mime_utils_generate_message_id@Base 2.6.4
- g_mime_utils_header_decode_date@Base 2.6.4
- g_mime_utils_header_decode_phrase@Base 2.6.4
- g_mime_utils_header_decode_text@Base 2.6.4
- g_mime_utils_header_encode_phrase@Base 2.6.4
- g_mime_utils_header_encode_text@Base 2.6.4
- g_mime_utils_header_fold@Base 2.6.4
- g_mime_utils_header_format_date@Base 2.6.4
- g_mime_utils_header_printf@Base 2.6.4
- g_mime_utils_quote_string@Base 2.6.4
- g_mime_utils_structured_header_fold@Base 2.6.4
- g_mime_utils_text_is_8bit@Base 2.6.4
- g_mime_utils_unquote_string@Base 2.6.4
- g_mime_utils_unstructured_header_fold@Base 2.6.4
- g_mime_ydecode_step@Base 2.6.4
- g_mime_yencode_close@Base 2.6.4
- g_mime_yencode_step@Base 2.6.4
- g_trie_add@Base 2.6.4
- g_trie_free@Base 2.6.4
- g_trie_new@Base 2.6.4
- g_trie_quick_search@Base 2.6.4
- g_trie_search@Base 2.6.4
- gmime_binary_age@Base 2.6.4
- gmime_error_quark@Base 2.6.4
- gmime_gpgme_error_quark@Base 2.6.4
- gmime_interface_age@Base 2.6.4
- gmime_major_version@Base 2.6.4
- gmime_micro_version@Base 2.6.4
- gmime_minor_version@Base 2.6.4
- internet_address_get_name@Base 2.6.4
- internet_address_get_type@Base 2.6.4
- internet_address_group_add_member@Base 2.6.4
- internet_address_group_get_members@Base 2.6.4
- internet_address_group_get_type@Base 2.6.4
- internet_address_group_new@Base 2.6.4
- internet_address_group_set_members@Base 2.6.4
- internet_address_list_add@Base 2.6.4
- internet_address_list_append@Base 2.6.4
- internet_address_list_clear@Base 2.6.4
- internet_address_list_contains@Base 2.6.4
- internet_address_list_get_address@Base 2.6.4
- internet_address_list_get_type@Base 2.6.4
- internet_address_list_index_of@Base 2.6.4
- internet_address_list_insert@Base 2.6.4
- internet_address_list_length@Base 2.6.4
- internet_address_list_new@Base 2.6.4
- internet_address_list_parse_string@Base 2.6.4
- internet_address_list_prepend@Base 2.6.4
- internet_address_list_remove@Base 2.6.4
- internet_address_list_remove_at@Base 2.6.4
- internet_address_list_set_address@Base 2.6.4
- internet_address_list_to_string@Base 2.6.4
- internet_address_list_writer@Base 2.6.4
- internet_address_mailbox_get_addr@Base 2.6.4
- internet_address_mailbox_get_type@Base 2.6.4
- internet_address_mailbox_new@Base 2.6.4
- internet_address_mailbox_set_addr@Base 2.6.4
- internet_address_set_name@Base 2.6.4
- internet_address_to_string@Base 2.6.4
diff -Nru gmime-2.6.22+dfsg2/debian/libgmime2.6-cil-dev.install gmime-3.0.1/debian/libgmime2.6-cil-dev.install
--- gmime-2.6.22+dfsg2/debian/libgmime2.6-cil-dev.install	2017-04-28 17:51:48.000000000 +0000
+++ gmime-3.0.1/debian/libgmime2.6-cil-dev.install	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-usr/lib/*/pkgconfig/gmime-sharp-2.6.pc usr/lib/pkgconfig
diff -Nru gmime-2.6.22+dfsg2/debian/libgmime2.6-cil.docs gmime-3.0.1/debian/libgmime2.6-cil.docs
--- gmime-2.6.22+dfsg2/debian/libgmime2.6-cil.docs	2017-04-28 17:51:48.000000000 +0000
+++ gmime-3.0.1/debian/libgmime2.6-cil.docs	1970-01-01 00:00:00.000000000 +0000
@@ -1,3 +0,0 @@
-AUTHORS
-README
-TODO
diff -Nru gmime-2.6.22+dfsg2/debian/libgmime2.6-cil.install gmime-3.0.1/debian/libgmime2.6-cil.install
--- gmime-2.6.22+dfsg2/debian/libgmime2.6-cil.install	2017-04-28 17:51:48.000000000 +0000
+++ gmime-3.0.1/debian/libgmime2.6-cil.install	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-usr/lib/mono/gac/gmime-sharp/2.6*/* /usr/lib/cli/gmime-sharp-2.6/
diff -Nru gmime-2.6.22+dfsg2/debian/libgmime2.6-cil.installcligac gmime-3.0.1/debian/libgmime2.6-cil.installcligac
--- gmime-2.6.22+dfsg2/debian/libgmime2.6-cil.installcligac	2017-04-28 17:51:48.000000000 +0000
+++ gmime-3.0.1/debian/libgmime2.6-cil.installcligac	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-/usr/lib/cli/gmime-sharp-2.6/gmime-sharp.dll
diff -Nru gmime-2.6.22+dfsg2/debian/libgmime-2.6-dev.docs gmime-3.0.1/debian/libgmime-2.6-dev.docs
--- gmime-2.6.22+dfsg2/debian/libgmime-2.6-dev.docs	2017-04-28 17:51:48.000000000 +0000
+++ gmime-3.0.1/debian/libgmime-2.6-dev.docs	1970-01-01 00:00:00.000000000 +0000
@@ -1,3 +0,0 @@
-AUTHORS
-README
-TODO
diff -Nru gmime-2.6.22+dfsg2/debian/libgmime-2.6-dev.install gmime-3.0.1/debian/libgmime-2.6-dev.install
--- gmime-2.6.22+dfsg2/debian/libgmime-2.6-dev.install	2017-04-28 17:51:48.000000000 +0000
+++ gmime-3.0.1/debian/libgmime-2.6-dev.install	1970-01-01 00:00:00.000000000 +0000
@@ -1,6 +0,0 @@
-usr/include/
-usr/lib/*/libgmime-2.6.a
-usr/lib/*/libgmime-2.6.so
-usr/lib/*/pkgconfig/gmime-2.6.pc
-usr/share/gir-1.0/GMime-2.6.gir
-usr/share/vala/vapi/*
diff -Nru gmime-2.6.22+dfsg2/debian/libgmime-2.6-doc.doc-base gmime-3.0.1/debian/libgmime-2.6-doc.doc-base
--- gmime-2.6.22+dfsg2/debian/libgmime-2.6-doc.doc-base	2017-04-28 17:51:48.000000000 +0000
+++ gmime-3.0.1/debian/libgmime-2.6-doc.doc-base	1970-01-01 00:00:00.000000000 +0000
@@ -1,9 +0,0 @@
-Document: gmime2.6
-Title: GMime Library Reference Manual
-Author: Jeffrey Stedfast
-Abstract: This is the programming reference for GMime.
-Section: Programming
-
-Format: HTML
-Index: /usr/share/doc/libgmime-2.6-doc/html/index.html
-Files: /usr/share/doc/libgmime-2.6-doc/html/*.html
diff -Nru gmime-2.6.22+dfsg2/debian/libgmime-2.6-doc.docs gmime-3.0.1/debian/libgmime-2.6-doc.docs
--- gmime-2.6.22+dfsg2/debian/libgmime-2.6-doc.docs	2017-04-28 17:51:48.000000000 +0000
+++ gmime-3.0.1/debian/libgmime-2.6-doc.docs	1970-01-01 00:00:00.000000000 +0000
@@ -1,4 +0,0 @@
-AUTHORS
-PORTING
-README
-TODO
diff -Nru gmime-2.6.22+dfsg2/debian/libgmime-2.6-doc.examples gmime-3.0.1/debian/libgmime-2.6-doc.examples
--- gmime-2.6.22+dfsg2/debian/libgmime-2.6-doc.examples	2017-04-28 17:51:48.000000000 +0000
+++ gmime-3.0.1/debian/libgmime-2.6-doc.examples	1970-01-01 00:00:00.000000000 +0000
@@ -1,4 +0,0 @@
-examples/*.c
-examples/Makefile.am
-examples/Makefile.in
-examples/README
diff -Nru gmime-2.6.22+dfsg2/debian/libgmime-2.6-doc.install gmime-3.0.1/debian/libgmime-2.6-doc.install
--- gmime-2.6.22+dfsg2/debian/libgmime-2.6-doc.install	2017-04-28 17:51:48.000000000 +0000
+++ gmime-3.0.1/debian/libgmime-2.6-doc.install	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-usr/share/gtk-doc/html/gmime-2.6/
diff -Nru gmime-2.6.22+dfsg2/debian/libgmime-2.6-doc.links gmime-3.0.1/debian/libgmime-2.6-doc.links
--- gmime-2.6.22+dfsg2/debian/libgmime-2.6-doc.links	2017-04-28 17:51:48.000000000 +0000
+++ gmime-3.0.1/debian/libgmime-2.6-doc.links	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-usr/share/gtk-doc/html/gmime-2.6 usr/share/doc/libgmime-2.6-doc/html
diff -Nru gmime-2.6.22+dfsg2/debian/libgmime-3.0-0.install gmime-3.0.1/debian/libgmime-3.0-0.install
--- gmime-2.6.22+dfsg2/debian/libgmime-3.0-0.install	1970-01-01 00:00:00.000000000 +0000
+++ gmime-3.0.1/debian/libgmime-3.0-0.install	2017-07-27 18:14:17.000000000 +0000
@@ -0,0 +1,2 @@
+usr/lib/*/libgmime-3.0.so.0
+usr/lib/*/libgmime-3.0.so.0.*
diff -Nru gmime-2.6.22+dfsg2/debian/libgmime-3.0-0.symbols gmime-3.0.1/debian/libgmime-3.0-0.symbols
--- gmime-2.6.22+dfsg2/debian/libgmime-3.0-0.symbols	1970-01-01 00:00:00.000000000 +0000
+++ gmime-3.0.1/debian/libgmime-3.0-0.symbols	2017-07-27 18:14:17.000000000 +0000
@@ -0,0 +1,593 @@
+libgmime-3.0.so.0 libgmime-3.0-0 #MINVER#
+ g_mime_application_pkcs7_mime_decrypt@Base 3.0.0
+ g_mime_application_pkcs7_mime_encrypt@Base 3.0.0
+ g_mime_application_pkcs7_mime_get_smime_type@Base 3.0.0
+ g_mime_application_pkcs7_mime_get_type@Base 3.0.0
+ g_mime_application_pkcs7_mime_new@Base 3.0.0
+ g_mime_application_pkcs7_mime_sign@Base 3.0.0
+ g_mime_application_pkcs7_mime_verify@Base 3.0.0
+ g_mime_certificate_get_created@Base 3.0.0
+ g_mime_certificate_get_digest_algo@Base 3.0.0
+ g_mime_certificate_get_email@Base 3.0.0
+ g_mime_certificate_get_expires@Base 3.0.0
+ g_mime_certificate_get_fingerprint@Base 3.0.0
+ g_mime_certificate_get_issuer_name@Base 3.0.0
+ g_mime_certificate_get_issuer_serial@Base 3.0.0
+ g_mime_certificate_get_key_id@Base 3.0.0
+ g_mime_certificate_get_name@Base 3.0.0
+ g_mime_certificate_get_pubkey_algo@Base 3.0.0
+ g_mime_certificate_get_trust@Base 3.0.0
+ g_mime_certificate_get_type@Base 3.0.0
+ g_mime_certificate_list_add@Base 3.0.0
+ g_mime_certificate_list_clear@Base 3.0.0
+ g_mime_certificate_list_contains@Base 3.0.0
+ g_mime_certificate_list_get_certificate@Base 3.0.0
+ g_mime_certificate_list_get_type@Base 3.0.0
+ g_mime_certificate_list_index_of@Base 3.0.0
+ g_mime_certificate_list_insert@Base 3.0.0
+ g_mime_certificate_list_length@Base 3.0.0
+ g_mime_certificate_list_new@Base 3.0.0
+ g_mime_certificate_list_remove@Base 3.0.0
+ g_mime_certificate_list_remove_at@Base 3.0.0
+ g_mime_certificate_list_set_certificate@Base 3.0.0
+ g_mime_certificate_new@Base 3.0.0
+ g_mime_certificate_set_created@Base 3.0.0
+ g_mime_certificate_set_digest_algo@Base 3.0.0
+ g_mime_certificate_set_email@Base 3.0.0
+ g_mime_certificate_set_expires@Base 3.0.0
+ g_mime_certificate_set_fingerprint@Base 3.0.0
+ g_mime_certificate_set_issuer_name@Base 3.0.0
+ g_mime_certificate_set_issuer_serial@Base 3.0.0
+ g_mime_certificate_set_key_id@Base 3.0.0
+ g_mime_certificate_set_name@Base 3.0.0
+ g_mime_certificate_set_pubkey_algo@Base 3.0.0
+ g_mime_certificate_set_trust@Base 3.0.0
+ g_mime_charset_best@Base 3.0.0
+ g_mime_charset_best_name@Base 3.0.0
+ g_mime_charset_can_encode@Base 3.0.0
+ g_mime_charset_canon_name@Base 3.0.0
+ g_mime_charset_iconv_name@Base 3.0.0
+ g_mime_charset_init@Base 3.0.0
+ g_mime_charset_iso_to_windows@Base 3.0.0
+ g_mime_charset_language@Base 3.0.0
+ g_mime_charset_locale_name@Base 3.0.0
+ g_mime_charset_map_init@Base 3.0.0
+ g_mime_charset_map_shutdown@Base 3.0.0
+ g_mime_charset_name@Base 3.0.0
+ g_mime_charset_step@Base 3.0.0
+ g_mime_check_version@Base 3.0.0
+ g_mime_content_disposition_encode@Base 3.0.0
+ g_mime_content_disposition_get_disposition@Base 3.0.0
+ g_mime_content_disposition_get_parameter@Base 3.0.0
+ g_mime_content_disposition_get_parameters@Base 3.0.0
+ g_mime_content_disposition_get_type@Base 3.0.0
+ g_mime_content_disposition_is_attachment@Base 3.0.0
+ g_mime_content_disposition_new@Base 3.0.0
+ g_mime_content_disposition_parse@Base 3.0.0
+ g_mime_content_disposition_set_disposition@Base 3.0.0
+ g_mime_content_disposition_set_parameter@Base 3.0.0
+ g_mime_content_encoding_from_string@Base 3.0.0
+ g_mime_content_encoding_to_string@Base 3.0.0
+ g_mime_content_type_encode@Base 3.0.0
+ g_mime_content_type_get_media_subtype@Base 3.0.0
+ g_mime_content_type_get_media_type@Base 3.0.0
+ g_mime_content_type_get_mime_type@Base 3.0.0
+ g_mime_content_type_get_parameter@Base 3.0.0
+ g_mime_content_type_get_parameters@Base 3.0.0
+ g_mime_content_type_get_type@Base 3.0.0
+ g_mime_content_type_is_type@Base 3.0.0
+ g_mime_content_type_new@Base 3.0.0
+ g_mime_content_type_parse@Base 3.0.0
+ g_mime_content_type_set_media_subtype@Base 3.0.0
+ g_mime_content_type_set_media_type@Base 3.0.0
+ g_mime_content_type_set_parameter@Base 3.0.0
+ g_mime_crypto_context_decrypt@Base 3.0.0
+ g_mime_crypto_context_digest_id@Base 3.0.0
+ g_mime_crypto_context_digest_name@Base 3.0.0
+ g_mime_crypto_context_encrypt@Base 3.0.0
+ g_mime_crypto_context_export_keys@Base 3.0.0
+ g_mime_crypto_context_get_encryption_protocol@Base 3.0.0
+ g_mime_crypto_context_get_key_exchange_protocol@Base 3.0.0
+ g_mime_crypto_context_get_request_password@Base 3.0.0
+ g_mime_crypto_context_get_signature_protocol@Base 3.0.0
+ g_mime_crypto_context_get_type@Base 3.0.0
+ g_mime_crypto_context_import_keys@Base 3.0.0
+ g_mime_crypto_context_new@Base 3.0.0
+ g_mime_crypto_context_register@Base 3.0.0
+ g_mime_crypto_context_set_request_password@Base 3.0.0
+ g_mime_crypto_context_shutdown@Base 3.0.0
+ g_mime_crypto_context_sign@Base 3.0.0
+ g_mime_crypto_context_verify@Base 3.0.0
+ g_mime_data_wrapper_get_encoding@Base 3.0.0
+ g_mime_data_wrapper_get_stream@Base 3.0.0
+ g_mime_data_wrapper_get_type@Base 3.0.0
+ g_mime_data_wrapper_new@Base 3.0.0
+ g_mime_data_wrapper_new_with_stream@Base 3.0.0
+ g_mime_data_wrapper_set_encoding@Base 3.0.0
+ g_mime_data_wrapper_set_stream@Base 3.0.0
+ g_mime_data_wrapper_write_to_stream@Base 3.0.0
+ g_mime_decrypt_result_get_cipher@Base 3.0.0
+ g_mime_decrypt_result_get_mdc@Base 3.0.0
+ g_mime_decrypt_result_get_recipients@Base 3.0.0
+ g_mime_decrypt_result_get_session_key@Base 3.0.0
+ g_mime_decrypt_result_get_signatures@Base 3.0.0
+ g_mime_decrypt_result_get_type@Base 3.0.0
+ g_mime_decrypt_result_new@Base 3.0.0
+ g_mime_decrypt_result_set_cipher@Base 3.0.0
+ g_mime_decrypt_result_set_mdc@Base 3.0.0
+ g_mime_decrypt_result_set_recipients@Base 3.0.0
+ g_mime_decrypt_result_set_session_key@Base 3.0.0
+ g_mime_decrypt_result_set_signatures@Base 3.0.0
+ g_mime_encoding_base64_decode_step@Base 3.0.0
+ g_mime_encoding_base64_encode_close@Base 3.0.0
+ g_mime_encoding_base64_encode_step@Base 3.0.0
+ g_mime_encoding_flush@Base 3.0.0
+ g_mime_encoding_init_decode@Base 3.0.0
+ g_mime_encoding_init_encode@Base 3.0.0
+ g_mime_encoding_outlen@Base 3.0.0
+ g_mime_encoding_quoted_decode_step@Base 3.0.0
+ g_mime_encoding_quoted_encode_close@Base 3.0.0
+ g_mime_encoding_quoted_encode_step@Base 3.0.0
+ g_mime_encoding_reset@Base 3.0.0
+ g_mime_encoding_step@Base 3.0.0
+ g_mime_encoding_uudecode_step@Base 3.0.0
+ g_mime_encoding_uuencode_close@Base 3.0.0
+ g_mime_encoding_uuencode_step@Base 3.0.0
+ g_mime_filter_backup@Base 3.0.0
+ g_mime_filter_basic_get_type@Base 3.0.0
+ g_mime_filter_basic_new@Base 3.0.0
+ g_mime_filter_best_charset@Base 3.0.0
+ g_mime_filter_best_encoding@Base 3.0.0
+ g_mime_filter_best_get_type@Base 3.0.0
+ g_mime_filter_best_new@Base 3.0.0
+ g_mime_filter_charset_get_type@Base 3.0.0
+ g_mime_filter_charset_new@Base 3.0.0
+ g_mime_filter_checksum_get_digest@Base 3.0.0
+ g_mime_filter_checksum_get_type@Base 3.0.0
+ g_mime_filter_checksum_new@Base 3.0.0
+ g_mime_filter_complete@Base 3.0.0
+ g_mime_filter_copy@Base 3.0.0
+ g_mime_filter_dos2unix_get_type@Base 3.0.0
+ g_mime_filter_dos2unix_new@Base 3.0.0
+ g_mime_filter_enriched_get_type@Base 3.0.0
+ g_mime_filter_enriched_new@Base 3.0.0
+ g_mime_filter_filter@Base 3.0.0
+ g_mime_filter_from_get_type@Base 3.0.0
+ g_mime_filter_from_new@Base 3.0.0
+ g_mime_filter_get_type@Base 3.0.0
+ g_mime_filter_gzip_get_type@Base 3.0.0
+ g_mime_filter_gzip_new@Base 3.0.0
+ g_mime_filter_html_get_type@Base 3.0.0
+ g_mime_filter_html_new@Base 3.0.0
+ g_mime_filter_reset@Base 3.0.0
+ g_mime_filter_set_size@Base 3.0.0
+ g_mime_filter_smtp_data_get_type@Base 3.0.0
+ g_mime_filter_smtp_data_new@Base 3.0.0
+ g_mime_filter_strip_get_type@Base 3.0.0
+ g_mime_filter_strip_new@Base 3.0.0
+ g_mime_filter_unix2dos_get_type@Base 3.0.0
+ g_mime_filter_unix2dos_new@Base 3.0.0
+ g_mime_filter_windows_get_type@Base 3.0.0
+ g_mime_filter_windows_is_windows_charset@Base 3.0.0
+ g_mime_filter_windows_new@Base 3.0.0
+ g_mime_filter_windows_real_charset@Base 3.0.0
+ g_mime_filter_yenc_get_crc@Base 3.0.0
+ g_mime_filter_yenc_get_pcrc@Base 3.0.0
+ g_mime_filter_yenc_get_type@Base 3.0.0
+ g_mime_filter_yenc_new@Base 3.0.0
+ g_mime_filter_yenc_set_crc@Base 3.0.0
+ g_mime_filter_yenc_set_state@Base 3.0.0
+ g_mime_format_options_add_hidden_header@Base 3.0.0
+ g_mime_format_options_clear_hidden_headers@Base 3.0.0
+ g_mime_format_options_clone@Base 3.0.0
+ g_mime_format_options_create_newline_filter@Base 3.0.0
+ g_mime_format_options_free@Base 3.0.0
+ g_mime_format_options_get_default@Base 3.0.0
+ g_mime_format_options_get_newline@Base 3.0.0
+ g_mime_format_options_get_newline_format@Base 3.0.0
+ g_mime_format_options_get_param_encoding_method@Base 3.0.0
+ g_mime_format_options_get_type@Base 3.0.0
+ g_mime_format_options_is_hidden_header@Base 3.0.0
+ g_mime_format_options_new@Base 3.0.0
+ g_mime_format_options_remove_hidden_header@Base 3.0.0
+ g_mime_format_options_set_newline_format@Base 3.0.0
+ g_mime_format_options_set_param_encoding_method@Base 3.0.0
+ g_mime_gpg_context_get_type@Base 3.0.0
+ g_mime_gpg_context_new@Base 3.0.0
+ g_mime_header_format_addrlist@Base 3.0.0
+ g_mime_header_format_content_disposition@Base 3.0.0
+ g_mime_header_format_content_type@Base 3.0.0
+ g_mime_header_format_default@Base 3.0.0
+ g_mime_header_format_message_id@Base 3.0.0
+ g_mime_header_format_received@Base 3.0.0
+ g_mime_header_format_references@Base 3.0.0
+ g_mime_header_get_name@Base 3.0.0
+ g_mime_header_get_offset@Base 3.0.0
+ g_mime_header_get_raw_name@Base 3.0.0
+ g_mime_header_get_raw_value@Base 3.0.0
+ g_mime_header_get_type@Base 3.0.0
+ g_mime_header_get_value@Base 3.0.0
+ g_mime_header_list_append@Base 3.0.0
+ g_mime_header_list_clear@Base 3.0.0
+ g_mime_header_list_contains@Base 3.0.0
+ g_mime_header_list_get_count@Base 3.0.0
+ g_mime_header_list_get_header@Base 3.0.0
+ g_mime_header_list_get_header_at@Base 3.0.0
+ g_mime_header_list_get_type@Base 3.0.0
+ g_mime_header_list_new@Base 3.0.0
+ g_mime_header_list_prepend@Base 3.0.0
+ g_mime_header_list_remove@Base 3.0.0
+ g_mime_header_list_remove_at@Base 3.0.0
+ g_mime_header_list_set@Base 3.0.0
+ g_mime_header_list_to_string@Base 3.0.0
+ g_mime_header_list_write_to_stream@Base 3.0.0
+ g_mime_header_set_raw_value@Base 3.0.0
+ g_mime_header_set_value@Base 3.0.0
+ g_mime_header_write_to_stream@Base 3.0.0
+ g_mime_iconv_close@Base 3.0.0
+ g_mime_iconv_locale_to_utf8@Base 3.0.0
+ g_mime_iconv_locale_to_utf8_length@Base 3.0.0
+ g_mime_iconv_open@Base 3.0.0
+ g_mime_iconv_strdup@Base 3.0.0
+ g_mime_iconv_strndup@Base 3.0.0
+ g_mime_iconv_utf8_to_locale@Base 3.0.0
+ g_mime_iconv_utf8_to_locale_length@Base 3.0.0
+ g_mime_init@Base 3.0.0
+ g_mime_locale_charset@Base 3.0.0
+ g_mime_locale_language@Base 3.0.0
+ g_mime_message_add_mailbox@Base 3.0.0
+ g_mime_message_foreach@Base 3.0.0
+ g_mime_message_get_addresses@Base 3.0.0
+ g_mime_message_get_all_recipients@Base 3.0.0
+ g_mime_message_get_bcc@Base 3.0.0
+ g_mime_message_get_body@Base 3.0.0
+ g_mime_message_get_cc@Base 3.0.0
+ g_mime_message_get_date@Base 3.0.0
+ g_mime_message_get_from@Base 3.0.0
+ g_mime_message_get_message_id@Base 3.0.0
+ g_mime_message_get_mime_part@Base 3.0.0
+ g_mime_message_get_reply_to@Base 3.0.0
+ g_mime_message_get_sender@Base 3.0.0
+ g_mime_message_get_subject@Base 3.0.0
+ g_mime_message_get_to@Base 3.0.0
+ g_mime_message_get_type@Base 3.0.0
+ g_mime_message_new@Base 3.0.0
+ g_mime_message_part_get_message@Base 3.0.0
+ g_mime_message_part_get_type@Base 3.0.0
+ g_mime_message_part_new@Base 3.0.0
+ g_mime_message_part_new_with_message@Base 3.0.0
+ g_mime_message_part_set_message@Base 3.0.0
+ g_mime_message_partial_get_id@Base 3.0.0
+ g_mime_message_partial_get_number@Base 3.0.0
+ g_mime_message_partial_get_total@Base 3.0.0
+ g_mime_message_partial_get_type@Base 3.0.0
+ g_mime_message_partial_new@Base 3.0.0
+ g_mime_message_partial_reconstruct_message@Base 3.0.0
+ g_mime_message_partial_split_message@Base 3.0.0
+ g_mime_message_set_date@Base 3.0.0
+ g_mime_message_set_message_id@Base 3.0.0
+ g_mime_message_set_mime_part@Base 3.0.0
+ g_mime_message_set_subject@Base 3.0.0
+ g_mime_multipart_add@Base 3.0.0
+ g_mime_multipart_clear@Base 3.0.0
+ g_mime_multipart_contains@Base 3.0.0
+ g_mime_multipart_encrypted_decrypt@Base 3.0.0
+ g_mime_multipart_encrypted_encrypt@Base 3.0.0
+ g_mime_multipart_encrypted_get_type@Base 3.0.0
+ g_mime_multipart_encrypted_new@Base 3.0.0
+ g_mime_multipart_foreach@Base 3.0.0
+ g_mime_multipart_get_boundary@Base 3.0.0
+ g_mime_multipart_get_count@Base 3.0.0
+ g_mime_multipart_get_epilogue@Base 3.0.0
+ g_mime_multipart_get_part@Base 3.0.0
+ g_mime_multipart_get_prologue@Base 3.0.0
+ g_mime_multipart_get_subpart_from_content_id@Base 3.0.0
+ g_mime_multipart_get_type@Base 3.0.0
+ g_mime_multipart_index_of@Base 3.0.0
+ g_mime_multipart_insert@Base 3.0.0
+ g_mime_multipart_new@Base 3.0.0
+ g_mime_multipart_new_with_subtype@Base 3.0.0
+ g_mime_multipart_remove@Base 3.0.0
+ g_mime_multipart_remove_at@Base 3.0.0
+ g_mime_multipart_replace@Base 3.0.0
+ g_mime_multipart_set_boundary@Base 3.0.0
+ g_mime_multipart_set_epilogue@Base 3.0.0
+ g_mime_multipart_set_prologue@Base 3.0.0
+ g_mime_multipart_signed_get_type@Base 3.0.0
+ g_mime_multipart_signed_new@Base 3.0.0
+ g_mime_multipart_signed_sign@Base 3.0.0
+ g_mime_multipart_signed_verify@Base 3.0.0
+ g_mime_object_append_header@Base 3.0.0
+ g_mime_object_encode@Base 3.0.0
+ g_mime_object_get_content_disposition@Base 3.0.0
+ g_mime_object_get_content_disposition_parameter@Base 3.0.0
+ g_mime_object_get_content_id@Base 3.0.0
+ g_mime_object_get_content_type@Base 3.0.0
+ g_mime_object_get_content_type_parameter@Base 3.0.0
+ g_mime_object_get_disposition@Base 3.0.0
+ g_mime_object_get_header@Base 3.0.0
+ g_mime_object_get_header_list@Base 3.0.0
+ g_mime_object_get_headers@Base 3.0.0
+ g_mime_object_get_type@Base 3.0.0
+ g_mime_object_new@Base 3.0.0
+ g_mime_object_new_type@Base 3.0.0
+ g_mime_object_prepend_header@Base 3.0.0
+ g_mime_object_register_type@Base 3.0.0
+ g_mime_object_remove_header@Base 3.0.0
+ g_mime_object_set_content_disposition@Base 3.0.0
+ g_mime_object_set_content_disposition_parameter@Base 3.0.0
+ g_mime_object_set_content_id@Base 3.0.0
+ g_mime_object_set_content_type@Base 3.0.0
+ g_mime_object_set_content_type_parameter@Base 3.0.0
+ g_mime_object_set_disposition@Base 3.0.0
+ g_mime_object_set_header@Base 3.0.0
+ g_mime_object_to_string@Base 3.0.0
+ g_mime_object_write_to_stream@Base 3.0.0
+ g_mime_param_get_charset@Base 3.0.0
+ g_mime_param_get_encoding_method@Base 3.0.0
+ g_mime_param_get_lang@Base 3.0.0
+ g_mime_param_get_name@Base 3.0.0
+ g_mime_param_get_type@Base 3.0.0
+ g_mime_param_get_value@Base 3.0.0
+ g_mime_param_list_clear@Base 3.0.0
+ g_mime_param_list_encode@Base 3.0.0
+ g_mime_param_list_get_parameter@Base 3.0.0
+ g_mime_param_list_get_parameter_at@Base 3.0.0
+ g_mime_param_list_get_type@Base 3.0.0
+ g_mime_param_list_length@Base 3.0.0
+ g_mime_param_list_new@Base 3.0.0
+ g_mime_param_list_parse@Base 3.0.0
+ g_mime_param_list_remove@Base 3.0.0
+ g_mime_param_list_remove_at@Base 3.0.0
+ g_mime_param_list_set_parameter@Base 3.0.0
+ g_mime_param_set_charset@Base 3.0.0
+ g_mime_param_set_encoding_method@Base 3.0.0
+ g_mime_param_set_lang@Base 3.0.0
+ g_mime_param_set_value@Base 3.0.0
+ g_mime_parser_construct_message@Base 3.0.0
+ g_mime_parser_construct_part@Base 3.0.0
+ g_mime_parser_eos@Base 3.0.0
+ g_mime_parser_get_format@Base 3.0.0
+ g_mime_parser_get_headers_begin@Base 3.0.0
+ g_mime_parser_get_headers_end@Base 3.0.0
+ g_mime_parser_get_mbox_marker@Base 3.0.0
+ g_mime_parser_get_mbox_marker_offset@Base 3.0.0
+ g_mime_parser_get_persist_stream@Base 3.0.0
+ g_mime_parser_get_respect_content_length@Base 3.0.0
+ g_mime_parser_get_type@Base 3.0.0
+ g_mime_parser_init_with_stream@Base 3.0.0
+ g_mime_parser_new@Base 3.0.0
+ g_mime_parser_new_with_stream@Base 3.0.0
+ g_mime_parser_options_clone@Base 3.0.0
+ g_mime_parser_options_free@Base 3.0.0
+ g_mime_parser_options_get_address_compliance_mode@Base 3.0.0
+ g_mime_parser_options_get_allow_addresses_without_domain@Base 3.0.0
+ g_mime_parser_options_get_default@Base 3.0.0
+ g_mime_parser_options_get_fallback_charsets@Base 3.0.0
+ g_mime_parser_options_get_parameter_compliance_mode@Base 3.0.0
+ g_mime_parser_options_get_rfc2047_compliance_mode@Base 3.0.0
+ g_mime_parser_options_get_type@Base 3.0.0
+ g_mime_parser_options_new@Base 3.0.0
+ g_mime_parser_options_set_address_compliance_mode@Base 3.0.0
+ g_mime_parser_options_set_allow_addresses_without_domain@Base 3.0.0
+ g_mime_parser_options_set_fallback_charsets@Base 3.0.0
+ g_mime_parser_options_set_parameter_compliance_mode@Base 3.0.0
+ g_mime_parser_options_set_rfc2047_compliance_mode@Base 3.0.0
+ g_mime_parser_set_format@Base 3.0.0
+ g_mime_parser_set_header_regex@Base 3.0.0
+ g_mime_parser_set_persist_stream@Base 3.0.0
+ g_mime_parser_set_respect_content_length@Base 3.0.0
+ g_mime_parser_tell@Base 3.0.0
+ g_mime_part_get_best_content_encoding@Base 3.0.0
+ g_mime_part_get_content@Base 3.0.0
+ g_mime_part_get_content_description@Base 3.0.0
+ g_mime_part_get_content_encoding@Base 3.0.0
+ g_mime_part_get_content_id@Base 3.0.0
+ g_mime_part_get_content_location@Base 3.0.0
+ g_mime_part_get_content_md5@Base 3.0.0
+ g_mime_part_get_filename@Base 3.0.0
+ g_mime_part_get_openpgp_data@Base 3.0.0
+ g_mime_part_get_type@Base 3.0.0
+ g_mime_part_is_attachment@Base 3.0.0
+ g_mime_part_iter_clone@Base 3.0.0
+ g_mime_part_iter_free@Base 3.0.0
+ g_mime_part_iter_get_current@Base 3.0.0
+ g_mime_part_iter_get_parent@Base 3.0.0
+ g_mime_part_iter_get_path@Base 3.0.0
+ g_mime_part_iter_get_toplevel@Base 3.0.0
+ g_mime_part_iter_get_type@Base 3.0.0
+ g_mime_part_iter_is_valid@Base 3.0.0
+ g_mime_part_iter_jump_to@Base 3.0.0
+ g_mime_part_iter_new@Base 3.0.0
+ g_mime_part_iter_next@Base 3.0.0
+ g_mime_part_iter_prev@Base 3.0.0
+ g_mime_part_iter_remove@Base 3.0.0
+ g_mime_part_iter_replace@Base 3.0.0
+ g_mime_part_iter_reset@Base 3.0.0
+ g_mime_part_new@Base 3.0.0
+ g_mime_part_new_with_type@Base 3.0.0
+ g_mime_part_openpgp_decrypt@Base 3.0.0
+ g_mime_part_openpgp_encrypt@Base 3.0.0
+ g_mime_part_openpgp_sign@Base 3.0.0
+ g_mime_part_openpgp_verify@Base 3.0.0
+ g_mime_part_set_content@Base 3.0.0
+ g_mime_part_set_content_description@Base 3.0.0
+ g_mime_part_set_content_encoding@Base 3.0.0
+ g_mime_part_set_content_id@Base 3.0.0
+ g_mime_part_set_content_location@Base 3.0.0
+ g_mime_part_set_content_md5@Base 3.0.0
+ g_mime_part_set_filename@Base 3.0.0
+ g_mime_part_set_openpgp_data@Base 3.0.0
+ g_mime_part_verify_content_md5@Base 3.0.0
+ g_mime_pkcs7_context_get_type@Base 3.0.0
+ g_mime_pkcs7_context_new@Base 3.0.0
+ g_mime_references_append@Base 3.0.0
+ g_mime_references_clear@Base 3.0.0
+ g_mime_references_copy@Base 3.0.0
+ g_mime_references_free@Base 3.0.0
+ g_mime_references_get_message_id@Base 3.0.0
+ g_mime_references_get_type@Base 3.0.0
+ g_mime_references_length@Base 3.0.0
+ g_mime_references_new@Base 3.0.0
+ g_mime_references_parse@Base 3.0.0
+ g_mime_references_set_message_id@Base 3.0.0
+ g_mime_shutdown@Base 3.0.0
+ g_mime_signature_get_certificate@Base 3.0.0
+ g_mime_signature_get_created@Base 3.0.0
+ g_mime_signature_get_expires@Base 3.0.0
+ g_mime_signature_get_status@Base 3.0.0
+ g_mime_signature_get_type@Base 3.0.0
+ g_mime_signature_list_add@Base 3.0.0
+ g_mime_signature_list_clear@Base 3.0.0
+ g_mime_signature_list_contains@Base 3.0.0
+ g_mime_signature_list_get_signature@Base 3.0.0
+ g_mime_signature_list_get_type@Base 3.0.0
+ g_mime_signature_list_index_of@Base 3.0.0
+ g_mime_signature_list_insert@Base 3.0.0
+ g_mime_signature_list_length@Base 3.0.0
+ g_mime_signature_list_new@Base 3.0.0
+ g_mime_signature_list_remove@Base 3.0.0
+ g_mime_signature_list_remove_at@Base 3.0.0
+ g_mime_signature_list_set_signature@Base 3.0.0
+ g_mime_signature_new@Base 3.0.0
+ g_mime_signature_set_certificate@Base 3.0.0
+ g_mime_signature_set_created@Base 3.0.0
+ g_mime_signature_set_expires@Base 3.0.0
+ g_mime_signature_set_status@Base 3.0.0
+ g_mime_stream_buffer_get_type@Base 3.0.0
+ g_mime_stream_buffer_gets@Base 3.0.0
+ g_mime_stream_buffer_new@Base 3.0.0
+ g_mime_stream_buffer_readln@Base 3.0.0
+ g_mime_stream_cat_add_source@Base 3.0.0
+ g_mime_stream_cat_get_type@Base 3.0.0
+ g_mime_stream_cat_new@Base 3.0.0
+ g_mime_stream_close@Base 3.0.0
+ g_mime_stream_construct@Base 3.0.0
+ g_mime_stream_eos@Base 3.0.0
+ g_mime_stream_file_get_owner@Base 3.0.0
+ g_mime_stream_file_get_type@Base 3.0.0
+ g_mime_stream_file_new@Base 3.0.0
+ g_mime_stream_file_new_with_bounds@Base 3.0.0
+ g_mime_stream_file_open@Base 3.0.0
+ g_mime_stream_file_set_owner@Base 3.0.0
+ g_mime_stream_filter_add@Base 3.0.0
+ g_mime_stream_filter_get_owner@Base 3.0.0
+ g_mime_stream_filter_get_type@Base 3.0.0
+ g_mime_stream_filter_new@Base 3.0.0
+ g_mime_stream_filter_remove@Base 3.0.0
+ g_mime_stream_filter_set_owner@Base 3.0.0
+ g_mime_stream_flush@Base 3.0.0
+ g_mime_stream_fs_get_owner@Base 3.0.0
+ g_mime_stream_fs_get_type@Base 3.0.0
+ g_mime_stream_fs_new@Base 3.0.0
+ g_mime_stream_fs_new_with_bounds@Base 3.0.0
+ g_mime_stream_fs_open@Base 3.0.0
+ g_mime_stream_fs_set_owner@Base 3.0.0
+ g_mime_stream_get_type@Base 3.0.0
+ g_mime_stream_gio_get_owner@Base 3.0.0
+ g_mime_stream_gio_get_type@Base 3.0.0
+ g_mime_stream_gio_new@Base 3.0.0
+ g_mime_stream_gio_new_with_bounds@Base 3.0.0
+ g_mime_stream_gio_set_owner@Base 3.0.0
+ g_mime_stream_length@Base 3.0.0
+ g_mime_stream_mem_get_byte_array@Base 3.0.0
+ g_mime_stream_mem_get_owner@Base 3.0.0
+ g_mime_stream_mem_get_type@Base 3.0.0
+ g_mime_stream_mem_new@Base 3.0.0
+ g_mime_stream_mem_new_with_buffer@Base 3.0.0
+ g_mime_stream_mem_new_with_byte_array@Base 3.0.0
+ g_mime_stream_mem_set_byte_array@Base 3.0.0
+ g_mime_stream_mem_set_owner@Base 3.0.0
+ g_mime_stream_mmap_get_type@Base 3.0.0
+ g_mime_stream_mmap_new@Base 3.0.0
+ g_mime_stream_mmap_new_with_bounds@Base 3.0.0
+ g_mime_stream_null_count_newlines@Base 3.0.0
+ g_mime_stream_null_get_count_newlines@Base 3.0.0
+ g_mime_stream_null_get_type@Base 3.0.0
+ g_mime_stream_null_new@Base 3.0.0
+ g_mime_stream_pipe_get_owner@Base 3.0.0
+ g_mime_stream_pipe_get_type@Base 3.0.0
+ g_mime_stream_pipe_new@Base 3.0.0
+ g_mime_stream_pipe_set_owner@Base 3.0.0
+ g_mime_stream_printf@Base 3.0.0
+ g_mime_stream_read@Base 3.0.0
+ g_mime_stream_reset@Base 3.0.0
+ g_mime_stream_seek@Base 3.0.0
+ g_mime_stream_set_bounds@Base 3.0.0
+ g_mime_stream_substream@Base 3.0.0
+ g_mime_stream_tell@Base 3.0.0
+ g_mime_stream_write@Base 3.0.0
+ g_mime_stream_write_string@Base 3.0.0
+ g_mime_stream_write_to_stream@Base 3.0.0
+ g_mime_stream_writev@Base 3.0.0
+ g_mime_text_part_get_charset@Base 3.0.0
+ g_mime_text_part_get_text@Base 3.0.0
+ g_mime_text_part_get_type@Base 3.0.0
+ g_mime_text_part_new@Base 3.0.0
+ g_mime_text_part_new_with_subtype@Base 3.0.0
+ g_mime_text_part_set_charset@Base 3.0.0
+ g_mime_text_part_set_text@Base 3.0.0
+ g_mime_utils_best_encoding@Base 3.0.0
+ g_mime_utils_decode_8bit@Base 3.0.0
+ g_mime_utils_decode_message_id@Base 3.0.0
+ g_mime_utils_generate_message_id@Base 3.0.0
+ g_mime_utils_header_decode_date@Base 3.0.0
+ g_mime_utils_header_decode_phrase@Base 3.0.0
+ g_mime_utils_header_decode_text@Base 3.0.0
+ g_mime_utils_header_encode_phrase@Base 3.0.0
+ g_mime_utils_header_encode_text@Base 3.0.0
+ g_mime_utils_header_format_date@Base 3.0.0
+ g_mime_utils_header_printf@Base 3.0.0
+ g_mime_utils_quote_string@Base 3.0.0
+ g_mime_utils_structured_header_fold@Base 3.0.0
+ g_mime_utils_text_is_8bit@Base 3.0.0
+ g_mime_utils_unquote_string@Base 3.0.0
+ g_mime_utils_unstructured_header_fold@Base 3.0.0
+ g_mime_ydecode_step@Base 3.0.0
+ g_mime_yencode_close@Base 3.0.0
+ g_mime_yencode_step@Base 3.0.0
+ g_trie_add@Base 3.0.0
+ g_trie_free@Base 3.0.0
+ g_trie_new@Base 3.0.0
+ g_trie_quick_search@Base 3.0.0
+ g_trie_search@Base 3.0.0
+ gmime_binary_age@Base 3.0.0
+ gmime_error_quark@Base 3.0.0
+ gmime_gpgme_error_quark@Base 3.0.0
+ gmime_interface_age@Base 3.0.0
+ gmime_major_version@Base 3.0.0
+ gmime_micro_version@Base 3.0.0
+ gmime_minor_version@Base 3.0.0
+ internet_address_get_charset@Base 3.0.0
+ internet_address_get_name@Base 3.0.0
+ internet_address_get_type@Base 3.0.0
+ internet_address_group_add_member@Base 3.0.0
+ internet_address_group_get_members@Base 3.0.0
+ internet_address_group_get_type@Base 3.0.0
+ internet_address_group_new@Base 3.0.0
+ internet_address_group_set_members@Base 3.0.0
+ internet_address_list_add@Base 3.0.0
+ internet_address_list_append@Base 3.0.0
+ internet_address_list_clear@Base 3.0.0
+ internet_address_list_contains@Base 3.0.0
+ internet_address_list_encode@Base 3.0.0
+ internet_address_list_get_address@Base 3.0.0
+ internet_address_list_get_type@Base 3.0.0
+ internet_address_list_index_of@Base 3.0.0
+ internet_address_list_insert@Base 3.0.0
+ internet_address_list_length@Base 3.0.0
+ internet_address_list_new@Base 3.0.0
+ internet_address_list_parse@Base 3.0.0
+ internet_address_list_prepend@Base 3.0.0
+ internet_address_list_remove@Base 3.0.0
+ internet_address_list_remove_at@Base 3.0.0
+ internet_address_list_set_address@Base 3.0.0
+ internet_address_list_to_string@Base 3.0.0
+ internet_address_mailbox_get_addr@Base 3.0.0
+ internet_address_mailbox_get_idn_addr@Base 3.0.0
+ internet_address_mailbox_get_type@Base 3.0.0
+ internet_address_mailbox_new@Base 3.0.0
+ internet_address_mailbox_set_addr@Base 3.0.0
+ internet_address_set_charset@Base 3.0.0
+ internet_address_set_name@Base 3.0.0
+ internet_address_to_string@Base 3.0.0
diff -Nru gmime-2.6.22+dfsg2/debian/libgmime-3.0-dev.docs gmime-3.0.1/debian/libgmime-3.0-dev.docs
--- gmime-2.6.22+dfsg2/debian/libgmime-3.0-dev.docs	1970-01-01 00:00:00.000000000 +0000
+++ gmime-3.0.1/debian/libgmime-3.0-dev.docs	2017-07-27 18:14:17.000000000 +0000
@@ -0,0 +1,3 @@
+AUTHORS
+README
+TODO
diff -Nru gmime-2.6.22+dfsg2/debian/libgmime-3.0-dev.install gmime-3.0.1/debian/libgmime-3.0-dev.install
--- gmime-2.6.22+dfsg2/debian/libgmime-3.0-dev.install	1970-01-01 00:00:00.000000000 +0000
+++ gmime-3.0.1/debian/libgmime-3.0-dev.install	2017-07-27 18:14:17.000000000 +0000
@@ -0,0 +1,6 @@
+usr/include/
+usr/lib/*/libgmime-3.0.a
+usr/lib/*/libgmime-3.0.so
+usr/lib/*/pkgconfig/gmime-3.0.pc
+usr/share/gir-1.0/GMime-3.0.gir
+usr/share/vala/vapi/*
diff -Nru gmime-2.6.22+dfsg2/debian/libgmime-3.0-doc.doc-base gmime-3.0.1/debian/libgmime-3.0-doc.doc-base
--- gmime-2.6.22+dfsg2/debian/libgmime-3.0-doc.doc-base	1970-01-01 00:00:00.000000000 +0000
+++ gmime-3.0.1/debian/libgmime-3.0-doc.doc-base	2017-07-27 18:14:17.000000000 +0000
@@ -0,0 +1,9 @@
+Document: gmime3.0
+Title: GMime Library Reference Manual
+Author: Jeffrey Stedfast
+Abstract: This is the programming reference for GMime.
+Section: Programming
+
+Format: HTML
+Index: /usr/share/doc/libgmime-3.0-doc/html/index.html
+Files: /usr/share/doc/libgmime-3.0-doc/html/*.html
diff -Nru gmime-2.6.22+dfsg2/debian/libgmime-3.0-doc.docs gmime-3.0.1/debian/libgmime-3.0-doc.docs
--- gmime-2.6.22+dfsg2/debian/libgmime-3.0-doc.docs	1970-01-01 00:00:00.000000000 +0000
+++ gmime-3.0.1/debian/libgmime-3.0-doc.docs	2017-07-27 18:14:17.000000000 +0000
@@ -0,0 +1,4 @@
+AUTHORS
+PORTING
+README
+TODO
diff -Nru gmime-2.6.22+dfsg2/debian/libgmime-3.0-doc.examples gmime-3.0.1/debian/libgmime-3.0-doc.examples
--- gmime-2.6.22+dfsg2/debian/libgmime-3.0-doc.examples	1970-01-01 00:00:00.000000000 +0000
+++ gmime-3.0.1/debian/libgmime-3.0-doc.examples	2017-07-27 18:14:17.000000000 +0000
@@ -0,0 +1,4 @@
+examples/*.c
+examples/Makefile.am
+examples/Makefile.in
+examples/README
diff -Nru gmime-2.6.22+dfsg2/debian/libgmime-3.0-doc.install gmime-3.0.1/debian/libgmime-3.0-doc.install
--- gmime-2.6.22+dfsg2/debian/libgmime-3.0-doc.install	1970-01-01 00:00:00.000000000 +0000
+++ gmime-3.0.1/debian/libgmime-3.0-doc.install	2017-07-27 18:14:17.000000000 +0000
@@ -0,0 +1 @@
+usr/share/gtk-doc/html/gmime-3.0/
diff -Nru gmime-2.6.22+dfsg2/debian/libgmime-3.0-doc.links gmime-3.0.1/debian/libgmime-3.0-doc.links
--- gmime-2.6.22+dfsg2/debian/libgmime-3.0-doc.links	1970-01-01 00:00:00.000000000 +0000
+++ gmime-3.0.1/debian/libgmime-3.0-doc.links	2017-07-27 18:14:17.000000000 +0000
@@ -0,0 +1 @@
+usr/share/gtk-doc/html/gmime-3.0 usr/share/doc/libgmime-3.0-doc/html
diff -Nru gmime-2.6.22+dfsg2/debian/monodoc-gmime2.6-manual.install gmime-3.0.1/debian/monodoc-gmime2.6-manual.install
--- gmime-2.6.22+dfsg2/debian/monodoc-gmime2.6-manual.install	2017-04-28 17:51:48.000000000 +0000
+++ gmime-3.0.1/debian/monodoc-gmime2.6-manual.install	1970-01-01 00:00:00.000000000 +0000
@@ -1,3 +0,0 @@
-debian/gmime-sharp-2.6.source	/usr/lib/monodoc/sources/
-mono/gmime-sharp-2.6.tree	/usr/lib/monodoc/sources/
-mono/gmime-sharp-2.6.zip	/usr/lib/monodoc/sources/
diff -Nru gmime-2.6.22+dfsg2/debian/patches/0001-Fixed-g_mime_part_set_encoding-when-encoding-is-DEFA.patch gmime-3.0.1/debian/patches/0001-Fixed-g_mime_part_set_encoding-when-encoding-is-DEFA.patch
--- gmime-2.6.22+dfsg2/debian/patches/0001-Fixed-g_mime_part_set_encoding-when-encoding-is-DEFA.patch	1970-01-01 00:00:00.000000000 +0000
+++ gmime-3.0.1/debian/patches/0001-Fixed-g_mime_part_set_encoding-when-encoding-is-DEFA.patch	2017-07-27 18:15:20.000000000 +0000
@@ -0,0 +1,33 @@
+From: Jeffrey Stedfast 
+Date: Thu, 22 Jun 2017 12:58:07 -0400
+Subject: Fixed g_mime_part_set_encoding when encoding is DEFAULT
+
+When the encoding is DEFAULT, the string value is NULL which
+was causing g_mime_header_list_set() to abort.
+
+Instead, what this code needs to do is call g_mime_header_list_remove()
+in that case.
+
+Thanks to Peter Bloomfield of Balsa fame for spotting this issue.
+
+(cherry picked from commit c37d462dab3199cf7cb6df535b78e134ce7f8486)
+---
+ gmime/gmime-part.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/gmime/gmime-part.c b/gmime/gmime-part.c
+index 520a490..677bc98 100644
+--- a/gmime/gmime-part.c
++++ b/gmime/gmime-part.c
+@@ -788,7 +788,10 @@ g_mime_part_set_content_encoding (GMimePart *mime_part, GMimeContentEncoding enc
+ 	mime_part->encoding = encoding;
+ 	
+ 	_g_mime_object_block_header_list_changed (object);
+-	g_mime_header_list_set (object->headers, "Content-Transfer-Encoding", value, NULL);
++	if (value != NULL)
++		g_mime_header_list_set (object->headers, "Content-Transfer-Encoding", value, NULL);
++	else
++		g_mime_header_list_remove (object->headers, "Content-Transfer-Encoding");
+ 	_g_mime_object_block_header_list_changed (object);
+ }
+ 
diff -Nru gmime-2.6.22+dfsg2/debian/patches/0002-Improved-docs.patch gmime-3.0.1/debian/patches/0002-Improved-docs.patch
--- gmime-2.6.22+dfsg2/debian/patches/0002-Improved-docs.patch	1970-01-01 00:00:00.000000000 +0000
+++ gmime-3.0.1/debian/patches/0002-Improved-docs.patch	2017-07-27 18:15:20.000000000 +0000
@@ -0,0 +1,34 @@
+From: Jeffrey Stedfast 
+Date: Sun, 25 Jun 2017 21:15:44 -0400
+Subject: Improved docs
+
+(cherry picked from commit 8243349ff23fdbe43e9db1d01f761562c94e4ce3)
+---
+ gmime/gmime-header.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/gmime/gmime-header.c b/gmime/gmime-header.c
+index dec71fa..df6a961 100644
+--- a/gmime/gmime-header.c
++++ b/gmime/gmime-header.c
+@@ -244,9 +244,9 @@ unfold (const char *value)
+  * g_mime_header_get_value:
+  * @header: a #GMimeHeader
+  *
+- * Gets the header's value.
++ * Gets the header's unfolded value.
+  *
+- * Returns: the header's raw, unprocessed value or %NULL if invalid.
++ * Returns: the header's unfolded value or %NULL if invalid.
+  *
+  * Note: The returned value should be decoded with a function such as
+  * g_mime_utils_header_decode_text() before displaying to the user.
+@@ -275,7 +275,7 @@ g_mime_header_get_value (GMimeHeader *header)
+  * @value: the new header value
+  * @charset: a charset
+  *
+- * Sets the header's value.
++ * Sets the header's (unfolded) value.
+  **/
+ void
+ g_mime_header_set_value (GMimeHeader *header, GMimeFormatOptions *options, const char *value, const char *charset)
diff -Nru gmime-2.6.22+dfsg2/debian/patches/0002-Rename-g_mime_decryption_result_-to-g_mime_decrypt_r.patch gmime-3.0.1/debian/patches/0002-Rename-g_mime_decryption_result_-to-g_mime_decrypt_r.patch
--- gmime-2.6.22+dfsg2/debian/patches/0002-Rename-g_mime_decryption_result_-to-g_mime_decrypt_r.patch	2017-04-28 17:51:48.000000000 +0000
+++ gmime-3.0.1/debian/patches/0002-Rename-g_mime_decryption_result_-to-g_mime_decrypt_r.patch	1970-01-01 00:00:00.000000000 +0000
@@ -1,59 +0,0 @@
-From: Daniel Kahn Gillmor 
-Date: Tue, 17 Jan 2017 07:51:49 -0500
-Subject: Rename g_mime_decryption_result_* to g_mime_decrypt_result_*
-
-Two functions appear to have been misnamed in gmime-crypto-context.c:
-g_mime_decryption_result_get_mdc and
-g_mime_decryption_result_get_session_key.  They should have been named
-with a prefix of g_mime_decrypt_, not g_mime_decryption_ :(
-
-Correcting this is technically an ABI change, but i don't think it
-matters: the wrong function names never ended up in any .h files, so i
-don't think anyone could have reliably used them.  A search of all of
-debian shows no uses outside of the declaration in gmime itself:
-
-   https://codesearch.debian.net/search?q=g_mime_decryption_result
-
-At any rate, i've retained the old/misnamed functions as an alias to
-the correctly-named functions to technically keep the ABI intact,
-while actually supporting the declared functionality.
----
- gmime/gmime-crypto-context.c | 16 ++++++++++++++--
- 1 file changed, 14 insertions(+), 2 deletions(-)
-
-diff --git a/gmime/gmime-crypto-context.c b/gmime/gmime-crypto-context.c
-index 2ae77c61..decba176 100644
---- a/gmime/gmime-crypto-context.c
-+++ b/gmime/gmime-crypto-context.c
-@@ -893,7 +893,7 @@ g_mime_decrypt_result_set_mdc (GMimeDecryptResult *result, GMimeDigestAlgo mdc)
-  * Returns: the mdc digest algorithm used.
-  **/
- GMimeDigestAlgo
--g_mime_decryption_result_get_mdc (GMimeDecryptResult *result)
-+g_mime_decrypt_result_get_mdc (GMimeDecryptResult *result)
- {
- 	g_return_val_if_fail (GMIME_IS_DECRYPT_RESULT (result), GMIME_DIGEST_ALGO_DEFAULT);
- 	
-@@ -935,9 +935,21 @@ g_mime_decrypt_result_set_session_key (GMimeDecryptResult *result, const char *s
-  * session key was requested or found.
-  **/
- const char *
--g_mime_decryption_result_get_session_key (GMimeDecryptResult *result)
-+g_mime_decrypt_result_get_session_key (GMimeDecryptResult *result)
- {
- 	g_return_val_if_fail (GMIME_IS_DECRYPT_RESULT (result), NULL);
- 	
- 	return result->session_key;
- }
-+
-+/* DEPRECATED, for ABI-compatibility with pre-2.6.22 only */
-+const char *
-+g_mime_decryption_result_get_session_key (GMimeDecryptResult *result)
-+{
-+	return g_mime_decrypt_result_get_session_key (result);
-+}
-+GMimeDigestAlgo
-+g_mime_decryption_result_get_mdc (GMimeDecryptResult *result)
-+{
-+	return g_mime_decrypt_result_get_mdc (result);
-+}
diff -Nru gmime-2.6.22+dfsg2/debian/patches/0003-Reduced-unnecessary-allocation.patch gmime-3.0.1/debian/patches/0003-Reduced-unnecessary-allocation.patch
--- gmime-2.6.22+dfsg2/debian/patches/0003-Reduced-unnecessary-allocation.patch	1970-01-01 00:00:00.000000000 +0000
+++ gmime-3.0.1/debian/patches/0003-Reduced-unnecessary-allocation.patch	2017-07-27 18:15:20.000000000 +0000
@@ -0,0 +1,28 @@
+From: Jeffrey Stedfast 
+Date: Sun, 25 Jun 2017 21:24:05 -0400
+Subject: Reduced unnecessary allocation
+
+(cherry picked from commit 53170eed215901c3de3f4ea71575f0556dba4b21)
+---
+ gmime/gmime-utils.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/gmime/gmime-utils.c b/gmime/gmime-utils.c
+index bbf1d57..2742e1b 100644
+--- a/gmime/gmime-utils.c
++++ b/gmime/gmime-utils.c
+@@ -2466,11 +2466,13 @@ header_fold_tokens (GMimeFormatOptions *options, const char *field, const char *
+ 	GString *output;
+ 	
+ 	len = strlen (field) + 2;
+-	output = g_string_sized_new (len + vlen + 1);
++	
+ 	if (include_field) {
++		output = g_string_sized_new (len + vlen + 1);
+ 		g_string_append (output, field);
+ 		g_string_append (output, ": ");
+ 	} else {
++		output = g_string_sized_new (vlen + 2);
+ 		g_string_append_c (output, ' ');
+ 	}
+ 	lwsp = 0;
diff -Nru gmime-2.6.22+dfsg2/debian/patches/0004-Fixed-docs-thanks-to-Peter-Bloomfield-s-critical-eye.patch gmime-3.0.1/debian/patches/0004-Fixed-docs-thanks-to-Peter-Bloomfield-s-critical-eye.patch
--- gmime-2.6.22+dfsg2/debian/patches/0004-Fixed-docs-thanks-to-Peter-Bloomfield-s-critical-eye.patch	1970-01-01 00:00:00.000000000 +0000
+++ gmime-3.0.1/debian/patches/0004-Fixed-docs-thanks-to-Peter-Bloomfield-s-critical-eye.patch	2017-07-27 18:15:20.000000000 +0000
@@ -0,0 +1,34 @@
+From: Jeffrey Stedfast 
+Date: Mon, 26 Jun 2017 09:17:31 -0400
+Subject: Fixed docs thanks to Peter Bloomfield's critical eye ;)
+
+(cherry picked from commit 893b51cd32533325e44b0dec47ff63025897d99f)
+---
+ gmime/gmime-header.c | 7 ++-----
+ 1 file changed, 2 insertions(+), 5 deletions(-)
+
+diff --git a/gmime/gmime-header.c b/gmime/gmime-header.c
+index df6a961..2333e81 100644
+--- a/gmime/gmime-header.c
++++ b/gmime/gmime-header.c
+@@ -246,10 +246,7 @@ unfold (const char *value)
+  *
+  * Gets the header's unfolded value.
+  *
+- * Returns: the header's unfolded value or %NULL if invalid.
+- *
+- * Note: The returned value should be decoded with a function such as
+- * g_mime_utils_header_decode_text() before displaying to the user.
++ * Returns: the header's decoded value or %NULL if invalid.
+  **/
+ const char *
+ g_mime_header_get_value (GMimeHeader *header)
+@@ -275,7 +272,7 @@ g_mime_header_get_value (GMimeHeader *header)
+  * @value: the new header value
+  * @charset: a charset
+  *
+- * Sets the header's (unfolded) value.
++ * Sets the header's decoded value.
+  **/
+ void
+ g_mime_header_set_value (GMimeHeader *header, GMimeFormatOptions *options, const char *value, const char *charset)
diff -Nru gmime-2.6.22+dfsg2/debian/patches/0005-Updated-gmime-part-encode-method-to-force-7bit-and-8.patch gmime-3.0.1/debian/patches/0005-Updated-gmime-part-encode-method-to-force-7bit-and-8.patch
--- gmime-2.6.22+dfsg2/debian/patches/0005-Updated-gmime-part-encode-method-to-force-7bit-and-8.patch	1970-01-01 00:00:00.000000000 +0000
+++ gmime-3.0.1/debian/patches/0005-Updated-gmime-part-encode-method-to-force-7bit-and-8.patch	2017-07-27 18:15:20.000000000 +0000
@@ -0,0 +1,70 @@
+From: Jeffrey Stedfast 
+Date: Mon, 10 Jul 2017 14:55:20 -0400
+Subject: Updated gmime-part encode() method to force 7bit and 8bit to qp if
+ they contain from-lines
+
+(cherry picked from commit 1a0b2abdf9629d95f738a245107466875b3603be)
+---
+ gmime/gmime-part.c | 35 ++++++++++++++++++++++-------------
+ 1 file changed, 22 insertions(+), 13 deletions(-)
+
+diff --git a/gmime/gmime-part.c b/gmime/gmime-part.c
+index 677bc98..ffa6c68 100644
+--- a/gmime/gmime-part.c
++++ b/gmime/gmime-part.c
+@@ -432,18 +432,6 @@ mime_part_encode (GMimeObject *object, GMimeEncodingConstraint constraint)
+ 	GMimeFilter *filter;
+ 	
+ 	switch (part->encoding) {
+-	case GMIME_CONTENT_ENCODING_DEFAULT:
+-		/* Unspecified encoding, we need to figure out the
+-		 * best encoding no matter what */
+-		break;
+-	case GMIME_CONTENT_ENCODING_7BIT:
+-		/* This encoding is always safe. */
+-		return;
+-	case GMIME_CONTENT_ENCODING_8BIT:
+-		/* This encoding is safe unless the constraint is 7bit. */
+-		if (constraint != GMIME_ENCODING_CONSTRAINT_7BIT)
+-			return;
+-		break;
+ 	case GMIME_CONTENT_ENCODING_BINARY:
+ 		/* This encoding is only safe if the constraint is binary. */
+ 		if (constraint == GMIME_ENCODING_CONSTRAINT_BINARY)
+@@ -454,6 +442,8 @@ mime_part_encode (GMimeObject *object, GMimeEncodingConstraint constraint)
+ 	case GMIME_CONTENT_ENCODING_UUENCODE:
+ 		/* These encodings are always safe. */
+ 		return;
++	default:
++		break;
+ 	}
+ 	
+ 	filter = g_mime_filter_best_new (GMIME_FILTER_BEST_ENCODING);
+@@ -467,7 +457,26 @@ mime_part_encode (GMimeObject *object, GMimeEncodingConstraint constraint)
+ 	g_object_unref (stream);
+ 	
+ 	encoding = g_mime_filter_best_encoding ((GMimeFilterBest *) filter, constraint);
+-	g_mime_part_set_content_encoding (part, encoding);
++	
++	switch (part->encoding) {
++	case GMIME_CONTENT_ENCODING_DEFAULT:
++		g_mime_part_set_content_encoding (part, encoding);
++		break;
++	case GMIME_CONTENT_ENCODING_7BIT:
++		/* This encoding is generally safe, but we may need to encode From-lines. */
++		if (((GMimeFilterBest *) filter)->hadfrom)
++			g_mime_part_set_content_encoding (part, GMIME_ENCODING_QUOTED_PRINTABLE);
++		break;
++	case GMIME_CONTENT_ENCODING_8BIT:
++		if (constraint == GMIME_ENCODING_CONSTRAINT_7BIT)
++			g_mime_part_set_content_encoding (part, encoding);
++		else if (((GMimeFilterBest *) filter)->hadfrom)
++			g_mime_part_set_content_encoding (part, GMIME_ENCODING_QUOTED_PRINTABLE);
++		break;
++	default:
++		break;
++	}
++	
+ 	g_object_unref (filter);
+ }
+ 
diff -Nru gmime-2.6.22+dfsg2/debian/patches/0006-Fixed-typo.patch gmime-3.0.1/debian/patches/0006-Fixed-typo.patch
--- gmime-2.6.22+dfsg2/debian/patches/0006-Fixed-typo.patch	1970-01-01 00:00:00.000000000 +0000
+++ gmime-3.0.1/debian/patches/0006-Fixed-typo.patch	2017-07-27 18:15:20.000000000 +0000
@@ -0,0 +1,29 @@
+From: Jeffrey Stedfast 
+Date: Mon, 10 Jul 2017 14:59:50 -0400
+Subject: Fixed typo
+
+(cherry picked from commit 5a586bc4432f18682bb64eeba3c6d790cc0534a1)
+---
+ gmime/gmime-part.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/gmime/gmime-part.c b/gmime/gmime-part.c
+index ffa6c68..2177edb 100644
+--- a/gmime/gmime-part.c
++++ b/gmime/gmime-part.c
+@@ -465,13 +465,13 @@ mime_part_encode (GMimeObject *object, GMimeEncodingConstraint constraint)
+ 	case GMIME_CONTENT_ENCODING_7BIT:
+ 		/* This encoding is generally safe, but we may need to encode From-lines. */
+ 		if (((GMimeFilterBest *) filter)->hadfrom)
+-			g_mime_part_set_content_encoding (part, GMIME_ENCODING_QUOTED_PRINTABLE);
++			g_mime_part_set_content_encoding (part, GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE);
+ 		break;
+ 	case GMIME_CONTENT_ENCODING_8BIT:
+ 		if (constraint == GMIME_ENCODING_CONSTRAINT_7BIT)
+ 			g_mime_part_set_content_encoding (part, encoding);
+ 		else if (((GMimeFilterBest *) filter)->hadfrom)
+-			g_mime_part_set_content_encoding (part, GMIME_ENCODING_QUOTED_PRINTABLE);
++			g_mime_part_set_content_encoding (part, GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE);
+ 		break;
+ 	default:
+ 		break;
diff -Nru gmime-2.6.22+dfsg2/debian/patches/0007-spelling-cleanup.patch gmime-3.0.1/debian/patches/0007-spelling-cleanup.patch
--- gmime-2.6.22+dfsg2/debian/patches/0007-spelling-cleanup.patch	1970-01-01 00:00:00.000000000 +0000
+++ gmime-3.0.1/debian/patches/0007-spelling-cleanup.patch	2017-07-27 18:15:20.000000000 +0000
@@ -0,0 +1,298 @@
+From: Daniel Kahn Gillmor 
+Date: Thu, 13 Jul 2017 08:56:38 +0200
+Subject: spelling cleanup
+
+(cherry picked from commit f1f240ef0b281c71943bea2e56e857b928560876)
+---
+ PORTING                              |  4 ++--
+ docs/reference/building.sgml         |  2 +-
+ docs/reference/streams.sgml          |  2 +-
+ docs/tutorial/gmime-tut.sgml         |  4 ++--
+ examples/basic-example.c             |  2 +-
+ gmime/charset-map.c                  |  2 +-
+ gmime/gmime-application-pkcs7-mime.c | 10 +++++-----
+ gmime/gmime-charset.c                |  2 +-
+ gmime/gmime-crypto-context.c         |  2 +-
+ gmime/gmime-filter.c                 |  2 +-
+ gmime/gmime-message.c                |  2 +-
+ gmime/gmime-multipart-encrypted.c    |  6 +++---
+ gmime/gmime-multipart-signed.c       |  4 ++--
+ gmime/gmime-utils.c                  |  2 +-
+ util/url-scanner.c                   |  2 +-
+ 15 files changed, 24 insertions(+), 24 deletions(-)
+
+diff --git a/PORTING b/PORTING
+index 80de6d9..d491dcb 100644
+--- a/PORTING
++++ b/PORTING
+@@ -1,6 +1,6 @@
+ It is my intention to make migrating code using one version of GMime
+ to another as easy as I can and so for the most part, I will try not
+-to break API/ABI compatability between versions, however this isn't
++to break API/ABI compatibility between versions, however this isn't
+ always easy to do.
+ 
+ This document is intended to help developers port their application(s)
+@@ -104,7 +104,7 @@ Porting from GMime 2.6 to GMime 3.0
+   detach argument.
+ 
+ - g_mime_crypto_context_decrypt_session() has been merged with
+-  g_mime_crypto_context_decrypt() and so the decryot method now takes a session_key
++  g_mime_crypto_context_decrypt() and so the decrypt method now takes a session_key
+   argument that is allowed to be NULL.
+ 
+ - g_mime_crypto_context_verify() no longer takes a 'digest' argument.
+diff --git a/docs/reference/building.sgml b/docs/reference/building.sgml
+index 2cf25f5..712d36f 100644
+--- a/docs/reference/building.sgml
++++ b/docs/reference/building.sgml
+@@ -155,7 +155,7 @@
+       
+     
+     
+-      GMime depends on the existance of two (2) libraries: GLib and iconv.
++      GMime depends on the existence of two (2) libraries: GLib and iconv.
+     
+     
+       
+diff --git a/docs/reference/streams.sgml b/docs/reference/streams.sgml
+index f3ae793..88c39fc 100644
+--- a/docs/reference/streams.sgml
++++ b/docs/reference/streams.sgml
+@@ -49,7 +49,7 @@
+     GMimeObject (for example) will require.
+ 
+     GMimeStreamMmap is a memory-mapped stream. This isn't
+-    guarenteed to work on all systems since not all systems support
++    guaranteed to work on all systems since not all systems support
+     the POSIX mmap system call, but for those that do - this might
+     present a faster stream than GMimeStreamFs and/or
+     GMimeStreamFile. You'll have to do some experimentation to know
+diff --git a/docs/tutorial/gmime-tut.sgml b/docs/tutorial/gmime-tut.sgml
+index bfde37c..52a5226 100644
+--- a/docs/tutorial/gmime-tut.sgml
++++ b/docs/tutorial/gmime-tut.sgml
+@@ -119,7 +119,7 @@ url="http://library.gnome.org/devel/gmime/stable/gmime-building.html">http://lib
+       
+       Before we get too deep into using GMime, it is important
+       to understand how to use the underlying I/O classes since GMime
+-      is so very heavily dependant upon them.
++      is so very heavily dependent upon them.
+       
+       If you've looked at the API at all already, you will have
+       probably noticed that the stream functions work very much like
+@@ -547,7 +547,7 @@ void    g_mime_stream_buffer_readln (GMimeStream *stream, GByteArray *buffer);
+       
+       GMimeFilterUnix2Dos will likely become very useful to you if
+       you are implementing any internet standards or DOS/UNIX
+-      compatability. This filter is meant for converting line endings
++      compatibility. This filter is meant for converting line endings
+       from the traditional UNIX sequence (LF) to the internet standard
+       (and DOS) sequence. There's also a GMimeFilterDos2Unix to perform
+       the opposite conversion.
+diff --git a/examples/basic-example.c b/examples/basic-example.c
+index cdfc91a..87f8649 100644
+--- a/examples/basic-example.c
++++ b/examples/basic-example.c
+@@ -148,7 +148,7 @@ verify_foreach_callback (GMimeObject *parent, GMimeObject *part, gpointer user_d
+ 		int i;
+ 		
+ 		if (!(signatures = g_mime_multipart_signed_verify (mps, GMIME_VERIFY_NONE, &err))) {
+-			/* an error occured - probably couldn't start gpg? */
++			/* an error occurred - probably couldn't start gpg? */
+ 			
+ 			/* for more information about GError, see:
+ 			 * http://developer.gnome.org/doc/API/2.0/glib/glib-Error-Reporting.html
+diff --git a/gmime/charset-map.c b/gmime/charset-map.c
+index f616d45..a610914 100644
+--- a/gmime/charset-map.c
++++ b/gmime/charset-map.c
+@@ -120,7 +120,7 @@ int main (int argc, char **argv)
+ 	int bytes;
+ 	int j, k;
+ 	
+-	/* dont count the terminator */
++	/* don't count the terminator */
+ 	bytes = ((sizeof (tables) / sizeof (tables[0])) + 7 - 1) / 8;
+ 	g_assert (bytes <= 4);
+ 	
+diff --git a/gmime/gmime-application-pkcs7-mime.c b/gmime/gmime-application-pkcs7-mime.c
+index 74db382..a404326 100644
+--- a/gmime/gmime-application-pkcs7-mime.c
++++ b/gmime/gmime-application-pkcs7-mime.c
+@@ -226,7 +226,7 @@ g_mime_application_pkcs7_mime_decompress (GMimeApplicationPkcs7Mime *pkcs7_mime,
+  *
+  * Returns: (nullable) (transfer full): a new #GMimeApplicationPkcs7Mime object on success
+  * or %NULL on fail. If encrypting fails, an exception will be set on @err to provide
+- * information as to why the failure occured.
++ * information as to why the failure occurred.
+  **/
+ GMimeApplicationPkcs7Mime *
+ g_mime_application_pkcs7_mime_encrypt (GMimeObject *entity, GMimeEncryptFlags flags, GPtrArray *recipients, GError **err)
+@@ -296,7 +296,7 @@ g_mime_application_pkcs7_mime_encrypt (GMimeObject *entity, GMimeEncryptFlags fl
+  *
+  * When non-%NULL, @session_key should be a %NULL-terminated string,
+  * such as the one returned by g_mime_decrypt_result_get_session_key()
+- * from a previous decryption. If the @sesion_key is not valid, decryption
++ * from a previous decryption. If the @session_key is not valid, decryption
+  * will fail.
+  *
+  * If @result is non-%NULL, then on a successful decrypt operation, it will be
+@@ -306,7 +306,7 @@ g_mime_application_pkcs7_mime_encrypt (GMimeObject *entity, GMimeEncryptFlags fl
+  *
+  * Returns: (nullable) (transfer full): the decrypted MIME part on success or
+  * %NULL on fail. If the decryption fails, an exception will be set on
+- * @err to provide information as to why the failure occured.
++ * @err to provide information as to why the failure occurred.
+  **/
+ GMimeObject *
+ g_mime_application_pkcs7_mime_decrypt (GMimeApplicationPkcs7Mime *pkcs7_mime,
+@@ -397,7 +397,7 @@ g_mime_application_pkcs7_mime_decrypt (GMimeApplicationPkcs7Mime *pkcs7_mime,
+  *
+  * Returns: (nullable) (transfer full): a new #GMimeApplicationPkcs7Mime object on success
+  * or %NULL on fail. If signing fails, an exception will be set on @err to provide
+- * information as to why the failure occured.
++ * information as to why the failure occurred.
+  **/
+ GMimeApplicationPkcs7Mime *
+ g_mime_application_pkcs7_mime_sign (GMimeObject *entity, const char *userid, GError **err)
+@@ -468,7 +468,7 @@ g_mime_application_pkcs7_mime_sign (GMimeObject *entity, const char *userid, GEr
+  * Returns: (nullable) (transfer full): a new #GMimeSignatureList object on
+  * success or %NULL on fail. If the verification fails, an exception
+  * will be set on @err to provide information as to why the failure
+- * occured.
++ * occurred.
+  **/
+ GMimeSignatureList *
+ g_mime_application_pkcs7_mime_verify (GMimeApplicationPkcs7Mime *pkcs7_mime, GMimeVerifyFlags flags, GMimeObject **entity, GError **err)
+diff --git a/gmime/gmime-charset.c b/gmime/gmime-charset.c
+index e77bcb5..dac7090 100644
+--- a/gmime/gmime-charset.c
++++ b/gmime/gmime-charset.c
+@@ -103,7 +103,7 @@ static struct {
+ 	/* Note: according to http://www.iana.org/assignments/character-sets,
+ 	 * ks_c_5601-1987 should really map to ISO-2022-KR, but the EUC-KR
+ 	 * mapping was given to me via a native Korean user, so I'm not sure
+-	 * if I should change this... perhaps they are compatable? */
++	 * if I should change this... perhaps they are compatible? */
+ 	{ "ks_c_5601-1987",  "EUC-KR"     },
+ 	{ "5601",            "EUC-KR"     },
+ 	{ "ksc-5601",        "EUC-KR"     },
+diff --git a/gmime/gmime-crypto-context.c b/gmime/gmime-crypto-context.c
+index 16ca934..cb7364c 100644
+--- a/gmime/gmime-crypto-context.c
++++ b/gmime/gmime-crypto-context.c
+@@ -488,7 +488,7 @@ crypto_decrypt (GMimeCryptoContext *ctx, GMimeDecryptFlags flags, const char *se
+  *
+  * When non-%NULL, @session_key should be a %NULL-terminated string,
+  * such as the one returned by g_mime_decrypt_result_get_session_key()
+- * from a previous decryption. If the @sesion_key is not valid, decryption
++ * from a previous decryption. If the @session_key is not valid, decryption
+  * will fail.
+  *
+  * If the encrypted input stream was also signed, the returned
+diff --git a/gmime/gmime-filter.c b/gmime/gmime-filter.c
+index e43e470..121204d 100644
+--- a/gmime/gmime-filter.c
++++ b/gmime/gmime-filter.c
+@@ -170,7 +170,7 @@ filter_run (GMimeFilter *filter, char *inbuf, size_t inlen, size_t prespace,
+ 		size_t newlen = inlen + prespace + filter->backlen;
+ 		
+ 		if (p->inlen < newlen) {
+-			/* NOTE: g_realloc copies data, we dont need that (slower) */
++			/* NOTE: g_realloc copies data, we don't need that (slower) */
+ 			g_free (p->inbuf);
+ 			p->inbuf = g_malloc (newlen + PRE_HEAD);
+ 			p->inlen = newlen + PRE_HEAD;
+diff --git a/gmime/gmime-message.c b/gmime/gmime-message.c
+index e30da0e..eabef24 100644
+--- a/gmime/gmime-message.c
++++ b/gmime/gmime-message.c
+@@ -1140,7 +1140,7 @@ multipart_guess_body (GMimeMultipart *multipart)
+  * Returns: (transfer none): a #GMimeObject containing the textual
+  * content that appears to be the main body of the message.
+  *
+- * Note: This function is NOT guarenteed to always work as it
++ * Note: This function is NOT guaranteed to always work as it
+  * makes some assumptions that are not necessarily true. It is
+  * recommended that you traverse the MIME structure yourself.
+  **/
+diff --git a/gmime/gmime-multipart-encrypted.c b/gmime/gmime-multipart-encrypted.c
+index 97c84db..a418fc2 100644
+--- a/gmime/gmime-multipart-encrypted.c
++++ b/gmime/gmime-multipart-encrypted.c
+@@ -153,7 +153,7 @@ g_mime_multipart_encrypted_new (void)
+  *
+  * Returns: (nullable) (transfer full): a new #GMimeMultipartEncrypted object on success
+  * or %NULL on fail. If encrypting fails, an exception will be set on @err to provide
+- * information as to why the failure occured.
++ * information as to why the failure occurred.
+  **/
+ GMimeMultipartEncrypted *
+ g_mime_multipart_encrypted_encrypt (GMimeCryptoContext *ctx, GMimeObject *entity, gboolean sign, const char *userid,
+@@ -246,7 +246,7 @@ g_mime_multipart_encrypted_encrypt (GMimeCryptoContext *ctx, GMimeObject *entity
+  *
+  * When non-%NULL, @session_key should be a %NULL-terminated string,
+  * such as the one returned by g_mime_decrypt_result_get_session_key()
+- * from a previous decryption. If the @sesion_key is not valid, decryption
++ * from a previous decryption. If the @session_key is not valid, decryption
+  * will fail.
+  *
+  * If @result is non-%NULL, then on a successful decrypt operation, it will be
+@@ -256,7 +256,7 @@ g_mime_multipart_encrypted_encrypt (GMimeCryptoContext *ctx, GMimeObject *entity
+  *
+  * Returns: (nullable) (transfer full): the decrypted MIME part on success or
+  * %NULL on fail. If the decryption fails, an exception will be set on
+- * @err to provide information as to why the failure occured.
++ * @err to provide information as to why the failure occurred.
+  **/
+ GMimeObject *
+ g_mime_multipart_encrypted_decrypt (GMimeMultipartEncrypted *encrypted, GMimeDecryptFlags flags,
+diff --git a/gmime/gmime-multipart-signed.c b/gmime/gmime-multipart-signed.c
+index 5913c10..ab54a43 100644
+--- a/gmime/gmime-multipart-signed.c
++++ b/gmime/gmime-multipart-signed.c
+@@ -206,7 +206,7 @@ sign_prepare (GMimeObject *mime_part)
+  *
+  * Returns: (nullable) (transfer full): a new #GMimeMultipartSigned object on success
+  * or %NULL on fail. If signing fails, an exception will be set on @err to provide
+- * information as to why the failure occured.
++ * information as to why the failure occurred.
+  **/
+ GMimeMultipartSigned *
+ g_mime_multipart_signed_sign (GMimeCryptoContext *ctx, GMimeObject *entity,
+@@ -365,7 +365,7 @@ check_protocol_supported (const char *protocol, const char *supported)
+  * Returns: (nullable) (transfer full): a new #GMimeSignatureList object on
+  * success or %NULL on fail. If the verification fails, an exception
+  * will be set on @err to provide information as to why the failure
+- * occured.
++ * occurred.
+  **/
+ GMimeSignatureList *
+ g_mime_multipart_signed_verify (GMimeMultipartSigned *mps, GMimeVerifyFlags flags, GError **err)
+diff --git a/gmime/gmime-utils.c b/gmime/gmime-utils.c
+index 2742e1b..5046d8c 100644
+--- a/gmime/gmime-utils.c
++++ b/gmime/gmime-utils.c
+@@ -1819,7 +1819,7 @@ rfc2047_decode_tokens (GMimeParserOptions *options, rfc2047_token *tokens, size_
+ 			
+ 			/* convert the raw decoded text into UTF-8 */
+ 			if (!g_ascii_strcasecmp (charset, "UTF-8")) {
+-				/* slight optimization over going thru iconv */
++				/* slight optimization over going through iconv */
+ 				str = (char *) outptr;
+ 				len = outlen;
+ 				
+diff --git a/util/url-scanner.c b/util/url-scanner.c
+index 3457019..4a56c7c 100644
+--- a/util/url-scanner.c
++++ b/util/url-scanner.c
+@@ -557,7 +557,7 @@ url_scanner_table_init (void)
+ 	
+ 	/* not defined to be special in rfc0822, but when scanning
+            backwards to find the beginning of the email address we do
+-           not want to include this char if we come accross it - so
++           not want to include this char if we come across it - so
+            this is kind of a hack, but it's ok */
+ 	url_scanner_table['/'] |= IS_SPECIAL;
+ 	
diff -Nru gmime-2.6.22+dfsg2/debian/patches/0008-PORTING-No-way-to-explicitly-set-the-path-to-gpg-as-.patch gmime-3.0.1/debian/patches/0008-PORTING-No-way-to-explicitly-set-the-path-to-gpg-as-.patch
--- gmime-2.6.22+dfsg2/debian/patches/0008-PORTING-No-way-to-explicitly-set-the-path-to-gpg-as-.patch	1970-01-01 00:00:00.000000000 +0000
+++ gmime-3.0.1/debian/patches/0008-PORTING-No-way-to-explicitly-set-the-path-to-gpg-as-.patch	2017-07-27 18:15:20.000000000 +0000
@@ -0,0 +1,48 @@
+From: Daniel Kahn Gillmor 
+Date: Wed, 12 Jul 2017 20:50:58 -0400
+Subject: PORTING: No way to explicitly set the path to gpg as of gmime 3.0
+MIME-Version: 1.0
+Content-Type: text/plain; charset="utf-8"
+Content-Transfer-Encoding: 8bit
+
+As of version 3.0, gmime is unable to explicitly set the path to the
+gpg executable.  in 2.6, it was possible to do so explicitly when
+invoking g_mime_gpg_context_new().
+
+This is a good thing, since The Defaults Should Be Correct™ :)
+
+It also acknowledges that different branches of gpg are really not
+actually effectively co-installable (that is, that they can't be used
+against the same homedir in a way that is usable).
+
+Furthermore, end users can still effectively select an installed
+version of GnuPG by setting $PATH properly, as long as the installed
+binary is named "gpg" in whatever directory it's located in.
+
+However, this is a change in functionality between versions, so i
+figure it's worth documenting it as something users need to think
+about.  For example, when building notmuch against gmime 3.0, we'll
+need to ensure that the "crypto.gpg_path" configuration option is
+explicitly deprecated.
+
+(cherry picked from commit 80e7e96e26c1f0fe44b9a0237210f4d1298817c5)
+---
+ PORTING | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/PORTING b/PORTING
+index d491dcb..69106cf 100644
+--- a/PORTING
++++ b/PORTING
+@@ -92,6 +92,11 @@ Porting from GMime 2.6 to GMime 3.0
+ 
+ - Removed g_mime_gpg_context_[get,set]_auto_key_retrieve().
+ 
++- When using GMimeGpgContext, there is no longer a way to explicitly
++  set the path to the "gpg" executable.  Of course, users can still
++  use the $PATH environment variable to select any executable named
++  "gpg" as always.
++
+ - Removed g_mime_crypto_context_[get,set]_retrieve_session_key(). This is now handled by
+   passing GMIME_DECRYPT_EXPORT_SESSION_KEY to the g_mime_crypto_context_decrypt()
+   method.
diff -Nru gmime-2.6.22+dfsg2/debian/patches/0009-Fixed-infinite-loop-in-address-parser-w-malformed-do.patch gmime-3.0.1/debian/patches/0009-Fixed-infinite-loop-in-address-parser-w-malformed-do.patch
--- gmime-2.6.22+dfsg2/debian/patches/0009-Fixed-infinite-loop-in-address-parser-w-malformed-do.patch	1970-01-01 00:00:00.000000000 +0000
+++ gmime-3.0.1/debian/patches/0009-Fixed-infinite-loop-in-address-parser-w-malformed-do.patch	2017-07-27 18:15:20.000000000 +0000
@@ -0,0 +1,33 @@
+From: Jeffrey Stedfast 
+Date: Thu, 27 Jul 2017 06:24:11 -0400
+Subject: Fixed infinite loop in address parser w/ malformed domain literal
+
+(cherry picked from commit b29c54cdf44e0043c82b4408452f051933e4b956)
+---
+ gmime/gmime-parse-utils.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/gmime/gmime-parse-utils.c b/gmime/gmime-parse-utils.c
+index 43c6f70..4ade524 100644
+--- a/gmime/gmime-parse-utils.c
++++ b/gmime/gmime-parse-utils.c
+@@ -354,7 +354,7 @@ decode_subliteral (const char **in, GString *domain)
+ 			inptr++;
+ 			got = TRUE;
+ 		} else if (is_lwsp (*inptr)) {
+-			skip_cfws (&inptr);
++			skip_lwsp (&inptr);
+ 		} else {
+ 			break;
+ 		}
+@@ -417,8 +417,9 @@ g_mime_decode_domain (const char **in, GString *domain)
+ 			if (*inptr == ']') {
+ 				g_string_append_c (domain, ']');
+ 				inptr++;
+-			} else
++			} else {
+ 				w(g_warning ("Missing ']' in domain-literal: %s", *in));
++			}
+ 		} else {
+ 			if (!(atom = decode_atom (&inptr))) {
+ 				w(g_warning ("Unexpected char '%c' in domain: %s", *inptr, *in));
diff -Nru gmime-2.6.22+dfsg2/debian/patches/fix_gmime-sharp.pc_path.patch gmime-3.0.1/debian/patches/fix_gmime-sharp.pc_path.patch
--- gmime-2.6.22+dfsg2/debian/patches/fix_gmime-sharp.pc_path.patch	2017-04-28 17:51:48.000000000 +0000
+++ gmime-3.0.1/debian/patches/fix_gmime-sharp.pc_path.patch	1970-01-01 00:00:00.000000000 +0000
@@ -1,23 +0,0 @@
-From: Daniel Kahn Gillmor 
-Date: Tue, 5 Jul 2016 17:44:56 -0400
-Subject: fix_gmime-sharp.pc_path
-
-we use the standard packaging locations for debian mono.
----
- mono/gmime-sharp.pc.in | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/mono/gmime-sharp.pc.in b/mono/gmime-sharp.pc.in
-index ca9fc1c7..dbd1e3e5 100644
---- a/mono/gmime-sharp.pc.in
-+++ b/mono/gmime-sharp.pc.in
-@@ -5,7 +5,7 @@ gapidir=${prefix}/share/gapi-2.0
- 
- Name: gmime-sharp 
- Version: @VERSION@
--Description: .NET bindings for GMime
-+Description: CLI bindings for GMime
- Cflags: -I:${gapidir}/gmime-api.xml
--Libs: -r:${libdir}/mono/gmime-sharp-@GMIME_API_VERSION@/gmime-sharp.dll
-+Libs: -r:${libdir}/cli/gmime-sharp-@GMIME_API_VERSION@/gmime-sharp.dll
- Requires: glib-sharp-2.0
diff -Nru gmime-2.6.22+dfsg2/debian/patches/series gmime-3.0.1/debian/patches/series
--- gmime-2.6.22+dfsg2/debian/patches/series	2017-04-28 17:51:48.000000000 +0000
+++ gmime-3.0.1/debian/patches/series	2017-07-27 18:15:20.000000000 +0000
@@ -1,2 +1,9 @@
-fix_gmime-sharp.pc_path.patch
-0002-Rename-g_mime_decryption_result_-to-g_mime_decrypt_r.patch
+0001-Fixed-g_mime_part_set_encoding-when-encoding-is-DEFA.patch
+0002-Improved-docs.patch
+0003-Reduced-unnecessary-allocation.patch
+0004-Fixed-docs-thanks-to-Peter-Bloomfield-s-critical-eye.patch
+0005-Updated-gmime-part-encode-method-to-force-7bit-and-8.patch
+0006-Fixed-typo.patch
+0007-spelling-cleanup.patch
+0008-PORTING-No-way-to-explicitly-set-the-path-to-gpg-as-.patch
+0009-Fixed-infinite-loop-in-address-parser-w-malformed-do.patch
diff -Nru gmime-2.6.22+dfsg2/debian/README.source gmime-3.0.1/debian/README.source
--- gmime-2.6.22+dfsg2/debian/README.source	1970-01-01 00:00:00.000000000 +0000
+++ gmime-3.0.1/debian/README.source	2017-07-27 18:14:17.000000000 +0000
@@ -0,0 +1,32 @@
+This package is maintained with git-buildpackage in the git repo as
+indicated in the Vcs-* fields in debian/control.
+
+The debian packaging git repository incorporates upstream's git
+history as well, which is found at https://github.com/jstedfast/gmime.
+
+You can configure a sensible local working copy with:
+
+    git clone https://anonscm.debian.org/git/collab-maint/gmime.git
+    cd gmime
+    for x in upstream pristine-tar experimental master; do
+        git checkout $x
+    done
+    git remote add github https://github.com/jstedfast/gmime
+    git remote update github
+
+The simplest way to discover/fetch a new tarball is:
+
+    uscan --verbose
+
+Then you can import it while merging with upstream via:
+
+    gbp import-orig ../gmime_${newversion}.orig.tar.xz
+
+Building a new package from the master branch looks like:
+
+    gbp buildpackage --changes-option=-S --git-tag
+
+See debian/gbp.conf and debian/watch for details about how the
+packaging git repository is integrated with upstream development.
+
+ -- Daniel Kahn Gillmor , Mon, 22 May 2017 12:49:29 -0400
diff -Nru gmime-2.6.22+dfsg2/debian/rules gmime-3.0.1/debian/rules
--- gmime-2.6.22+dfsg2/debian/rules	2017-04-28 17:51:48.000000000 +0000
+++ gmime-3.0.1/debian/rules	2017-07-27 18:16:08.000000000 +0000
@@ -6,40 +6,14 @@
 # make sure it picks a standard shell for reproducibility
 export CONFIG_SHELL = /bin/sh
 
-# only invoke dh --with=cli if cli-common-dev is present
-ifeq (,$(wildcard /usr/share/perl5/Debian/Debhelper/Sequence/cli.pm))
-WITH_CLI = 
-CONFIGURE_MONO_FLAGS = --enable-mono=no
-else
-WITH_CLI = ,cli
-CONFIGURE_MONO_FLAGS = CSC=/usr/bin/mono-csc
-endif
-
 override_dh_auto_configure:
 	dh_auto_configure -- \
 		$(shell dpkg-buildflags --export=configure) \
 		--enable-vala \
 		--enable-gtk-doc \
-		--disable-rpath \
 		--enable-largefile \
-		--enable-smime \
 		--enable-introspection \
 		$(CONFIGURE_MONO_FLAGS)
 
-# https://bugs.debian.org/806033 -- dh_clideps expects to see
-# dh_makeshlibs called before it, but dh_makeshlibs is never called
-# when building only arch-indep packages.  So we force the issue by
-# making a phony shlibs.local file that dh_clideps will accept, if no
-# others exist:
-override_dh_clideps:
-	if ! grep -q . debian/*/DEBIAN/shlibs; then echo libgmime-2.6 0 libgmime-2.6-0 > debian/shlibs.local; fi
-	dh_clideps
-	rm -f debian/shlibs.local
-
-override_dh_auto_build-indep: 
-	dh_auto_build
-	mdoc update -o $(CURDIR)/mono/monodocer $(CURDIR)/mono/gmime-sharp.dll
-	mdoc assemble -o $(CURDIR)/mono/gmime-sharp-2.6 $(CURDIR)/mono/monodocer
-
 %:
-	dh $@ --with=autoreconf,gir$(WITH_CLI)
+	dh $@ --with=gir
diff -Nru gmime-2.6.22+dfsg2/debian/watch gmime-3.0.1/debian/watch
--- gmime-2.6.22+dfsg2/debian/watch	2017-04-28 17:51:48.000000000 +0000
+++ gmime-3.0.1/debian/watch	2017-07-27 18:14:17.000000000 +0000
@@ -1,3 +1,3 @@
 version=4
 opts=dversionmangle=s/\+dfsg\d*$// \
-  https://download.gnome.org/sources/gmime/2.6/gmime-@ANY_VERSION@@ARCHIVE_EXT@
+  https://download.gnome.org/sources/gmime/3.0/gmime-@ANY_VERSION@@ARCHIVE_EXT@
diff -Nru gmime-2.6.22+dfsg2/depcomp gmime-3.0.1/depcomp
--- gmime-2.6.22+dfsg2/depcomp	1970-01-01 00:00:00.000000000 +0000
+++ gmime-3.0.1/depcomp	2016-06-28 13:40:13.000000000 +0000
@@ -0,0 +1,791 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2013-05-30.07; # UTC
+
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see .
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva .
+
+case $1 in
+  '')
+    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
+    exit 1;
+    ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+  depmode     Dependency tracking mode.
+  source      Source file read by 'PROGRAMS ARGS'.
+  object      Object file output by 'PROGRAMS ARGS'.
+  DEPDIR      directory where to store dependencies.
+  depfile     Dependency file to output.
+  tmpdepfile  Temporary file to use when outputting dependencies.
+  libtool     Whether libtool is used (yes/no).
+
+Report bugs to .
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "depcomp $scriptversion"
+    exit $?
+    ;;
+esac
+
+# Get the directory component of the given path, and save it in the
+# global variables '$dir'.  Note that this directory component will
+# be either empty or ending with a '/' character.  This is deliberate.
+set_dir_from ()
+{
+  case $1 in
+    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
+      *) dir=;;
+  esac
+}
+
+# Get the suffix-stripped basename of the given path, and save it the
+# global variable '$base'.
+set_base_from ()
+{
+  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
+}
+
+# If no dependency file was actually created by the compiler invocation,
+# we still have to create a dummy depfile, to avoid errors with the
+# Makefile "include basename.Plo" scheme.
+make_dummy_depfile ()
+{
+  echo "#dummy" > "$depfile"
+}
+
+# Factor out some common post-processing of the generated depfile.
+# Requires the auxiliary global variable '$tmpdepfile' to be set.
+aix_post_process_depfile ()
+{
+  # If the compiler actually managed to produce a dependency file,
+  # post-process it.
+  if test -f "$tmpdepfile"; then
+    # Each line is of the form 'foo.o: dependency.h'.
+    # Do two passes, one to just change these to
+    #   $object: dependency.h
+    # and one to simply output
+    #   dependency.h:
+    # which is needed to avoid the deleted-header problem.
+    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
+      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
+    } > "$depfile"
+    rm -f "$tmpdepfile"
+  else
+    make_dummy_depfile
+  fi
+}
+
+# A tabulation character.
+tab='	'
+# A newline character.
+nl='
+'
+# Character ranges might be problematic outside the C locale.
+# These definitions help.
+upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
+lower=abcdefghijklmnopqrstuvwxyz
+digits=0123456789
+alpha=${upper}${lower}
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+  echo "depcomp: Variables source, object and depmode must be set" 1>&2
+  exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Avoid interferences from the environment.
+gccflag= dashmflag=
+
+# Some modes work just like other modes, but use different flags.  We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write.  Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+  # HP compiler uses -M and no extra arg.
+  gccflag=-M
+  depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+  # This is just like dashmstdout with a different argument.
+  dashmflag=-xM
+  depmode=dashmstdout
+fi
+
+cygpath_u="cygpath -u -f -"
+if test "$depmode" = msvcmsys; then
+  # This is just like msvisualcpp but w/o cygpath translation.
+  # Just convert the backslash-escaped backslashes to single forward
+  # slashes to satisfy depend.m4
+  cygpath_u='sed s,\\\\,/,g'
+  depmode=msvisualcpp
+fi
+
+if test "$depmode" = msvc7msys; then
+  # This is just like msvc7 but w/o cygpath translation.
+  # Just convert the backslash-escaped backslashes to single forward
+  # slashes to satisfy depend.m4
+  cygpath_u='sed s,\\\\,/,g'
+  depmode=msvc7
+fi
+
+if test "$depmode" = xlc; then
+  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
+  gccflag=-qmakedep=gcc,-MF
+  depmode=gcc
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff.  Hmm.
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am.  Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+  for arg
+  do
+    case $arg in
+    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+    *)  set fnord "$@" "$arg" ;;
+    esac
+    shift # fnord
+    shift # $arg
+  done
+  "$@"
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  mv "$tmpdepfile" "$depfile"
+  ;;
+
+gcc)
+## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
+## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
+## (see the conditional assignment to $gccflag above).
+## There are various ways to get dependency output from gcc.  Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+##   up in a subdir.  Having to rename by hand is ugly.
+##   (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+##   -MM, not -M (despite what the docs say).  Also, it might not be
+##   supported by the other compilers which use the 'gcc' depmode.
+## - Using -M directly means running the compiler twice (even worse
+##   than renaming).
+  if test -z "$gccflag"; then
+    gccflag=-MD,
+  fi
+  "$@" -Wp,"$gccflag$tmpdepfile"
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  # The second -e expression handles DOS-style file names with drive
+  # letters.
+  sed -e 's/^[^:]*: / /' \
+      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the "deleted header file" problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header).  We avoid this by adding
+## dummy dependencies for each header file.  Too bad gcc doesn't do
+## this for us directly.
+## Some versions of gcc put a space before the ':'.  On the theory
+## that the space means something, we add a space to the output as
+## well.  hp depmode also adds that space, but also prefixes the VPATH
+## to the object.  Take care to not repeat it in the output.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+  tr ' ' "$nl" < "$tmpdepfile" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+sgi)
+  if test "$libtool" = yes; then
+    "$@" "-Wp,-MDupdate,$tmpdepfile"
+  else
+    "$@" -MDupdate "$tmpdepfile"
+  fi
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+
+  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
+    echo "$object : \\" > "$depfile"
+    # Clip off the initial element (the dependent).  Don't try to be
+    # clever and replace this with sed code, as IRIX sed won't handle
+    # lines with more than a fixed number of characters (4096 in
+    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
+    # the IRIX cc adds comments like '#:fec' to the end of the
+    # dependency line.
+    tr ' ' "$nl" < "$tmpdepfile" \
+      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
+      | tr "$nl" ' ' >> "$depfile"
+    echo >> "$depfile"
+    # The second pass generates a dummy entry for each header file.
+    tr ' ' "$nl" < "$tmpdepfile" \
+      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+      >> "$depfile"
+  else
+    make_dummy_depfile
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+xlc)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+aix)
+  # The C for AIX Compiler uses -M and outputs the dependencies
+  # in a .u file.  In older versions, this file always lives in the
+  # current directory.  Also, the AIX compiler puts '$object:' at the
+  # start of each line; $object doesn't have directory information.
+  # Version 6 uses the directory in both cases.
+  set_dir_from "$object"
+  set_base_from "$object"
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$base.u
+    tmpdepfile3=$dir.libs/$base.u
+    "$@" -Wc,-M
+  else
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$dir$base.u
+    tmpdepfile3=$dir$base.u
+    "$@" -M
+  fi
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  aix_post_process_depfile
+  ;;
+
+tcc)
+  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
+  # FIXME: That version still under development at the moment of writing.
+  #        Make that this statement remains true also for stable, released
+  #        versions.
+  # It will wrap lines (doesn't matter whether long or short) with a
+  # trailing '\', as in:
+  #
+  #   foo.o : \
+  #    foo.c \
+  #    foo.h \
+  #
+  # It will put a trailing '\' even on the last line, and will use leading
+  # spaces rather than leading tabs (at least since its commit 0394caf7
+  # "Emit spaces for -MD").
+  "$@" -MD -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
+  # We have to change lines of the first kind to '$object: \'.
+  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
+  # And for each line of the second kind, we have to emit a 'dep.h:'
+  # dummy dependency, to avoid the deleted-header problem.
+  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+## The order of this option in the case statement is important, since the
+## shell code in configure will try each of these formats in the order
+## listed in this file.  A plain '-MD' option would be understood by many
+## compilers, so we must ensure this comes after the gcc and icc options.
+pgcc)
+  # Portland's C compiler understands '-MD'.
+  # Will always output deps to 'file.d' where file is the root name of the
+  # source file under compilation, even if file resides in a subdirectory.
+  # The object file name does not affect the name of the '.d' file.
+  # pgcc 10.2 will output
+  #    foo.o: sub/foo.c sub/foo.h
+  # and will wrap long lines using '\' :
+  #    foo.o: sub/foo.c ... \
+  #     sub/foo.h ... \
+  #     ...
+  set_dir_from "$object"
+  # Use the source, not the object, to determine the base name, since
+  # that's sadly what pgcc will do too.
+  set_base_from "$source"
+  tmpdepfile=$base.d
+
+  # For projects that build the same source file twice into different object
+  # files, the pgcc approach of using the *source* file root name can cause
+  # problems in parallel builds.  Use a locking strategy to avoid stomping on
+  # the same $tmpdepfile.
+  lockdir=$base.d-lock
+  trap "
+    echo '$0: caught signal, cleaning up...' >&2
+    rmdir '$lockdir'
+    exit 1
+  " 1 2 13 15
+  numtries=100
+  i=$numtries
+  while test $i -gt 0; do
+    # mkdir is a portable test-and-set.
+    if mkdir "$lockdir" 2>/dev/null; then
+      # This process acquired the lock.
+      "$@" -MD
+      stat=$?
+      # Release the lock.
+      rmdir "$lockdir"
+      break
+    else
+      # If the lock is being held by a different process, wait
+      # until the winning process is done or we timeout.
+      while test -d "$lockdir" && test $i -gt 0; do
+        sleep 1
+        i=`expr $i - 1`
+      done
+    fi
+    i=`expr $i - 1`
+  done
+  trap - 1 2 13 15
+  if test $i -le 0; then
+    echo "$0: failed to acquire lock after $numtries attempts" >&2
+    echo "$0: check lockdir '$lockdir'" >&2
+    exit 1
+  fi
+
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each line is of the form `foo.o: dependent.h',
+  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+  # Do two passes, one to just change these to
+  # `$object: dependent.h' and one to simply `dependent.h:'.
+  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp2)
+  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+  # compilers, which have integrated preprocessors.  The correct option
+  # to use with these is +Maked; it writes dependencies to a file named
+  # 'foo.d', which lands next to the object file, wherever that
+  # happens to be.
+  # Much of this is similar to the tru64 case; see comments there.
+  set_dir_from  "$object"
+  set_base_from "$object"
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir.libs/$base.d
+    "$@" -Wc,+Maked
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    "$@" +Maked
+  fi
+  stat=$?
+  if test $stat -ne 0; then
+     rm -f "$tmpdepfile1" "$tmpdepfile2"
+     exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
+    # Add 'dependent.h:' lines.
+    sed -ne '2,${
+               s/^ *//
+               s/ \\*$//
+               s/$/:/
+               p
+             }' "$tmpdepfile" >> "$depfile"
+  else
+    make_dummy_depfile
+  fi
+  rm -f "$tmpdepfile" "$tmpdepfile2"
+  ;;
+
+tru64)
+  # The Tru64 compiler uses -MD to generate dependencies as a side
+  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
+  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+  # dependencies in 'foo.d' instead, so we check for that too.
+  # Subdirectories are respected.
+  set_dir_from  "$object"
+  set_base_from "$object"
+
+  if test "$libtool" = yes; then
+    # Libtool generates 2 separate objects for the 2 libraries.  These
+    # two compilations output dependencies in $dir.libs/$base.o.d and
+    # in $dir$base.o.d.  We have to check for both files, because
+    # one of the two compilations can be disabled.  We should prefer
+    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+    # automatically cleaned when .libs/ is deleted, while ignoring
+    # the former would cause a distcleancheck panic.
+    tmpdepfile1=$dir$base.o.d          # libtool 1.5
+    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
+    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
+    "$@" -Wc,-MD
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    tmpdepfile3=$dir$base.d
+    "$@" -MD
+  fi
+
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  # Same post-processing that is required for AIX mode.
+  aix_post_process_depfile
+  ;;
+
+msvc7)
+  if test "$libtool" = yes; then
+    showIncludes=-Wc,-showIncludes
+  else
+    showIncludes=-showIncludes
+  fi
+  "$@" $showIncludes > "$tmpdepfile"
+  stat=$?
+  grep -v '^Note: including file: ' "$tmpdepfile"
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  # The first sed program below extracts the file names and escapes
+  # backslashes for cygpath.  The second sed program outputs the file
+  # name when reading, but also accumulates all include files in the
+  # hold buffer in order to output them again at the end.  This only
+  # works with sed implementations that can handle large buffers.
+  sed < "$tmpdepfile" -n '
+/^Note: including file:  *\(.*\)/ {
+  s//\1/
+  s/\\/\\\\/g
+  p
+}' | $cygpath_u | sort -u | sed -n '
+s/ /\\ /g
+s/\(.*\)/'"$tab"'\1 \\/p
+s/.\(.*\) \\/\1:/
+H
+$ {
+  s/.*/'"$tab"'/
+  G
+  p
+}' >> "$depfile"
+  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
+  rm -f "$tmpdepfile"
+  ;;
+
+msvc7msys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+#nosideeffect)
+  # This comment above is used by automake to tell side-effect
+  # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout, regardless of -o.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove '-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  test -z "$dashmflag" && dashmflag=-M
+  # Require at least two characters before searching for ':'
+  # in the target name.  This is to cope with DOS-style filenames:
+  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
+  "$@" $dashmflag |
+    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this sed invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  tr ' ' "$nl" < "$tmpdepfile" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+dashXmstdout)
+  # This case only exists to satisfy depend.m4.  It is never actually
+  # run, as this mode is specially recognized in the preamble.
+  exit 1
+  ;;
+
+makedepend)
+  "$@" || exit $?
+  # Remove any Libtool call
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+  # X makedepend
+  shift
+  cleared=no eat=no
+  for arg
+  do
+    case $cleared in
+    no)
+      set ""; shift
+      cleared=yes ;;
+    esac
+    if test $eat = yes; then
+      eat=no
+      continue
+    fi
+    case "$arg" in
+    -D*|-I*)
+      set fnord "$@" "$arg"; shift ;;
+    # Strip any option that makedepend may not understand.  Remove
+    # the object too, otherwise makedepend will parse it as a source file.
+    -arch)
+      eat=yes ;;
+    -*|$object)
+      ;;
+    *)
+      set fnord "$@" "$arg"; shift ;;
+    esac
+  done
+  obj_suffix=`echo "$object" | sed 's/^.*\././'`
+  touch "$tmpdepfile"
+  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+  rm -f "$depfile"
+  # makedepend may prepend the VPATH from the source file name to the object.
+  # No need to regex-escape $object, excess matching of '.' is harmless.
+  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process the last invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed '1,2d' "$tmpdepfile" \
+    | tr ' ' "$nl" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile" "$tmpdepfile".bak
+  ;;
+
+cpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove '-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  "$@" -E \
+    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+    | sed '$ s: \\$::' > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  cat < "$tmpdepfile" >> "$depfile"
+  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvisualcpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  IFS=" "
+  for arg
+  do
+    case "$arg" in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+        set fnord "$@"
+        shift
+        shift
+        ;;
+    *)
+        set fnord "$@" "$arg"
+        shift
+        shift
+        ;;
+    esac
+  done
+  "$@" -E 2>/dev/null |
+  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
+  echo "$tab" >> "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvcmsys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+none)
+  exec "$@"
+  ;;
+
+*)
+  echo "Unknown depmode $depmode" 1>&2
+  exit 1
+  ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff -Nru gmime-2.6.22+dfsg2/docs/Makefile.in gmime-3.0.1/docs/Makefile.in
--- gmime-2.6.22+dfsg2/docs/Makefile.in	1970-01-01 00:00:00.000000000 +0000
+++ gmime-3.0.1/docs/Makefile.in	2017-05-21 16:38:02.000000000 +0000
@@ -0,0 +1,690 @@
+# Makefile.in generated by automake 1.15 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+subdir = docs
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/gpgme.m4 \
+	$(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/introspection.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/vapigen.m4 \
+	$(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+	ctags-recursive dvi-recursive html-recursive info-recursive \
+	install-data-recursive install-dvi-recursive \
+	install-exec-recursive install-html-recursive \
+	install-info-recursive install-pdf-recursive \
+	install-ps-recursive install-recursive installcheck-recursive \
+	installdirs-recursive pdf-recursive ps-recursive \
+	tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+	distdir
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DB2HTML = @DB2HTML@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOLT_BASH = @DOLT_BASH@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GMIME_API_VERSION = @GMIME_API_VERSION@
+GMIME_BINARY_AGE = @GMIME_BINARY_AGE@
+GMIME_CFLAGS = @GMIME_CFLAGS@
+GMIME_INCLUDEDIR = @GMIME_INCLUDEDIR@
+GMIME_INTERFACE_AGE = @GMIME_INTERFACE_AGE@
+GMIME_LIBDIR = @GMIME_LIBDIR@
+GMIME_LIBS = @GMIME_LIBS@
+GMIME_LIBS_PRIVATE = @GMIME_LIBS_PRIVATE@
+GMIME_MAJOR_VERSION = @GMIME_MAJOR_VERSION@
+GMIME_MICRO_VERSION = @GMIME_MICRO_VERSION@
+GMIME_MINOR_VERSION = @GMIME_MINOR_VERSION@
+GMIME_VERSION = @GMIME_VERSION@
+GOBJECT_QUERY = @GOBJECT_QUERY@
+GPGME_CONFIG = @GPGME_CONFIG@
+GPGME_PTHREAD_CFLAGS = @GPGME_PTHREAD_CFLAGS@
+GPGME_PTHREAD_LIBS = @GPGME_PTHREAD_LIBS@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+HTML_DIR = @HTML_DIR@
+ICONV_LIBS = @ICONV_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBIDN_CFLAGS = @LIBIDN_CFLAGS@
+LIBIDN_LIBS = @LIBIDN_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTCOMPILE = @LTCOMPILE@
+LTCXXCOMPILE = @LTCXXCOMPILE@
+LTLIBOBJS = @LTLIBOBJS@
+LTP = @LTP@
+LTP_GENHTML = @LTP_GENHTML@
+LT_AGE = @LT_AGE@
+LT_CURRENT = @LT_CURRENT@
+LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@
+LT_RELEASE = @LT_RELEASE@
+LT_REVISION = @LT_REVISION@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MV = @MV@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+RANLIB = @RANLIB@
+RM = @RM@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHTOOL = @SHTOOL@
+STRIP = @STRIP@
+TAR = @TAR@
+VAPIGEN = @VAPIGEN@
+VAPIGEN_MAKEFILE = @VAPIGEN_MAKEFILE@
+VAPIGEN_VAPIDIR = @VAPIGEN_VAPIDIR@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+ZLIB_CFLAGS = @ZLIB_CFLAGS@
+ZLIB_LIBS = @ZLIB_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+ms_librarian = @ms_librarian@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+SUBDIRS = reference tutorial
+EXTRA_DIST = gtkdocs_fix
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu docs/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu docs/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+	@fail=; \
+	if $(am__make_keepgoing); then \
+	  failcom='fail=yes'; \
+	else \
+	  failcom='exit 1'; \
+	fi; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    $(am__make_dryrun) \
+	      || test -d "$(distdir)/$$subdir" \
+	      || $(MKDIR_P) "$(distdir)/$$subdir" \
+	      || exit 1; \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(am__recursive_targets) install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+	check-am clean clean-generic clean-libtool cscopelist-am ctags \
+	ctags-am distclean distclean-generic distclean-libtool \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	installdirs-am maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+	ps ps-am tags tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff -Nru gmime-2.6.22+dfsg2/docs/reference/building.sgml gmime-3.0.1/docs/reference/building.sgml
--- gmime-2.6.22+dfsg2/docs/reference/building.sgml	2017-04-28 17:43:42.000000000 +0000
+++ gmime-3.0.1/docs/reference/building.sgml	2017-05-06 14:11:44.000000000 +0000
@@ -44,7 +44,7 @@
       directory full of the source files as follows:
     
     
-      tar -zxvf gmime-2.6.x.tar.gz
+      tar -zxvf gmime-3.0.x.tar.gz
     
     
       In the toplevel of the directory that is created, there will be
@@ -197,7 +197,7 @@
       lucky, this will all go smoothly, and you'll be ready to
       start compiling your own GMime
 	applications. You can test your GMime installation
-      by running pkg-config --modversion gmime-2.6
+      by running pkg-config --modversion gmime-3.0
       and making sure that it can both find GMime and reports the 
       correct version.
     
diff -Nru gmime-2.6.22+dfsg2/docs/reference/changes-3.0.sgml gmime-3.0.1/docs/reference/changes-3.0.sgml
--- gmime-2.6.22+dfsg2/docs/reference/changes-3.0.sgml	1970-01-01 00:00:00.000000000 +0000
+++ gmime-3.0.1/docs/reference/changes-3.0.sgml	2017-05-21 16:29:14.000000000 +0000
@@ -0,0 +1,71 @@
+
+  
+    Changes from 2.6 to 3.0
+    3
+    Changes from 2.6 to 3.0
+  
+  
+    Changes from 2.6 to 3.0
+    Changes made between version 2.6 and version 3.0
+  
+  
+    Changes from 2.6 to 3.0
+    GMimeMessage API changes:
+    
+      g_mime_message_get_sender() no longer returns the value of the From header, it now returns an InternetAddressList* containing the parsed address(es) from the Sender header. For the From addresses, use g_mime_message_get_from().
+      g_mime_message_get_reply_to() no longer returns a const char*, instead it returns an InternetAddressList* for easier use.
+      g_mime_message_set_sender() and g_mime_message_set_reply_to() have been removed. You will either need to use the appropriate getter method and then internet_address_list_add() to add a new InternetAddressMailbox or, alternatively, you can use g_mime_message_add_mailbox().
+      GMimeRecipientType has been replaced by GMimeAddressType because it now contains non-recipient-based enum values (SENDER, FROM, and REPLY_TO).
+      g_mime_message_get_recipients() has been replaced by g_mime_message_get_addresses() which allows you to access the address lists of any address header.
+      g_mime_message_add_recipient() has been renamed to g_mime_message_add_mailbox() due to the fact that it can now be used to add mailbox addresses to the Sender, From, and Reply-To headers as well.
+      g_mime_message_set_subject() now takes a charset argument used when encoding the subject into rfc2047 encoded-word tokens (if needed). Use NULL to get the old behavior of using a best-fit charset.
+      Removed g_mime_message_get_date_as_string() and g_mime_message_get_date_as_string(). This is unnecessary since this can be done using g_mime_object_get_header() and g_mime_object_set_header().
+    
+    Cryptography related API changes:
+    
+      Renamed GMimeCertificateTrust to GMimeTrust and GMIME_CERTIFICATE_TRUST_NONE to GMIME_TRUST_UNKNOWN.
+      Removed g_mime_gpg_context_get_always_trust() and g_mime_gpg_context_set_always_trust(). This can now be accomplished by passing GMIME_ENCRYPT_ALWAYS_TRUST to g_mime_crypto_context_encrypt().
+      Removed g_mime_gpg_context_get_use_agent() and g_mime_gpg_context_set_use_agent(). This should no longer be needed.
+      Removed g_mime_gpg_context_get_auto_key_retrieve() and g_mime_gpg_context_set_auto_key_retrieve().
+      Removed g_mime_crypto_context_get_retrieve_session_key() and g_mime_crypto_context_set_retrieve_session_key(). This is now handled by passing GMIME_DECRYPT_EXPORT_SESSION_KEY to the g_mime_crypto_context_decrypt() method.
+      GMimeCryptoContext's encrypt, decrypt, and verify methods now all take a flags argument that can enable additional features (see above examples).
+      g_mime_crypto_context_sign() now takes a boolean 'detach' argument that specifies whether or not to generate a detached signature. To get the old behavior, pass TRUE as the detach argument.
+      g_mime_crypto_context_decrypt_session() has been merged with g_mime_crypto_context_decrypt() and so the decryot method now takes a session_key argument that is allowed to be NULL.
+      g_mime_crypto_context_verify() no longer takes a 'digest' argument as it was unused (it was originally meant to be a hint but wasnever really needed).
+      g_mime_multipart_signed_verify() and g_mime_multipart_encrypted_decrypt() no longer take GMimeCryptoContext arguments. Instead, they instantiate their own contexts based on the protocol specified in the Content-Type header. These methods now also take a flags argument and in the case of the decrypt() method, it now also takes a session_key argument.
+      GMimeSignatureStatus and GMimeSignatureErrors have been merged into a single bitfield (GMimeSignatureStatus) which mirrors gpgme_sigsum_t and thus g_mime_signature_get_errors() and g_mime_signature_set_errors() have been removed.
+      g_mime_multipart_encrypted_encrypt() no longer takes a GMimeMultipartEncrypted argument nor does it return int. Instead, this function now returns a newly allocated GMimeMultipartEncrypted.
+      g_mime_multipart_signed_sign() no longer takes a GMimeMultipartSigned argument nor does it return int. Instead, this function now returns a newly allocated GMimeMultipartSigned.
+    
+    Other API changes:
+    
+      g_mime_set_user_charsets() and g_mime_user_charsets() have been removed. All encoding API's now have a way to specify a charset to use and all decoder API's take a GMimeParserOptions argument that allows for specifying fallback charsets.
+      GMimeObject's prepend_header(), append_header(), set_header(), get_header(), and remove_header() virtual methods have all been removed. They have been replaced by the header_added(), header_changed(), header_removed(), and headers_cleared() virtual methods to allow users to set headers on the GMimeHeaderList directly and still get notifications of those changes.
+      g_mime_object_new() and g_mime_object_new_with_type() both now take a GMimeParserOptions argument.
+      g_mime_param_new_from_string() has been replaced by g_mime_param_list_parse() and now takes a GMimeParserOptions argument.
+      g_mime_content_type_new_from_string() has been replaced by g_mime_content_type_parse() and now takes a GMimeParserOptions argument.
+      g_mime_content_type_to_string() has been renamed to g_mime_content_type_get_mime_type() and a new function has been introduced called g_mime_content_type_encode() that includes the encoded parameter list.
+      g_mime_content_type_get_params() has been renamed to g_mime_content_type_get_parameters().
+      g_mime_content_disposition_new_from_string() has been replaced by g_mime_content_disposition_parse() and now takes a GMimeParserOptions argument.
+      g_mime_content_disposition_to_string() has been replaced by g_mime_content_disposition_encode().
+      g_mime_content_disposition_get_params() has been renamed to g_mime_content_disposition_get_parameters().
+      internet_address_list_parse_string() has been replaced by internet_address_list_parse() and now takes a GMimeParserOptions argument.
+      GMimeHeaderIter has been dropped in favour of a more direct way of iterating over a GMimeHeaderList using int indexes.
+      g_mime_stream_write_to_stream(), g_mime_stream_writev(), and g_mime_stream_printf() now return a gint64.
+      g_mime_stream_file_new_for_path() has been renamed to g_mime_stream_file_open() and now also takes a GError argument.
+      g_mime_stream_fs_new_for_path() has been renamed to g_mime_stream_fs_open() and now also takes a GError argument.
+      g_mime_part_new() now returns a GMimePart with a Content-Type of "application/octet-stream" instead of "text/plain" since there is now a GMimeTextPart who's g_mime_text_part_new() returns a GMimeTextPart with a Content-Type of "text/plain".
+      g_mime_part_get_content_object() has been renamed to g_mime_part_get_content().
+      g_mime_part_set_content_object() has been renamed to g_mime_part_set_content().
+      g_mime_parser_get_scan_from() and g_mime_parser_set_scan_from() have been replaced by g_mime_parser_get_format() and g_mime_parser_get_format() which take a GMimeFormat argument.
+      g_mime_parser_get_from() has been renamed to g_mime_parser_get_mbox_marker().
+      g_mime_parser_get_from_offset() has been renamed to g_mime_parser_get_mbox_marker_offset().
+      g_mime_parser_construct_message() and g_mime_parser_construct_part() now take a GMimeParserOptions argument.
+      Renamed GMimeFilterMd5 to GMimeFilterChecksum.
+      Renamed g_mime_multipart_get_preface() to g_mime_multipart_get_prologue() and g_mime_multipart_set_preface to g_mime_multipart_set_prologue.
+      Renamed g_mime_multipart_get_postface() to g_mime_multipart_get_epilogue() and g_mime_multipart_set_postface() to g_mime_multipart_set_epilogue().
+      Updated g_mime_object_write_to_stream() to take a GMimeFormatOptions argument.
+      Split GMimeFilterCRLF into GMimeFilterDos2Unix, GMimeFilterUnix2Dos and GMimeFilterSmtpData.
+    
+  
+
diff -Nru gmime-2.6.22+dfsg2/docs/reference/compiling.sgml gmime-3.0.1/docs/reference/compiling.sgml
--- gmime-2.6.22+dfsg2/docs/reference/compiling.sgml	2017-04-28 17:43:42.000000000 +0000
+++ gmime-3.0.1/docs/reference/compiling.sgml	2017-05-06 14:11:44.000000000 +0000
@@ -24,10 +24,10 @@
 The following interactive shell session demonstrates how
 pkg-config is used:
 
-$ pkg-config --cflags gmime-2.4
- -I/usr/include/gmime-2.4 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include 
-$ pkg-config --libs gmime-2.4
- -L/opt/gnome2/lib -lgmime-2.4 -lnsl -lgobject-2.0 -lglib-2.0
+$ pkg-config --cflags gmime-3.0
+ -I/usr/include/gmime-3.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include 
+$ pkg-config --libs gmime-3.0
+ -L/opt/gnome2/lib -lgmime-3.0 -lnsl -lgobject-2.0 -lglib-2.0
 
 
 
@@ -37,7 +37,7 @@
 substituted into the command line before execution. So to compile 
 a GTK+ Hello, World, you would type the following:
 
-$ cc `pkg-config --cflags --libs gmime-2.4` hello.c -o hello
+$ cc `pkg-config --cflags --libs gmime-3.0` hello.c -o hello
 
 
 
diff -Nru gmime-2.6.22+dfsg2/docs/reference/data-wrappers.sgml gmime-3.0.1/docs/reference/data-wrappers.sgml
--- gmime-2.6.22+dfsg2/docs/reference/data-wrappers.sgml	2017-04-28 17:43:42.000000000 +0000
+++ gmime-3.0.1/docs/reference/data-wrappers.sgml	2017-04-23 16:04:05.000000000 +0000
@@ -1,12 +1,12 @@
 
   
-    GMime Data Wrappers
+    Data Wrappers
     GMime Library
   
 
   
-    GMime Data Wrappers
-    How to use GMime Data Wrappers
+    Data Wrappers
+    How to use Data Wrappers
   
   
     Overview of Data Wrappers
diff -Nru gmime-2.6.22+dfsg2/docs/reference/filters.sgml gmime-3.0.1/docs/reference/filters.sgml
--- gmime-2.6.22+dfsg2/docs/reference/filters.sgml	2017-04-28 17:43:42.000000000 +0000
+++ gmime-3.0.1/docs/reference/filters.sgml	2017-04-23 16:04:05.000000000 +0000
@@ -1,12 +1,12 @@
 
   
-    GMime Stream Filters
+    Stream Filters
     GMime Library
   
 
   
-    GMime Stream Filters
-    How to use GMime Stream Filters
+    Stream Filters
+    How to use Stream Filters
   
   
     Overview of Filters
@@ -16,8 +16,8 @@
     filters to it.
 
     GMime comes equipped with some basic filters such as
-    GMimeFilterBasic, GMimeFilterCharset, GMimeFilterCRLF,
-    GMimeFilterFrom and GMimeFilterHTML.
+    GMimeFilterBasic, GMimeFilterCharset, GMimeFilterDos2Unix,
+    GMimeFilterUnix2Dos, GMimeFilterFrom and GMimeFilterHTML.
 
     The GMimeFilterBasic filter is actually a collection of
     filters for common transfer encodings used by MIME. So far, it is
@@ -32,10 +32,8 @@
 
     A common conversion needed for text is CRLF -> LF and LF ->
     CRLF which is needed for most (all?) internet protocols. Luckily,
-    GMime comes equipped with a filter to handle this for you,
-    GMimeFilterCRLF. You'll notice that GMimeFilterCRLF can also
-    handle dot-escaping, which is especially useful for SMTP
-    (rfc821).
+    GMime comes equipped with a set of filters to handle this for you:
+    GMimeFilterDos2Unix and GMimeFilterUnix2Dos.
 
     On Unix systems, mail often resides in spools in mbox
     format. Mbox uses a line that starts with "From " to delimit
diff -Nru gmime-2.6.22+dfsg2/docs/reference/gmime-docs.sgml gmime-3.0.1/docs/reference/gmime-docs.sgml
--- gmime-2.6.22+dfsg2/docs/reference/gmime-docs.sgml	2017-04-28 17:43:42.000000000 +0000
+++ gmime-3.0.1/docs/reference/gmime-docs.sgml	2017-04-08 17:01:10.000000000 +0000
@@ -2,6 +2,7 @@
 
+
 
 
 
@@ -12,6 +13,7 @@
 
 
 
+
 
 
 
@@ -22,10 +24,13 @@
 
 
 
+
+
 
 
 
 
+
 
 
 
@@ -41,13 +46,15 @@
 
 
 
-
+
+
 
 
 
 
-
+
 
+
 
 
 
@@ -66,6 +73,7 @@
 
 
 
+
 
 
 
@@ -74,7 +82,7 @@
 
 
   
-    GMime 2.6 Reference Manual
+    GMime 3.0 Reference Manual
     
       
         Jeffrey
@@ -87,7 +95,7 @@
       
     
     
-      2000-2011
+      2000-2017
       Jeffrey Stedfast
     
 
@@ -151,6 +159,7 @@
     &gmime-Changes-2-2;
     &gmime-Changes-2-4;
     &gmime-Changes-2-6;
+    &gmime-Changes-3-0;
     &gmime-Resources;
     &gmime-Questions;
   
@@ -170,6 +179,8 @@
     &gmime-iconv-utils;
     &gmime-encodings;
     &gmime-utils;
+    &GMimeReferences;
+    &GMimeFormatOptions;
   
 
   
@@ -184,6 +195,7 @@
       &GMimeStream;
       &GMimeStreamFile;
       &GMimeStreamFs;
+      &GMimeStreamGIO;
       &GMimeStreamMem;
       &GMimeStreamMmap;
       &GMimeStreamNull;
@@ -199,13 +211,15 @@
       &GMimeFilterBasic;
       &GMimeFilterBest;
       &GMimeFilterCharset;
-      &GMimeFilterCRLF;
+      &GMimeFilterChecksum;
+      &GMimeFilterDos2Unix;
       &GMimeFilterEnriched;
       &GMimeFilterFrom;
       &GMimeFilterGZip;
       &GMimeFilterHTML;
-      &GMimeFilterMd5;
+      &GMimeFilterSmtpData;
       &GMimeFilterStrip;
+      &GMimeFilterUnix2Dos;
       &GMimeFilterWindows;
       &GMimeFilterYenc;
     
@@ -236,9 +250,11 @@
       &GMimeObject;
       &GMimeMessage;
       &GMimePart;
+      &GMimeTextPart;
       &GMimeMultipart;
       &GMimeMultipartEncrypted;
       &GMimeMultipartSigned;
+      &GMimeApplicationPkcs7Mime;
       &GMimeMessagePart;
       &GMimeMessagePartial;
       &GMimePartIter;
@@ -246,6 +262,7 @@
 
     
       Parsing Messages and MIME Parts
+      &GMimeParserOptions;
       &GMimeParser;
     
 
diff -Nru gmime-2.6.22+dfsg2/docs/reference/gmime.hierarchy gmime-3.0.1/docs/reference/gmime.hierarchy
--- gmime-2.6.22+dfsg2/docs/reference/gmime.hierarchy	1970-01-01 00:00:00.000000000 +0000
+++ gmime-3.0.1/docs/reference/gmime.hierarchy	2017-05-21 16:36:26.000000000 +0000
@@ -0,0 +1,59 @@
+GObject
+  GMimeObject
+    GMimeMessage
+    GMimePart
+      GMimeApplicationPkcs7Mime
+      GMimeMessagePartial
+      GMimeTextPart
+    GMimeMultipart
+      GMimeMultipartEncrypted
+      GMimeMultipartSigned
+    GMimeMessagePart
+  GMimeParam
+  GMimeParamList
+  GMimeContentType
+  GMimeContentDisposition
+  GMimeHeader
+  GMimeHeaderList
+  InternetAddress
+    InternetAddressGroup
+    InternetAddressMailbox
+  InternetAddressList
+  GMimeCertificate
+  GMimeCertificateList
+  GMimeDecryptResult
+  GMimeSignature
+  GMimeSignatureList
+  GMimeCryptoContext
+    GMimeGpgContext
+    GMimePkcs7Context
+  GMimeDataWrapper
+  GMimeFilter
+    GMimeFilterBasic
+    GMimeFilterBest
+    GMimeFilterCharset
+    GMimeFilterChecksum
+    GMimeFilterDos2Unix
+    GMimeFilterEnriched
+    GMimeFilterFrom
+    GMimeFilterGZip
+    GMimeFilterHTML
+    GMimeFilterSmtpData
+    GMimeFilterStrip
+    GMimeFilterUnix2Dos
+    GMimeFilterWindows
+    GMimeFilterYenc
+  GMimeParser
+  GMimeStream
+    GMimeStreamBuffer
+    GMimeStreamCat
+    GMimeStreamFile
+    GMimeStreamFilter
+    GMimeStreamFs
+    GMimeStreamGIO
+    GMimeStreamMem
+    GMimeStreamMmap
+    GMimeStreamNull
+    GMimeStreamPipe
+GInterface
+  GTypePlugin
diff -Nru gmime-2.6.22+dfsg2/docs/reference/gmime-sections.txt gmime-3.0.1/docs/reference/gmime-sections.txt
--- gmime-2.6.22+dfsg2/docs/reference/gmime-sections.txt	2017-04-28 17:43:42.000000000 +0000
+++ gmime-3.0.1/docs/reference/gmime-sections.txt	2017-05-21 16:42:45.000000000 +0000
@@ -6,8 +6,6 @@
 GMIME_BINARY_AGE
 GMIME_INTERFACE_AGE
 GMIME_CHECK_VERSION
-GMIME_ENABLE_RFC2047_WORKAROUNDS
-GMIME_ENABLE_USE_ONLY_USER_CHARSETS
 g_mime_init
 g_mime_shutdown
 gmime_major_version
@@ -21,7 +19,12 @@
 
gmime-error GMIME_ERROR +GMIME_GPGME_ERROR GMIME_ERROR_IS_SYSTEM + + +gmime_error_quark +gmime_gpgme_error_quark
@@ -103,8 +106,8 @@ gmime-stream-file GMimeStreamFile g_mime_stream_file_new +g_mime_stream_file_open g_mime_stream_file_new_with_bounds -g_mime_stream_file_new_for_path g_mime_stream_file_get_owner g_mime_stream_file_set_owner @@ -125,8 +128,8 @@ gmime-stream-fs GMimeStreamFs g_mime_stream_fs_new +g_mime_stream_fs_open g_mime_stream_fs_new_with_bounds -g_mime_stream_fs_new_for_path g_mime_stream_fs_get_owner g_mime_stream_fs_set_owner @@ -211,6 +214,8 @@ gmime-stream-null GMimeStreamNull g_mime_stream_null_new +g_mime_stream_null_get_count_newlines +g_mime_stream_null_set_count_newlines g_mime_stream_null_get_type @@ -251,6 +256,8 @@ g_mime_stream_filter_new g_mime_stream_filter_add g_mime_stream_filter_remove +g_mime_stream_filter_get_owner +g_mime_stream_filter_set_owner g_mime_stream_filter_get_type @@ -346,21 +353,39 @@
-gmime-filter-crlf -GMimeFilterCRLF -g_mime_filter_crlf_new +gmime-filter-smtp-data +GMimeFilterSmtpData +g_mime_filter_smtp_data_new + + +g_mime_filter_smtp_data_get_type + + +GMimeFilterSmtpDataClass +GMIME_TYPE_FILTER_SMTP_DATA +GMIME_FILTER_SMTP_DATA +GMIME_IS_FILTER_SMTP_DATA +GMIME_FILTER_SMTP_DATA_CLASS +GMIME_IS_FILTER_SMTP_DATA_CLASS +GMIME_FILTER_SMTP_DATA_GET_CLASS +
+ +
+gmime-filter-dos2unix +GMimeFilterDos2Unix +g_mime_filter_dos2unix_new -g_mime_filter_crlf_get_type +g_mime_filter_dos2unix_get_type -GMimeFilterCRLFClass -GMIME_TYPE_FILTER_CRLF -GMIME_FILTER_CRLF -GMIME_IS_FILTER_CRLF -GMIME_FILTER_CRLF_CLASS -GMIME_IS_FILTER_CRLF_CLASS -GMIME_FILTER_CRLF_GET_CLASS +GMimeFilterDos2UnixClass +GMIME_TYPE_FILTER_DOS2UNIX +GMIME_FILTER_DOS2UNIX +GMIME_IS_FILTER_DOS2UNIX +GMIME_FILTER_DOS2UNIX_CLASS +GMIME_IS_FILTER_DOS2UNIX_CLASS +GMIME_FILTER_DOS2UNIX_GET_CLASS
@@ -428,6 +453,7 @@ GMIME_FILTER_HTML_CONVERT_SPACES GMIME_FILTER_HTML_CONVERT_URLS GMIME_FILTER_HTML_MARK_CITATION +GMIME_FILTER_HTML_BLOCKQUOTE_CITATION GMIME_FILTER_HTML_CONVERT_ADDRESSES GMIME_FILTER_HTML_ESCAPE_8BIT GMIME_FILTER_HTML_CITE @@ -447,22 +473,22 @@
-gmime-filter-md5 -GMimeFilterMd5 -g_mime_filter_md5_new -g_mime_filter_md5_get_digest - - -g_mime_filter_md5_get_type - - -GMimeFilterMd5Class -GMIME_TYPE_FILTER_MD5 -GMIME_FILTER_MD5 -GMIME_IS_FILTER_MD5 -GMIME_FILTER_MD5_CLASS -GMIME_IS_FILTER_MD5_CLASS -GMIME_FILTER_MD5_GET_CLASS +gmime-filter-checksum +GMimeFilterChecksum +g_mime_filter_checksum_new +g_mime_filter_checksum_get_digest + + +g_mime_filter_checksum_get_type + + +GMimeFilterChecksumClass +GMIME_TYPE_FILTER_CHECKSUM +GMIME_FILTER_CHECKSUM +GMIME_IS_FILTER_CHECKSUM +GMIME_FILTER_CHECKSUM_CLASS +GMIME_IS_FILTER_CHECKSUM_CLASS +GMIME_FILTER_CHECKSUM_GET_CLASS
@@ -484,6 +510,24 @@
+gmime-filter-unix2dos +GMimeFilterUnix2Dos +g_mime_filter_unix2dos_new + + +g_mime_filter_unix2dos_get_type + + +GMimeFilterUnix2DosClass +GMIME_TYPE_FILTER_UNIX2DOS +GMIME_FILTER_UNIX2DOS +GMIME_IS_FILTER_UNIX2DOS +GMIME_FILTER_UNIX2DOS_CLASS +GMIME_IS_FILTER_UNIX2DOS_CLASS +GMIME_FILTER_UNIX2DOS_GET_CLASS +
+ +
gmime-filter-windows GMimeFilterWindows g_mime_filter_windows_new @@ -567,68 +611,116 @@
gmime-param GMimeParam -g_mime_param_new -g_mime_param_new_from_string -g_mime_param_destroy -g_mime_param_next +GMimeParamList g_mime_param_get_name g_mime_param_get_value -g_mime_param_append -g_mime_param_append_param -g_mime_param_write_to_string +g_mime_param_set_value +g_mime_param_get_charset +g_mime_param_set_charset +g_mime_param_get_lang +g_mime_param_set_lang +g_mime_param_get_encoding_method +g_mime_param_set_encoding_method +g_mime_param_list_new +g_mime_param_list_parse +g_mime_param_list_clear +g_mime_param_list_length +g_mime_param_list_set_parameter +g_mime_param_list_get_parameter +g_mime_param_list_get_parameter_at +g_mime_param_list_remove +g_mime_param_list_remove_at +g_mime_param_list_encode + + +g_mime_param_get_type +g_mime_param_list_get_type + + +GMIME_PARAM +GMIME_IS_PARAM +GMIME_TYPE_PARAM +GMIME_PARAM_CLASS +GMIME_IS_PARAM_CLASS +GMIME_PARAM_GET_CLASS +GMimeParamClass +GMIME_PARAM_LIST +GMIME_IS_PARAM_LIST +GMIME_TYPE_PARAM_LIST +GMIME_PARAM_LIST_CLASS +GMIME_IS_PARAM_LIST_CLASS +GMIME_PARAM_LIST_GET_CLASS +GMimeParamListClass
-gmime-header -GMimeHeaderIter +gmime-headerg +GMimeHeader GMimeHeaderList -GMimeHeaderWriter -GMimeHeaderForeachFunc -g_mime_header_iter_new -g_mime_header_iter_free -g_mime_header_iter_copy -g_mime_header_iter_copy_to -g_mime_header_iter_equal -g_mime_header_iter_first -g_mime_header_iter_last -g_mime_header_iter_next -g_mime_header_iter_prev -g_mime_header_iter_is_valid -g_mime_header_iter_get_name -g_mime_header_iter_get_value -g_mime_header_iter_set_value -g_mime_header_iter_remove +GMimeHeaderRawValueFormatter +g_mime_header_format_addrlist +g_mime_header_format_content_disposition +g_mime_header_format_content_type +g_mime_header_format_default +g_mime_header_format_message_id +g_mime_header_format_received +g_mime_header_format_references +g_mime_header_get_name +g_mime_header_get_raw_name +g_mime_header_get_offset +g_mime_header_get_value +g_mime_header_set_value +g_mime_header_get_raw_value +g_mime_header_set_raw_value +g_mime_header_write_to_stream g_mime_header_list_new -g_mime_header_list_destroy +g_mime_header_list_get_count g_mime_header_list_clear g_mime_header_list_contains +g_mime_header_list_get_header +g_mime_header_list_get_header_at g_mime_header_list_prepend g_mime_header_list_append -g_mime_header_list_remove g_mime_header_list_set -g_mime_header_list_get -g_mime_header_list_get_iter -g_mime_header_list_foreach -g_mime_header_list_register_writer +g_mime_header_list_remove +g_mime_header_list_remove_at g_mime_header_list_write_to_stream g_mime_header_list_to_string -g_mime_header_list_get_stream -g_mime_header_list_set_stream + + +g_mime_header_get_type +g_mime_header_list_get_type + + +GMIME_HEADER +GMIME_IS_HEADER +GMIME_TYPE_HEADER +GMIME_HEADER_CLASS +GMIME_IS_HEADER_CLASS +GMIME_HEADER_GET_CLASS +GMimeHeaderClass +GMIME_HEADER_LIST +GMIME_IS_HEADER_LIST +GMIME_TYPE_HEADER_LIST +GMIME_HEADER_LIST_CLASS +GMIME_IS_HEADER_LIST_CLASS +GMIME_HEADER_LIST_GET_CLASS +GMimeHeaderListClass
gmime-content-type GMimeContentType g_mime_content_type_new -g_mime_content_type_new_from_string -g_mime_content_type_to_string +g_mime_content_type_parse +g_mime_content_type_get_mime_type +g_mime_content_type_encode g_mime_content_type_is_type g_mime_content_type_get_media_type g_mime_content_type_set_media_type g_mime_content_type_get_media_subtype g_mime_content_type_set_media_subtype -g_mime_content_type_get_params -g_mime_content_type_set_params +g_mime_content_type_get_parameters g_mime_content_type_get_parameter g_mime_content_type_set_parameter @@ -651,15 +743,14 @@ GMIME_DISPOSITION_INLINE GMimeContentDisposition g_mime_content_disposition_new +g_mime_content_disposition_parse g_mime_content_disposition_is_attachment -g_mime_content_disposition_new_from_string g_mime_content_disposition_set_disposition g_mime_content_disposition_get_disposition -g_mime_content_disposition_get_params -g_mime_content_disposition_set_params +g_mime_content_disposition_get_parameters g_mime_content_disposition_set_parameter g_mime_content_disposition_get_parameter -g_mime_content_disposition_to_string +g_mime_content_disposition_encode g_mime_content_disposition_get_type @@ -720,6 +811,7 @@
gmime-part GMimePart +GMimeOpenPGPData g_mime_part_new g_mime_part_new_with_type g_mime_part_is_attachment @@ -737,8 +829,14 @@ g_mime_part_get_best_content_encoding g_mime_part_set_filename g_mime_part_get_filename -g_mime_part_get_content_object -g_mime_part_set_content_object +g_mime_part_get_content +g_mime_part_set_content +g_mime_part_get_openpgp_data +g_mime_part_set_openpgp_data +g_mime_part_openpgp_encrypt +g_mime_part_openpgp_decrypt +g_mime_part_openpgp_sign +g_mime_part_openpgp_verify g_mime_part_get_type @@ -758,6 +856,7 @@ GMimePartIter g_mime_part_iter_new g_mime_part_iter_free +g_mime_part_iter_clone g_mime_part_iter_reset g_mime_part_iter_jump_to g_mime_part_iter_is_valid @@ -769,6 +868,12 @@ g_mime_part_iter_get_path g_mime_part_iter_replace g_mime_part_iter_remove + + +g_mime_part_iter_get_type + + +GMIME_TYPE_PART_ITER
@@ -776,10 +881,10 @@ GMimeMultipart g_mime_multipart_new g_mime_multipart_new_with_subtype -g_mime_multipart_set_preface -g_mime_multipart_get_preface -g_mime_multipart_set_postface -g_mime_multipart_get_postface +g_mime_multipart_set_prologue +g_mime_multipart_get_prologue +g_mime_multipart_set_epilogue +g_mime_multipart_get_epilogue g_mime_multipart_set_boundary g_mime_multipart_get_boundary g_mime_multipart_get_count @@ -814,7 +919,6 @@ g_mime_multipart_encrypted_new g_mime_multipart_encrypted_encrypt g_mime_multipart_encrypted_decrypt -g_mime_multipart_encrypted_decrypt_session g_mime_multipart_encrypted_get_type @@ -850,23 +954,47 @@
+gmime-application-pkcs7-mime +GMimeApplicationPkcs7Mime +GMimeSecureMimeType +g_mime_application_pkcs7_mime_new +g_mime_application_pkcs7_mime_get_smime_type +g_mime_application_pkcs7_mime_encrypt +g_mime_application_pkcs7_mime_decrypt +g_mime_application_pkcs7_mime_sign +g_mime_application_pkcs7_mime_verify + + +g_mime_application_pkcs7_mime_get_type + + +GMIME_APPLICATION_PKCS7_MIME +GMIME_IS_APPLICATION_PKCS7_MIME +GMIME_TYPE_APPLICATION_PKCS7_MIME +GMIME_APPLICATION_PKCS7_MIME_CLASS +GMIME_IS_APPLICATION_PKCS7_MIME_CLASS +GMIME_APPLICATION_PKCS7_MIME_GET_CLASS +GMimeApplicationPkcs7MimeClass +
+ +
gmime-message -GMimeRecipientType +GMimeAddressType GMimeMessage g_mime_message_new -g_mime_message_set_sender g_mime_message_get_sender -g_mime_message_set_reply_to +g_mime_message_get_from g_mime_message_get_reply_to -g_mime_message_add_recipient -g_mime_message_get_recipients +g_mime_message_get_to +g_mime_message_get_cc +g_mime_message_get_bcc +g_mime_message_add_mailbox +g_mime_message_get_addresses g_mime_message_get_all_recipients g_mime_message_set_subject g_mime_message_get_subject g_mime_message_set_date g_mime_message_get_date -g_mime_message_set_date_as_string -g_mime_message_get_date_as_string g_mime_message_set_message_id g_mime_message_get_message_id g_mime_message_set_mime_part @@ -932,19 +1060,55 @@
+gmime-text-part +GMimeTextPart +g_mime_text_part_new +g_mime_text_part_new_with_subtype +g_mime_text_part_get_charset +g_mime_text_part_set_charset +g_mime_text_part_get_text +g_mime_text_part_set_text + + +g_mime_text_part_get_type + + +GMIME_TEXT_PART +GMIME_IS_TEXT_PART +GMIME_TYPE_TEXT_PART +GMIME_TEXT_PART_CLASS +GMIME_IS_TEXT_PART_CLASS +GMIME_TEXT_PART_GET_CLASS +GMimeTextPartClass +
+ +
+gmime-references +GMimeReferences +g_mime_references_new +g_mime_references_free +g_mime_references_copy +g_mime_references_parse +g_mime_references_length +g_mime_references_append +g_mime_references_clear +g_mime_references_get_message_id +g_mime_references_set_message_id + + +g_mime_references_get_type + + +GMIME_TYPE_REFERENCES +
+ +
gmime-utils GMimeReferences g_mime_utils_header_decode_date g_mime_utils_header_format_date g_mime_utils_generate_message_id g_mime_utils_decode_message_id -g_mime_references_get_message_id -g_mime_references_get_next -g_mime_references_decode -g_mime_references_append -g_mime_references_clear -g_mime_references_free -g_mime_utils_header_fold g_mime_utils_header_printf g_mime_utils_quote_string g_mime_utils_unquote_string @@ -998,6 +1162,8 @@ InternetAddress internet_address_get_name internet_address_set_name +internet_address_get_charset +internet_address_set_charset internet_address_to_string @@ -1039,6 +1205,7 @@ internet_address_mailbox_new internet_address_mailbox_get_addr internet_address_mailbox_set_addr +internet_address_mailbox_get_idn_addr internet_address_mailbox_get_type @@ -1056,6 +1223,7 @@ internet-address-list InternetAddressList internet_address_list_new +internet_address_list_parse internet_address_list_length internet_address_list_clear internet_address_list_add @@ -1069,8 +1237,7 @@ internet_address_list_prepend internet_address_list_append internet_address_list_to_string -internet_address_list_parse_string -internet_address_list_writer +internet_address_list_encode internet_address_list_get_type @@ -1085,16 +1252,70 @@
+gmime-format-options +GMimeParamEncodingMethod +GMimeNewLineFormat +GMimeFormatOptions +g_mime_format_options_new +g_mime_format_options_free +g_mime_format_options_clone +g_mime_format_options_get_default +g_mime_format_options_get_param_encoding_method +g_mime_format_options_set_param_encoding_method +g_mime_format_options_get_newline_format +g_mime_format_options_set_newline_format +g_mime_format_options_get_newline +g_mime_format_options_create_newline_filter +g_mime_format_options_is_hidden_header +g_mime_format_options_add_hidden_header +g_mime_format_options_remove_hidden_header +g_mime_format_options_clear_hidden_headers + + +g_mime_format_options_get_type + + +GMIME_TYPE_FORMAT_OPTIONS +
+ +
+gmime-parser-options +GMimeParserOptions +GMimeRfcComplianceMode +g_mime_parser_options_new +g_mime_parser_options_free +g_mime_parser_options_clone +g_mime_parser_options_get_default +g_mime_parser_options_get_address_compliance_mode +g_mime_parser_options_set_address_compliance_mode +g_mime_parser_options_get_allow_addresses_without_domain +g_mime_parser_options_set_allow_addresses_without_domain +g_mime_parser_options_get_parameter_compliance_mode +g_mime_parser_options_set_parameter_compliance_mode +g_mime_parser_options_get_rfc2047_compliance_mode +g_mime_parser_options_set_rfc2047_compliance_mode +g_mime_parser_options_get_fallback_charsets +g_mime_parser_options_set_fallback_charsets + + +g_mime_parser_options_get_type + + +GMIME_TYPE_PARSER_OPTIONS +
+ +
gmime-parser GMimeParser +GMimeFormat GMimeParserHeaderRegexFunc g_mime_parser_new g_mime_parser_new_with_stream g_mime_parser_init_with_stream g_mime_parser_get_persist_stream g_mime_parser_set_persist_stream -g_mime_parser_get_scan_from -g_mime_parser_set_scan_from +g_mime_parser_get_format +g_mime_parser_set_format g_mime_parser_get_respect_content_length g_mime_parser_set_respect_content_length g_mime_parser_set_header_regex @@ -1102,8 +1323,8 @@ g_mime_parser_eos g_mime_parser_construct_part g_mime_parser_construct_message -g_mime_parser_get_from -g_mime_parser_get_from_offset +g_mime_parser_get_mbox_marker +g_mime_parser_get_mbox_marker_offset g_mime_parser_get_headers_begin g_mime_parser_get_headers_end @@ -1138,14 +1359,10 @@ g_mime_charset_best_name g_mime_charset_best g_mime_charset_can_encode -g_mime_set_user_charsets -g_mime_user_charsets
gmime-iconv -g_mime_iconv_init -g_mime_iconv_shutdown g_mime_iconv_open g_mime_iconv g_mime_iconv_close @@ -1165,7 +1382,7 @@ gmime-certificate GMimePubKeyAlgo GMimeDigestAlgo -GMimeCertificateTrust +GMimeTrust GMimeCertificate g_mime_certificate_new g_mime_certificate_get_pubkey_algo @@ -1227,15 +1444,12 @@
gmime-signature GMimeSignatureStatus -GMimeSignatureError GMimeSignature g_mime_signature_new g_mime_signature_get_certificate g_mime_signature_set_certificate g_mime_signature_get_status g_mime_signature_set_status -g_mime_signature_get_errors -g_mime_signature_set_errors g_mime_signature_get_created g_mime_signature_set_created g_mime_signature_get_expires @@ -1276,21 +1490,24 @@
gmime-crypto-context +GMimeCryptoContextNewFunc GMimePasswordRequestFunc +GMimeDecryptFlags +GMimeEncryptFlags +GMimeVerifyFlags GMimeCryptoContext +g_mime_crypto_context_register +g_mime_crypto_context_new g_mime_crypto_context_set_request_password g_mime_crypto_context_get_signature_protocol g_mime_crypto_context_get_encryption_protocol g_mime_crypto_context_get_key_exchange_protocol -g_mime_crypto_context_get_retrieve_session_key -g_mime_crypto_context_set_retrieve_session_key g_mime_crypto_context_digest_id g_mime_crypto_context_digest_name g_mime_crypto_context_sign g_mime_crypto_context_verify g_mime_crypto_context_encrypt g_mime_crypto_context_decrypt -g_mime_crypto_context_decrypt_session g_mime_crypto_context_import_keys g_mime_crypto_context_export_keys @@ -1332,12 +1549,6 @@ gmime-gpg-context GMimeGpgContext g_mime_gpg_context_new -g_mime_gpg_context_get_always_trust -g_mime_gpg_context_set_always_trust -g_mime_gpg_context_get_auto_key_retrieve -g_mime_gpg_context_set_auto_key_retrieve -g_mime_gpg_context_get_use_agent -g_mime_gpg_context_set_use_agent g_mime_gpg_context_get_type @@ -1356,8 +1567,6 @@ gmime-pkcs7-context GMimePkcs7Context g_mime_pkcs7_context_new -g_mime_pkcs7_context_get_always_trust -g_mime_pkcs7_context_set_always_trust g_mime_pkcs7_context_get_type diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/ch01.html gmime-3.0.1/docs/reference/html/ch01.html --- gmime-2.6.22+dfsg2/docs/reference/html/ch01.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/ch01.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,74 @@ + + + + +Class hierarchy: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/classes.html gmime-3.0.1/docs/reference/html/classes.html --- gmime-2.6.22+dfsg2/docs/reference/html/classes.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/classes.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,216 @@ + + + + +Part IV. GMime Classes: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+

+Part IV. GMime Classes

+
+

Table of Contents

+
+
Class hierarchy
+
Streams
+
+
+GMimeStream — Abstract stream class +
+
+GMimeStreamFile — A Standard-C FILE-based stream +
+
+GMimeStreamFs — A low-level FileSystem stream +
+
+GMimeStreamGIO — A wrapper for GLib's GIO streams +
+
+GMimeStreamMem — A memory-backed stream +
+
+GMimeStreamMmap — A memory-mapped file stream +
+
+GMimeStreamNull — A null stream +
+
+GMimeStreamFilter — A filtering stream +
+
+GMimeStreamBuffer — A buffered stream +
+
+GMimeStreamPipe — A low-level pipe stream +
+
+GMimeStreamCat — A concatenated stream +
+
+
Stream Filters
+
+
+GMimeFilter — Abstract filter class +
+
+GMimeFilterBasic — Basic transfer encoding filter +
+
+GMimeFilterBest — Determine the best charset/encoding to use for a stream +
+
+GMimeFilterCharset — Charset-conversion filter +
+
+GMimeFilterChecksum — Calculate a checksum +
+
+GMimeFilterDos2Unix — Convert line-endings from Windows/DOS (CRLF) to UNIX (LF). +
+
+GMimeFilterEnriched — Convert text/enriched or text/rtf to HTML +
+
+GMimeFilterFrom — Escape MBox From_ lines +
+
+GMimeFilterGZip — GNU Zip compression/decompression +
+
+GMimeFilterHTML — Convert plain text into HTML +
+
+GMimeFilterSmtpData — Byte-stuffs outgoing SMTP DATA. +
+
+GMimeFilterStrip — Strip trailing whitespace from the end of lines +
+
+GMimeFilterUnix2Dos — Convert line-endings from UNIX (LF) to Windows/DOS (CRLF). +
+
+GMimeFilterWindows — Determine if text is in a Microsoft Windows codepage +
+
+GMimeFilterYenc — yEncode or yDecode +
+
+
Data Wrappers
+
+GMimeDataWrapper — Content objects +
+
Message and MIME Headers
+
+
+GMimeHeaderList — Message and MIME part headers +
+
+GMimeContentType — Content-Type fields +
+
+GMimeContentDisposition — Content-Disposition fields +
+
+GMimeParamList — Content-Type and Content-Disposition parameters +
+
+
Internet Addresses
+
+
+InternetAddress — Internet addresses +
+
+InternetAddressGroup — rfc822 'group' address +
+
+InternetAddressMailbox — rfc822 'mailbox' address +
+
+InternetAddressList — A list of internet addresses +
+
+
MIME Messages and Parts
+
+
+GMimeObject — Abstract MIME objects +
+
+GMimeMessage — Messages +
+
+GMimePart — MIME parts +
+
+GMimeTextPart — textual MIME parts +
+
+GMimeMultipart — MIME multiparts +
+
+GMimeMultipartEncrypted — Encrypted MIME multiparts +
+
+GMimeMultipartSigned — Signed MIME multiparts +
+
+GMimeApplicationPkcs7Mime — Pkcs7 MIME parts +
+
+GMimeMessagePart — Message parts +
+
+GMimeMessagePartial — Partial MIME parts +
+
+GMimePartIter — MIME part iterators +
+
+
Parsing Messages and MIME Parts
+
+
+GMimeParserOptions — Parser options +
+
+GMimeParser — Message and MIME part parser +
+
+
Cryptography Contexts
+
+
+GMimeCertificate — Digital certificates +
+
+GMimeSignature — Digital signatures +
+
+GMimeCryptoContext — Encryption/signing contexts +
+
+GMimeGpgContext — GnuPG crypto contexts +
+
+GMimePkcs7Context — PKCS7 crypto contexts +
+
+
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/core.html gmime-3.0.1/docs/reference/html/core.html --- gmime-2.6.22+dfsg2/docs/reference/html/core.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/core.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,58 @@ + + + + +Part III. GMime Core Reference: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+

+Part III. GMime Core Reference

+
+

Table of Contents

+
+
+gmime — Initialization, shutdown and version-check routines +
+
+gmime-charset — Charset helper functions +
+
+gmime-iconv — Low-level routines for converting text from one charset to another +
+
+gmime-iconv-utils — High-level routines for converting text from one charset to another +
+
+gmime-encodings — MIME encoding functions +
+
+gmime-utils — MIME utility functions +
+
+GMimeReferences — a list of Message-Ids +
+
+GMimeFormatOptions — Format options +
+
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/CryptoContexts.html gmime-3.0.1/docs/reference/html/CryptoContexts.html --- gmime-2.6.22+dfsg2/docs/reference/html/CryptoContexts.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/CryptoContexts.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,46 @@ + + + + +Cryptography Contexts: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+

+Cryptography Contexts

+
+
+GMimeCertificate — Digital certificates +
+
+GMimeSignature — Digital signatures +
+
+GMimeCryptoContext — Encryption/signing contexts +
+
+GMimeGpgContext — GnuPG crypto contexts +
+
+GMimePkcs7Context — PKCS7 crypto contexts +
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/DataWrappers.html gmime-3.0.1/docs/reference/html/DataWrappers.html --- gmime-2.6.22+dfsg2/docs/reference/html/DataWrappers.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/DataWrappers.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,32 @@ + + + + +Data Wrappers: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+

+Data Wrappers

+
+GMimeDataWrapper — Content objects +
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/Filters.html gmime-3.0.1/docs/reference/html/Filters.html --- gmime-2.6.22+dfsg2/docs/reference/html/Filters.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/Filters.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,76 @@ + + + + +Stream Filters: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+

+Stream Filters

+
+
+GMimeFilter — Abstract filter class +
+
+GMimeFilterBasic — Basic transfer encoding filter +
+
+GMimeFilterBest — Determine the best charset/encoding to use for a stream +
+
+GMimeFilterCharset — Charset-conversion filter +
+
+GMimeFilterChecksum — Calculate a checksum +
+
+GMimeFilterDos2Unix — Convert line-endings from Windows/DOS (CRLF) to UNIX (LF). +
+
+GMimeFilterEnriched — Convert text/enriched or text/rtf to HTML +
+
+GMimeFilterFrom — Escape MBox From_ lines +
+
+GMimeFilterGZip — GNU Zip compression/decompression +
+
+GMimeFilterHTML — Convert plain text into HTML +
+
+GMimeFilterSmtpData — Byte-stuffs outgoing SMTP DATA. +
+
+GMimeFilterStrip — Strip trailing whitespace from the end of lines +
+
+GMimeFilterUnix2Dos — Convert line-endings from UNIX (LF) to Windows/DOS (CRLF). +
+
+GMimeFilterWindows — Determine if text is in a Microsoft Windows codepage +
+
+GMimeFilterYenc — yEncode or yDecode +
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/fundamentals.html gmime-3.0.1/docs/reference/html/fundamentals.html --- gmime-2.6.22+dfsg2/docs/reference/html/fundamentals.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/fundamentals.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,43 @@ + + + + +Part II. GMime Fundamentals: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+

+Part II. GMime Fundamentals

+
+

Table of Contents

+
+
+Streams — How to use Streams +
+
+Stream Filters — How to use Stream Filters +
+
+Data Wrappers — How to use Data Wrappers +
+
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeApplicationPkcs7Mime.html gmime-3.0.1/docs/reference/html/GMimeApplicationPkcs7Mime.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeApplicationPkcs7Mime.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeApplicationPkcs7Mime.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,475 @@ + + + + +GMimeApplicationPkcs7Mime: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeApplicationPkcs7Mime

+

GMimeApplicationPkcs7Mime — Pkcs7 MIME parts

+
+ +
+

Types and Values

+
++++ + + + + + + + + + + +
structGMimeApplicationPkcs7Mime
enumGMimeSecureMimeType
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeObject
+        ╰── GMimePart
+            ╰── GMimeApplicationPkcs7Mime
+
+
+
+

Description

+

A GMimeApplicationPkcs7Mime represents the application/pkcs7-mime MIME part.

+
+
+

Functions

+
+

g_mime_application_pkcs7_mime_new ()

+
GMimeApplicationPkcs7Mime *
+g_mime_application_pkcs7_mime_new (GMimeSecureMimeType type);
+

Creates a new application/pkcs7-mime object.

+
+

Parameters

+
+++++ + + + + + +

type

The type of S/MIME data contained within the part.

 
+
+
+

Returns

+

an empty application/pkcs7-mime object.

+
+
+
+
+

g_mime_application_pkcs7_mime_get_smime_type ()

+
GMimeSecureMimeType
+g_mime_application_pkcs7_mime_get_smime_type
+                               (GMimeApplicationPkcs7Mime *pkcs7_mime);
+

Gets the smime-type value of the Content-Type header.

+
+

Parameters

+
+++++ + + + + + +

pkcs7_mime

A GMimeApplicationPkcs7Mime object

 
+
+
+

Returns

+

the smime-type value.

+
+
+
+
+

g_mime_application_pkcs7_mime_encrypt ()

+
GMimeApplicationPkcs7Mime *
+g_mime_application_pkcs7_mime_encrypt (GMimeObject *entity,
+                                       GMimeEncryptFlags flags,
+                                       GPtrArray *recipients,
+                                       GError **err);
+

Attempts to encrypt the entity + MIME part to the public keys of recipients + +using S/MIME. If successful, a new application/pkcs7-mime object is returned.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

entity

a GMimeObject to encrypt

 

flags

a GMimeEncryptFlags

 

recipients

an array of recipients to encrypt to.

[element-type utf8]

err

a GError

 
+
+
+

Returns

+

a new GMimeApplicationPkcs7Mime object on success +or NULL on fail. If encrypting fails, an exception will be set on err +to provide +information as to why the failure occured.

+

[nullable][transfer full]

+
+
+
+
+

g_mime_application_pkcs7_mime_decrypt ()

+
GMimeObject *
+g_mime_application_pkcs7_mime_decrypt (GMimeApplicationPkcs7Mime *pkcs7_mime,
+                                       GMimeDecryptFlags flags,
+                                       const char *session_key,
+                                       GMimeDecryptResult **result,
+                                       GError **err);
+

Attempts to decrypt the encrypted application/pkcs7-mime part.

+

When non-NULL, session_key + should be a NULL-terminated string, +such as the one returned by g_mime_decrypt_result_get_session_key() +from a previous decryption. If the sesion_key + is not valid, decryption +will fail.

+

If result + is non-NULL, then on a successful decrypt operation, it will be +updated to point to a newly-allocated GMimeDecryptResult with signature +status information as well as a list of recipients that the part was +encrypted to.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

pkcs7_mime

a GMimeApplicationPkcs7Mime

 

flags

a GMimeDecryptFlags

 

session_key

session key to use or NULL

 

result

the decryption result

 

err

a GError

 
+
+
+

Returns

+

the decrypted MIME part on success or +NULL on fail. If the decryption fails, an exception will be set on +err +to provide information as to why the failure occured.

+

[nullable][transfer full]

+
+
+
+
+

g_mime_application_pkcs7_mime_sign ()

+
GMimeApplicationPkcs7Mime *
+g_mime_application_pkcs7_mime_sign (GMimeObject *entity,
+                                    const char *userid,
+                                    GError **err);
+

Attempts to sign the entity + MIME part with userid +'s private key using +S/MIME. If successful, a new application/pkcs7-mime object is returned.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

entity

a GMimeObject

 

userid

the user id to sign with

 

err

a GError

 
+
+
+

Returns

+

a new GMimeApplicationPkcs7Mime object on success +or NULL on fail. If signing fails, an exception will be set on err +to provide +information as to why the failure occured.

+

[nullable][transfer full]

+
+
+
+
+

g_mime_application_pkcs7_mime_verify ()

+
GMimeSignatureList *
+g_mime_application_pkcs7_mime_verify (GMimeApplicationPkcs7Mime *pkcs7_mime,
+                                      GMimeVerifyFlags flags,
+                                      GMimeObject **entity,
+                                      GError **err);
+

Attempts to verify the signed pkcs7_mime + part and extract the original +MIME entity.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

pkcs7_mime

a GMimeApplicationPkcs7Mime

 

flags

a GMimeVerifyFlags

 

entity

the extracted entity.

[out][transfer full]

err

a GError

 
+
+
+

Returns

+

a new GMimeSignatureList object on +success or NULL on fail. If the verification fails, an exception +will be set on err +to provide information as to why the failure +occured.

+

[nullable][transfer full]

+
+
+
+
+

Types and Values

+
+

struct GMimeApplicationPkcs7Mime

+
struct GMimeApplicationPkcs7Mime;
+

An application/pkcs7-mime MIME part.

+
+

Members

+
+++++ + +
+
+
+
+
+

enum GMimeSecureMimeType

+

The S/MIME data type.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

GMIME_SECURE_MIME_TYPE_COMPRESSED_DATA

+

The S/MIME content contains compressed data.

+
 

GMIME_SECURE_MIME_TYPE_ENVELOPED_DATA

+

The S/MIME content contains enveloped data.

+
 

GMIME_SECURE_MIME_TYPE_SIGNED_DATA

+

The S/MIME content contains signed data.

+
 

GMIME_SECURE_MIME_TYPE_CERTS_ONLY

+

The S/MIME content contains only certificates.

+
 

GMIME_SECURE_MIME_TYPE_UNKNOWN

+

The S/MIME content is unknown.

+
 
+
+
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/gmime-building.html gmime-3.0.1/docs/reference/html/gmime-building.html --- gmime-2.6.22+dfsg2/docs/reference/html/gmime-building.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/gmime-building.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,283 @@ + + + + +Compiling the GMime libraries: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Compiling the GMime libraries

+

Compiling the GMime Libraries — How to compile GMime itself

+
+
+

Building GMime on UNIX-like systems

+

+ This chapter covers building and installing GMime on UNIX and + UNIX-like systems such as Linux. Compiling GMime on Microsoft + Windows is not a goal of the project, however if you are able + build on a Microsoft Windows platform, do send me building and + installing instructions and I will add them to this document. +

+

+ Before we get into the details of how to compile GMime, I should + mention that binary packages of GMime prebuilt for your operating + system may be available either from your operating system vendor + or from independent sources such as http://rpmfind.net. If you + can find them, it may be the easiest way of getting started + developing GMime. +

+

+ On UNIX-like systems GMime uses the standard GNU build system, + using autoconf for package + configuration and resolving portability issues, + automake for building makefiles that + comply with the GNU Coding Standards, and + libtool for building shared libraries + on multiple platforms. +

+

+ If you are building GMime from the distributed source packages, + then you won't need these tools installed; the necessary pieces + of the tools are already included in the source packages. But + it's useful to know a bit about how packages that use these + tools work. A source package is distributed as a + tar.gz file which you unpack into a + directory full of the source files as follows: +

+
+      tar -zxvf gmime-3.0.x.tar.gz
+    
+

+ In the toplevel of the directory that is created, there will be + a shell script called configure which + you then run to take the template makefiles called + Makefile.in in the package and create + makefiles customized for your operating system. The + configure script can be passed various + command line arguments to determine how the package is built and + installed. The most commonly useful argument is the + --prefix argument which specifies where + the package is installed. To install a package into + /opt/gmime you would run configure as: +

+
+      ./configure --prefix=/opt/gmime
+    
+

+ A full list of options can be found by running + configure with the + --help argument. In general, the defaults + are right and should be trusted. After you've run + configure, you then run the + make command to build the package and install + it. +

+
+      make
+      make install
+    
+

+ If you don't have permission to write to the directory you are + installing in, you may have to change to root temporarily before + running make install. A quick way to do this is + to use the su command with the + -c option + (ex. su -c "make install"). Also, if you are + installing in a system directory, on some systems (such as + Linux), you will need to run ldconfig after + make install so that the newly installed + libraries will be found. +

+

+ Several environment variables are useful to pass to set before + running configure. CPPFLAGS contains options to + pass to the C compiler, and is used to tell the compiler where + to look for include files. The LDFLAGS variable + is used in a similar fashion for the linker. Finally the + PKG_CONFIG_PATH environment variable contains + a search path that pkg-config (see below) + uses when looking for a file describing how to compile + programs using different libraries. If you were installing GMime + and it's dependencies into /opt/gmime, you + might want to set these variables as: +

+
+      CPPFLAGS="-I/opt/gmime/include"
+      LDFLAGS="-L/opt/gmime/lib"
+      PKG_CONFIG_PATH="/opt/gmime/lib/pkgconfig"
+      export CPPFLAGS LDFLAGS PKG_CONFIG_PATH
+    
+

+ You may also need to set the LD_LIBRARY_PATH + environment variable so the systems dynamic linker can find + the newly installed libraries, and the PATH + environment program so that utility binaries installed by + the various libraries will be found. +

+
+      LD_LIBRARY_PATH="/opt/gmime/lib"
+      PATH="/opt/gmime/bin:$PATH"
+      export LD_LIBRARY_PATH PATH
+    
+
+
+

Dependencies

+

+ Before you can compile the GMime library, you need to have + various other tools and libraries installed on your + system. The two tools needed during the build process (as + differentiated from the tools used in when creating GMime + mentioned above such as autoconf) + are pkg-config and GNU make. +

+
    +
  • pkg-config + is a tool for tracking the compilation flags needed for + libraries that are used by the GMime libraries. (For each + library, a small .pc text file is installed in a standard + location that contains the compilation flags needed for that + library along with version number information.) The version + of pkg-config needed to build GMime is + mirrored in the dependencies directory + on the GTK+ FTP + site.

  • +
  • + The GMime makefiles will mostly work with different versions + of make, however, there tends to be + a few incompatibilities, so the GMime team recommends + installing GNU + make if you don't already have it on your system + and using it. (It may be called gmake + rather than make.) +

  • +
+

+ GMime depends on the existance of two (2) libraries: GLib and iconv. +

+
    +
  • + The GLib library provides core non-graphical functionality + such as high level data types, Unicode manipulation, and + a object and type system to C programs. It is available + from the GTK+ + FTP site. +

  • +
  • + The GNU + libiconv library is needed to build GLib and GMime + if your system doesn't already have the + iconv() function for doing conversion + between character encodings. Most modern systems should have + iconv(). +

  • +
+
+
+

Building and testing GMime

+

+ First make sure that you have the necessary external + dependencies installed: pkg-config, GNU make, + and, if necessary, libiconv. To get detailed information about + building these packages, see the documentation provided with the + individual packages. On a newer Linux system, it's quite likely + that you'll have all of these installed already. +

+

+ Then build and install the GMime libraries in the order: + libiconv, GLib, then GMime. For each library, follow the + steps of configure, make, + make install mentioned above. If you're + lucky, this will all go smoothly, and you'll be ready to + start compiling your own GMime + applications. You can test your GMime installation + by running pkg-config --modversion gmime-3.0 + and making sure that it can both find GMime and reports the + correct version. +

+

+ If one of the configure scripts fails or running + make fails, look closely at the error + messages printed; these will often provide useful information + as to what went wrong. When configure + fails, extra information, such as errors that a test compilation + ran into, is found in the file config.log. + Looking at the last couple of hundred lines in this file will + frequently make clear what went wrong. If all else fails, you + can ask for help by emailing me, fejj@gnome.org +

+
+
+

Extra Configuration Options

+

+ In addition to the normal options, the + configure script for the GMime library + supports a number of additional arguments. (Command line + arguments for the other GMime libraries are described in + the documentation distributed with those libraries.) + +

+

./configure [[--enable-profiling] | [--enable-warnings] | [--enable-mono] | [--enable-gtk-doc] | [--enable-largfile]]

+

+

+

+ --enable-profiling + .  + Normally GMime will not pass the -pg flag to + gcc when building. This option will enable + the use of that flag thus building profiling information into + the GMime libraries for use with the GNU Profiler, gprof. Odds + are you do not care about this option unless you are either me + or desire to profile GMime and/or your program. +

+

+ --enable-warnings + .  + This option enables parser warnings about invalid MIME to be + logged to stderr at runtime. Again, it is unlikely you will + care to use this option. +

+

+ --enable-mono + .  + This option will include the Mono .NET bindings as part of + the build. +

+

+ --enable-gtk-doc + .  + This option will enable the building of the reference + documentation for GMime (e.g. the html pages you are + reading now). +

+

+ --enable-largefile + .  + This option will enable large file support (e.g. files larger + than 2GB) on 32bit systems. This flag is enabled by default + starting with GMime 2.4.5. +

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeCertificate.html gmime-3.0.1/docs/reference/html/GMimeCertificate.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeCertificate.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeCertificate.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,1649 @@ + + + + +GMimeCertificate: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeCertificate

+

GMimeCertificate — Digital certificates

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GMimeCertificate * + +g_mime_certificate_new () +
+GMimePubKeyAlgo + +g_mime_certificate_get_pubkey_algo () +
+void + +g_mime_certificate_set_pubkey_algo () +
+GMimeDigestAlgo + +g_mime_certificate_get_digest_algo () +
+void + +g_mime_certificate_set_digest_algo () +
const char * + +g_mime_certificate_get_issuer_serial () +
+void + +g_mime_certificate_set_issuer_serial () +
const char * + +g_mime_certificate_get_issuer_name () +
+void + +g_mime_certificate_set_issuer_name () +
const char * + +g_mime_certificate_get_fingerprint () +
+void + +g_mime_certificate_set_fingerprint () +
+time_t + +g_mime_certificate_get_created () +
+void + +g_mime_certificate_set_created () +
+time_t + +g_mime_certificate_get_expires () +
+void + +g_mime_certificate_set_expires () +
const char * + +g_mime_certificate_get_key_id () +
+void + +g_mime_certificate_set_key_id () +
+GMimeTrust + +g_mime_certificate_get_trust () +
+void + +g_mime_certificate_set_trust () +
const char * + +g_mime_certificate_get_email () +
+void + +g_mime_certificate_set_email () +
const char * + +g_mime_certificate_get_name () +
+void + +g_mime_certificate_set_name () +
+GMimeCertificateList * + +g_mime_certificate_list_new () +
+int + +g_mime_certificate_list_length () +
+void + +g_mime_certificate_list_clear () +
+int + +g_mime_certificate_list_add () +
+void + +g_mime_certificate_list_insert () +
+gboolean + +g_mime_certificate_list_remove () +
+gboolean + +g_mime_certificate_list_remove_at () +
+gboolean + +g_mime_certificate_list_contains () +
+int + +g_mime_certificate_list_index_of () +
+GMimeCertificate * + +g_mime_certificate_list_get_certificate () +
+void + +g_mime_certificate_list_set_certificate () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + + + + + + + + + + + + + +
enumGMimePubKeyAlgo
enumGMimeDigestAlgo
enumGMimeTrust
structGMimeCertificate
structGMimeCertificateList
+
+
+

Object Hierarchy

+
    GObject
+    ├── GMimeCertificate
+    ╰── GMimeCertificateList
+
+
+
+

Description

+

A GMimeCertificate is an object containing useful information about a +digital certificate as used in signing and encrypting data.

+
+
+

Functions

+
+

g_mime_certificate_new ()

+
GMimeCertificate *
+g_mime_certificate_new (void);
+

Creates a new GMimeCertificate object.

+
+

Returns

+

a new GMimeCertificate object.

+
+
+
+
+

g_mime_certificate_get_pubkey_algo ()

+
GMimePubKeyAlgo
+g_mime_certificate_get_pubkey_algo (GMimeCertificate *cert);
+

Get the public-key algorithm used by the certificate.

+
+

Parameters

+
+++++ + + + + + +

cert

a GMimeCertificate

 
+
+
+

Returns

+

the public-key algorithm used by the certificate or +GMIME_PUBKEY_ALGO_DEFAULT if unspecified.

+
+
+
+
+

g_mime_certificate_set_pubkey_algo ()

+
void
+g_mime_certificate_set_pubkey_algo (GMimeCertificate *cert,
+                                    GMimePubKeyAlgo algo);
+

Set the public-key algorithm used by the certificate.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cert

a GMimeCertificate

 

algo

a GMimePubKeyAlgo

 
+
+
+
+
+

g_mime_certificate_get_digest_algo ()

+
GMimeDigestAlgo
+g_mime_certificate_get_digest_algo (GMimeCertificate *cert);
+

Get the digest algorithm used by the certificate.

+
+

Parameters

+
+++++ + + + + + +

cert

a GMimeCertificate

 
+
+
+

Returns

+

the digest algorithm used by the certificate or +GMIME_DIGEST_ALGO_DEFAULT if unspecified.

+
+
+
+
+

g_mime_certificate_set_digest_algo ()

+
void
+g_mime_certificate_set_digest_algo (GMimeCertificate *cert,
+                                    GMimeDigestAlgo algo);
+

Set the digest algorithm used by the certificate.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cert

a GMimeCertificate

 

algo

a GMimeDigestAlgo

 
+
+
+
+
+

g_mime_certificate_get_issuer_serial ()

+
const char *
+g_mime_certificate_get_issuer_serial (GMimeCertificate *cert);
+

Get the certificate's issuer serial.

+
+

Parameters

+
+++++ + + + + + +

cert

a GMimeCertificate

 
+
+
+

Returns

+

the certificate's issuer serial or NULL if unspecified.

+
+
+
+
+

g_mime_certificate_set_issuer_serial ()

+
void
+g_mime_certificate_set_issuer_serial (GMimeCertificate *cert,
+                                      const char *issuer_serial);
+

Set the certificate's issuer serial.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cert

a GMimeCertificate

 

issuer_serial

certificate's issuer serial

 
+
+
+
+
+

g_mime_certificate_get_issuer_name ()

+
const char *
+g_mime_certificate_get_issuer_name (GMimeCertificate *cert);
+

Get the certificate's issuer name.

+
+

Parameters

+
+++++ + + + + + +

cert

a GMimeCertificate

 
+
+
+

Returns

+

the certificate's issuer name or NULL if unspecified.

+
+
+
+
+

g_mime_certificate_set_issuer_name ()

+
void
+g_mime_certificate_set_issuer_name (GMimeCertificate *cert,
+                                    const char *issuer_name);
+

Set the certificate's issuer name.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cert

a GMimeCertificate

 

issuer_name

certificate's issuer name

 
+
+
+
+
+

g_mime_certificate_get_fingerprint ()

+
const char *
+g_mime_certificate_get_fingerprint (GMimeCertificate *cert);
+

Get the certificate's key fingerprint.

+
+

Parameters

+
+++++ + + + + + +

cert

a GMimeCertificate

 
+
+
+

Returns

+

the certificate's key fingerprint or NULL if unspecified.

+
+
+
+
+

g_mime_certificate_set_fingerprint ()

+
void
+g_mime_certificate_set_fingerprint (GMimeCertificate *cert,
+                                    const char *fingerprint);
+

Set the certificate's key fingerprint.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cert

a GMimeCertificate

 

fingerprint

fingerprint string

 
+
+
+
+
+

g_mime_certificate_get_created ()

+
time_t
+g_mime_certificate_get_created (GMimeCertificate *cert);
+

Get the creation date of the certificate's key.

+
+

Parameters

+
+++++ + + + + + +

cert

a GMimeCertificate

 
+
+
+

Returns

+

the creation date of the certificate's key or -1 if unknown.

+
+
+
+
+

g_mime_certificate_set_created ()

+
void
+g_mime_certificate_set_created (GMimeCertificate *cert,
+                                time_t created);
+

Set the creation date of the certificate's key.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cert

a GMimeCertificate

 

created

creation date

 
+
+
+
+
+

g_mime_certificate_get_expires ()

+
time_t
+g_mime_certificate_get_expires (GMimeCertificate *cert);
+

Get the expiration date of the certificate's key.

+
+

Parameters

+
+++++ + + + + + +

cert

a GMimeCertificate

 
+
+
+

Returns

+

the expiration date of the certificate's key or -1 if unknown.

+
+
+
+
+

g_mime_certificate_set_expires ()

+
void
+g_mime_certificate_set_expires (GMimeCertificate *cert,
+                                time_t expires);
+

Set the expiration date of the certificate's key.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cert

a GMimeCertificate

 

expires

expiration date

 
+
+
+
+
+

g_mime_certificate_get_key_id ()

+
const char *
+g_mime_certificate_get_key_id (GMimeCertificate *cert);
+

Get the certificate's key id.

+
+

Parameters

+
+++++ + + + + + +

cert

a GMimeCertificate

 
+
+
+

Returns

+

the certificate's key id or NULL if unspecified.

+
+
+
+
+

g_mime_certificate_set_key_id ()

+
void
+g_mime_certificate_set_key_id (GMimeCertificate *cert,
+                               const char *key_id);
+

Set the certificate's key id.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cert

a GMimeCertificate

 

key_id

key id

 
+
+
+
+
+

g_mime_certificate_get_trust ()

+
GMimeTrust
+g_mime_certificate_get_trust (GMimeCertificate *cert);
+

Get the certificate trust.

+
+

Parameters

+
+++++ + + + + + +

cert

a GMimeCertificate

 
+
+
+

Returns

+

the certificate trust.

+
+
+
+
+

g_mime_certificate_set_trust ()

+
void
+g_mime_certificate_set_trust (GMimeCertificate *cert,
+                              GMimeTrust trust);
+

Set the certificate trust.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cert

a GMimeCertificate

 

trust

a GMimeTrust value

 
+
+
+
+
+

g_mime_certificate_get_email ()

+
const char *
+g_mime_certificate_get_email (GMimeCertificate *cert);
+

Get the certificate's email.

+
+

Parameters

+
+++++ + + + + + +

cert

a GMimeCertificate

 
+
+
+

Returns

+

the certificate's email or NULL if unspecified.

+
+
+
+
+

g_mime_certificate_set_email ()

+
void
+g_mime_certificate_set_email (GMimeCertificate *cert,
+                              const char *email);
+

Set the certificate's email.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cert

a GMimeCertificate

 

email

certificate's email

 
+
+
+
+
+

g_mime_certificate_get_name ()

+
const char *
+g_mime_certificate_get_name (GMimeCertificate *cert);
+

Get the certificate's name.

+
+

Parameters

+
+++++ + + + + + +

cert

a GMimeCertificate

 
+
+
+

Returns

+

the certificate's name or NULL if unspecified.

+
+
+
+
+

g_mime_certificate_set_name ()

+
void
+g_mime_certificate_set_name (GMimeCertificate *cert,
+                             const char *name);
+

Set the certificate's name.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cert

a GMimeCertificate

 

name

certificate's name

 
+
+
+
+
+

g_mime_certificate_list_new ()

+
GMimeCertificateList *
+g_mime_certificate_list_new (void);
+

Creates a new GMimeCertificateList.

+
+

Returns

+

a new GMimeCertificateList.

+
+
+
+
+

g_mime_certificate_list_length ()

+
int
+g_mime_certificate_list_length (GMimeCertificateList *list);
+

Gets the length of the list.

+
+

Parameters

+
+++++ + + + + + +

list

a GMimeCertificateList

 
+
+
+

Returns

+

the number of GMimeCertificate objects in the list.

+
+
+
+
+

g_mime_certificate_list_clear ()

+
void
+g_mime_certificate_list_clear (GMimeCertificateList *list);
+

Clears the list of certificates.

+
+

Parameters

+
+++++ + + + + + +

list

a GMimeCertificateList

 
+
+
+
+
+

g_mime_certificate_list_add ()

+
int
+g_mime_certificate_list_add (GMimeCertificateList *list,
+                             GMimeCertificate *cert);
+

Adds a GMimeCertificate to the GMimeCertificateList.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

list

a GMimeCertificateList

 

cert

a GMimeCertificate

 
+
+
+

Returns

+

the index of the added GMimeCertificate.

+
+
+
+
+

g_mime_certificate_list_insert ()

+
void
+g_mime_certificate_list_insert (GMimeCertificateList *list,
+                                int index,
+                                GMimeCertificate *cert);
+

Inserts a GMimeCertificate into the GMimeCertificateList at the specified +index.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

list

a GMimeCertificateList

 

index

index to insert at

 

cert

a GMimeCertificate

 
+
+
+
+
+

g_mime_certificate_list_remove ()

+
gboolean
+g_mime_certificate_list_remove (GMimeCertificateList *list,
+                                GMimeCertificate *cert);
+

Removes a GMimeCertificate from the GMimeCertificateList.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

list

a GMimeCertificateList

 

cert

a GMimeCertificate

 
+
+
+

Returns

+

TRUE if the specified GMimeCertificate was removed or FALSE +otherwise.

+
+
+
+
+

g_mime_certificate_list_remove_at ()

+
gboolean
+g_mime_certificate_list_remove_at (GMimeCertificateList *list,
+                                   int index);
+

Removes a GMimeCertificate from the GMimeCertificateList at the specified +index.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

list

a GMimeCertificateList

 

index

index of the certificate to remove

 
+
+
+

Returns

+

TRUE if a GMimeCertificate was removed or FALSE otherwise.

+
+
+
+
+

g_mime_certificate_list_contains ()

+
gboolean
+g_mime_certificate_list_contains (GMimeCertificateList *list,
+                                  GMimeCertificate *cert);
+

Checks whether or not the specified GMimeCertificate is contained within +the GMimeCertificateList.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

list

a GMimeCertificateList

 

cert

a GMimeCertificate

 
+
+
+

Returns

+

TRUE if the specified GMimeCertificate is contained within the +specified GMimeCertificateList or FALSE otherwise.

+
+
+
+
+

g_mime_certificate_list_index_of ()

+
int
+g_mime_certificate_list_index_of (GMimeCertificateList *list,
+                                  GMimeCertificate *cert);
+

Gets the index of the specified GMimeCertificate inside the +GMimeCertificateList.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

list

a GMimeCertificateList

 

cert

a GMimeCertificate

 
+
+
+

Returns

+

the index of the requested GMimeCertificate within the +GMimeCertificateList or -1 if it is not contained within the +GMimeCertificateList.

+
+
+
+
+

g_mime_certificate_list_get_certificate ()

+
GMimeCertificate *
+g_mime_certificate_list_get_certificate
+                               (GMimeCertificateList *list,
+                                int index);
+

Gets the GMimeCertificate at the specified index.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

list

a GMimeCertificateList

 

index

index of GMimeCertificate to get

 
+
+
+

Returns

+

the GMimeCertificate at the specified +index or NULL if the index is out of range.

+

[transfer full]

+
+
+
+
+

g_mime_certificate_list_set_certificate ()

+
void
+g_mime_certificate_list_set_certificate
+                               (GMimeCertificateList *list,
+                                int index,
+                                GMimeCertificate *cert);
+

Sets the GMimeCertificate at the specified index to cert +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

list

a GMimeCertificateList

 

index

index of GMimeCertificate to set

 

cert

a GMimeCertificate

 
+
+
+
+
+

Types and Values

+
+

enum GMimePubKeyAlgo

+

A public-key algorithm.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

GMIME_PUBKEY_ALGO_DEFAULT

+

The default public-key algorithm.

+
 

GMIME_PUBKEY_ALGO_RSA

+

The RSA algorithm.

+
 

GMIME_PUBKEY_ALGO_RSA_E

+

An encryption-only RSA algorithm.

+
 

GMIME_PUBKEY_ALGO_RSA_S

+

A signature-only RSA algorithm.

+
 

GMIME_PUBKEY_ALGO_ELG_E

+

An encryption-only ElGamal algorithm.

+
 

GMIME_PUBKEY_ALGO_DSA

+

The DSA algorithm.

+
 

GMIME_PUBKEY_ALGO_ECC

+

The Eliptic Curve algorithm.

+
 

GMIME_PUBKEY_ALGO_ELG

+

The ElGamal algorithm.

+
 

GMIME_PUBKEY_ALGO_ECDSA

+

The Eliptic Curve + DSA algorithm.

+
 

GMIME_PUBKEY_ALGO_ECDH

+

The Eliptic Curve + Diffie Helman algorithm.

+
 

GMIME_PUBKEY_ALGO_EDDSA

+

The Eliptic Curve + DSA algorithm.

+
 
+
+
+
+
+

enum GMimeDigestAlgo

+

A hash algorithm.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

GMIME_DIGEST_ALGO_DEFAULT

+

The default hash algorithm.

+
 

GMIME_DIGEST_ALGO_MD5

+

The MD5 hash algorithm.

+
 

GMIME_DIGEST_ALGO_SHA1

+

The SHA-1 hash algorithm.

+
 

GMIME_DIGEST_ALGO_RIPEMD160

+

The RIPEMD-160 hash algorithm.

+
 

GMIME_DIGEST_ALGO_MD2

+

The MD2 hash algorithm.

+
 

GMIME_DIGEST_ALGO_TIGER192

+

The TIGER-192 hash algorithm.

+
 

GMIME_DIGEST_ALGO_HAVAL5160

+

The HAVAL-5-160 hash algorithm.

+
 

GMIME_DIGEST_ALGO_SHA256

+

The SHA-256 hash algorithm.

+
 

GMIME_DIGEST_ALGO_SHA384

+

The SHA-384 hash algorithm.

+
 

GMIME_DIGEST_ALGO_SHA512

+

The SHA-512 hash algorithm.

+
 

GMIME_DIGEST_ALGO_SHA224

+

The SHA-224 hash algorithm.

+
 

GMIME_DIGEST_ALGO_MD4

+

The MD4 hash algorithm.

+
 

GMIME_DIGEST_ALGO_CRC32

+

The CRC32 hash algorithm.

+
 

GMIME_DIGEST_ALGO_CRC32_RFC1510

+

The rfc1510 CRC32 hash algorithm.

+
 

GMIME_DIGEST_ALGO_CRC32_RFC2440

+

The rfc2440 CRC32 hash algorithm.

+
 
+
+
+
+
+

enum GMimeTrust

+

The trust level of a certificate or key.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

GMIME_TRUST_UNKNOWN

+

The certificate or key is of unknown validity.

+
 

GMIME_TRUST_UNDEFINED

+

The validity of the certificate or key is undefined.

+
 

GMIME_TRUST_NEVER

+

The certificate or key should never be treated as valid.

+
 

GMIME_TRUST_MARGINAL

+

The certificate or key is marginally valid.

+
 

GMIME_TRUST_FULL

+

The certificate or key is fully valid.

+
 

GMIME_TRUST_ULTIMATE

+

The certificate or key is ultimately valid.

+
 
+
+
+
+
+

struct GMimeCertificate

+
struct GMimeCertificate;
+

An object containing useful information about a certificate.

+
+

Members

+
+++++ + +
+
+
+
+
+

struct GMimeCertificateList

+
struct GMimeCertificateList;
+

A collection of GMimeCertificate objects.

+
+

Members

+
+++++ + +
+
+
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/gmime-changes-2-0.html gmime-3.0.1/docs/reference/html/gmime-changes-2-0.html --- gmime-2.6.22+dfsg2/docs/reference/html/gmime-changes-2-0.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/gmime-changes-2-0.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,134 @@ + + + + +Changes from 1.0 to 2.0: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Changes from 1.0 to 2.0

+

Changes from 1.0 to 2.0 — +Incompatible changes made between version 1.0 and version 2.0 +

+
+
+

Incompatible changes from 1.0 to 2.0

+

+See also the PORTING document in the toplevel GMime source directory. +

+

+The major change here is that I've dropped my own base object class +and have replaced it with GObject from glib-2.0. This should be a +pleasant change since you (the developer) will now be able to do many +more things such as setting arbitrary data on all GMime objects. For +additional information about GObject, please see the GObject Reference +Manual at http://developer.gnome.org/doc/API/2.0/gobject/ +

+
    +
  • +The first thing you need to know is that any function returning a +non-const pointer to any object /must/ be unref'd when you are done +with it. Since all objects in GMime now subclass GObject, you may +safely use g_object_unref() +(GMimeStream's may also be unref'd using +g_mime_stream_unref(), but either way is fine). + +Don't forget that +g_mime_part_get_content_object() returns a +ref-counted GMimeDataWrapper object now, and +so you /must/ unref it when you have finished using it. You must also +remember to unref any GMimeDataWrapper object that you /set/ on a +GMimePart using g_mime_part_set_content_object() +as the GMimePart will now ref the content object that you set on it. +

  • +
  • GMimeMultipart is a new class which is to be +used for all multipart MIME parts rather than GMimePart (as in +1.0). There are also some subclasses of GMimeMultipart for other +things. +

  • +
  • g_mime_part_[g,s]et_boundary() have been removed +(see above). You must now create a GMimeMultipart object and use +g_mime_multipart_[g,s]et_boundary(). +

  • +
  • g_mime_part_add_subpart() has been replaced with +g_mime_multipart_add_part(). +

  • +
  • g_mime_part_foreach() has been replaced with +g_mime_multipart_foreach() and/or +g_mime_message_foreach_part(). +

  • +
  • g_mime_part_get_subpart_from_content_id() has +been replaced with +g_mime_multipart_get_subpart_from_content_id(). +

  • +
  • +Another new class is GMimeMessagePart which +is to be used for all MIME parts containing an rfc822 message. All 1.0 +GMimePart's representing message/rfc822 parts (as well as message/news +parts?) need to be migrated over to be GMimeMessagePart objects. +

  • +
  • GMimeMessagePartial is another class meant +for handling the message/partial MIME type. All 1.0 GMimePart's +holding data of this type should be replaced with GMimeMessagePartial +objects. +

  • +
  • g_mime_message_write_to_stream() and +g_mime_part_write_to_stream() functions have been +consolidated into a virtual method. Replace calls to these functions +with g_mime_object_write_to_stream(). Note: while +g_mime_part_write_to_stream() and +g_mime_message_write_to_stream() still exist, it +is suggested you migrate to +g_mime_object_write_to_stream(). Same goes for +g_mime_part_to_string() and +g_mime_message_to_string(). +

  • +
  • GMimeMessage's structure has changed a +bit. You will not be able to do message->header, +instead you want to do ((GMimeObject *) +message)->header. +

  • +
  • g_mime_message_set_message_id() now takes a +message_id argument without the encapsulating < and >'s (it now +just takes the addr-spec portion of the msg-id). +

  • +
  • GMimeFilterFrom has changed slightly, you +will want to replace all calls to +g_mime_filter_from_new() with +g_mime_filter_from_new +(GMIME_FILTER_FROM_MODE_DEFAULT) +(GMIME_FILTER_FROM_MODE_DEFAULT is equivalent to (int) 0). +

  • +
  • GMimeParser is a brand new class and +gmime-parser.h has had a number of API additions. +g_mime_parser_construct_part() and +g_mime_parser_construct_message() still exist, +however they no longer take a GMimeStream argument. Instead, they take +a GMimeParser object. +

  • +
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/gmime-changes-2-2.html gmime-3.0.1/docs/reference/html/gmime-changes-2-2.html --- gmime-2.6.22+dfsg2/docs/reference/html/gmime-changes-2-2.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/gmime-changes-2-2.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,90 @@ + + + + +Changes from 2.0 to 2.2: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Changes from 2.0 to 2.2

+

Changes from 2.0 to 2.2 — Incompatible changes made between version 2.0 and version 2.2

+
+
+

Incompatible changes from 2.0 to 2.2

+

See also the PORTING document in the toplevel GMime source directory.

+

There are no incompatible changes between 2.0 and 2.2.

+

GMime 2.2 is both API and ABI compatible with GMime 2.0 meaning +that any program written for GMime 2.0 will compile fine with GMime +2.2 and any program linked against GMime 2.0's libraries will also +work with GMime 2.2's libraries.

+

Most of the changes made between 2.0 and 2.2 were internal but there +are a few API changes you should be aware of (as these interfaces will +be deprecated in some future version, probably 3.0).

+
+
+

Replacement interfaces from 2.0 to 2.2

+
    +
  • +g_mime_utils_8bit_header_decode() has been split +into 2 functions. We now have +g_mime_utils_header_decode_text() and +g_mime_utils_header_decode_phrase(). +g_mime_utils_header_decode_text() no longer +requires encoded-words to be rfc822 atoms. +g_mime_utils_header_decode_phrase() is +still strict in that encoded-words MUST be valid rfc822 atoms.

  • +
  • +g_mime_utils_8bit_header_encode() has been +renamed to g_mime_utils_header_encode_text() to +be more clear as to what type of header this is supposed to encode. If +you haven't guessed, this function is for encoding rfc822 'text' +headers (such as Subject).

  • +
  • +g_mime_utils_8bit_header_encode_phrase() has been +renamed to g_mime_utils_header_encode_phrase() +mostly for consistancy with the previous 2 changes.

  • +
  • +g_mime_charset_name() has been renamed to +g_mime_charset_iconv_name() for clarity.

  • +
  • +g_mime_charset_locale_name() has been renamed to +g_mime_locale_charset().

  • +
  • +g_mime_cipher_context_verify() no longer returns +a GMimeCipherValidity, instead it returns a +GMimeSignatureValidity which is far more +useful. Never fear, you may still use the +GMimeCipherValidity APIs for the time being - +they work fine given a GMimeSignatureValidity +structure.

  • +
  • +g_mime_multipart_signed_verify() also now returns +a GMimeSignatureValidity structure rather than +a GMimeCipherValidity structure. See changes to +g_mime_cipher_context_verify() for details.

  • +
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/gmime-changes-2-4.html gmime-3.0.1/docs/reference/html/gmime-changes-2-4.html --- gmime-2.6.22+dfsg2/docs/reference/html/gmime-changes-2-4.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/gmime-changes-2-4.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,81 @@ + + + + +Changes from 2.2 to 2.4: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Changes from 2.2 to 2.4

+

Changes from 2.2 to 2.4 — Changes made between version 2.2 and version 2.4

+
+
+

Changes from 2.2 to 2.4

+

GMime 2.4 has had a number of API changes since GMime +2.2. To start, ALL public APIs that used to use off_t in GMime 2.2 now +use gint64 so that the API and ABI do not change based on whether or +not large file support is enabled.

+

In addition, all of the functions marked as deprecated in +2.0 and 2.2 were removed (usually they had equivalent functionality in +a parent class).

+

Many functions have also been renamed for better clarity +and/or consistency. For convenience, GMime 2.4 source packages include +a shell-script to aid in porting applications using GMime 2.2 (should +work for most GMime 2.0 applications as well) to the 2.4 API. You can +find this script under the tools/ directory, named +`gmime-port-2-2-to-2-4.sh'.

+

This script won't fix everything, but it should help quite a +bit.

+

Beyond that, a few methods have changed in other ways:

+
    +
  • g_mime_cipher_context_sign() + still returns int, but if the value isn't -1 (failure), then it will + represent a GMimeCipherHash that it used for signing. This is + useful, for example, when the requested hash was + GMIME_CIPHER_HASH_DEFAULT.

  • +
  • g_mime_cipher_context_decrypt() + now returns a GMimeSignatureValidty on success and NULL on + failure. This is needed in case the encrypted stream was also + signed.

  • +
  • g_mime_multipart_encrypted_encrypt() + now takes a boolean 'sign' argument to allow the caller to request + encrypting and signing in a single pass.

  • +
+

Several structs have also been rewritten to subclass GObject like +GMimeContentType and GMimeContentDisposition as well as +InternetAddress and InternetAddressList.

+

Not only have InternetAddress and InternetAddressList been ported to +GObject, but they have also undergone other design +changes. InternetAddress is now a base class for +InternetAddressMailbox and InternetAddressGroup, meaning that +InternetAddress no longer contains a union for group/addr fields.

+

All functions that return a GObject have been changed to not add a ref +to the object returned, meaning that it is no longer necessary to call +g_object_unref() on MIME parts returned from functions like +g_mime_message_get_mime_part() or g_mime_multipart_get_part(). This +was done to be more consistent with the Gtk+ API.

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/gmime-changes-2-6.html gmime-3.0.1/docs/reference/html/gmime-changes-2-6.html --- gmime-2.6.22+dfsg2/docs/reference/html/gmime-changes-2-6.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/gmime-changes-2-6.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,89 @@ + + + + +Changes from 2.4 to 2.6: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Changes from 2.4 to 2.6

+

Changes from 2.4 to 2.6 — Changes made between version 2.4 and version 2.6

+
+
+

Changes from 2.4 to 2.6

+

After releasing GMime 2.4, it was discovered that +g_mime_stream_length() still returned ssize_t which, on 32bit systems, +meant that the function was useless if the actual stream was larger +than 2GB (which could happen if GMime was built with large file +support).

+

As I fixed this, I also found some API inconsistencies which I felt I +might as well fix up since I had to break API/ABI compatibility with +2.4 anyway.

+

Most notable in GMime 2.6 is the lack of GMimeSession which has been +dropped in favor of a much simpler callback +mechanism. GMimeCipherContexts constructors now take a +password_request callback function rather than forcing you to subclass +GMimeSession to get this functionality.

+

Other API changes include:

+
    +
  • GMimeBestEncoding has been renamed to + GMimeEncodingConstraint

  • +
  • GMimeSignatureValidity has been dropped in favor + of GMimeSignatureList which is simply a collection of + signatures. +

  • +
  • GMimeSigner has been replaced by GMimeSignature + and GMimeCertificate which added a number of new fields and + accessors making it much more complete. +

  • +
  • GMimeCipherContext has been renamed to + GMimeCryptoContext and the method names for this class have also + been renamed in a similar fashion. +

  • +
  • g_mime_crypto_context_encrypt() + now takes a digest algorithm argument which is used when the + 'sign' argument is TRUE. +

  • +
  • g_mime_multipart_encrypted_encrypt() + also now takes a digest algorithm argument which it passes along + to g_mime_crypto_context_encrypt(). +

  • +
  • g_mime_crypto_context_decrypt() + now returns a GMimeDecryptResult which contains a list of + signatures (if signed), a list of recipients that the stream had + been encrypted to, and also the cipher and digest algorithms + used. +

  • +
  • g_mime_multipart_encrypted_decrypt() + no longer caches the decrypted part and also now takes a + GMimeSignatureList** output argument which it sets in place of + having to call + g_mime_multipart_encrypted_get_signature_validity() + afterward. +

  • +
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/gmime-changes-3-0.html gmime-3.0.1/docs/reference/html/gmime-changes-3-0.html --- gmime-2.6.22+dfsg2/docs/reference/html/gmime-changes-3-0.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/gmime-changes-3-0.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,95 @@ + + + + +Changes from 2.6 to 3.0: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Changes from 2.6 to 3.0

+

Changes from 2.6 to 3.0 — Changes made between version 2.6 and version 3.0

+
+
+

Changes from 2.6 to 3.0

+

GMimeMessage API changes:

+
    +
  • g_mime_message_get_sender() no longer returns the value of the From header, it now returns an InternetAddressList* containing the parsed address(es) from the Sender header. For the From addresses, use g_mime_message_get_from().

  • +
  • g_mime_message_get_reply_to() no longer returns a const char*, instead it returns an InternetAddressList* for easier use.

  • +
  • g_mime_message_set_sender() and g_mime_message_set_reply_to() have been removed. You will either need to use the appropriate getter method and then internet_address_list_add() to add a new InternetAddressMailbox or, alternatively, you can use g_mime_message_add_mailbox().

  • +
  • GMimeRecipientType has been replaced by GMimeAddressType because it now contains non-recipient-based enum values (SENDER, FROM, and REPLY_TO).

  • +
  • g_mime_message_get_recipients() has been replaced by g_mime_message_get_addresses() which allows you to access the address lists of any address header.

  • +
  • g_mime_message_add_recipient() has been renamed to g_mime_message_add_mailbox() due to the fact that it can now be used to add mailbox addresses to the Sender, From, and Reply-To headers as well.

  • +
  • g_mime_message_set_subject() now takes a charset argument used when encoding the subject into rfc2047 encoded-word tokens (if needed). Use NULL to get the old behavior of using a best-fit charset.

  • +
  • Removed g_mime_message_get_date_as_string() and g_mime_message_get_date_as_string(). This is unnecessary since this can be done using g_mime_object_get_header() and g_mime_object_set_header()

  • +
+

Cryptography related API changes:

+
    +
  • Renamed GMimeCertificateTrust to GMimeTrust and GMIME_CERTIFICATE_TRUST_NONE to GMIME_TRUST_UNKNOWN.

  • +
  • Removed g_mime_gpg_context_get_always_trust() and g_mime_gpg_context_set_always_trust(). This can now be accomplished by passing GMIME_ENCRYPT_ALWAYS_TRUST to g_mime_crypto_context_encrypt().

  • +
  • Removed g_mime_gpg_context_get_use_agent() and g_mime_gpg_context_set_use_agent(). This should no longer be needed.

  • +
  • Removed g_mime_gpg_context_get_auto_key_retrieve() and g_mime_gpg_context_set_auto_key_retrieve().

  • +
  • Removed g_mime_crypto_context_get_retrieve_session_key() and g_mime_crypto_context_set_retrieve_session_key(). This is now handled by passing GMIME_DECRYPT_EXPORT_SESSION_KEY to the g_mime_crypto_context_decrypt() method.

  • +
  • GMimeCryptoContext's encrypt, decrypt, and verify methods now all take a flags argument that can enable additional features (see above examples).

  • +
  • g_mime_crypto_context_sign() now takes a boolean 'detach' argument that specifies whether or not to generate a detached signature. To get the old behavior, pass TRUE as the detach argument.

  • +
  • g_mime_crypto_context_decrypt_session() has been merged with g_mime_crypto_context_decrypt() and so the decryot method now takes a session_key argument that is allowed to be NULL.

  • +
  • g_mime_crypto_context_verify() no longer takes a 'digest' argument as it was unused (it was originally meant to be a hint but wasnever really needed).

  • +
  • g_mime_multipart_signed_verify() and g_mime_multipart_encrypted_decrypt() no longer take GMimeCryptoContext arguments. Instead, they instantiate their own contexts based on the protocol specified in the Content-Type header. These methods now also take a flags argument and in the case of the decrypt() method, it now also takes a session_key argument.

  • +
  • GMimeSignatureStatus and GMimeSignatureErrors have been merged into a single bitfield (GMimeSignatureStatus) which mirrors gpgme_sigsum_t and thus g_mime_signature_get_errors() and g_mime_signature_set_errors() have been removed.

  • +
  • g_mime_multipart_encrypted_encrypt() no longer takes a GMimeMultipartEncrypted argument nor does it return int. Instead, this function now returns a newly allocated GMimeMultipartEncrypted.

  • +
  • g_mime_multipart_signed_sign() no longer takes a GMimeMultipartSigned argument nor does it return int. Instead, this function now returns a newly allocated GMimeMultipartSigned.

  • +
+

Other API changes:

+
    +
  • g_mime_set_user_charsets() and g_mime_user_charsets() have been removed. All encoding API's now have a way to specify a charset to use and all decoder API's take a GMimeParserOptions argument that allows for specifying fallback charsets.

  • +
  • GMimeObject's prepend_header(), append_header(), set_header(), get_header(), and remove_header() virtual methods have all been removed. They have been replaced by the header_added(), header_changed(), header_removed(), and headers_cleared() virtual methods to allow users to set headers on the GMimeHeaderList directly and still get notifications of those changes.

  • +
  • g_mime_object_new() and g_mime_object_new_with_type() both now take a GMimeParserOptions argument.

  • +
  • g_mime_param_new_from_string() has been replaced by g_mime_param_list_parse() and now takes a GMimeParserOptions argument.

  • +
  • g_mime_content_type_new_from_string() has been replaced by g_mime_content_type_parse() and now takes a GMimeParserOptions argument.

  • +
  • g_mime_content_type_to_string() has been renamed to g_mime_content_type_get_mime_type() and a new function has been introduced called g_mime_content_type_encode() that includes the encoded parameter list.

  • +
  • g_mime_content_type_get_params() has been renamed to g_mime_content_type_get_parameters().

  • +
  • g_mime_content_disposition_new_from_string() has been replaced by g_mime_content_disposition_parse() and now takes a GMimeParserOptions argument.

  • +
  • g_mime_content_disposition_to_string() has been replaced by g_mime_content_disposition_encode().

  • +
  • g_mime_content_disposition_get_params() has been renamed to g_mime_content_disposition_get_parameters().

  • +
  • internet_address_list_parse_string() has been replaced by internet_address_list_parse() and now takes a GMimeParserOptions argument.

  • +
  • GMimeHeaderIter has been dropped in favour of a more direct way of iterating over a GMimeHeaderList using int indexes.

  • +
  • g_mime_stream_write_to_stream(), g_mime_stream_writev(), and g_mime_stream_printf() now return a gint64.

  • +
  • g_mime_stream_file_new_for_path() has been renamed to g_mime_stream_file_open() and now also takes a GError argument.

  • +
  • g_mime_stream_fs_new_for_path() has been renamed to g_mime_stream_fs_open() and now also takes a GError argument.

  • +
  • g_mime_part_new() now returns a GMimePart with a Content-Type of "application/octet-stream" instead of "text/plain" since there is now a GMimeTextPart who's g_mime_text_part_new() returns a GMimeTextPart with a Content-Type of "text/plain".

  • +
  • g_mime_part_get_content_object() has been renamed to g_mime_part_get_content().

  • +
  • g_mime_part_set_content_object() has been renamed to g_mime_part_set_content().

  • +
  • g_mime_parser_get_scan_from() and g_mime_parser_set_scan_from() have been replaced by g_mime_parser_get_format() and g_mime_parser_get_format() which take a GMimeFormat argument.

  • +
  • g_mime_parser_get_from() has been renamed to g_mime_parser_get_mbox_marker().

  • +
  • g_mime_parser_get_from_offset() has been renamed to g_mime_parser_get_mbox_marker_offset().

  • +
  • g_mime_parser_construct_message() and g_mime_parser_construct_part() now take a GMimeParserOptions argument.

  • +
  • Renamed GMimeFilterMd5 to GMimeFilterChecksum.

  • +
  • Renamed g_mime_multipart_get_preface() to g_mime_multipart_get_prologue() and g_mime_multipart_set_preface to g_mime_multipart_set_prologue.

  • +
  • Renamed g_mime_multipart_get_postface() to g_mime_multipart_get_epilogue() and g_mime_multipart_set_postface() to g_mime_multipart_set_epilogue().

  • +
  • Updated g_mime_object_write_to_stream() to take a GMimeFormatOptions argument.

  • +
  • Split GMimeFilterCRLF into GMimeFilterDos2Unix, GMimeFilterUnix2Dos and GMimeFilterSmtpData.

  • +
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/gmime-compiling.html gmime-3.0.1/docs/reference/html/gmime-compiling.html --- gmime-2.6.22+dfsg2/docs/reference/html/gmime-compiling.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/gmime-compiling.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,69 @@ + + + + +Compiling GMime Applications: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Compiling GMime Applications

+

Compiling GMime Applications — +How to compile your GMime application +

+
+
+

Compiling GMime Applications on UNIX

+

+To compile a GMime application, you need to tell the compiler where to +find the GMime header files and libraries. This is done with the +pkg-config utility. +

+

+The following interactive shell session demonstrates how +pkg-config is used: +

+
+$ pkg-config --cflags gmime-3.0
+ -I/usr/include/gmime-3.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include 
+$ pkg-config --libs gmime-3.0
+ -L/opt/gnome2/lib -lgmime-3.0 -lnsl -lgobject-2.0 -lglib-2.0
+
+

+

+

+The simplest way to compile a program is to use the "backticks" +feature of the shell. If you enclose a command in backticks +(not single quotes), then its output will be +substituted into the command line before execution. So to compile +a GTK+ Hello, World, you would type the following: +

+
+$ cc `pkg-config --cflags --libs gmime-3.0` hello.c -o hello
+
+

+

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeContentDisposition.html gmime-3.0.1/docs/reference/html/GMimeContentDisposition.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeContentDisposition.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeContentDisposition.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,466 @@ + + + + +GMimeContentDisposition: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeContentDisposition

+

GMimeContentDisposition — Content-Disposition fields

+
+ +
+

Types and Values

+
++++ + + + + + + + + + + + + + + +
#defineGMIME_DISPOSITION_ATTACHMENT
#defineGMIME_DISPOSITION_INLINE
structGMimeContentDisposition
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeContentDisposition
+
+
+
+

Description

+

A GMimeContentDisposition represents the pre-parsed contents of a +Content-Disposition header field.

+
+
+

Functions

+
+

g_mime_content_disposition_new ()

+
GMimeContentDisposition *
+g_mime_content_disposition_new (void);
+

Creates a new GMimeContentDisposition object.

+
+

Returns

+

a new GMimeContentDisposition object.

+
+
+
+
+

g_mime_content_disposition_parse ()

+
GMimeContentDisposition *
+g_mime_content_disposition_parse (GMimeParserOptions *options,
+                                  const char *str);
+

Parses the input string into a GMimeContentDisposition object.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

options

a GMimeParserOptions or NULL.

[nullable]

str

Content-Disposition field value

 
+
+
+

Returns

+

a new GMimeContentDisposition object.

+

[transfer full]

+
+
+
+
+

g_mime_content_disposition_is_attachment ()

+
gboolean
+g_mime_content_disposition_is_attachment
+                               (GMimeContentDisposition *disposition);
+

Determines if a Content-Disposition has a value of "attachment".

+
+

Parameters

+
+++++ + + + + + +

disposition

a GMimeContentDisposition object

 
+
+
+

Returns

+

TRUE if the value matches "attachment", otherwise FALSE.

+
+
+
+
+

g_mime_content_disposition_set_disposition ()

+
void
+g_mime_content_disposition_set_disposition
+                               (GMimeContentDisposition *disposition,
+                                const char *value);
+

Sets the disposition to value + which may be one of +GMIME_DISPOSITION_ATTACHMENT or GMIME_DISPOSITION_INLINE or, by +your choice, any other string which would indicate how the MIME +part should be displayed by the MUA.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

disposition

a GMimeContentDisposition object

 

value

disposition value

 
+
+
+
+
+

g_mime_content_disposition_get_disposition ()

+
const char *
+g_mime_content_disposition_get_disposition
+                               (GMimeContentDisposition *disposition);
+

Gets the disposition or NULL on fail.

+
+

Parameters

+
+++++ + + + + + +

disposition

a GMimeContentDisposition object

 
+
+
+

Returns

+

the disposition string which is probably one of +GMIME_DISPOSITION_ATTACHMENT or GMIME_DISPOSITION_INLINE.

+
+
+
+
+

g_mime_content_disposition_get_parameters ()

+
GMimeParamList *
+g_mime_content_disposition_get_parameters
+                               (GMimeContentDisposition *disposition);
+

Gets the Content-Disposition parameter list.

+
+

Parameters

+
+++++ + + + + + +

disposition

a GMimeContentDisposition object

 
+
+
+

Returns

+

the Content-Disposition's parameter list.

+

[transfer none]

+
+
+
+
+

g_mime_content_disposition_set_parameter ()

+
void
+g_mime_content_disposition_set_parameter
+                               (GMimeContentDisposition *disposition,
+                                const char *name,
+                                const char *value);
+

Sets a parameter on the Content-Disposition.

+

Note: The name + should be in US-ASCII while the value + should be in +UTF-8.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

disposition

a GMimeContentDisposition object

 

name

parameter name

 

value

parameter value

 
+
+
+
+
+

g_mime_content_disposition_get_parameter ()

+
const char *
+g_mime_content_disposition_get_parameter
+                               (GMimeContentDisposition *disposition,
+                                const char *name);
+

Gets the parameter value specified by name + if it's available.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

disposition

a GMimeContentDisposition object

 

name

parameter name

 
+
+
+

Returns

+

the value of the requested parameter or NULL if the +parameter is not set. If the parameter is set, the returned string +will be in UTF-8.

+
+
+
+
+

g_mime_content_disposition_encode ()

+
char *
+g_mime_content_disposition_encode (GMimeContentDisposition *disposition,
+                                   GMimeFormatOptions *options);
+

Encodes the Content-Disposition header.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

disposition

a GMimeContentDisposition object

 

options

a GMimeFormatOptions or NULL.

[nullable]
+
+
+

Returns

+

a new string containing the encoded header value.

+
+
+
+
+

Types and Values

+
+

GMIME_DISPOSITION_ATTACHMENT

+
#define GMIME_DISPOSITION_ATTACHMENT "attachment"
+
+

Standard attachment disposition.

+
+
+
+

GMIME_DISPOSITION_INLINE

+
#define GMIME_DISPOSITION_INLINE     "inline"
+
+

Standard inline disposition.

+
+
+
+

struct GMimeContentDisposition

+
struct GMimeContentDisposition;
+

A data structure representing a Content-Disposition.

+
+

Members

+
+++++ + +
+
+
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeContentType.html gmime-3.0.1/docs/reference/html/GMimeContentType.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeContentType.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeContentType.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,582 @@ + + + + +GMimeContentType: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeContentType

+

GMimeContentType — Content-Type fields

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GMimeContentType * + +g_mime_content_type_new () +
+GMimeContentType * + +g_mime_content_type_parse () +
+char * + +g_mime_content_type_get_mime_type () +
+char * + +g_mime_content_type_encode () +
+gboolean + +g_mime_content_type_is_type () +
const char * + +g_mime_content_type_get_media_type () +
+void + +g_mime_content_type_set_media_type () +
const char * + +g_mime_content_type_get_media_subtype () +
+void + +g_mime_content_type_set_media_subtype () +
+GMimeParamList * + +g_mime_content_type_get_parameters () +
const char * + +g_mime_content_type_get_parameter () +
+void + +g_mime_content_type_set_parameter () +
+
+
+

Types and Values

+
++++ + + + + +
structGMimeContentType
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeContentType
+
+
+
+

Description

+

A GMimeContentType represents the pre-parsed contents of a +Content-Type header field.

+
+
+

Functions

+
+

g_mime_content_type_new ()

+
GMimeContentType *
+g_mime_content_type_new (const char *type,
+                         const char *subtype);
+

Creates a Content-Type object with type type + and subtype subtype +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

type

the MIME type or NULL for the default value

 

subtype

the MIME subtype or NULL for the default value

 
+
+
+

Returns

+

a new GMimeContentType object.

+
+
+
+
+

g_mime_content_type_parse ()

+
GMimeContentType *
+g_mime_content_type_parse (GMimeParserOptions *options,
+                           const char *str);
+

Parses the input string into a GMimeContentType object.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

options

a GMimeParserOptions or NULL.

[nullable]

str

input string containing a content-type (and params)

 
+
+
+

Returns

+

a new GMimeContentType object.

+

[transfer full]

+
+
+
+
+

g_mime_content_type_get_mime_type ()

+
char *
+g_mime_content_type_get_mime_type (GMimeContentType *content_type);
+

Allocates a string buffer containing the type and subtype defined +by the content_type +.

+
+

Parameters

+
+++++ + + + + + +

content_type

a GMimeContentType

 
+
+
+

Returns

+

an allocated string containing the type and subtype of the +content-type in the format: type/subtype.

+
+
+
+
+

g_mime_content_type_encode ()

+
char *
+g_mime_content_type_encode (GMimeContentType *content_type,
+                            GMimeFormatOptions *options);
+

Encodes the Content-Disposition header.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

content_type

a GMimeContentType

 

options

a GMimeFormatOptions or NULL.

[nullable]
+
+
+

Returns

+

a new string containing the encoded header value.

+
+
+
+
+

g_mime_content_type_is_type ()

+
gboolean
+g_mime_content_type_is_type (GMimeContentType *content_type,
+                             const char *type,
+                             const char *subtype);
+

Compares the given type and subtype with that of the given mime +type object.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

content_type

a GMimeContentType

 

type

MIME type to compare against

 

subtype

MIME subtype to compare against

 
+
+
+

Returns

+

TRUE if the MIME types match or FALSE otherwise. You may +use "*" in place of type +and/or subtype +as a wilcard.

+
+
+
+
+

g_mime_content_type_get_media_type ()

+
const char *
+g_mime_content_type_get_media_type (GMimeContentType *content_type);
+

Gets the Content-Type's media type.

+
+

Parameters

+
+++++ + + + + + +

content_type

a GMimeContentType

 
+
+
+

Returns

+

the Content-Type's media type.

+
+
+
+
+

g_mime_content_type_set_media_type ()

+
void
+g_mime_content_type_set_media_type (GMimeContentType *content_type,
+                                    const char *type);
+

Sets the Content-Type's media type.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

content_type

a GMimeContentType

 

type

media type

 
+
+
+
+
+

g_mime_content_type_get_media_subtype ()

+
const char *
+g_mime_content_type_get_media_subtype (GMimeContentType *content_type);
+

Gets the Content-Type's media sub-type.

+
+

Parameters

+
+++++ + + + + + +

content_type

a GMimeContentType

 
+
+
+

Returns

+

the Content-Type's media sub-type.

+
+
+
+
+

g_mime_content_type_set_media_subtype ()

+
void
+g_mime_content_type_set_media_subtype (GMimeContentType *content_type,
+                                       const char *subtype);
+

Sets the Content-Type's media subtype.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

content_type

a GMimeContentType

 

subtype

media subtype

 
+
+
+
+
+

g_mime_content_type_get_parameters ()

+
GMimeParamList *
+g_mime_content_type_get_parameters (GMimeContentType *content_type);
+

Gets the Content-Type's parameter list.

+
+

Parameters

+
+++++ + + + + + +

content_type

a GMimeContentType

 
+
+
+

Returns

+

the Content-Type's parameter list.

+

[transfer none]

+
+
+
+
+

g_mime_content_type_get_parameter ()

+
const char *
+g_mime_content_type_get_parameter (GMimeContentType *content_type,
+                                   const char *name);
+

Gets the parameter value specified by name + if it's available.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

content_type

a GMimeContentType

 

name

parameter name (aka attribute)

 
+
+
+

Returns

+

the value of the requested parameter or NULL if the +parameter is not set. If the parameter is set, the returned string +will be in UTF-8.

+
+
+
+
+

g_mime_content_type_set_parameter ()

+
void
+g_mime_content_type_set_parameter (GMimeContentType *content_type,
+                                   const char *name,
+                                   const char *value);
+

Sets a parameter on the Content-Type.

+

Note: The name + should be in US-ASCII while the value + should be in +UTF-8.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

content_type

a GMimeContentType

 

name

parameter name (aka attribute)

 

value

parameter value

 
+
+
+
+
+

Types and Values

+
+

struct GMimeContentType

+
struct GMimeContentType;
+

A data structure representing a Content-Type.

+
+

Members

+
+++++ + +
+
+
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeCryptoContext.html gmime-3.0.1/docs/reference/html/GMimeCryptoContext.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeCryptoContext.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeCryptoContext.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,1540 @@ + + + + +GMimeCryptoContext: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeCryptoContext

+

GMimeCryptoContext — Encryption/signing contexts

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GMimeCryptoContext * + +(*GMimeCryptoContextNewFunc) () +
+gboolean + +(*GMimePasswordRequestFunc) () +
+void + +g_mime_crypto_context_register () +
+GMimeCryptoContext * + +g_mime_crypto_context_new () +
+void + +g_mime_crypto_context_set_request_password () +
const char * + +g_mime_crypto_context_get_signature_protocol () +
const char * + +g_mime_crypto_context_get_encryption_protocol () +
const char * + +g_mime_crypto_context_get_key_exchange_protocol () +
+GMimeDigestAlgo + +g_mime_crypto_context_digest_id () +
const char * + +g_mime_crypto_context_digest_name () +
+int + +g_mime_crypto_context_sign () +
+GMimeSignatureList * + +g_mime_crypto_context_verify () +
+int + +g_mime_crypto_context_encrypt () +
+GMimeDecryptResult * + +g_mime_crypto_context_decrypt () +
+int + +g_mime_crypto_context_import_keys () +
+int + +g_mime_crypto_context_export_keys () +
+GMimeDecryptResult * + +g_mime_decrypt_result_new () +
+GMimeCertificateList * + +g_mime_decrypt_result_get_recipients () +
+void + +g_mime_decrypt_result_set_recipients () +
+GMimeSignatureList * + +g_mime_decrypt_result_get_signatures () +
+void + +g_mime_decrypt_result_set_signatures () +
+GMimeCipherAlgo + +g_mime_decrypt_result_get_cipher () +
+void + +g_mime_decrypt_result_set_cipher () +
+GMimeDigestAlgo + +g_mime_decrypt_result_get_mdc () +
+void + +g_mime_decrypt_result_set_mdc () +
const char * + +g_mime_decrypt_result_get_session_key () +
+void + +g_mime_decrypt_result_set_session_key () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + +
enumGMimeDecryptFlags
enumGMimeEncryptFlags
enumGMimeVerifyFlags
structGMimeCryptoContext
enumGMimeCipherAlgo
structGMimeDecryptResult
+
+
+

Object Hierarchy

+
    GObject
+    ├── GMimeCryptoContext
+       ├── GMimeGpgContext
+       ╰── GMimePkcs7Context
+    ╰── GMimeDecryptResult
+
+
+
+

Description

+

A GMimeCryptoContext is used for encrypting, decrypting, signing +and verifying cryptographic signatures.

+
+
+

Functions

+
+

GMimeCryptoContextNewFunc ()

+
GMimeCryptoContext *
+(*GMimeCryptoContextNewFunc) (void);
+

A callback used to create a new instance of a GMimeCryptoContext subclass.

+
+

Returns

+

a new GMimeCryptoContext instance.

+
+
+
+
+

GMimePasswordRequestFunc ()

+
gboolean
+(*GMimePasswordRequestFunc) (GMimeCryptoContext *ctx,
+                             const char *user_id,
+                             const char *prompt,
+                             gboolean reprompt,
+                             GMimeStream *response,
+                             GError **err);
+

A password request callback allowing a GMimeCryptoContext to +prompt the user for a password for a given key.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

ctx

the GMimeCryptoContext making the request

 

user_id

the user_id of the password being requested

 

prompt

a string containing some helpful context for the prompt

 

reprompt

TRUE if this password request is a reprompt due to a previously bad password response

 

response

a stream for the application to write the password to (followed by a newline '\n' character)

 

err

a GError for the callback to set if an error occurs

 
+
+
+

Returns

+

TRUE on success or FALSE on error.

+
+
+
+
+

g_mime_crypto_context_register ()

+
void
+g_mime_crypto_context_register (const char *protocol,
+                                GMimeCryptoContextNewFunc callback);
+

Registers the callback for the specified protocol +.

+

[skip]

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

protocol

crypto protocol

 

callback

a GMimeCryptoContextNewFunc

 
+
+
+
+
+

g_mime_crypto_context_new ()

+
GMimeCryptoContext *
+g_mime_crypto_context_new (const char *protocol);
+

Creates a new crypto context for the specified protocol +.

+
+

Parameters

+
+++++ + + + + + +

protocol

the crypto protocol

 
+
+
+

Returns

+

a newly allocated GMimeCryptoContext.

+

[nullable]

+
+
+
+
+

g_mime_crypto_context_set_request_password ()

+
void
+g_mime_crypto_context_set_request_password
+                               (GMimeCryptoContext *ctx,
+                                GMimePasswordRequestFunc request_passwd);
+

Sets the function used by the ctx + for requesting a password from +the user.

+

[skip]

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

ctx

a GMimeCryptoContext

 

request_passwd

a callback function for requesting a password

 
+
+
+
+
+

g_mime_crypto_context_get_signature_protocol ()

+
const char *
+g_mime_crypto_context_get_signature_protocol
+                               (GMimeCryptoContext *ctx);
+

Gets the signature protocol for the crypto context.

+
+

Parameters

+
+++++ + + + + + +

ctx

a GMimeCryptoContext

 
+
+
+

Returns

+

the signature protocol or NULL if not supported.

+

[nullable]

+
+
+
+
+

g_mime_crypto_context_get_encryption_protocol ()

+
const char *
+g_mime_crypto_context_get_encryption_protocol
+                               (GMimeCryptoContext *ctx);
+

Gets the encryption protocol for the crypto context.

+
+

Parameters

+
+++++ + + + + + +

ctx

a GMimeCryptoContext

 
+
+
+

Returns

+

the encryption protocol or NULL if not supported.

+

[nullable]

+
+
+
+
+

g_mime_crypto_context_get_key_exchange_protocol ()

+
const char *
+g_mime_crypto_context_get_key_exchange_protocol
+                               (GMimeCryptoContext *ctx);
+

Gets the key exchange protocol for the crypto context.

+
+

Parameters

+
+++++ + + + + + +

ctx

a GMimeCryptoContext

 
+
+
+

Returns

+

the key exchange protocol or NULL if not supported.

+

[nullable]

+
+
+
+
+

g_mime_crypto_context_digest_id ()

+
GMimeDigestAlgo
+g_mime_crypto_context_digest_id (GMimeCryptoContext *ctx,
+                                 const char *name);
+

Gets the digest id based on the digest name.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

ctx

a GMimeCryptoContext

 

name

digest name

 
+
+
+

Returns

+

the equivalent digest id or GMIME_DIGEST_ALGO_DEFAULT on fail.

+
+
+
+
+

g_mime_crypto_context_digest_name ()

+
const char *
+g_mime_crypto_context_digest_name (GMimeCryptoContext *ctx,
+                                   GMimeDigestAlgo digest);
+

Gets the digest name based on the digest id digest +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

ctx

a GMimeCryptoContext

 

digest

digest id

 
+
+
+

Returns

+

the equivalent digest name or NULL on fail.

+

[nullable]

+
+
+
+
+

g_mime_crypto_context_sign ()

+
int
+g_mime_crypto_context_sign (GMimeCryptoContext *ctx,
+                            gboolean detach,
+                            const char *userid,
+                            GMimeStream *istream,
+                            GMimeStream *ostream,
+                            GError **err);
+

Signs the input stream and writes the resulting signature to the output stream.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

ctx

a GMimeCryptoContext

 

detach

TRUE if ostream +should be the detached signature; otherwise, FALSE

 

userid

private key to use to sign the stream

 

istream

input stream

 

ostream

output stream

 

err

a GError

 
+
+
+

Returns

+

the GMimeDigestAlgo used on success or -1 on fail.

+
+
+
+
+

g_mime_crypto_context_verify ()

+
GMimeSignatureList *
+g_mime_crypto_context_verify (GMimeCryptoContext *ctx,
+                              GMimeVerifyFlags flags,
+                              GMimeStream *istream,
+                              GMimeStream *sigstream,
+                              GMimeStream *ostream,
+                              GError **err);
+

Verifies the signature. If istream + is a clearsigned stream, you +should pass NULL as the sigstream + parameter and may wish to +provide an ostream + argument for GMime to output the original +plaintext into. Otherwise sigstream + is assumed to be the signature +stream and is used to verify the integirity of the istream +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

ctx

a GMimeCryptoContext

 

flags

a GMimeVerifyFlags

 

istream

input stream

 

sigstream

detached-signature stream.

[nullable]

ostream

output stream for use with encapsulated signature input streams.

[nullable]

err

a GError

 
+
+
+

Returns

+

a GMimeSignatureList object containing +the status of each signature or NULL on error.

+

[nullable][transfer full]

+
+
+
+
+

g_mime_crypto_context_encrypt ()

+
int
+g_mime_crypto_context_encrypt (GMimeCryptoContext *ctx,
+                               gboolean sign,
+                               const char *userid,
+                               GMimeEncryptFlags flags,
+                               GPtrArray *recipients,
+                               GMimeStream *istream,
+                               GMimeStream *ostream,
+                               GError **err);
+

Encrypts (and optionally signs) the cleartext input stream and +writes the resulting ciphertext to the output stream.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

ctx

a GMimeCryptoContext

 

sign

sign as well as encrypt

 

userid

the key id (or email address) to use when signing (assuming sign +is TRUE).

[nullable]

flags

a set of GMimeEncryptFlags

 

recipients

an array of recipient key ids and/or email addresses.

[element-type utf8]

istream

cleartext input stream

 

ostream

ciphertext output stream

 

err

a GError

 
+
+
+

Returns

+

0 on success or -1 on fail.

+
+
+
+
+

g_mime_crypto_context_decrypt ()

+
GMimeDecryptResult *
+g_mime_crypto_context_decrypt (GMimeCryptoContext *ctx,
+                               GMimeDecryptFlags flags,
+                               const char *session_key,
+                               GMimeStream *istream,
+                               GMimeStream *ostream,
+                               GError **err);
+

Decrypts the ciphertext input stream and writes the resulting cleartext +to the output stream.

+

When non-NULL, session_key + should be a NULL-terminated string, +such as the one returned by g_mime_decrypt_result_get_session_key() +from a previous decryption. If the sesion_key + is not valid, decryption +will fail.

+

If the encrypted input stream was also signed, the returned +GMimeDecryptResult will have a non-NULL list of signatures, each with a +GMimeSignatureStatus (among other details about each signature).

+

On success, the returned GMimeDecryptResult will contain a list of +certificates, one for each recipient, that the original encrypted stream +was encrypted to.

+

Note: It *may* be possible to maliciously design an encrypted stream such +that recursively decrypting it will result in an endless loop, causing +a denial of service attack on your application.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

ctx

a GMimeCryptoContext

 

flags

a set of GMimeDecryptFlags

 

session_key

the session key to use or NULL.

[nullable]

istream

input/ciphertext stream

 

ostream

output/cleartext stream

 

err

a GError

 
+
+
+

Returns

+

a GMimeDecryptResult on success or NULL +on error.

+

[transfer full]

+
+
+
+
+

g_mime_crypto_context_import_keys ()

+
int
+g_mime_crypto_context_import_keys (GMimeCryptoContext *ctx,
+                                   GMimeStream *istream,
+                                   GError **err);
+

Imports a stream of keys/certificates contained within istream + +into the key/certificate database controlled by ctx +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

ctx

a GMimeCryptoContext

 

istream

input stream (containing keys)

 

err

a GError

 
+
+
+

Returns

+

the total number of keys imported on success or -1 on fail.

+
+
+
+
+

g_mime_crypto_context_export_keys ()

+
int
+g_mime_crypto_context_export_keys (GMimeCryptoContext *ctx,
+                                   const char *keys[],
+                                   GMimeStream *ostream,
+                                   GError **err);
+

Exports the keys/certificates in keys + to the stream ostream + from +the key/certificate database controlled by ctx +.

+

If keys + is NULL or contains only a NULL element, then all keys +will be exported.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

ctx

a GMimeCryptoContext

 

keys

an array of key ids, terminated by a NULL element

 

ostream

output stream

 

err

a GError

 
+
+
+

Returns

+

0 on success or -1 on fail.

+
+
+
+
+

g_mime_decrypt_result_new ()

+
GMimeDecryptResult *
+g_mime_decrypt_result_new (void);
+

Creates a new GMimeDecryptResult object.

+
+

Returns

+

a new GMimeDecryptResult object.

+
+
+
+
+

g_mime_decrypt_result_get_recipients ()

+
GMimeCertificateList *
+g_mime_decrypt_result_get_recipients (GMimeDecryptResult *result);
+

Gets the list of certificates that the stream had been encrypted to.

+
+

Parameters

+
+++++ + + + + + +

result

A GMimeDecryptResult

 
+
+ +
+
+
+

g_mime_decrypt_result_set_recipients ()

+
void
+g_mime_decrypt_result_set_recipients (GMimeDecryptResult *result,
+                                      GMimeCertificateList *recipients);
+

Sets the list of certificates that the stream had been encrypted to.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

result

A GMimeDecryptResult

 

recipients

A GMimeCertificateList

 
+
+
+
+
+

g_mime_decrypt_result_get_signatures ()

+
GMimeSignatureList *
+g_mime_decrypt_result_get_signatures (GMimeDecryptResult *result);
+

Gets a list of signatures if the encrypted stream had also been signed.

+
+

Parameters

+
+++++ + + + + + +

result

A GMimeDecryptResult

 
+
+
+

Returns

+

a GMimeSignatureList or NULL if the +stream was not signed.

+

[nullable][transfer none]

+
+
+
+
+

g_mime_decrypt_result_set_signatures ()

+
void
+g_mime_decrypt_result_set_signatures (GMimeDecryptResult *result,
+                                      GMimeSignatureList *signatures);
+

Sets the list of signatures.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

result

A GMimeDecryptResult

 

signatures

A GMimeSignatureList

 
+
+
+
+
+

g_mime_decrypt_result_get_cipher ()

+
GMimeCipherAlgo
+g_mime_decrypt_result_get_cipher (GMimeDecryptResult *result);
+

Get the cipher algorithm used.

+
+

Parameters

+
+++++ + + + + + +

result

a GMimeDecryptResult

 
+
+
+

Returns

+

the cipher algorithm used.

+
+
+
+
+

g_mime_decrypt_result_set_cipher ()

+
void
+g_mime_decrypt_result_set_cipher (GMimeDecryptResult *result,
+                                  GMimeCipherAlgo cipher);
+

Set the cipher algorithm used.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

result

a GMimeDecryptResult

 

cipher

a GMimeCipherAlgo

 
+
+
+
+
+

g_mime_decrypt_result_get_mdc ()

+
GMimeDigestAlgo
+g_mime_decrypt_result_get_mdc (GMimeDecryptResult *result);
+

Get the mdc digest algorithm used.

+
+

Parameters

+
+++++ + + + + + +

result

a GMimeDecryptResult

 
+
+
+

Returns

+

the mdc digest algorithm used.

+
+
+
+
+

g_mime_decrypt_result_set_mdc ()

+
void
+g_mime_decrypt_result_set_mdc (GMimeDecryptResult *result,
+                               GMimeDigestAlgo mdc);
+

Set the mdc digest algorithm used.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

result

a GMimeDecryptResult

 

mdc

a GMimeDigestAlgo

 
+
+
+
+
+

g_mime_decrypt_result_get_session_key ()

+
const char *
+g_mime_decrypt_result_get_session_key (GMimeDecryptResult *result);
+

Get the session key used for this decryption.

+
+

Parameters

+
+++++ + + + + + +

result

a GMimeDecryptResult

 
+
+
+

Returns

+

the session key digest algorithm used, or NULL if no +session key was requested or found.

+

[nullable]

+
+
+
+
+

g_mime_decrypt_result_set_session_key ()

+
void
+g_mime_decrypt_result_set_session_key (GMimeDecryptResult *result,
+                                       const char *session_key);
+

Set the session key to be returned by this decryption result.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

result

a GMimeDecryptResult

 

session_key

a string representing the session key or NULL to unset the key.

[nullable]
+
+
+
+
+

Types and Values

+
+

enum GMimeDecryptFlags

+

Decryption flags.

+
+

Members

+
+++++ + + + + + + + + + + + + +

GMIME_DECRYPT_NONE

+

No flags specified.

+
 

GMIME_DECRYPT_EXPORT_SESSION_KEY

+

Export the decryption session-key

+
 
+
+
+
+
+

enum GMimeEncryptFlags

+

Encryption flags.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

GMIME_ENCRYPT_NONE

+

No flags specified.

+
 

GMIME_ENCRYPT_ALWAYS_TRUST

+

Always trust the specified keys.

+
 

GMIME_ENCRYPT_NO_COMPRESS

+

Don't compress the plaintext before encrypting.

+
 

GMIME_ENCRYPT_SYMMETRIC

+

Encrypt symmetrically.

+
 

GMIME_ENCRYPT_THROW_KEYIDS

+

Do not include the key ids in the ciphertext.

+
 
+
+
+
+
+

enum GMimeVerifyFlags

+

Signature verification flags.

+
+

Members

+
+++++ + + + + + +

GMIME_VERIFY_NONE

+

No flags specified.

+
 
+
+
+
+
+

struct GMimeCryptoContext

+
struct GMimeCryptoContext;
+

A crypto context for use with MIME.

+
+

Members

+
+++++ + +
+
+
+
+
+

enum GMimeCipherAlgo

+

A cipher algorithm.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

GMIME_CIPHER_ALGO_DEFAULT

+

The default (or unknown) cipher.

+
 

GMIME_CIPHER_ALGO_IDEA

+

The IDEA cipher.

+
 

GMIME_CIPHER_ALGO_3DES

+

The 3DES cipher.

+
 

GMIME_CIPHER_ALGO_CAST5

+

The CAST5 cipher.

+
 

GMIME_CIPHER_ALGO_BLOWFISH

+

The Blowfish cipher.

+
 

GMIME_CIPHER_ALGO_AES

+

The AES (aka RIJANDALE) cipher.

+
 

GMIME_CIPHER_ALGO_AES192

+

The AES-192 cipher.

+
 

GMIME_CIPHER_ALGO_AES256

+

The AES-256 cipher.

+
 

GMIME_CIPHER_ALGO_TWOFISH

+

The Twofish cipher.

+
 

GMIME_CIPHER_ALGO_CAMELLIA128

+

The Camellia-128 cipher.

+
 

GMIME_CIPHER_ALGO_CAMELLIA192

+

The Camellia-192 cipher.

+
 

GMIME_CIPHER_ALGO_CAMELLIA256

+

The Camellia-256 cipher.

+
 
+
+
+
+
+

struct GMimeDecryptResult

+
struct GMimeDecryptResult;
+

An object containing the results from decrypting an encrypted stream.

+
+

Members

+
+++++ + +
+
+
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeDataWrapper.html gmime-3.0.1/docs/reference/html/GMimeDataWrapper.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeDataWrapper.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeDataWrapper.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,362 @@ + + + + +GMimeDataWrapper: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeDataWrapper

+

GMimeDataWrapper — Content objects

+
+
+

Functions

+ +
+
+

Types and Values

+
++++ + + + + +
structGMimeDataWrapper
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeDataWrapper
+
+
+
+

Description

+

A GMimeDataWrapper is a wrapper object for a GMimePart's body, +allowing clients to read the content from the backing stream +without having to know whether it is encoded/compressed/etc and not +neding to know how to undo said encoding(s).

+
+
+

Functions

+
+

g_mime_data_wrapper_new ()

+
GMimeDataWrapper *
+g_mime_data_wrapper_new (void);
+

Creates a new GMimeDataWrapper object.

+
+

Returns

+

a new data wrapper object.

+
+
+
+
+

g_mime_data_wrapper_new_with_stream ()

+
GMimeDataWrapper *
+g_mime_data_wrapper_new_with_stream (GMimeStream *stream,
+                                     GMimeContentEncoding encoding);
+

Creates a new GMimeDataWrapper object around stream +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

stream

a GMimeStream

 

encoding

stream's encoding

 
+
+
+

Returns

+

a data wrapper around stream +. Since the wrapper owns its +own reference on the stream, caller is responsible for unrefing +its own copy.

+
+
+
+
+

g_mime_data_wrapper_set_stream ()

+
void
+g_mime_data_wrapper_set_stream (GMimeDataWrapper *wrapper,
+                                GMimeStream *stream);
+

Replaces the wrapper's internal stream with stream +. Don't forget, +if stream + is not of the same encoding as the old stream, you'll +want to call g_mime_data_wrapper_set_encoding() as well.

+

Note: caller is responsible for its own reference on +stream +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

wrapper

a GMimeDataWrapper

 

stream

a GMimeStream

 
+
+
+
+
+

g_mime_data_wrapper_get_stream ()

+
GMimeStream *
+g_mime_data_wrapper_get_stream (GMimeDataWrapper *wrapper);
+

Gets a reference to the stream wrapped by wrapper +.

+
+

Parameters

+
+++++ + + + + + +

wrapper

a GMimeDataWrapper

 
+
+
+

Returns

+

a reference to the internal stream.

+

[transfer none]

+
+
+
+
+

g_mime_data_wrapper_set_encoding ()

+
void
+g_mime_data_wrapper_set_encoding (GMimeDataWrapper *wrapper,
+                                  GMimeContentEncoding encoding);
+

Sets the encoding type of the internal stream.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

wrapper

a GMimeDataWrapper

 

encoding

encoding

 
+
+
+
+
+

g_mime_data_wrapper_get_encoding ()

+
GMimeContentEncoding
+g_mime_data_wrapper_get_encoding (GMimeDataWrapper *wrapper);
+

Gets the encoding type of the stream wrapped by wrapper +.

+
+

Parameters

+
+++++ + + + + + +

wrapper

a GMimeDataWrapper

 
+
+
+

Returns

+

the encoding type of the internal stream.

+
+
+
+
+

g_mime_data_wrapper_write_to_stream ()

+
ssize_t
+g_mime_data_wrapper_write_to_stream (GMimeDataWrapper *wrapper,
+                                     GMimeStream *stream);
+

Writes the raw (decoded) data to the output stream.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

wrapper

a GMimeDataWrapper

 

stream

output stream

 
+
+
+

Returns

+

the number of bytes written or -1 on failure.

+
+
+
+
+

Types and Values

+
+

struct GMimeDataWrapper

+
struct GMimeDataWrapper;
+

A wrapper for a stream which may be encoded.

+
+

Members

+
+++++ + +
+
+
+
+
+

See Also

+

GMimePart

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/gmime-data-wrappers.html gmime-3.0.1/docs/reference/html/gmime-data-wrappers.html --- gmime-2.6.22+dfsg2/docs/reference/html/gmime-data-wrappers.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/gmime-data-wrappers.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,45 @@ + + + + +Data Wrappers: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Data Wrappers

+

Data Wrappers — How to use Data Wrappers

+
+
+

Overview of Data Wrappers

+

Data wrappers are very simple. A GMimeDataWrapper object + contains both a stream and an encoding-type. The encoding-type + (such as GMIME_PART_ENCODING_BASE64) is used by + g_mime_data_wrapper_write_to_stream() in order to decode the data + into its unencoded form. This means that you, the application + programmer, do not need to worry about decoding the content stream + yourself.

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/gmime.devhelp2 gmime-3.0.1/docs/reference/html/gmime.devhelp2 --- gmime-2.6.22+dfsg2/docs/reference/html/gmime.devhelp2 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/gmime.devhelp2 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,875 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeFilterBasic.html gmime-3.0.1/docs/reference/html/GMimeFilterBasic.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeFilterBasic.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeFilterBasic.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,141 @@ + + + + +GMimeFilterBasic: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeFilterBasic

+

GMimeFilterBasic — Basic transfer encoding filter

+
+
+

Functions

+
++++ + + + + +
+GMimeFilter * + +g_mime_filter_basic_new () +
+
+
+

Types and Values

+
++++ + + + + +
structGMimeFilterBasic
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeFilter
+        ╰── GMimeFilterBasic
+
+
+
+

Description

+

A GMimeFilter which can encode or decode basic MIME encodings such +as Quoted-Printable, Base64 and UUEncode.

+
+
+

Functions

+
+

g_mime_filter_basic_new ()

+
GMimeFilter *
+g_mime_filter_basic_new (GMimeContentEncoding encoding,
+                         gboolean encode);
+

Creates a new basic filter for encoding +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

encoding

a GMimeContentEncoding

 

encode

TRUE to encode or FALSE to decode

 
+
+
+

Returns

+

a new basic encoder filter.

+
+
+
+
+

Types and Values

+
+

struct GMimeFilterBasic

+
struct GMimeFilterBasic;
+

A basic encoder/decoder filter for the MIME encodings.

+
+

Members

+
+++++ + +
+
+
+
+
+

See Also

+

GMimeFilter

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeFilterBest.html gmime-3.0.1/docs/reference/html/GMimeFilterBest.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeFilterBest.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeFilterBest.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,269 @@ + + + + +GMimeFilterBest: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeFilterBest

+

GMimeFilterBest — Determine the best charset/encoding to use for a stream

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + +
+GMimeFilter * + +g_mime_filter_best_new () +
const char * + +g_mime_filter_best_charset () +
+GMimeContentEncoding + +g_mime_filter_best_encoding () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
structGMimeFilterBest
enumGMimeFilterBestFlags
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeFilter
+        ╰── GMimeFilterBest
+
+
+
+

Description

+

A GMimeFilter which is meant to determine the best charset and/or +transfer encoding suitable for the stream which is filtered through +it.

+
+
+

Functions

+
+

g_mime_filter_best_new ()

+
GMimeFilter *
+g_mime_filter_best_new (GMimeFilterBestFlags flags);
+

Creates a new GMimeFilterBest filter. flags + are used to determine +which information to keep statistics of. If the +GMIME_FILTER_BEST_CHARSET bit is set, the filter will be able to +compute the best charset for encoding the stream of data +filtered. If the GMIME_FILTER_BEST_ENCODING bit is set, the filter +will be able to compute the best Content-Transfer-Encoding for use +with the stream being filtered.

+

Note: In order for the g_mime_filter_best_charset() function to +work, the stream being filtered MUST already be encoded in UTF-8.

+
+

Parameters

+
+++++ + + + + + +

flags

filter flags

 
+
+
+

Returns

+

a new best filter with flags flags +.

+
+
+
+
+

g_mime_filter_best_charset ()

+
const char *
+g_mime_filter_best_charset (GMimeFilterBest *best);
+

Calculates the best charset for encoding the stream filtered +through the best + filter.

+
+

Parameters

+
+++++ + + + + + +

best

best filter

 
+
+
+

Returns

+

a pointer to a string containing the name of the charset +best suited for the text filtered through best +.

+
+
+
+
+

g_mime_filter_best_encoding ()

+
GMimeContentEncoding
+g_mime_filter_best_encoding (GMimeFilterBest *best,
+                             GMimeEncodingConstraint constraint);
+

Calculates the most efficient Content-Transfer-Encoding for the +stream filtered through best + that fits within the encoding +constraint +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

best

a GMimeFilterBest

 

constraint

a GMimeEncodingConstraint

 
+
+
+

Returns

+

the best encoding for the stream filtered by best +.

+
+
+
+
+

Types and Values

+
+

struct GMimeFilterBest

+
struct GMimeFilterBest;
+

A filter for calculating the best encoding and/or charset to encode +the data passed through it.

+
+

Members

+
+++++ + +
+
+
+
+
+

enum GMimeFilterBestFlags

+

Bit flags to enable charset and/or encoding scanning to make +educated guesses as to what the best charset and/or encodings to +use for the content passed through the filter.

+
+

Members

+
+++++ + + + + + + + + + + + + +

GMIME_FILTER_BEST_CHARSET

+

Enable best-charset detection.

+
 

GMIME_FILTER_BEST_ENCODING

+

Enable best-encoding detection.

+
 
+
+
+
+
+

See Also

+

GMimeFilter

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeFilterCharset.html gmime-3.0.1/docs/reference/html/GMimeFilterCharset.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeFilterCharset.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeFilterCharset.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,137 @@ + + + + +GMimeFilterCharset: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeFilterCharset

+

GMimeFilterCharset — Charset-conversion filter

+
+
+

Functions

+
++++ + + + + +
+GMimeFilter * + +g_mime_filter_charset_new () +
+
+
+

Types and Values

+
++++ + + + + +
structGMimeFilterCharset
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeFilter
+        ╰── GMimeFilterCharset
+
+
+
+

Description

+

A GMimeFilter which is used for converting text from one charset +to another.

+
+
+

Functions

+
+

g_mime_filter_charset_new ()

+
GMimeFilter *
+g_mime_filter_charset_new (const char *from_charset,
+                           const char *to_charset);
+

Creates a new GMimeFilterCharset filter.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

from_charset

charset to convert from

 

to_charset

charset to convert to

 
+
+
+

Returns

+

a new charset filter or NULL if the charset conversion is +not possible.

+
+
+
+
+

Types and Values

+
+

struct GMimeFilterCharset

+
struct GMimeFilterCharset;
+

A filter to convert between charsets.

+
+

Members

+
+++++ + +
+
+
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeFilterChecksum.html gmime-3.0.1/docs/reference/html/GMimeFilterChecksum.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeFilterChecksum.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeFilterChecksum.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,183 @@ + + + + +GMimeFilterChecksum: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeFilterChecksum

+

GMimeFilterChecksum — Calculate a checksum

+
+
+

Functions

+
++++ + + + + + + + + + + +
+GMimeFilter * + +g_mime_filter_checksum_new () +
+size_t + +g_mime_filter_checksum_get_digest () +
+
+
+

Types and Values

+
++++ + + + + +
structGMimeFilterChecksum
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeFilter
+        ╰── GMimeFilterChecksum
+
+
+
+

Description

+

Calculate a checksum for a stream.

+
+
+

Functions

+
+

g_mime_filter_checksum_new ()

+
GMimeFilter *
+g_mime_filter_checksum_new (GChecksumType type);
+

Creates a new checksum filter.

+
+

Parameters

+
+++++ + + + + + +

type

the type of checksum

 
+
+
+

Returns

+

a new GMimeFilterChecksum filter.

+
+
+
+
+

g_mime_filter_checksum_get_digest ()

+
size_t
+g_mime_filter_checksum_get_digest (GMimeFilterChecksum *checksum,
+                                   unsigned char *digest,
+                                   size_t len);
+

Outputs the checksum digest into digest +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

checksum

checksum filter object

 

digest

the digest buffer

 

len

the length of the digest buffer

 
+
+
+

Returns

+

the number of bytes used of the digest +buffer.

+
+
+
+
+

Types and Values

+
+

struct GMimeFilterChecksum

+
struct GMimeFilterChecksum;
+

A filter for calculating the checksum of a stream.

+
+

Members

+
+++++ + +
+
+
+
+
+

See Also

+

GMimeFilter

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeFilterDos2Unix.html gmime-3.0.1/docs/reference/html/GMimeFilterDos2Unix.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeFilterDos2Unix.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeFilterDos2Unix.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,127 @@ + + + + +GMimeFilterDos2Unix: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeFilterDos2Unix

+

GMimeFilterDos2Unix — Convert line-endings from Windows/DOS (CRLF) to UNIX (LF).

+
+
+

Functions

+
++++ + + + + +
+GMimeFilter * + +g_mime_filter_dos2unix_new () +
+
+
+

Types and Values

+
++++ + + + + +
structGMimeFilterDos2Unix
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeFilter
+        ╰── GMimeFilterDos2Unix
+
+
+
+

Description

+

A GMimeFilter for converting from DOS to UNIX line-endings.

+
+
+

Functions

+
+

g_mime_filter_dos2unix_new ()

+
GMimeFilter *
+g_mime_filter_dos2unix_new (gboolean ensure_newline);
+

Creates a new GMimeFilterDos2Unix filter.

+
+

Parameters

+
+++++ + + + + + +

ensure_newline

TRUE if the filter should ensure that the stream ends in a new line

 
+
+
+

Returns

+

a new GMimeFilterDos2Unix filter.

+
+
+
+
+

Types and Values

+
+

struct GMimeFilterDos2Unix

+
struct GMimeFilterDos2Unix;
+

A filter to convert a stream from Windows/DOS line endings to Unix line endings.

+
+

Members

+
+++++ + +
+
+
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeFilterEnriched.html gmime-3.0.1/docs/reference/html/GMimeFilterEnriched.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeFilterEnriched.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeFilterEnriched.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,146 @@ + + + + +GMimeFilterEnriched: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeFilterEnriched

+

GMimeFilterEnriched — Convert text/enriched or text/rtf to HTML

+
+
+

Functions

+
++++ + + + + +
+GMimeFilter * + +g_mime_filter_enriched_new () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
#defineGMIME_FILTER_ENRICHED_IS_RICHTEXT
structGMimeFilterEnriched
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeFilter
+        ╰── GMimeFilterEnriched
+
+
+
+

Description

+

A GMimeFilter used for converting text/enriched or text/rtf to HTML.

+
+
+

Functions

+
+

g_mime_filter_enriched_new ()

+
GMimeFilter *
+g_mime_filter_enriched_new (guint32 flags);
+

Creates a new GMimeFilterEnriched object.

+
+

Parameters

+
+++++ + + + + + +

flags

flags

 
+
+
+

Returns

+

a new GMimeFilter object.

+
+
+
+
+

Types and Values

+
+

GMIME_FILTER_ENRICHED_IS_RICHTEXT

+
#define GMIME_FILTER_ENRICHED_IS_RICHTEXT  (1 << 0)
+
+

A bit flag for g_mime_filter_enriched_new() which signifies that +the filter should expect Rich Text (aka RTF).

+
+
+
+

struct GMimeFilterEnriched

+
struct GMimeFilterEnriched;
+

A filter for converting text/enriched or text/richtext textual +streams into text/html.

+
+

Members

+
+++++ + +
+
+
+
+
+

See Also

+

GMimeFilter

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeFilterFrom.html gmime-3.0.1/docs/reference/html/GMimeFilterFrom.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeFilterFrom.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeFilterFrom.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,186 @@ + + + + +GMimeFilterFrom: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeFilterFrom

+

GMimeFilterFrom — Escape MBox From_ lines

+
+
+

Functions

+
++++ + + + + +
+GMimeFilter * + +g_mime_filter_from_new () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
structGMimeFilterFrom
enumGMimeFilterFromMode
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeFilter
+        ╰── GMimeFilterFrom
+
+
+
+

Description

+

A GMimeFilter used for escaping MBox From_ lines using either the +traditional ">From " or quoted-printable encoding.

+
+
+

Functions

+
+

g_mime_filter_from_new ()

+
GMimeFilter *
+g_mime_filter_from_new (GMimeFilterFromMode mode);
+

Creates a new GMimeFilterFrom filter. If mode + is +GMIME_FILTER_FROM_MODE_ARMOR, the from-filter will encode from +lines using the quoted-printable encoding resulting in "=46rom ". +Using the GMIME_FILTER_FROM_MODE_DEFAULT or +GMIME_FILTER_FROM_MODE_ESCAPE mode (they are the same), from lines +will be escaped to ">From ".

+

Note: If you plan on using a from-filter in mode ARMOR, you should +remember to also use a GMimeFilterBasic filter with an encoding of +GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE.

+
+

Parameters

+
+++++ + + + + + +

mode

filter mode

 
+
+
+

Returns

+

a new from filter with mode mode +.

+
+
+
+
+

Types and Values

+
+

struct GMimeFilterFrom

+
struct GMimeFilterFrom;
+

A filter for armoring or escaping lines beginning with "From ".

+
+

Members

+
+++++ + +
+
+
+
+
+

enum GMimeFilterFromMode

+

The mode for a GMimeFilterFrom filter.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + +

GMIME_FILTER_FROM_MODE_DEFAULT

+

Default mode.

+
 

GMIME_FILTER_FROM_MODE_ESCAPE

+

Escape 'From ' lines with a '>'

+
 

GMIME_FILTER_FROM_MODE_ARMOR

+

QP-Encode 'From ' lines

+
 
+
+
+
+
+

See Also

+

GMimeFilter

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeFilterGZip.html gmime-3.0.1/docs/reference/html/GMimeFilterGZip.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeFilterGZip.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeFilterGZip.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,177 @@ + + + + +GMimeFilterGZip: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeFilterGZip

+

GMimeFilterGZip — GNU Zip compression/decompression

+
+
+

Functions

+
++++ + + + + +
+GMimeFilter * + +g_mime_filter_gzip_new () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
structGMimeFilterGZip
enumGMimeFilterGZipMode
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeFilter
+        ╰── GMimeFilterGZip
+
+
+
+

Description

+

A GMimeFilter used for compressing or decompressing a stream using +GNU Zip.

+
+
+

Functions

+
+

g_mime_filter_gzip_new ()

+
GMimeFilter *
+g_mime_filter_gzip_new (GMimeFilterGZipMode mode,
+                        int level);
+

Creates a new gzip (or gunzip) filter.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

mode

zip or unzip

 

level

compression level

 
+
+
+

Returns

+

a new gzip (or gunzip) filter.

+
+
+
+
+

Types and Values

+
+

struct GMimeFilterGZip

+
struct GMimeFilterGZip;
+

A filter for compresing or decompressing a gzip stream.

+
+

Members

+
+++++ + +
+
+
+
+
+

enum GMimeFilterGZipMode

+

The mode for the GMimeFilterGZip filter.

+
+

Members

+
+++++ + + + + + + + + + + + + +

GMIME_FILTER_GZIP_MODE_ZIP

+

Compress (zip) mode.

+
 

GMIME_FILTER_GZIP_MODE_UNZIP

+

Uncompress (unzip) mode.

+
 
+
+
+
+
+

See Also

+

GMimeFilter

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeFilter.html gmime-3.0.1/docs/reference/html/GMimeFilter.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeFilter.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeFilter.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,407 @@ + + + + +GMimeFilter: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeFilter

+

GMimeFilter — Abstract filter class

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GMimeFilter * + +g_mime_filter_copy () +
+void + +g_mime_filter_filter () +
+void + +g_mime_filter_complete () +
+void + +g_mime_filter_reset () +
+void + +g_mime_filter_backup () +
+void + +g_mime_filter_set_size () +
+
+
+

Types and Values

+
++++ + + + + +
structGMimeFilter
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeFilter
+        ├── GMimeFilterBasic
+        ├── GMimeFilterBest
+        ├── GMimeFilterCharset
+        ├── GMimeFilterChecksum
+        ├── GMimeFilterDos2Unix
+        ├── GMimeFilterEnriched
+        ├── GMimeFilterFrom
+        ├── GMimeFilterGZip
+        ├── GMimeFilterHTML
+        ├── GMimeFilterSmtpData
+        ├── GMimeFilterStrip
+        ├── GMimeFilterUnix2Dos
+        ├── GMimeFilterWindows
+        ╰── GMimeFilterYenc
+
+
+
+

Description

+

Stream filters are an efficient way of converting data from one +format to another.

+
+
+

Functions

+
+

g_mime_filter_copy ()

+
GMimeFilter *
+g_mime_filter_copy (GMimeFilter *filter);
+

Copies filter + into a new GMimeFilter object.

+
+

Parameters

+
+++++ + + + + + +

filter

filter

 
+
+
+

Returns

+

a duplicate of filter +.

+

[transfer full]

+
+
+
+
+

g_mime_filter_filter ()

+
void
+g_mime_filter_filter (GMimeFilter *filter,
+                      char *inbuf,
+                      size_t inlen,
+                      size_t prespace,
+                      char **outbuf,
+                      size_t *outlen,
+                      size_t *outprespace);
+

Filters the input data and writes it to out +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

filter

filter

 

inbuf

input buffer.

[array length=inlen][element-type guint8]

inlen

input buffer length

 

prespace

prespace buffer length

 

outbuf

pointer to output buffer.

[out][array length=outlen][element-type guint8][transfer none]

outlen

pointer to output length.

[out]

outprespace

pointer to output prespace buffer length.

[out]
+
+
+
+
+

g_mime_filter_complete ()

+
void
+g_mime_filter_complete (GMimeFilter *filter,
+                        char *inbuf,
+                        size_t inlen,
+                        size_t prespace,
+                        char **outbuf,
+                        size_t *outlen,
+                        size_t *outprespace);
+

Completes the filtering.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

filter

filter

 

inbuf

input buffer.

[array length=inlen][element-type guint8]

inlen

input buffer length

 

prespace

prespace buffer length

 

outbuf

pointer to output buffer.

[out][array length=outlen][element-type guint8][transfer none]

outlen

pointer to output length.

[out]

outprespace

pointer to output prespace buffer length.

[out]
+
+
+
+
+

g_mime_filter_reset ()

+
void
+g_mime_filter_reset (GMimeFilter *filter);
+

Resets the filter.

+
+

Parameters

+
+++++ + + + + + +

filter

a GMimeFilter object

 
+
+
+
+
+

g_mime_filter_backup ()

+
void
+g_mime_filter_backup (GMimeFilter *filter,
+                      const char *data,
+                      size_t length);
+

Sets number of bytes backed up on the input, new calls replace +previous ones

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

filter

filter

 

data

data to backup.

[array length=length][element-type guint8]

length

length of data +

 
+
+
+
+
+

g_mime_filter_set_size ()

+
void
+g_mime_filter_set_size (GMimeFilter *filter,
+                        size_t size,
+                        gboolean keep);
+

Ensure this much size is available for filter output (if required)

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

filter

filter

 

size

requested size for the output buffer

 

keep

TRUE if existing data in the output buffer should be kept

 
+
+
+
+
+

Types and Values

+
+

struct GMimeFilter

+
struct GMimeFilter;
+

Base class for filters used by GMimeStreamFilter.

+
+

Members

+
+++++ + +
+
+
+
+
+

See Also

+

GMimeStreamFilter

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeFilterHTML.html gmime-3.0.1/docs/reference/html/GMimeFilterHTML.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeFilterHTML.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeFilterHTML.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,242 @@ + + + + +GMimeFilterHTML: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeFilterHTML

+

GMimeFilterHTML — Convert plain text into HTML

+
+
+

Functions

+
++++ + + + + +
+GMimeFilter * + +g_mime_filter_html_new () +
+
+ +
+

Object Hierarchy

+
    GObject
+    ╰── GMimeFilter
+        ╰── GMimeFilterHTML
+
+
+
+

Description

+

A GMimeFilter used for converting plain text into HTML.

+
+
+

Functions

+
+

g_mime_filter_html_new ()

+
GMimeFilter *
+g_mime_filter_html_new (guint32 flags,
+                        guint32 colour);
+

Creates a new GMimeFilterHTML filter which can be used to convert a +plain UTF-8 text stream into an html stream.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

flags

html flags

 

colour

citation colour

 
+
+
+

Returns

+

a new html filter.

+
+
+
+
+

Types and Values

+
+

struct GMimeFilterHTML

+
struct GMimeFilterHTML;
+

A filter for converting text/plain into text/html.

+
+

Members

+
+++++ + +
+
+
+
+
+

GMIME_FILTER_HTML_PRE

+
#define GMIME_FILTER_HTML_PRE                 (1 << 0)
+
+

Wrap stream in <pre> and </pre> tags.

+
+
+
+

GMIME_FILTER_HTML_CONVERT_NL

+
#define GMIME_FILTER_HTML_CONVERT_NL          (1 << 1)
+
+

Convert new-lines ('\n') into <br> tags.

+
+
+
+

GMIME_FILTER_HTML_CONVERT_SPACES

+
#define GMIME_FILTER_HTML_CONVERT_SPACES      (1 << 2)
+
+

Preserve whitespace by converting spaces into their appropriate +html entities.

+
+
+
+

GMIME_FILTER_HTML_CONVERT_URLS

+
#define GMIME_FILTER_HTML_CONVERT_URLS        (1 << 3)
+
+

Wrap detected URLs in <a href=...> tags.

+
+
+
+

GMIME_FILTER_HTML_MARK_CITATION

+
#define GMIME_FILTER_HTML_MARK_CITATION       (1 << 4)
+
+

Change the colour of citation text.

+
+
+
+

GMIME_FILTER_HTML_BLOCKQUOTE_CITATION

+
#define GMIME_FILTER_HTML_BLOCKQUOTE_CITATION (1 << 8)
+
+

Enclose citation text in blockquotes.

+
+
+
+

GMIME_FILTER_HTML_CONVERT_ADDRESSES

+
#define GMIME_FILTER_HTML_CONVERT_ADDRESSES   (1 << 5)
+
+

Wrap email addresses in "mailto:" href tags.

+
+
+
+

GMIME_FILTER_HTML_ESCAPE_8BIT

+
#define GMIME_FILTER_HTML_ESCAPE_8BIT         (1 << 6)
+
+

Converts 8bit characters to '?'.

+
+
+
+

GMIME_FILTER_HTML_CITE

+
#define GMIME_FILTER_HTML_CITE                (1 << 7)
+
+

Cites text by prepending "> " to each cited line.

+
+
+
+

See Also

+

GMimeFilter

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/gmime-filters.html gmime-3.0.1/docs/reference/html/gmime-filters.html --- gmime-2.6.22+dfsg2/docs/reference/html/gmime-filters.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/gmime-filters.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,69 @@ + + + + +Stream Filters: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Stream Filters

+

Stream Filters — How to use Stream Filters

+
+
+

Overview of Filters

+

Stream filters are an efficient way of converting data from + one format to another. To use a stream filter, you must first + construct a GMimeStreamFilter stream and then add the desired + filters to it.

+

GMime comes equipped with some basic filters such as + GMimeFilterBasic, GMimeFilterCharset, GMimeFilterDos2Unix, + GMimeFilterUnix2Dos, GMimeFilterFrom and GMimeFilterHTML.

+

The GMimeFilterBasic filter is actually a collection of + filters for common transfer encodings used by MIME. So far, it is + able to handle encoding and decoding of base64, quoted-printable + and (x-)uuencode.

+

For internationalization support, GMime also includes a + filter for converting between any 2 charsets, + GMimeFilterCharset. With this filter, mail user agents can allow + the user to read the message content in his or her own + charset.

+

A common conversion needed for text is CRLF -> LF and LF -> + CRLF which is needed for most (all?) internet protocols. Luckily, + GMime comes equipped with a set of filters to handle this for you: + GMimeFilterDos2Unix and GMimeFilterUnix2Dos.

+

On Unix systems, mail often resides in spools in mbox + format. Mbox uses a line that starts with "From " to delimit + messages which means that message bodies are forbidden to contain + lines starting with "From ". The common way to escape these from + lines in message bodies is to prepend the line with a greater-than + character ('>') producing ">From ". You'll find GMimeFilterFrom + handy when dealing with this.

+

The GMimeFilterHTML filter converts a normal text stream + into an html stream. This is especially useful if you are using a + widget such as GtkHTML to display the contents of an email + message.

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeFilterSmtpData.html gmime-3.0.1/docs/reference/html/GMimeFilterSmtpData.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeFilterSmtpData.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeFilterSmtpData.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,112 @@ + + + + +GMimeFilterSmtpData: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeFilterSmtpData

+

GMimeFilterSmtpData — Byte-stuffs outgoing SMTP DATA.

+
+
+

Functions

+
++++ + + + + +
+GMimeFilter * + +g_mime_filter_smtp_data_new () +
+
+
+

Types and Values

+
++++ + + + + +
structGMimeFilterSmtpData
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeFilter
+        ╰── GMimeFilterSmtpData
+
+
+
+

Description

+

A GMimeFilter for byte-stuffing outgoing SMTP DATA.

+
+
+

Functions

+
+

g_mime_filter_smtp_data_new ()

+
GMimeFilter *
+g_mime_filter_smtp_data_new (void);
+

Creates a new GMimeFilterSmtpData filter.

+
+

Returns

+

a new GMimeFilterSmtpData filter.

+
+
+
+
+

Types and Values

+
+

struct GMimeFilterSmtpData

+
struct GMimeFilterSmtpData;
+

A filter to byte-stuff SMTP DATA.

+
+

Members

+
+++++ + +
+
+
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeFilterStrip.html gmime-3.0.1/docs/reference/html/GMimeFilterStrip.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeFilterStrip.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeFilterStrip.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,118 @@ + + + + +GMimeFilterStrip: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeFilterStrip

+

GMimeFilterStrip — Strip trailing whitespace from the end of lines

+
+
+

Functions

+
++++ + + + + +
+GMimeFilter * + +g_mime_filter_strip_new () +
+
+
+

Types and Values

+
++++ + + + + +
structGMimeFilterStrip
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeFilter
+        ╰── GMimeFilterStrip
+
+
+
+

Description

+

A GMimeFilter used for stripping trailing whitespace from the end +of lines.

+
+
+

Functions

+
+

g_mime_filter_strip_new ()

+
GMimeFilter *
+g_mime_filter_strip_new (void);
+

Creates a new GMimeFilterStrip filter which will strip trailing +whitespace from every line of input passed through the filter.

+
+

Returns

+

a new strip filter.

+
+
+
+
+

Types and Values

+
+

struct GMimeFilterStrip

+
struct GMimeFilterStrip;
+

A filter for stripping whitespace from the end of lines.

+
+

Members

+
+++++ + +
+
+
+
+
+

See Also

+

GMimeFilter

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeFilterUnix2Dos.html gmime-3.0.1/docs/reference/html/GMimeFilterUnix2Dos.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeFilterUnix2Dos.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeFilterUnix2Dos.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,127 @@ + + + + +GMimeFilterUnix2Dos: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeFilterUnix2Dos

+

GMimeFilterUnix2Dos — Convert line-endings from UNIX (LF) to Windows/DOS (CRLF).

+
+
+

Functions

+
++++ + + + + +
+GMimeFilter * + +g_mime_filter_unix2dos_new () +
+
+
+

Types and Values

+
++++ + + + + +
structGMimeFilterUnix2Dos
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeFilter
+        ╰── GMimeFilterUnix2Dos
+
+
+
+

Description

+

A GMimeFilter for converting from UNIX to DOS line-endings.

+
+
+

Functions

+
+

g_mime_filter_unix2dos_new ()

+
GMimeFilter *
+g_mime_filter_unix2dos_new (gboolean ensure_newline);
+

Creates a new GMimeFilterUnix2Dos filter.

+
+

Parameters

+
+++++ + + + + + +

ensure_newline

TRUE if the filter should ensure that the stream ends in a new line

 
+
+
+

Returns

+

a new GMimeFilterUnix2Dos filter.

+
+
+
+
+

Types and Values

+
+

struct GMimeFilterUnix2Dos

+
struct GMimeFilterUnix2Dos;
+

A filter to convert a stream from Windows/DOS line endings to Unix line endings.

+
+

Members

+
+++++ + +
+
+
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeFilterWindows.html gmime-3.0.1/docs/reference/html/GMimeFilterWindows.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeFilterWindows.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeFilterWindows.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,211 @@ + + + + +GMimeFilterWindows: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeFilterWindows

+

GMimeFilterWindows — Determine if text is in a Microsoft Windows codepage

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + +
+GMimeFilter * + +g_mime_filter_windows_new () +
+gboolean + +g_mime_filter_windows_is_windows_charset () +
const char * + +g_mime_filter_windows_real_charset () +
+
+
+

Types and Values

+
++++ + + + + +
structGMimeFilterWindows
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeFilter
+        ╰── GMimeFilterWindows
+
+
+
+

Description

+

A GMimeFilter used for determining if text marked as iso-8859-## +is actually encoded in one of the Windows-CP125# charsets.

+
+
+

Functions

+
+

g_mime_filter_windows_new ()

+
GMimeFilter *
+g_mime_filter_windows_new (const char *claimed_charset);
+

Creates a new GMimeFilterWindows filter. When a stream of text has +been filtered, it can be determined whether or not said text stream +was in claimed_charset + or the equivalent Windows-CP125# charset.

+
+

Parameters

+
+++++ + + + + + +

claimed_charset

charset that a text stream claims to be

 
+
+
+

Returns

+

a new windows filter.

+
+
+
+
+

g_mime_filter_windows_is_windows_charset ()

+
gboolean
+g_mime_filter_windows_is_windows_charset
+                               (GMimeFilterWindows *filter);
+

Determines whether or not a Windows-CP125# charset has been +detected so far.

+
+

Parameters

+
+++++ + + + + + +

filter

windows filter object

 
+
+
+

Returns

+

TRUE if the filtered stream has been detected to contain +Windows-CP125# characters or FALSE otherwise.

+
+
+
+
+

g_mime_filter_windows_real_charset ()

+
const char *
+g_mime_filter_windows_real_charset (GMimeFilterWindows *filter);
+

Figures out the real charset that the text is encoded in based on whether or not Windows-CP125# characters were found.

+
+

Parameters

+
+++++ + + + + + +

filter

windows filter object

 
+
+
+

Returns

+

a const string pointer to the claimed charset if filtered +text stream was found not to contain any Windows-CP125# characters +or the proper Windows-CP125# charset.

+
+
+
+
+

Types and Values

+
+

struct GMimeFilterWindows

+
struct GMimeFilterWindows;
+

A filter for detecting whether or not a text stream claimed to be +iso-8859-X is really that charset or if it is really a +Windows-CP125x charset.

+
+

Members

+
+++++ + +
+
+
+
+
+

See Also

+

GMimeFilter

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeFilterYenc.html gmime-3.0.1/docs/reference/html/GMimeFilterYenc.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeFilterYenc.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeFilterYenc.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,649 @@ + + + + +GMimeFilterYenc: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeFilterYenc

+

GMimeFilterYenc — yEncode or yDecode

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GMimeFilter * + +g_mime_filter_yenc_new () +
+void + +g_mime_filter_yenc_set_state () +
+void + +g_mime_filter_yenc_set_crc () +
+guint32 + +g_mime_filter_yenc_get_crc () +
+guint32 + +g_mime_filter_yenc_get_pcrc () +
#define +GMIME_YENCODE_CRC_FINAL() +
+size_t + +g_mime_ydecode_step () +
+size_t + +g_mime_yencode_step () +
+size_t + +g_mime_yencode_close () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
structGMimeFilterYenc
#defineGMIME_YENCODE_CRC_INIT
#defineGMIME_YENCODE_STATE_INIT
#defineGMIME_YDECODE_STATE_INIT
#defineGMIME_YDECODE_STATE_EOLN
#defineGMIME_YDECODE_STATE_ESCAPE
#defineGMIME_YDECODE_STATE_END
#defineGMIME_YDECODE_STATE_BEGIN
#defineGMIME_YDECODE_STATE_DECODE
#defineGMIME_YDECODE_STATE_PART
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeFilter
+        ╰── GMimeFilterYenc
+
+
+
+

Description

+

A GMimeFilter used to encode or decode the Usenet yEncoding.

+
+
+

Functions

+
+

g_mime_filter_yenc_new ()

+
GMimeFilter *
+g_mime_filter_yenc_new (gboolean encode);
+

Creates a new yEnc filter.

+
+

Parameters

+
+++++ + + + + + +

encode

encode vs decode

 
+
+
+

Returns

+

a new yEnc filter.

+
+
+
+
+

g_mime_filter_yenc_set_state ()

+
void
+g_mime_filter_yenc_set_state (GMimeFilterYenc *yenc,
+                              int state);
+

Sets the current state of the yencoder/ydecoder

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

yenc

yEnc filter

 

state

encode/decode state

 
+
+
+
+
+

g_mime_filter_yenc_set_crc ()

+
void
+g_mime_filter_yenc_set_crc (GMimeFilterYenc *yenc,
+                            guint32 crc);
+

Sets the current crc32 value on the yEnc filter yenc + to crc +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

yenc

yEnc filter

 

crc

crc32

 
+
+
+
+
+

g_mime_filter_yenc_get_crc ()

+
guint32
+g_mime_filter_yenc_get_crc (GMimeFilterYenc *yenc);
+

Get the computed crc or (guint32) -1 on fail.

+
+

Parameters

+
+++++ + + + + + +

yenc

yEnc filter

 
+
+
+

Returns

+

the computed crc or (guint32) -1 on fail.

+
+
+
+
+

g_mime_filter_yenc_get_pcrc ()

+
guint32
+g_mime_filter_yenc_get_pcrc (GMimeFilterYenc *yenc);
+

Get the computed part crc or (guint32) -1 on fail.

+
+

Parameters

+
+++++ + + + + + +

yenc

yEnc filter

 
+
+
+

Returns

+

the computed part crc or (guint32) -1 on fail.

+
+
+
+
+

GMIME_YENCODE_CRC_FINAL()

+
#define GMIME_YENCODE_CRC_FINAL(crc) (~crc)
+
+

Gets the final crc value from crc +.

+
+

Parameters

+
+++++ + + + + + +

crc

crc or pcrc state variable

 
+
+
+
+
+

g_mime_ydecode_step ()

+
size_t
+g_mime_ydecode_step (const unsigned char *inbuf,
+                     size_t inlen,
+                     unsigned char *outbuf,
+                     int *state,
+                     guint32 *pcrc,
+                     guint32 *crc);
+

Performs a 'decode step' on a chunk of yEncoded data of length +inlen + pointed to by inbuf + and writes to outbuf +. Assumes the =ybegin +and =ypart lines have already been stripped off.

+

To get the crc32 value of the part, use GMIME_YENCODE_CRC_FINAL +(pcrc +). If there are more parts, you should reuse crc + without +re-initializing. Once all parts have been decoded, you may get the +combined crc32 value of all the parts using GMIME_YENCODE_CRC_FINAL +(crc +).

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

inbuf

input buffer

 

inlen

input buffer length

 

outbuf

output buffer

 

state

ydecode state

 

pcrc

part crc state

 

crc

crc state

 
+
+
+

Returns

+

the number of bytes decoded.

+
+
+
+
+

g_mime_yencode_step ()

+
size_t
+g_mime_yencode_step (const unsigned char *inbuf,
+                     size_t inlen,
+                     unsigned char *outbuf,
+                     int *state,
+                     guint32 *pcrc,
+                     guint32 *crc);
+

Performs an yEncode 'encode step' on a chunk of raw data of length +inlen + pointed to by inbuf + and writes to outbuf +.

+

state + should be initialized to GMIME_YENCODE_STATE_INIT before +beginning making the first call to this function. Subsequent calls +should reuse state +.

+

Along the same lines, pcrc + and crc + should be initialized to +GMIME_YENCODE_CRC_INIT before using.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

inbuf

input buffer

 

inlen

input buffer length

 

outbuf

output buffer

 

state

yencode state

 

pcrc

part crc state

 

crc

crc state

 
+
+
+

Returns

+

the number of bytes encoded.

+
+
+
+
+

g_mime_yencode_close ()

+
size_t
+g_mime_yencode_close (const unsigned char *inbuf,
+                      size_t inlen,
+                      unsigned char *outbuf,
+                      int *state,
+                      guint32 *pcrc,
+                      guint32 *crc);
+

Call this function when finished encoding data with +g_mime_yencode_step() to flush off the remaining state.

+

GMIME_YENCODE_CRC_FINAL (pcrc +) will give you the crc32 of the +encoded "part". If there are more "parts" to encode, you should +re-use crc + when encoding the next "parts" and then use +GMIME_YENCODE_CRC_FINAL (crc +) to get the combined crc32 value of +all the parts.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

inbuf

input buffer

 

inlen

input buffer length

 

outbuf

output buffer

 

state

yencode state

 

pcrc

part crc state

 

crc

crc state

 
+
+
+

Returns

+

the number of bytes encoded.

+
+
+
+
+

Types and Values

+
+

struct GMimeFilterYenc

+
struct GMimeFilterYenc;
+

A filter for yEncoding or yDecoding a stream.

+
+

Members

+
+++++ + +
+
+
+
+
+

GMIME_YENCODE_CRC_INIT

+
#define GMIME_YENCODE_CRC_INIT       (~0)
+
+

Initial state for the crc and pcrc state variables.

+
+
+
+

GMIME_YENCODE_STATE_INIT

+
#define GMIME_YENCODE_STATE_INIT     (0)
+
+

Initial state for the g_mime_ydecode_step() function.

+
+
+
+

GMIME_YDECODE_STATE_INIT

+
#define GMIME_YDECODE_STATE_INIT     (0)
+
+

Initial state for the g_mime_ydecode_step() function.

+
+
+
+

GMIME_YDECODE_STATE_EOLN

+
#define GMIME_YDECODE_STATE_EOLN     (1 << 8)
+
+

State bit that denotes the yEnc filter has reached an end-of-line.

+

This state is for internal use only.

+
+
+
+

GMIME_YDECODE_STATE_ESCAPE

+
#define GMIME_YDECODE_STATE_ESCAPE   (1 << 9)
+
+

State bit that denotes the yEnc filter has reached an escape +sequence.

+

This state is for internal use only.

+
+
+
+

GMIME_YDECODE_STATE_END

+
#define GMIME_YDECODE_STATE_END      (1 << 15)
+
+

State bit that denoates that g_mime_ydecode_step() has finished +decoding.

+
+
+
+

GMIME_YDECODE_STATE_BEGIN

+
#define GMIME_YDECODE_STATE_BEGIN    (1 << 12)
+
+

State bit that denotes the yEnc filter has found the =ybegin line.

+
+
+
+

GMIME_YDECODE_STATE_DECODE

+
#define GMIME_YDECODE_STATE_DECODE   (1 << 14)
+
+

State bit that denotes yEnc filter has begun decoding the actual +yencoded content and will continue to do so until an =yend line is +found (or until there is nothing left to decode).

+
+
+
+

GMIME_YDECODE_STATE_PART

+
#define GMIME_YDECODE_STATE_PART     (1 << 13)
+
+

State bit that denotes the yEnc filter has found the =ypart +line. (Note: not all yencoded blocks have one)

+
+
+
+

See Also

+

GMimeFilter

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/gmime-gmime-charset.html gmime-3.0.1/docs/reference/html/gmime-gmime-charset.html --- gmime-2.6.22+dfsg2/docs/reference/html/gmime-gmime-charset.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/gmime-gmime-charset.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,595 @@ + + + + +gmime-charset: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

gmime-charset

+

gmime-charset — Charset helper functions

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+void + +g_mime_charset_map_init () +
+void + +g_mime_charset_map_shutdown () +
const char * + +g_mime_locale_charset () +
const char * + +g_mime_locale_language () +
const char * + +g_mime_charset_language () +
const char * + +g_mime_charset_canon_name () +
const char * + +g_mime_charset_iconv_name () +
const char * + +g_mime_charset_name () +
const char * + +g_mime_charset_locale_name () +
const char * + +g_mime_charset_iso_to_windows () +
+void + +g_mime_charset_init () +
+void + +g_mime_charset_step () +
const char * + +g_mime_charset_best_name () +
const char * + +g_mime_charset_best () +
+gboolean + +g_mime_charset_can_encode () +
+
+
+

Types and Values

+
++++ + + + + +
structGMimeCharset
+
+
+

Description

+

Charset utility functions.

+
+
+

Functions

+
+

g_mime_charset_map_init ()

+
void
+g_mime_charset_map_init (void);
+

Initializes character set maps.

+

Note: g_mime_init() calls this routine for you.

+
+
+
+

g_mime_charset_map_shutdown ()

+
void
+g_mime_charset_map_shutdown (void);
+

Frees internal lookup tables created in g_mime_charset_map_init().

+
+
+
+

g_mime_locale_charset ()

+
const char *
+g_mime_locale_charset (void);
+

Gets the user's locale charset (or iso-8859-1 by default).

+
+

Returns

+

the user's locale charset (or iso-8859-1 by default).

+
+
+
+
+

g_mime_locale_language ()

+
const char *
+g_mime_locale_language (void);
+

Gets the user's locale language code (or NULL by default).

+
+

Returns

+

the user's locale language code (or NULL by default).

+

[nullable]

+
+
+
+
+

g_mime_charset_language ()

+
const char *
+g_mime_charset_language (const char *charset);
+

Attempts to find a specific language code that is specific to +charset +. Currently only handles CJK and Russian/Ukranian +charset->lang mapping. Everything else will return NULL.

+
+

Parameters

+
+++++ + + + + + +

charset

charset name

 
+
+
+

Returns

+

a language code that is specific to charset +, +or NULL on fail.

+

[nullable]

+
+
+
+
+

g_mime_charset_canon_name ()

+
const char *
+g_mime_charset_canon_name (const char *charset);
+

Attempts to find a canonical charset name for charset +.

+

Note: Will normally return the same value as +g_mime_charset_iconv_name() unless the system iconv does not use +the canonical ISO charset names (such as using ISO8859-1 rather +than the canonical form ISO-8859-1).

+
+

Parameters

+
+++++ + + + + + +

charset

charset name

 
+
+
+

Returns

+

a canonical charset name for charset +.

+
+
+
+
+

g_mime_charset_iconv_name ()

+
const char *
+g_mime_charset_iconv_name (const char *charset);
+

Attempts to find an iconv-friendly charset name for charset +.

+
+

Parameters

+
+++++ + + + + + +

charset

charset name

 
+
+
+

Returns

+

an iconv-friendly charset name for charset +.

+
+
+
+
+

g_mime_charset_name ()

+
const char *
+g_mime_charset_name (const char *charset);
+

g_mime_charset_name is deprecated and should not be used in newly-written code.

+

Attempts to find an iconv-friendly charset name for charset +.

+

Note: This function is deprecated. Use g_mime_charset_iconv_name() +instead.

+
+

Parameters

+
+++++ + + + + + +

charset

charset name

 
+
+
+

Returns

+

an iconv-friendly charset name for charset +.

+
+
+
+
+

g_mime_charset_locale_name ()

+
const char *
+g_mime_charset_locale_name (void);
+

g_mime_charset_locale_name is deprecated and should not be used in newly-written code.

+

Gets the user's locale charset (or iso-8859-1 by default).

+

Note: This function is deprecated. Use g_mime_locale_charset() +instead.

+
+

Returns

+

the user's locale charset (or iso-8859-1 by default).

+
+
+
+
+

g_mime_charset_iso_to_windows ()

+
const char *
+g_mime_charset_iso_to_windows (const char *isocharset);
+

Maps the ISO-8859-# charset to the equivalent Windows-CP125# +charset.

+
+

Parameters

+
+++++ + + + + + +

isocharset

ISO-8859-# charset

 
+
+
+

Returns

+

equivalent Windows charset.

+
+
+
+
+

g_mime_charset_init ()

+
void
+g_mime_charset_init (GMimeCharset *charset);
+

Initializes a charset mask structure.

+
+

Parameters

+
+++++ + + + + + +

charset

charset mask

 
+
+
+
+
+

g_mime_charset_step ()

+
void
+g_mime_charset_step (GMimeCharset *charset,
+                     const char *inbuf,
+                     size_t inlen);
+

Steps through the input buffer 1 unicode character (glyph) at a +time (ie, not necessarily 1 byte at a time). Bitwise 'and' our +charset->mask + with the mask for each glyph. This has the effect of +limiting what charsets our charset->mask + can match.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

charset

charset structure

 

inbuf

input text buffer (must be in UTF-8)

 

inlen

input buffer length

 
+
+
+
+
+

g_mime_charset_best_name ()

+
const char *
+g_mime_charset_best_name (GMimeCharset *charset);
+

Gets the best charset name based on the charset mask charset +.

+
+

Parameters

+
+++++ + + + + + +

charset

charset mask

 
+
+
+

Returns

+

the charset name that best represents the charset +mask charset +or NULL for us-ascii.

+

[nullable]

+
+
+
+
+

g_mime_charset_best ()

+
const char *
+g_mime_charset_best (const char *inbuf,
+                     size_t inlen);
+

Computes the best charset to use to encode this text buffer.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

inbuf

a UTF-8 text buffer

 

inlen

input buffer length

 
+
+
+

Returns

+

the charset name best suited for the input text +or NULL if it is ascii-safe.

+

[nullable]

+
+
+
+
+

g_mime_charset_can_encode ()

+
gboolean
+g_mime_charset_can_encode (GMimeCharset *mask,
+                           const char *charset,
+                           const char *text,
+                           size_t len);
+

Check to see if the UTF-8 text + will fit safely within charset +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

mask

a GMimeCharset mask

 

charset

a charset

 

text

utf-8 text to check

 

len

length of text +

 
+
+
+

Returns

+

TRUE if it is safe to encode text +into charset +or FALSE +otherwise.

+
+
+
+
+

Types and Values

+
+

struct GMimeCharset

+
struct GMimeCharset {
+	unsigned int mask;
+	unsigned int level;
+};
+
+

State used by g_mime_charset_best() and g_mime_charset_best_name().

+
+

Members

+
+++++ + + + + + + + + + + + + +

unsigned int mask;

charset mask

 

unsigned int level;

charset level

 
+
+
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/gmime-gmime-encodings.html gmime-3.0.1/docs/reference/html/gmime-gmime-encodings.html --- gmime-2.6.22+dfsg2/docs/reference/html/gmime-gmime-encodings.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/gmime-gmime-encodings.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,1312 @@ + + + + +gmime-encodings: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

gmime-encodings

+

gmime-encodings — MIME encoding functions

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GMimeContentEncoding + +g_mime_content_encoding_from_string () +
const char * + +g_mime_content_encoding_to_string () +
+void + +g_mime_encoding_init_encode () +
+void + +g_mime_encoding_init_decode () +
+void + +g_mime_encoding_reset () +
+size_t + +g_mime_encoding_outlen () +
+size_t + +g_mime_encoding_step () +
+size_t + +g_mime_encoding_flush () +
#define +GMIME_BASE64_ENCODE_LEN() +
+size_t + +g_mime_encoding_base64_decode_step () +
+size_t + +g_mime_encoding_base64_encode_step () +
+size_t + +g_mime_encoding_base64_encode_close () +
#define +GMIME_UUENCODE_LEN() +
+size_t + +g_mime_encoding_uudecode_step () +
+size_t + +g_mime_encoding_uuencode_step () +
+size_t + +g_mime_encoding_uuencode_close () +
#define +GMIME_QP_ENCODE_LEN() +
+size_t + +g_mime_encoding_quoted_decode_step () +
+size_t + +g_mime_encoding_quoted_encode_step () +
+size_t + +g_mime_encoding_quoted_encode_close () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + +
enumGMimeContentEncoding
enumGMimeEncodingConstraint
structGMimeEncoding
#defineGMIME_UUDECODE_STATE_INIT
#defineGMIME_UUDECODE_STATE_BEGIN
#defineGMIME_UUDECODE_STATE_END
+
+
+

Description

+

Utility functions to encode or decode MIME +Content-Transfer-Encodings.

+
+
+

Functions

+
+

g_mime_content_encoding_from_string ()

+
GMimeContentEncoding
+g_mime_content_encoding_from_string (const char *str);
+

Gets the appropriate GMimeContentEncoding enumeration value based +on the input string.

+
+

Parameters

+
+++++ + + + + + +

str

a string representing a Content-Transfer-Encoding value

 
+
+
+

Returns

+

the GMimeContentEncoding specified by str +or +GMIME_CONTENT_ENCODING_DEFAULT on error.

+
+
+
+
+

g_mime_content_encoding_to_string ()

+
const char *
+g_mime_content_encoding_to_string (GMimeContentEncoding encoding);
+

Gets the string value of the content encoding.

+
+

Parameters

+
+++++ + + + + + +

encoding

a GMimeContentEncoding

 
+
+ +
+
+
+

g_mime_encoding_init_encode ()

+
void
+g_mime_encoding_init_encode (GMimeEncoding *state,
+                             GMimeContentEncoding encoding);
+

Initializes a GMimeEncoding state machine for encoding to +encoding +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

state

a GMimeEncoding to initialize

 

encoding

a GMimeContentEncoding to use

 
+
+
+
+
+

g_mime_encoding_init_decode ()

+
void
+g_mime_encoding_init_decode (GMimeEncoding *state,
+                             GMimeContentEncoding encoding);
+

Initializes a GMimeEncoding state machine for decoding from +encoding +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

state

a GMimeEncoding to initialize

 

encoding

a GMimeContentEncoding to use

 
+
+
+
+
+

g_mime_encoding_reset ()

+
void
+g_mime_encoding_reset (GMimeEncoding *state);
+

Resets the state of the GMimeEncoding.

+
+

Parameters

+
+++++ + + + + + +

state

a GMimeEncoding to reset

 
+
+
+
+
+

g_mime_encoding_outlen ()

+
size_t
+g_mime_encoding_outlen (GMimeEncoding *state,
+                        size_t inlen);
+

Given the input length, inlen +, calculate the needed output length +to perform an encoding or decoding step.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

state

a GMimeEncoding

 

inlen

an input length

 
+
+
+

Returns

+

the maximum number of bytes needed to encode or decode a +buffer of inlen +bytes.

+
+
+
+
+

g_mime_encoding_step ()

+
size_t
+g_mime_encoding_step (GMimeEncoding *state,
+                      const char *inbuf,
+                      size_t inlen,
+                      char *outbuf);
+

Incrementally encodes or decodes (depending on state +) an input +stream by 'stepping' through a block of input at a time.

+

You should make sure outbuf + is large enough by calling +g_mime_encoding_outlen() to find out how large outbuf + might need +to be.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

state

a GMimeEncoding

 

inbuf

an input buffer to encode or decode

 

inlen

input buffer length

 

outbuf

an output buffer

 
+
+
+

Returns

+

the number of bytes written to outbuf +.

+
+
+
+
+

g_mime_encoding_flush ()

+
size_t
+g_mime_encoding_flush (GMimeEncoding *state,
+                       const char *inbuf,
+                       size_t inlen,
+                       char *outbuf);
+

Completes the incremental encode or decode of the input stream (see +g_mime_encoding_step() for details).

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

state

a GMimeEncoding

 

inbuf

an input buffer to encode or decode

 

inlen

input buffer length

 

outbuf

an output buffer

 
+
+
+

Returns

+

the number of bytes written to outbuf +.

+
+
+
+
+

GMIME_BASE64_ENCODE_LEN()

+
#define GMIME_BASE64_ENCODE_LEN(x) ((size_t) (((((x) + 2) / 57) * 77) + 77))
+
+

Calculates the maximum number of bytes needed to base64 encode the +full input buffer of length x +.

+
+

Parameters

+
+++++ + + + + + +

x

Length of the input data to encode

 
+
+
+

Returns

+

the number of output bytes needed to base64 encode an input +buffer of size x +.

+
+
+
+
+

g_mime_encoding_base64_decode_step ()

+
size_t
+g_mime_encoding_base64_decode_step (const unsigned char *inbuf,
+                                    size_t inlen,
+                                    unsigned char *outbuf,
+                                    int *state,
+                                    guint32 *save);
+

Decodes a chunk of base64 encoded data.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

inbuf

input buffer

 

inlen

input buffer length

 

outbuf

output buffer

 

state

holds the number of bits that are stored in save +

 

save

leftover bits that have not yet been decoded

 
+
+
+

Returns

+

the number of bytes decoded (which have been dumped in +outbuf +).

+
+
+
+
+

g_mime_encoding_base64_encode_step ()

+
size_t
+g_mime_encoding_base64_encode_step (const unsigned char *inbuf,
+                                    size_t inlen,
+                                    unsigned char *outbuf,
+                                    int *state,
+                                    guint32 *save);
+

Base64 encodes a chunk of data. Performs an 'encode step', only +encodes blocks of 3 characters to the output at a time, saves +left-over state in state and save (initialise to 0 on first +invocation).

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

inbuf

input buffer

 

inlen

input buffer length

 

outbuf

output buffer

 

state

holds the number of bits that are stored in save +

 

save

leftover bits that have not yet been encoded

 
+
+
+

Returns

+

the number of bytes encoded.

+
+
+
+
+

g_mime_encoding_base64_encode_close ()

+
size_t
+g_mime_encoding_base64_encode_close (const unsigned char *inbuf,
+                                     size_t inlen,
+                                     unsigned char *outbuf,
+                                     int *state,
+                                     guint32 *save);
+

Base64 encodes the input stream to the output stream. Call this +when finished encoding data with g_mime_encoding_base64_encode_step() +to flush off the last little bit.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

inbuf

input buffer

 

inlen

input buffer length

 

outbuf

output buffer

 

state

holds the number of bits that are stored in save +

 

save

leftover bits that have not yet been encoded

 
+
+
+

Returns

+

the number of bytes encoded.

+
+
+
+
+

GMIME_UUENCODE_LEN()

+
#define GMIME_UUENCODE_LEN(x)      ((size_t) (((((x) + 2) / 45) * 62) + 64))
+
+

Calculates the maximum number of bytes needed to uuencode the full +input buffer of length x +.

+
+

Parameters

+
+++++ + + + + + +

x

Length of the input data to encode

 
+
+
+

Returns

+

the number of output bytes needed to uuencode an input +buffer of size x +.

+
+
+
+
+

g_mime_encoding_uudecode_step ()

+
size_t
+g_mime_encoding_uudecode_step (const unsigned char *inbuf,
+                               size_t inlen,
+                               unsigned char *outbuf,
+                               int *state,
+                               guint32 *save);
+

Uudecodes a chunk of data. Performs a 'decode step' on a chunk of +uuencoded data. Assumes the "begin mode filename" line has +been stripped off.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

inbuf

input buffer

 

inlen

input buffer length

 

outbuf

output buffer

 

state

holds the number of bits that are stored in save +

 

save

leftover bits that have not yet been decoded

 
+
+
+

Returns

+

the number of bytes decoded.

+
+
+
+
+

g_mime_encoding_uuencode_step ()

+
size_t
+g_mime_encoding_uuencode_step (const unsigned char *inbuf,
+                               size_t inlen,
+                               unsigned char *outbuf,
+                               unsigned char *uubuf,
+                               int *state,
+                               guint32 *save);
+

Uuencodes a chunk of data. Performs an 'encode step', only encodes +blocks of 45 characters to the output at a time, saves left-over +state in uubuf +, state + and save + (initialize to 0 on first +invocation).

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

inbuf

input buffer

 

inlen

input buffer length

 

outbuf

output stream

 

uubuf

temporary buffer of 60 bytes

 

state

holds the number of bits that are stored in save +

 

save

leftover bits that have not yet been encoded

 
+
+
+

Returns

+

the number of bytes encoded.

+
+
+
+
+

g_mime_encoding_uuencode_close ()

+
size_t
+g_mime_encoding_uuencode_close (const unsigned char *inbuf,
+                                size_t inlen,
+                                unsigned char *outbuf,
+                                unsigned char *uubuf,
+                                int *state,
+                                guint32 *save);
+

Uuencodes a chunk of data. Call this when finished encoding data +with g_mime_encoding_uuencode_step() to flush off the last little bit.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

inbuf

input buffer

 

inlen

input buffer length

 

outbuf

output buffer

 

uubuf

temporary buffer of 60 bytes

 

state

holds the number of bits that are stored in save +

 

save

leftover bits that have not yet been encoded

 
+
+
+

Returns

+

the number of bytes encoded.

+
+
+
+
+

GMIME_QP_ENCODE_LEN()

+
#define GMIME_QP_ENCODE_LEN(x)     ((size_t) ((((x) / 24) * 74) + 74))
+
+

Calculates the maximum number of bytes needed to encode the full +input buffer of length x + using the quoted-printable encoding.

+
+

Parameters

+
+++++ + + + + + +

x

Length of the input data to encode

 
+
+
+

Returns

+

the number of output bytes needed to encode an input buffer +of size x +using the quoted-printable encoding.

+
+
+
+
+

g_mime_encoding_quoted_decode_step ()

+
size_t
+g_mime_encoding_quoted_decode_step (const unsigned char *inbuf,
+                                    size_t inlen,
+                                    unsigned char *outbuf,
+                                    int *state,
+                                    guint32 *save);
+

Decodes a block of quoted-printable encoded data. Performs a +'decode step' on a chunk of QP encoded data.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

inbuf

input buffer

 

inlen

input buffer length

 

outbuf

output buffer

 

state

holds the number of bits that are stored in save +

 

save

leftover bits that have not yet been decoded

 
+
+
+

Returns

+

the number of bytes decoded.

+
+
+
+
+

g_mime_encoding_quoted_encode_step ()

+
size_t
+g_mime_encoding_quoted_encode_step (const unsigned char *inbuf,
+                                    size_t inlen,
+                                    unsigned char *outbuf,
+                                    int *state,
+                                    guint32 *save);
+

Quoted-printable encodes a block of text. Performs an 'encode +step', saves left-over state in state and save (initialise to -1 on +first invocation).

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

inbuf

input buffer

 

inlen

input buffer length

 

outbuf

output buffer

 

state

holds the number of bits that are stored in save +

 

save

leftover bits that have not yet been encoded

 
+
+
+

Returns

+

the number of bytes encoded.

+
+
+
+
+

g_mime_encoding_quoted_encode_close ()

+
size_t
+g_mime_encoding_quoted_encode_close (const unsigned char *inbuf,
+                                     size_t inlen,
+                                     unsigned char *outbuf,
+                                     int *state,
+                                     guint32 *save);
+

Quoted-printable encodes a block of text. Call this when finished +encoding data with g_mime_encoding_quoted_encode_step() to flush off +the last little bit.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

inbuf

input buffer

 

inlen

input buffer length

 

outbuf

output buffer

 

state

holds the number of bits that are stored in save +

 

save

leftover bits that have not yet been encoded

 
+
+
+

Returns

+

the number of bytes encoded.

+
+
+
+
+

Types and Values

+
+

enum GMimeContentEncoding

+

A Content-Transfer-Encoding enumeration.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

GMIME_CONTENT_ENCODING_DEFAULT

+

Default transfer encoding.

+
 

GMIME_CONTENT_ENCODING_7BIT

+

7bit text transfer encoding.

+
 

GMIME_CONTENT_ENCODING_8BIT

+

8bit text transfer encoding.

+
 

GMIME_CONTENT_ENCODING_BINARY

+

Binary transfer encoding.

+
 

GMIME_CONTENT_ENCODING_BASE64

+

Base64 transfer encoding.

+
 

GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE

+

Quoted-printable transfer encoding.

+
 

GMIME_CONTENT_ENCODING_UUENCODE

+

Uuencode transfer encoding.

+
 
+
+
+
+
+

enum GMimeEncodingConstraint

+

Used with functions like g_mime_filter_best_encoding() and +g_mime_object_encode() as the 'constraint' argument. These values +provide a means of letting the filter know what the encoding +constraints are for the stream.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + +

GMIME_ENCODING_CONSTRAINT_7BIT

+

The stream data must fit within the 7bit ASCII range.

+
 

GMIME_ENCODING_CONSTRAINT_8BIT

+

The stream data may have bytes with the high bit set, but no null bytes.

+
 

GMIME_ENCODING_CONSTRAINT_BINARY

+

The stream may contain any binary data.

+
 
+
+
+
+
+

struct GMimeEncoding

+
struct GMimeEncoding {
+	GMimeContentEncoding encoding;
+	unsigned char uubuf[60];
+	gboolean encode;
+	guint32 save;
+	int state;
+};
+
+

A context used for encoding or decoding data.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

GMimeContentEncoding encoding;

the type of encoding

 

unsigned char uubuf[60];

a temporary buffer needed when uuencoding data

 

gboolean encode;

TRUE if encoding or FALSE if decoding

 

guint32 save;

saved bytes from the previous step

 

int state;

current encder/decoder state

 
+
+
+
+
+

GMIME_UUDECODE_STATE_INIT

+
#define GMIME_UUDECODE_STATE_INIT   (0)
+
+

Initial state for the g_mime_encoding_uudecode_step() function.

+
+
+
+

GMIME_UUDECODE_STATE_BEGIN

+
#define GMIME_UUDECODE_STATE_BEGIN  (1 << 16)
+
+

State for the g_mime_encoding_uudecode_step() function, denoting that +the 'begin' line has been found.

+
+
+
+

GMIME_UUDECODE_STATE_END

+
#define GMIME_UUDECODE_STATE_END    (1 << 17)
+
+

State for the g_mime_encoding_uudecode_step() function, denoting that +the end of the UU encoded block has been found.

+
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/gmime-GMimeFormatOptions.html gmime-3.0.1/docs/reference/html/gmime-GMimeFormatOptions.html --- gmime-2.6.22+dfsg2/docs/reference/html/gmime-GMimeFormatOptions.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/gmime-GMimeFormatOptions.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,647 @@ + + + + +GMimeFormatOptions: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeFormatOptions

+

GMimeFormatOptions — Format options

+
+ +
+

Types and Values

+
++++ + + + + + + + + + + + + + + +
enumGMimeParamEncodingMethod
enumGMimeNewLineFormat
 GMimeFormatOptions
+
+
+

Description

+

A GMimeFormatOptions is used by GMime to determine how to serialize various objects and headers.

+
+
+

Functions

+
+

g_mime_format_options_new ()

+
GMimeFormatOptions *
+g_mime_format_options_new (void);
+

Creates a new set of GMimeFormatOptions.

+
+

Returns

+

a newly allocated set of GMimeFormatOptions with the default values.

+
+
+
+
+

g_mime_format_options_free ()

+
void
+g_mime_format_options_free (GMimeFormatOptions *options);
+

Frees a set of GMimeFormatOptions.

+
+

Parameters

+
+++++ + + + + + +

options

a GMimeFormatOptions

 
+
+
+
+
+

g_mime_format_options_clone ()

+
GMimeFormatOptions *
+g_mime_format_options_clone (GMimeFormatOptions *options);
+

Clones a GMimeFormatOptions.

+
+

Parameters

+
+++++ + + + + + +

options

a GMimeFormatOptions or NULL.

[nullable]
+
+
+

Returns

+

a newly allocated GMimeFormatOptions.

+

[transfer full]

+
+
+
+
+

g_mime_format_options_get_default ()

+
GMimeFormatOptions *
+g_mime_format_options_get_default (void);
+

Gets the default format options.

+
+

Returns

+

the default format options.

+
+
+
+
+

g_mime_format_options_get_param_encoding_method ()

+
GMimeParamEncodingMethod
+g_mime_format_options_get_param_encoding_method
+                               (GMimeFormatOptions *options);
+

Gets the parameter encoding method to use for GMimeParam parameters that do not +already have an encoding method specified.

+
+

Parameters

+
+++++ + + + + + +

options

a GMimeFormatOptions or NULL.

[nullable]
+
+
+

Returns

+

the encoding method that is currently set.

+
+
+
+
+

g_mime_format_options_set_param_encoding_method ()

+
void
+g_mime_format_options_set_param_encoding_method
+                               (GMimeFormatOptions *options,
+                                GMimeParamEncodingMethod method);
+

Sets the parameter encoding method to use when encoding parameters which +do not have an encoding method specified.

+

Note: GMIME_PARAM_ENCODING_METHOD_DEFAULT is not allowed.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

options

a GMimeFormatOptions

 

method

a GMimeParamEncodingMethod

 
+
+
+
+
+

g_mime_format_options_get_newline_format ()

+
GMimeNewLineFormat
+g_mime_format_options_get_newline_format
+                               (GMimeFormatOptions *options);
+

Gets the new-line format to use when writing out messages and headers.

+
+

Parameters

+
+++++ + + + + + +

options

a GMimeFormatOptions or NULL.

[nullable]
+
+
+

Returns

+

the new-line format that is currently set.

+
+
+
+
+

g_mime_format_options_set_newline_format ()

+
void
+g_mime_format_options_set_newline_format
+                               (GMimeFormatOptions *options,
+                                GMimeNewLineFormat newline);
+

Sets the new-line format that should be used when writing headers and messages.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

options

a GMimeFormatOptions

 

newline

a GMimeNewLineFormat

 
+
+
+
+
+

g_mime_format_options_get_newline ()

+
const char *
+g_mime_format_options_get_newline (GMimeFormatOptions *options);
+

Gets a string representing the currently set new-line format.

+
+

Parameters

+
+++++ + + + + + +

options

a GMimeFormatOptions or NULL.

[nullable]
+
+
+

Returns

+

a new-line character sequence.

+
+
+
+
+

g_mime_format_options_create_newline_filter ()

+
GMimeFilter *
+g_mime_format_options_create_newline_filter
+                               (GMimeFormatOptions *options,
+                                gboolean ensure_newline);
+

Creates a GMimeFilter suitable for converting line-endings to the +currently set new-line format.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

options

a GMimeFormatOptions or NULL.

[nullable]

ensure_newline

TRUE if the output must *always* end with a new line

 
+
+
+

Returns

+

a GMimeFilter to convert to the specified new-line format.

+

[transfer full]

+
+
+
+
+

g_mime_format_options_is_hidden_header ()

+
gboolean
+g_mime_format_options_is_hidden_header
+                               (GMimeFormatOptions *options,
+                                const char *header);
+

Gets whether or not the specified header should be hidden.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

options

a GMimeFormatOptions or NULL.

[nullable]

header

the name of a header

 
+
+
+

Returns

+

TRUE if the header should be hidden or FALSE otherwise.

+
+
+
+
+

g_mime_format_options_add_hidden_header ()

+
void
+g_mime_format_options_add_hidden_header
+                               (GMimeFormatOptions *options,
+                                const char *header);
+

Adds the given header to the list of headers that should be hidden.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

options

a GMimeFormatOptions

 

header

a header name

 
+
+
+
+
+

g_mime_format_options_remove_hidden_header ()

+
void
+g_mime_format_options_remove_hidden_header
+                               (GMimeFormatOptions *options,
+                                const char *header);
+

Removes the given header from the list of headers that should be hidden.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

options

a GMimeFormatOptions

 

header

a header name

 
+
+
+
+
+

g_mime_format_options_clear_hidden_headers ()

+
void
+g_mime_format_options_clear_hidden_headers
+                               (GMimeFormatOptions *options);
+

Clears the list of headers that should be hidden.

+
+

Parameters

+
+++++ + + + + + +

options

a GMimeFormatOptions

 
+
+
+
+
+

Types and Values

+
+

enum GMimeParamEncodingMethod

+

The MIME specifications specify that the proper method for encoding Content-Type and +Content-Disposition parameter values is the method described in

+<a>rfc2231</a>. However, it is common for +

some older email clients to improperly encode using the method described in

+<a>rfc2047</a> instead. +
+

Members

+
+++++ + + + + + + + + + + + + + + + + + +

GMIME_PARAM_ENCODING_METHOD_DEFAULT

+

Use the default encoding method set on the GMimeFormatOptions.

+
 

GMIME_PARAM_ENCODING_METHOD_RFC2231

+

Use the encoding method described in rfc2231.

+
 

GMIME_PARAM_ENCODING_METHOD_RFC2047

+

Use the encoding method described in rfc2047.

+
 
+
+
+
+
+

enum GMimeNewLineFormat

+

There are two commonly used line-endings used by modern Operating Systems. +Unix-based systems such as Linux and Mac OS use a single character ('\n' aka LF) +to represent the end of line where-as Windows (or DOS) uses a sequence of two +characters ("\r\n" aka CRLF). Most text-based network protocols such as SMTP, +POP3, and IMAP use the CRLF sequence as well.

+
+

Members

+
+++++ + + + + + + + + + + + + +

GMIME_NEWLINE_FORMAT_UNIX

+

The Unix New-Line format ("\n").

+
 

GMIME_NEWLINE_FORMAT_DOS

+

The DOS New-Line format ("\r\n").

+
 
+
+
+
+
+

GMimeFormatOptions

+
typedef struct _GMimeFormatOptions GMimeFormatOptions;
+

Format options for serializing various GMime objects.

+
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/gmime-gmime.html gmime-3.0.1/docs/reference/html/gmime-gmime.html --- gmime-2.6.22+dfsg2/docs/reference/html/gmime-gmime.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/gmime-gmime.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,300 @@ + + + + +gmime: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

gmime

+

gmime — Initialization, shutdown and version-check routines

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + +
#define +GMIME_CHECK_VERSION() +
+void + +g_mime_init () +
+void + +g_mime_shutdown () +
+gboolean + +g_mime_check_version () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#defineGMIME_MAJOR_VERSION
#defineGMIME_MICRO_VERSION
#defineGMIME_MINOR_VERSION
#defineGMIME_BINARY_AGE
#defineGMIME_INTERFACE_AGE
extern const guint gmime_major_version
extern const guint gmime_minor_version
extern const guint gmime_micro_version
extern const guint gmime_binary_age
extern const guint gmime_interface_age
+
+
+

Description

+

Initialization, shutdown, and version-check functions.

+
+
+

Functions

+
+

GMIME_CHECK_VERSION()

+
#define             GMIME_CHECK_VERSION(major,minor,micro)
+

Check whether a GMime version equal to or greater than +major +.minor +.micro + is present.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

major

Minimum major version

 

minor

Minimum minor version

 

micro

Minimum micro version

 
+
+
+
+
+

g_mime_init ()

+
void
+g_mime_init (void);
+

Initializes GMime.

+
+
+
+

g_mime_shutdown ()

+
void
+g_mime_shutdown (void);
+

Frees internally allocated tables created in g_mime_init().

+
+
+
+

g_mime_check_version ()

+
gboolean
+g_mime_check_version (guint major,
+                      guint minor,
+                      guint micro);
+

Checks that the GMime library version meets the requirements of the +required version.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

major

Minimum major version

 

minor

Minimum minor version

 

micro

Minimum micro version

 
+
+
+

Returns

+

TRUE if the requirement is met or FALSE otherwise.

+
+
+
+
+

Types and Values

+
+

GMIME_MAJOR_VERSION

+
#define GMIME_MAJOR_VERSION (3)
+
+

GMime's major version.

+
+
+
+

GMIME_MICRO_VERSION

+
#define GMIME_MICRO_VERSION (1)
+
+

GMime's micro version.

+
+
+
+

GMIME_MINOR_VERSION

+
#define GMIME_MINOR_VERSION (0)
+
+

GMime's minor version.

+
+
+
+

GMIME_BINARY_AGE

+
#define GMIME_BINARY_AGE    (1)
+
+

GMime's binary age.

+
+
+
+

GMIME_INTERFACE_AGE

+
#define GMIME_INTERFACE_AGE (1)
+
+

GMime's interface age.

+
+
+
+

gmime_major_version

+
extern const guint gmime_major_version;
+
+

GMime's major version.

+
+
+
+

gmime_minor_version

+
extern const guint gmime_minor_version;
+
+

GMime's minor version.

+
+
+
+

gmime_micro_version

+
extern const guint gmime_micro_version;
+
+

GMime's micro version.

+
+
+
+

gmime_binary_age

+
extern const guint gmime_binary_age;
+
+

GMime's binary age.

+
+
+
+

gmime_interface_age

+
extern const guint gmime_interface_age;
+
+

GMime's interface age.

+
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/gmime-gmime-iconv.html gmime-3.0.1/docs/reference/html/gmime-gmime-iconv.html --- gmime-2.6.22+dfsg2/docs/reference/html/gmime-gmime-iconv.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/gmime-gmime-iconv.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,258 @@ + + + + +gmime-iconv: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

gmime-iconv

+

gmime-iconv — Low-level routines for converting text from one charset to another

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + +
+iconv_t + +g_mime_iconv_open () +
#define +g_mime_iconv() +
+int + +g_mime_iconv_close () +
+
+
+

Description

+

These functions are wrappers around the system iconv(3) routines. The +purpose of this wrapper is to use the appropriate system charset alias for +the MIME charset names given as arguments.

+
+
+

Functions

+
+

g_mime_iconv_open ()

+
iconv_t
+g_mime_iconv_open (const char *to,
+                   const char *from);
+

Allocates a coversion descriptor suitable for converting byte +sequences from charset from + to charset to +. The resulting +descriptor can be used with iconv() (or the g_mime_iconv() wrapper) any +number of times until closed using g_mime_iconv_close().

+

See the manual page for iconv_open(3) for further details.

+

[skip]

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

to

charset to convert to

 

from

charset to convert from

 
+
+
+

Returns

+

a new conversion descriptor for use with g_mime_iconv() on +success or (iconv_t) -1 on fail as well as setting an appropriate +errno value.

+
+
+
+
+

g_mime_iconv()

+
#define             g_mime_iconv(cd,inbuf,inleft,outbuf,outleft)
+

The argument cd + must be a conversion descriptor created using the +function g_mime_iconv_open.

+

The main case is when inbuf + is not NULL and *inbuf is not +NULL. In this case, the g_mime_iconv function converts the +multibyte sequence starting at *inbuf to a multibyte sequence +starting at *outbuf. At most *inleft bytes, starting at *inbuf, +will be read. At most *outleft bytes, starting at *outbuf, will +be written.

+

The g_mime_iconv function converts one multibyte character at a +time, and for each character conversion it increments *inbuf and +decrements *inleft by the number of converted input bytes, it +increments *outbuf and decrements *outleft by the number of +converted output bytes, and it updates the conversion state +contained in cd +. The conversion can stop for four reasons:

+
    +
  1. An invalid multibyte sequence is encountered in the input. In +this case it sets errno to EILSEQ and returns (size_t)(-1). +*inbuf is left pointing to the beginning of the invalid multibyte +sequence.

  2. +
  3. The input byte sequence has been entirely converted, i.e. +*inleft has gone down to 0. In this case g_mime_iconv returns +the number of non-reversible conversions performed during this +call.

  4. +
  5. An incomplete multibyte sequence is encountered in the input, +and the input byte sequence terminates after it. In this case it +sets errno to EINVAL and returns (size_t)(-1). *inbuf is left +pointing to the beginning of the incomplete multibyte sequence.

  6. +
  7. The output buffer has no more room for the next converted +character. In this case it sets errno to E2BIG and returns +(size_t)(-1).

  8. +
+

A different case is when inbuf + is NULL or *inbuf is NULL, but +outbuf + is not NULL and *outbuf is not NULL. In this case, the +g_mime_iconv function attempts to set cd +'s conversion state to +the initial state and store a corresponding shift sequence at +*outbuf. At most *outleft bytes, starting at *outbuf, will be +written. If the output buffer has no more room for this reset +sequence, it sets errno to E2BIG and returns (size_t)(-1). +Otherwise it increments *outbuf and decrements *outleft by the +number of bytes written.

+

A third case is when inbuf + is NULL or *inbuf is NULL, and +outbuf + is NULL or *outbuf is NULL. In this case, the +g_mime_iconv function sets cd +'s conversion state to the initial +state.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

cd

iconv_t conversion descriptor

 

inbuf

input buffer

 

inleft

number of bytes left in inbuf +

 

outbuf

output buffer

 

outleft

number of bytes left in outbuf +

 
+
+
+

Returns

+

the number of characters converted in a nonreversible way +during this call; reversible conversions are not counted. In case +of error, it sets errno and returns (size_t)(-1).

+
+
+
+
+

g_mime_iconv_close ()

+
int
+g_mime_iconv_close (iconv_t cd);
+

Closes the iconv descriptor cd +.

+

See the manual page for iconv_close(3) for further details.

+

[skip]

+
+

Parameters

+
+++++ + + + + + +

cd

iconv conversion descriptor

 
+
+
+

Returns

+

0 on success or -1 on fail as well as setting an +appropriate errno value.

+
+
+
+
+

Types and Values

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/gmime-gmime-iconv-utils.html gmime-3.0.1/docs/reference/html/gmime-gmime-iconv-utils.html --- gmime-2.6.22+dfsg2/docs/reference/html/gmime-gmime-iconv-utils.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/gmime-gmime-iconv-utils.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,334 @@ + + + + +gmime-iconv-utils: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

gmime-iconv-utils

+

gmime-iconv-utils — High-level routines for converting text from one charset to another

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+char * + +g_mime_iconv_strdup () +
+char * + +g_mime_iconv_strndup () +
+char * + +g_mime_iconv_utf8_to_locale () +
+char * + +g_mime_iconv_utf8_to_locale_length () +
+char * + +g_mime_iconv_locale_to_utf8 () +
+char * + +g_mime_iconv_locale_to_utf8_length () +
+
+
+

Description

+

Charset conversion utility functions.

+
+
+

Functions

+
+

g_mime_iconv_strdup ()

+
char *
+g_mime_iconv_strdup (iconv_t cd,
+                     const char *str);
+

Allocates a new string buffer containing str + converted to the +destination charset described in cd +.

+

[skip]

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cd

conversion descriptor

 

str

string in source charset

 
+
+
+

Returns

+

a new string buffer containing the original string +converted to the new charset.

+
+
+
+
+

g_mime_iconv_strndup ()

+
char *
+g_mime_iconv_strndup (iconv_t cd,
+                      const char *str,
+                      size_t n);
+

Allocates a new string buffer containing the first n + bytes of str + +converted to the destination charset as described by the conversion +descriptor cd +.

+

[skip]

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

cd

conversion descriptor

 

str

string in source charset

 

n

number of bytes to convert

 
+
+
+

Returns

+

a new string buffer containing the first n +bytes of +str +converted to the destination charset as described by the +conversion descriptor cd +.

+
+
+
+
+

g_mime_iconv_utf8_to_locale ()

+
char *
+g_mime_iconv_utf8_to_locale (const char *str);
+

Allocates a new string buffer containing str + converted to the +user's locale charset.

+
+

Parameters

+
+++++ + + + + + +

str

string in UTF-8 charset

 
+
+
+

Returns

+

a new string buffer containing str +converted to the +user's locale charset.

+
+
+
+
+

g_mime_iconv_utf8_to_locale_length ()

+
char *
+g_mime_iconv_utf8_to_locale_length (const char *str,
+                                    size_t n);
+

Allocates a new string buffer containing the first n + bytes of +str + converted to the user's locale charset.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

str

string in UTF-8 charset

 

n

number of bytes to convert

 
+
+
+

Returns

+

a new string buffer containing the first n +bytes of +str +converted to the user's locale charset.

+
+
+
+
+

g_mime_iconv_locale_to_utf8 ()

+
char *
+g_mime_iconv_locale_to_utf8 (const char *str);
+

Allocates a new string buffer containing str + in UTF-8.

+
+

Parameters

+
+++++ + + + + + +

str

string in locale charset

 
+
+
+

Returns

+

a new string buffer containing str +converted to UTF-8.

+
+
+
+
+

g_mime_iconv_locale_to_utf8_length ()

+
char *
+g_mime_iconv_locale_to_utf8_length (const char *str,
+                                    size_t n);
+

Allocates a new string buffer containing the first n + bytes of +str + converted to UTF-8.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

str

string in locale charset

 

n

number of bytes to convert

 
+
+
+

Returns

+

a new string buffer containing the first n +bytes of +str +converted to UTF-8.

+
+
+
+
+

Types and Values

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/gmime-GMimeParserOptions.html gmime-3.0.1/docs/reference/html/gmime-GMimeParserOptions.html --- gmime-2.6.22+dfsg2/docs/reference/html/gmime-GMimeParserOptions.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/gmime-GMimeParserOptions.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,633 @@ + + + + +GMimeParserOptions: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeParserOptions

+

GMimeParserOptions — Parser options

+
+ +
+

Types and Values

+
++++ + + + + + + + + + + +
 GMimeParserOptions
enumGMimeRfcComplianceMode
+
+
+

Description

+

A GMimeParserOptions is used to pass various options to GMimeParser +and all of the various other parser functions in GMime.

+
+
+

Functions

+
+

g_mime_parser_options_new ()

+
GMimeParserOptions *
+g_mime_parser_options_new (void);
+

Creates a new set of GMimeParserOptions.

+
+

Returns

+

a newly allocated set of GMimeParserOptions with the default values.

+
+
+
+
+

g_mime_parser_options_free ()

+
void
+g_mime_parser_options_free (GMimeParserOptions *options);
+

Frees a set of GMimeParserOptions.

+
+

Parameters

+
+++++ + + + + + +

options

a GMimeParserOptions

 
+
+
+
+
+

g_mime_parser_options_clone ()

+
GMimeParserOptions *
+g_mime_parser_options_clone (GMimeParserOptions *options);
+

Clones a GMimeParserOptions.

+
+

Parameters

+
+++++ + + + + + +

options

a GMimeParserOptions or NULL.

[nullable]
+
+
+

Returns

+

a newly allocated GMimeParserOptions.

+

[transfer full]

+
+
+
+
+

g_mime_parser_options_get_default ()

+
GMimeParserOptions *
+g_mime_parser_options_get_default (void);
+

Gets the default parser options.

+
+

Returns

+

the default parser options.

+
+
+
+
+

g_mime_parser_options_get_address_compliance_mode ()

+
GMimeRfcComplianceMode
+g_mime_parser_options_get_address_compliance_mode
+                               (GMimeParserOptions *options);
+

Gets the compliance mode that should be used when parsing rfc822 addresses.

+

Note: Even in GMIME_RFC_COMPLIANCE_STRICT mode, the address parser is fairly liberal in +what it accepts. Setting it to GMIME_RFC_COMPLIANCE_LOOSE just makes it try harder to +deal with garbage input.

+
+

Parameters

+
+++++ + + + + + +

options

a GMimeParserOptions or NULL.

[nullable]
+
+
+

Returns

+

the compliance mode that is currently set.

+
+
+
+
+

g_mime_parser_options_set_address_compliance_mode ()

+
void
+g_mime_parser_options_set_address_compliance_mode
+                               (GMimeParserOptions *options,
+                                GMimeRfcComplianceMode mode);
+

Sets the compliance mode that should be used when parsing rfc822 addresses.

+

In general, you'll probably want this value to be GMIME_RFC_COMPLIANCE_LOOSE +(the default) as it allows maximum interoperability with existing (broken) mail clients +and other mail software such as sloppily written perl scripts (aka spambots).

+

Note: Even in GMIME_RFC_COMPLIANCE_STRICT mode, the address parser is fairly liberal in +what it accepts. Setting it to GMIME_RFC_COMPLIANCE_LOOSE just makes it try harder to +deal with garbage input.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

options

a GMimeParserOptions

 

mode

a GMimeRfcComplianceMode

 
+
+
+
+
+

g_mime_parser_options_get_allow_addresses_without_domain ()

+
gboolean
+g_mime_parser_options_get_allow_addresses_without_domain
+                               (GMimeParserOptions *options);
+

Gets whether or not the rfc822 address parser should allow addresses without a domain.

+

In general, you'll probably want this value to be FALSE (the default) as it allows +maximum interoperability with existing (broken) mail clients and other mail software +such as sloppily written perl scripts (aka spambots) that do not properly quote the +name when it contains a comma.

+

This option exists in order to allow parsing of mailbox addresses that do not have a +domain component. These types of addresses are rare and were typically only used when +sending mail to other users on the same UNIX system.

+
+

Parameters

+
+++++ + + + + + +

options

a GMimeParserOptions or NULL.

[nullable]
+
+
+

Returns

+

TRUE if the address parser should allow addresses without a domain.

+
+
+
+
+

g_mime_parser_options_set_allow_addresses_without_domain ()

+
void
+g_mime_parser_options_set_allow_addresses_without_domain
+                               (GMimeParserOptions *options,
+                                gboolean allow);
+

Sets whether the rfc822 address parser should allow addresses without a domain.

+

In general, you'll probably want this value to be FALSE (the default) as it allows +maximum interoperability with existing (broken) mail clients and other mail software +such as sloppily written perl scripts (aka spambots) that do not properly quote the +name when it contains a comma.

+

This option exists in order to allow parsing of mailbox addresses that do not have a +domain component. These types of addresses are rare and were typically only used when +sending mail to other users on the same UNIX system.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

options

a GMimeParserOptions

 

allow

TRUE if the parser should allow addresses without a domain or FALSE otherwise

 
+
+
+
+
+

g_mime_parser_options_get_parameter_compliance_mode ()

+
GMimeRfcComplianceMode
+g_mime_parser_options_get_parameter_compliance_mode
+                               (GMimeParserOptions *options);
+

Gets the compliance mode that should be used when parsing Content-Type and +Content-Disposition parameters.

+

Note: Even in GMIME_RFC_COMPLIANCE_STRICT mode, the parameter parser is fairly liberal +in what it accepts. Setting it to GMIME_RFC_COMPLIANCE_LOOSE just makes it try harder +to deal with garbage input.

+
+

Parameters

+
+++++ + + + + + +

options

a GMimeParserOptions or NULL.

[nullable]
+
+
+

Returns

+

the compliance mode that is currently set.

+
+
+
+
+

g_mime_parser_options_set_parameter_compliance_mode ()

+
void
+g_mime_parser_options_set_parameter_compliance_mode
+                               (GMimeParserOptions *options,
+                                GMimeRfcComplianceMode mode);
+

Sets the compliance mode that should be used when parsing Content-Type and +Content-Disposition parameters.

+

In general, you'll probably want this value to be GMIME_RFC_COMPLIANCE_LOOSE +(the default) as it allows maximum interoperability with existing (broken) mail clients +and other mail software such as sloppily written perl scripts (aka spambots).

+

Note: Even in GMIME_RFC_COMPLIANCE_STRICT mode, the parameter parser is fairly liberal +in what it accepts. Setting it to GMIME_RFC_COMPLIANCE_LOOSE just makes it try harder +to deal with garbage input.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

options

a GMimeParserOptions

 

mode

a GMimeRfcComplianceMode

 
+
+
+
+
+

g_mime_parser_options_get_rfc2047_compliance_mode ()

+
GMimeRfcComplianceMode
+g_mime_parser_options_get_rfc2047_compliance_mode
+                               (GMimeParserOptions *options);
+

Gets the compliance mode that should be used when parsing rfc2047 encoded words.

+

Note: Even in GMIME_RFC_COMPLIANCE_STRICT mode, the rfc2047 parser is fairly liberal +in what it accepts. Setting it to GMIME_RFC_COMPLIANCE_LOOSE just makes it try harder +to deal with garbage input.

+
+

Parameters

+
+++++ + + + + + +

options

a GMimeParserOptions or NULL.

[nullable]
+
+
+

Returns

+

the compliance mode that is currently set.

+
+
+
+
+

g_mime_parser_options_set_rfc2047_compliance_mode ()

+
void
+g_mime_parser_options_set_rfc2047_compliance_mode
+                               (GMimeParserOptions *options,
+                                GMimeRfcComplianceMode mode);
+

Sets the compliance mode that should be used when parsing rfc2047 encoded words.

+

In general, you'll probably want this value to be GMIME_RFC_COMPLIANCE_LOOSE +(the default) as it allows maximum interoperability with existing (broken) mail clients +and other mail software such as sloppily written perl scripts (aka spambots).

+

Note: Even in GMIME_RFC_COMPLIANCE_STRICT mode, the parameter parser is fairly liberal +in what it accepts. Setting it to GMIME_RFC_COMPLIANCE_LOOSE just makes it try harder +to deal with garbage input.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

options

a GMimeParserOptions

 

mode

a GMimeRfcComplianceMode

 
+
+
+
+
+

g_mime_parser_options_get_fallback_charsets ()

+
const char **
+g_mime_parser_options_get_fallback_charsets
+                               (GMimeParserOptions *options);
+

Gets the fallback charsets to try when decoding 8-bit headers.

+
+

Parameters

+
+++++ + + + + + +

options

a GMimeParserOptions or NULL.

[nullable]
+
+
+

Returns

+

a NULL-terminated list of charsets to try when +decoding 8-bit headers.

+

[transfer none]

+
+
+
+
+

g_mime_parser_options_set_fallback_charsets ()

+
void
+g_mime_parser_options_set_fallback_charsets
+                               (GMimeParserOptions *options,
+                                const char **charsets);
+

Sets the fallback charsets to try when decoding 8-bit headers.

+

Note: It is recommended that the list of charsets start with utf-8 +and end with iso-8859-1.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

options

a GMimeParserOptions

 

charsets

a NULL-terminated list of charsets or NULL for the default list

 
+
+
+
+
+

Types and Values

+
+

GMimeParserOptions

+
typedef struct _GMimeParserOptions GMimeParserOptions;
+

A set of parser options used by GMimeParser and various other parsing functions.

+
+
+
+

enum GMimeRfcComplianceMode

+

An RFC compliance mode.

+
+

Members

+
+++++ + + + + + + + + + + + + +

GMIME_RFC_COMPLIANCE_LOOSE

+

Attempt to be much more liberal accepting broken and/or invalid formatting.

+
 

GMIME_RFC_COMPLIANCE_STRICT

+

Do not attempt to be overly liberal in accepting broken and/or invalid formatting.

+
 
+
+
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/gmime-GMimePartIter.html gmime-3.0.1/docs/reference/html/gmime-GMimePartIter.html --- gmime-2.6.22+dfsg2/docs/reference/html/gmime-GMimePartIter.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/gmime-GMimePartIter.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,600 @@ + + + + +GMimePartIter: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimePartIter

+

GMimePartIter — MIME part iterators

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GMimePartIter * + +g_mime_part_iter_new () +
+void + +g_mime_part_iter_free () +
+GMimePartIter * + +g_mime_part_iter_clone () +
+void + +g_mime_part_iter_reset () +
+gboolean + +g_mime_part_iter_jump_to () +
+gboolean + +g_mime_part_iter_is_valid () +
+gboolean + +g_mime_part_iter_next () +
+gboolean + +g_mime_part_iter_prev () +
+GMimeObject * + +g_mime_part_iter_get_toplevel () +
+GMimeObject * + +g_mime_part_iter_get_current () +
+GMimeObject * + +g_mime_part_iter_get_parent () +
+char * + +g_mime_part_iter_get_path () +
+gboolean + +g_mime_part_iter_replace () +
+gboolean + +g_mime_part_iter_remove () +
+
+
+

Types and Values

+
++++ + + + + +
 GMimePartIter
+
+
+

Description

+

GMimePartIter is an iterator for traversing a GMimeObject tree in +Depth-First order.

+
+
+

Functions

+
+

g_mime_part_iter_new ()

+
GMimePartIter *
+g_mime_part_iter_new (GMimeObject *toplevel);
+

Creates a new GMimePartIter for iterating over toplevel +'s subparts.

+
+

Parameters

+
+++++ + + + + + +

toplevel

a GMimeObject to use as the toplevel

 
+
+
+

Returns

+

a newly allocated GMimePartIter which should be freed +using g_mime_part_iter_free() when finished with it.

+
+
+
+
+

g_mime_part_iter_free ()

+
void
+g_mime_part_iter_free (GMimePartIter *iter);
+

Frees the memory allocated by g_mime_part_iter_new().

+
+

Parameters

+
+++++ + + + + + +

iter

a GMimePartIter

 
+
+
+
+
+

g_mime_part_iter_clone ()

+
GMimePartIter *
+g_mime_part_iter_clone (GMimePartIter *iter);
+

Clones the iter +, including its current state.

+
+

Parameters

+
+++++ + + + + + +

iter

a GMimePartIter

 
+
+
+

Returns

+

a new GMimePartIter that is identical to iter +.

+

[transfer full]

+
+
+
+
+

g_mime_part_iter_reset ()

+
void
+g_mime_part_iter_reset (GMimePartIter *iter);
+

Resets the state of iter + to its initial state.

+
+

Parameters

+
+++++ + + + + + +

iter

a GMimePartIter

 
+
+
+
+
+

g_mime_part_iter_jump_to ()

+
gboolean
+g_mime_part_iter_jump_to (GMimePartIter *iter,
+                          const char *path);
+

Updates the state of iter + to point to the GMimeObject specified +by path +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

iter

a GMimePartIter

 

path

a string representing the path to jump to

 
+
+
+

Returns

+

TRUE if the GMimeObject specified by path +exists or +FALSE otherwise.

+
+
+
+
+

g_mime_part_iter_is_valid ()

+
gboolean
+g_mime_part_iter_is_valid (GMimePartIter *iter);
+

Checks that the current state of iter + is valid.

+
+

Parameters

+
+++++ + + + + + +

iter

a GMimePartIter

 
+
+
+

Returns

+

TRUE if iter +is valid or FALSE otherwise.

+
+
+
+
+

g_mime_part_iter_next ()

+
gboolean
+g_mime_part_iter_next (GMimePartIter *iter);
+

Advances to the next part in the MIME structure used to initialize +iter +.

+
+

Parameters

+
+++++ + + + + + +

iter

a GMimePartIter

 
+
+
+

Returns

+

TRUE if successful or FALSE otherwise.

+
+
+
+
+

g_mime_part_iter_prev ()

+
gboolean
+g_mime_part_iter_prev (GMimePartIter *iter);
+

Rewinds to the previous part in the MIME structure used to +initialize iter +.

+
+

Parameters

+
+++++ + + + + + +

iter

a GMimePartIter

 
+
+
+

Returns

+

TRUE if successful or FALSE otherwise.

+
+
+
+
+

g_mime_part_iter_get_toplevel ()

+
GMimeObject *
+g_mime_part_iter_get_toplevel (GMimePartIter *iter);
+

Gets the toplevel GMimeObject used to initialize iter +.

+
+

Parameters

+
+++++ + + + + + +

iter

a GMimePartIter

 
+
+
+

Returns

+

the toplevel GMimeObject.

+

[transfer none]

+
+
+
+
+

g_mime_part_iter_get_current ()

+
GMimeObject *
+g_mime_part_iter_get_current (GMimePartIter *iter);
+

Gets the GMimeObject at the current GMimePartIter position.

+
+

Parameters

+
+++++ + + + + + +

iter

a GMimePartIter

 
+
+
+

Returns

+

the current GMimeObject or NULL if the +state of iter +is invalid.

+

[transfer none]

+
+
+
+
+

g_mime_part_iter_get_parent ()

+
GMimeObject *
+g_mime_part_iter_get_parent (GMimePartIter *iter);
+

Gets the parent of the GMimeObject at the current GMimePartIter +position.

+
+

Parameters

+
+++++ + + + + + +

iter

a GMimePartIter

 
+
+
+

Returns

+

the parent GMimeObject or NULL if the +state of iter +is invalid.

+

[transfer none]

+
+
+
+
+

g_mime_part_iter_get_path ()

+
char *
+g_mime_part_iter_get_path (GMimePartIter *iter);
+

Gets the path of the current GMimeObject in the MIME structure +used to initialize iter +.

+
+

Parameters

+
+++++ + + + + + +

iter

a GMimePartIter

 
+
+
+

Returns

+

a newly allocated string representation of the path to the +GMimeObject at the current GMimePartIter position.

+
+
+
+
+

g_mime_part_iter_replace ()

+
gboolean
+g_mime_part_iter_replace (GMimePartIter *iter,
+                          GMimeObject *replacement);
+

Replaces the GMimeObject at the current position with replacement +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

iter

a GMimePartIter

 

replacement

a GMimeObject

 
+
+
+

Returns

+

TRUE if the part at the current position was replaced or +FALSE otherwise.

+
+
+
+
+

g_mime_part_iter_remove ()

+
gboolean
+g_mime_part_iter_remove (GMimePartIter *iter);
+

Removes the GMimeObject at the current position from its +parent. If successful, iter + is advanced to the next position +(since the current position will become invalid).

+
+

Parameters

+
+++++ + + + + + +

iter

a GMimePartIter

 
+
+
+

Returns

+

TRUE if the part at the current position was removed or +FALSE otherwise.

+
+
+
+
+

Types and Values

+
+

GMimePartIter

+
typedef struct _GMimePartIter GMimePartIter;
+

A MIME part iterator.

+
+
+
+

See Also

+

GMimeObject

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/gmime-GMimeReferences.html gmime-3.0.1/docs/reference/html/gmime-GMimeReferences.html --- gmime-2.6.22+dfsg2/docs/reference/html/gmime-GMimeReferences.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/gmime-GMimeReferences.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,412 @@ + + + + +GMimeReferences: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeReferences

+

GMimeReferences — a list of Message-Ids

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GMimeReferences * + +g_mime_references_new () +
+void + +g_mime_references_free () +
+GMimeReferences * + +g_mime_references_copy () +
+GMimeReferences * + +g_mime_references_parse () +
+int + +g_mime_references_length () +
+void + +g_mime_references_append () +
+void + +g_mime_references_clear () +
const char * + +g_mime_references_get_message_id () +
+void + +g_mime_references_set_message_id () +
+
+
+

Types and Values

+
++++ + + + + +
structGMimeReferences
+
+
+

Description

+

A list of Message-Ids as found in a References or In-Reply-To header.

+
+
+

Functions

+
+

g_mime_references_new ()

+
GMimeReferences *
+g_mime_references_new (void);
+

Creates a new GMimeReferences.

+
+

Returns

+

a new GMimeReferences.

+
+
+
+
+

g_mime_references_free ()

+
void
+g_mime_references_free (GMimeReferences *refs);
+

Frees the GMimeReferences list.

+
+

Parameters

+
+++++ + + + + + +

refs

a GMimeReferences list

 
+
+
+
+
+

g_mime_references_copy ()

+
GMimeReferences *
+g_mime_references_copy (GMimeReferences *refs);
+

Copies a GMimeReferences list.

+
+

Parameters

+
+++++ + + + + + +

refs

the list of references to copy

 
+
+
+

Returns

+

a new GMimeReferences list that contains +an identical list of items as refs +.

+

[transfer full]

+
+
+
+
+

g_mime_references_parse ()

+
GMimeReferences *
+g_mime_references_parse (GMimeParserOptions *options,
+                         const char *text);
+

Decodes a list of msg-ids as in the References and/or In-Reply-To +headers defined in rfc822.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

options

a GMimeParserOptions or NULL.

[nullable]

text

string containing a list of msg-ids

 
+
+
+

Returns

+

a new GMimeReferences containing the parsed message ids.

+

[transfer full]

+
+
+
+
+

g_mime_references_length ()

+
int
+g_mime_references_length (GMimeReferences *refs);
+

Gets the length of the GMimeReferences list.

+
+

Parameters

+
+++++ + + + + + +

refs

a GMimeReferences

 
+
+
+

Returns

+

the number of message ids in the list.

+
+
+
+
+

g_mime_references_append ()

+
void
+g_mime_references_append (GMimeReferences *refs,
+                          const char *msgid);
+

Appends a reference to msgid to the list of references.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

refs

a GMimeReferences

 

msgid

a message-id string

 
+
+
+
+
+

g_mime_references_clear ()

+
void
+g_mime_references_clear (GMimeReferences *refs);
+

Clears the GMimeReferences list.

+
+

Parameters

+
+++++ + + + + + +

refs

a GMimeReferences

 
+
+
+
+
+

g_mime_references_get_message_id ()

+
const char *
+g_mime_references_get_message_id (GMimeReferences *refs,
+                                  int index);
+

Gets the specified Message-Id reference from the GMimeReferences.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

refs

a GMimeReferences

 

index

the index of the message id

 
+
+
+

Returns

+

the Message-Id reference from the GMimeReferences.

+
+
+
+
+

g_mime_references_set_message_id ()

+
void
+g_mime_references_set_message_id (GMimeReferences *refs,
+                                  int index,
+                                  const char *msgid);
+

Sets the specified Message-Id reference from the GMimeReferences.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

refs

a GMimeReferences

 

index

the index of the message id

 

msgid

the message id

 
+
+
+
+
+

Types and Values

+
+

struct GMimeReferences

+
struct GMimeReferences {
+	GPtrArray *array;
+};
+
+

A List of references, as per the References or In-Reply-To header +fields.

+
+

Members

+
+++++ + + + + + +

GPtrArray *array;

the array of message-id references

 
+
+
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/gmime-gmime-utils.html gmime-3.0.1/docs/reference/html/gmime-gmime-utils.html --- gmime-2.6.22+dfsg2/docs/reference/html/gmime-gmime-utils.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/gmime-gmime-utils.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,791 @@ + + + + +gmime-utils: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

gmime-utils

+

gmime-utils — MIME utility functions

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GDateTime * + +g_mime_utils_header_decode_date () +
+char * + +g_mime_utils_header_format_date () +
+char * + +g_mime_utils_generate_message_id () +
+char * + +g_mime_utils_decode_message_id () +
+char * + +g_mime_utils_header_printf () +
+char * + +g_mime_utils_quote_string () +
+void + +g_mime_utils_unquote_string () +
+gboolean + +g_mime_utils_text_is_8bit () +
+GMimeContentEncoding + +g_mime_utils_best_encoding () +
+char * + +g_mime_utils_decode_8bit () +
+char * + +g_mime_utils_header_decode_text () +
+char * + +g_mime_utils_header_encode_text () +
+char * + +g_mime_utils_header_decode_phrase () +
+char * + +g_mime_utils_header_encode_phrase () +
+char * + +g_mime_utils_structured_header_fold () +
+char * + +g_mime_utils_unstructured_header_fold () +
+
+
+

Types and Values

+
++++ + + + + +
structGMimeReferences
+
+
+

Description

+

Utility functions to parse, encode and decode various MIME tokens +and encodings.

+
+
+

Functions

+
+

g_mime_utils_header_decode_date ()

+
GDateTime *
+g_mime_utils_header_decode_date (const char *str);
+

Parses the rfc822 date string.

+
+

Parameters

+
+++++ + + + + + +

str

input date string

 
+
+
+

Returns

+

the GDateTime representation of the date +string specified by str +or NULL on error.

+

[nullable][transfer full]

+
+
+
+
+

g_mime_utils_header_format_date ()

+
char *
+g_mime_utils_header_format_date (GDateTime *date);
+

Allocates a string buffer containing the rfc822 formatted date +string represented by date +.

+
+

Parameters

+
+++++ + + + + + +

date

a GDateTime

 
+
+
+

Returns

+

a valid string representation of the date.

+
+
+
+
+

g_mime_utils_generate_message_id ()

+
char *
+g_mime_utils_generate_message_id (const char *fqdn);
+

Generates a unique Message-Id.

+
+

Parameters

+
+++++ + + + + + +

fqdn

Fully qualified domain name

 
+
+
+

Returns

+

a unique string in an addr-spec format suitable for use as +a Message-Id.

+
+
+
+
+

g_mime_utils_decode_message_id ()

+
char *
+g_mime_utils_decode_message_id (const char *message_id);
+

Decodes a msg-id as defined by rfc822.

+
+

Parameters

+
+++++ + + + + + +

message_id

string containing a message-id

 
+
+
+

Returns

+

the addr-spec portion of the msg-id.

+
+
+
+
+

g_mime_utils_header_printf ()

+
char *
+g_mime_utils_header_printf (GMimeParserOptions *options,
+                            GMimeFormatOptions *format,
+                            const char *text,
+                            ...);
+

Allocates a buffer containing a formatted header specified by the +Varargs +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

options

a GMimeParserOptions or NULL.

[nullable]

format

a GMimeFormatOptions or NULL.

[nullable]

text

text with printf-style formatters

 

...

arguments

 
+
+
+

Returns

+

an allocated string containing the folded header specified +by text +and the following arguments.

+
+
+
+
+

g_mime_utils_quote_string ()

+
char *
+g_mime_utils_quote_string (const char *str);
+

Quotes string + as needed according to the rules in rfc2045.

+
+

Parameters

+
+++++ + + + + + +

str

input string

 
+
+
+

Returns

+

an allocated string containing the escaped and quoted (if +needed to be) input string. The decision to quote the string is +based on whether or not the input string contains any 'tspecials' +as defined by rfc2045.

+
+
+
+
+

g_mime_utils_unquote_string ()

+
void
+g_mime_utils_unquote_string (char *str);
+

Unquotes and unescapes a string.

+
+

Parameters

+
+++++ + + + + + +

str

input string

 
+
+
+
+
+

g_mime_utils_text_is_8bit ()

+
gboolean
+g_mime_utils_text_is_8bit (const unsigned char *text,
+                           size_t len);
+

Determines if text + contains 8bit characters within the first len + +bytes.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

text

text to check for 8bit chars.

[array length=len][element-type guint8]

len

text length

 
+
+
+

Returns

+

TRUE if the text contains 8bit characters or FALSE +otherwise.

+
+
+
+
+

g_mime_utils_best_encoding ()

+
GMimeContentEncoding
+g_mime_utils_best_encoding (const unsigned char *text,
+                            size_t len);
+

Determines the best content encoding for the first len + bytes of +text +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

text

text to encode.

[array length=len][element-type guint8]

len

text length

 
+
+
+

Returns

+

a GMimeContentEncoding that is determined to be the best +encoding type for the specified block of text. ("best" in this +particular case means smallest output size)

+
+
+
+
+

g_mime_utils_decode_8bit ()

+
char *
+g_mime_utils_decode_8bit (GMimeParserOptions *options,
+                          const char *text,
+                          size_t len);
+

Attempts to convert text in an unknown 8bit/multibyte charset into +UTF-8 by finding the charset which will convert the most bytes into +valid UTF-8 characters as possible. If no exact match can be found, +it will choose the best match and convert invalid byte sequences +into question-marks (?) in the returned string buffer.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

options

a GMimeParserOptions or NULL.

[nullable]

text

input text in +unknown 8bit/multibyte character set.

[array length=len][element-type guint8]

len

input text length

 
+
+
+

Returns

+

a UTF-8 string representation of text +.

+
+
+
+
+

g_mime_utils_header_decode_text ()

+
char *
+g_mime_utils_header_decode_text (GMimeParserOptions *options,
+                                 const char *text);
+

Decodes an rfc2047 encoded 'text' header.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

text

header text to decode

 

options

a GMimeParserOptions or NULL.

[nullable]
+
+
+

Returns

+

a newly allocated UTF-8 string representing the the decoded +header.

+
+
+
+
+

g_mime_utils_header_encode_text ()

+
char *
+g_mime_utils_header_encode_text (GMimeFormatOptions *options,
+                                 const char *text,
+                                 const char *charset);
+

Encodes a 'text' header according to the rules in rfc2047.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

options

a GMimeFormatOptions or NULL.

[nullable]

text

text to encode

 

charset

the charset to use or NULL to use the default.

[nullable]
+
+
+

Returns

+

the encoded header. Useful for encoding +headers like "Subject".

+
+
+
+
+

g_mime_utils_header_decode_phrase ()

+
char *
+g_mime_utils_header_decode_phrase (GMimeParserOptions *options,
+                                   const char *phrase);
+

Decodes an rfc2047 encoded 'phrase' header.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

phrase

header to decode

 

options

a GMimeParserOptions or NULL.

[nullable]
+
+
+

Returns

+

a newly allocated UTF-8 string representing the the decoded +header.

+
+
+
+
+

g_mime_utils_header_encode_phrase ()

+
char *
+g_mime_utils_header_encode_phrase (GMimeFormatOptions *options,
+                                   const char *phrase,
+                                   const char *charset);
+

Encodes a 'phrase' header according to the rules in rfc2047.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

options

a GMimeFormatOptions or NULL.

[nullable]

phrase

phrase to encode

 

charset

the charset to use or NULL to use the default.

[nullable]
+
+
+

Returns

+

the encoded 'phrase'. Useful for encoding internet +addresses.

+
+
+
+
+

g_mime_utils_structured_header_fold ()

+
char *
+g_mime_utils_structured_header_fold (GMimeParserOptions *options,
+                                     GMimeFormatOptions *format,
+                                     const char *header);
+

Folds a structured header according to the rules in rfc822.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

options

a GMimeParserOptions or NULL.

[nullable]

format

a GMimeFormatOptions or NULL.

[nullable]

header

header field and value string

 
+
+
+

Returns

+

an allocated string containing the folded header.

+
+
+
+
+

g_mime_utils_unstructured_header_fold ()

+
char *
+g_mime_utils_unstructured_header_fold (GMimeParserOptions *options,
+                                       GMimeFormatOptions *format,
+                                       const char *header);
+

Folds an unstructured header according to the rules in rfc822.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

options

a GMimeParserOptions or NULL.

[nullable]

format

a GMimeFormatOptions or NULL.

[nullable]

header

header field and value string

 
+
+
+

Returns

+

an allocated string containing the folded header.

+
+
+
+
+

Types and Values

+
+

struct GMimeReferences

+
struct GMimeReferences {
+	GPtrArray *array;
+};
+
+

A List of references, as per the References or In-Reply-To header +fields.

+
+

Members

+
+++++ + + + + + +

GPtrArray *array;

the array of message-id references

 
+
+
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeGpgContext.html gmime-3.0.1/docs/reference/html/GMimeGpgContext.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeGpgContext.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeGpgContext.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,107 @@ + + + + +GMimeGpgContext: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeGpgContext

+

GMimeGpgContext — GnuPG crypto contexts

+
+
+

Functions

+
++++ + + + + +
+GMimeCryptoContext * + +g_mime_gpg_context_new () +
+
+
+

Types and Values

+
++++ + + + + +
 GMimeGpgContext
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeCryptoContext
+        ╰── GMimeGpgContext
+
+
+
+

Description

+

A GMimeGpgContext is a GMimeCryptoContext that uses GnuPG to do +all of the encryption and digital signatures.

+
+
+

Functions

+
+

g_mime_gpg_context_new ()

+
GMimeCryptoContext *
+g_mime_gpg_context_new (void);
+

Creates a new gpg crypto context object.

+
+

Returns

+

a new gpg crypto context object.

+

[transfer full]

+
+
+
+
+

Types and Values

+
+

GMimeGpgContext

+
typedef struct _GMimeGpgContext GMimeGpgContext;
+

A GnuPG crypto context.

+
+
+
+

See Also

+

GMimeCryptoContext

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeHeaderList.html gmime-3.0.1/docs/reference/html/GMimeHeaderList.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeHeaderList.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeHeaderList.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,1436 @@ + + + + +GMimeHeaderList: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeHeaderList

+

GMimeHeaderList — Message and MIME part headers

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+char * + +(*GMimeHeaderRawValueFormatter) () +
+char * + +g_mime_header_format_addrlist () +
+char * + +g_mime_header_format_content_disposition () +
+char * + +g_mime_header_format_content_type () +
+char * + +g_mime_header_format_default () +
+char * + +g_mime_header_format_message_id () +
+char * + +g_mime_header_format_received () +
+char * + +g_mime_header_format_references () +
const char * + +g_mime_header_get_name () +
const char * + +g_mime_header_get_raw_name () +
+gint64 + +g_mime_header_get_offset () +
const char * + +g_mime_header_get_value () +
+void + +g_mime_header_set_value () +
const char * + +g_mime_header_get_raw_value () +
+void + +g_mime_header_set_raw_value () +
+ssize_t + +g_mime_header_write_to_stream () +
+GMimeHeaderList * + +g_mime_header_list_new () +
+int + +g_mime_header_list_get_count () +
+void + +g_mime_header_list_clear () +
+gboolean + +g_mime_header_list_contains () +
+GMimeHeader * + +g_mime_header_list_get_header () +
+GMimeHeader * + +g_mime_header_list_get_header_at () +
+void + +g_mime_header_list_prepend () +
+void + +g_mime_header_list_append () +
+void + +g_mime_header_list_set () +
+gboolean + +g_mime_header_list_remove () +
+void + +g_mime_header_list_remove_at () +
+ssize_t + +g_mime_header_list_write_to_stream () +
+char * + +g_mime_header_list_to_string () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
structGMimeHeader
structGMimeHeaderList
+
+
+

Object Hierarchy

+
    GObject
+    ├── GMimeHeader
+    ╰── GMimeHeaderList
+
+
+
+

Description

+

A GMimeHeader is a collection of rfc822 header fields and their +values.

+
+
+

Functions

+
+

GMimeHeaderRawValueFormatter ()

+
char *
+(*GMimeHeaderRawValueFormatter) (GMimeHeader *header,
+                                 GMimeFormatOptions *options,
+                                 const char *value,
+                                 const char *charset);
+

Function callback for encoding and formatting a header value.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

header

a GMimeHeader

 

options

a GMimeFormatOptions

 

value

an unencoded header value

 

charset

a charset

 
+
+
+

Returns

+

the encoded and formatted raw header value.

+
+
+
+
+

g_mime_header_format_addrlist ()

+
char *
+g_mime_header_format_addrlist (GMimeHeader *header,
+                               GMimeFormatOptions *options,
+                               const char *value,
+                               const char *charset);
+

Parses the value + and then re-formats it to conform to the formatting options, +folding the value if necessary.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

header

a GMimeHeader

 

options

a GMimeFormatOptions or NULL.

[nullable]

value

a Sender, From, Reply-To, To, Cc, or Bcc header value

 

charset

a charset (note: unused)

 
+
+
+

Returns

+

a newly allocated string containing the reformatted value.

+
+
+
+
+

g_mime_header_format_content_disposition ()

+
char *
+g_mime_header_format_content_disposition
+                               (GMimeHeader *header,
+                                GMimeFormatOptions *options,
+                                const char *value,
+                                const char *charset);
+

Parses the value + and then re-formats it to conform to the formatting options, +folding the value if necessary.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

header

a GMimeHeader

 

options

a GMimeFormatOptions or NULL.

[nullable]

value

a Content-Disposition header value

 

charset

a charset (note: unused)

 
+
+
+

Returns

+

a newly allocated string containing the reformatted value.

+
+
+
+
+

g_mime_header_format_content_type ()

+
char *
+g_mime_header_format_content_type (GMimeHeader *header,
+                                   GMimeFormatOptions *options,
+                                   const char *value,
+                                   const char *charset);
+

Parses the value + and then re-formats it to conform to the formatting options, +folding the value if necessary.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

header

a GMimeHeader

 

options

a GMimeFormatOptions or NULL.

[nullable]

value

a Content-Type header value

 

charset

a charset (note: unused)

 
+
+
+

Returns

+

a newly allocated string containing the reformatted value.

+
+
+
+
+

g_mime_header_format_default ()

+
char *
+g_mime_header_format_default (GMimeHeader *header,
+                              GMimeFormatOptions *options,
+                              const char *value,
+                              const char *charset);
+

Parses the value + and then re-formats it to conform to the formatting options, +folding the value if necessary.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

header

a GMimeHeader

 

options

a GMimeFormatOptions or NULL.

[nullable]

value

a header value

 

charset

a charset to use when encoding the value +

 
+
+
+

Returns

+

a newly allocated string containing the reformatted value.

+
+
+
+
+

g_mime_header_format_message_id ()

+
char *
+g_mime_header_format_message_id (GMimeHeader *header,
+                                 GMimeFormatOptions *options,
+                                 const char *value,
+                                 const char *charset);
+

Parses the value + and then re-formats it to conform to the formatting options, +folding the value if necessary.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

header

a GMimeHeader

 

options

a GMimeFormatOptions or NULL.

[nullable]

value

a Message-Id or Content-Id header value

 

charset

a charset (note: unused)

 
+
+
+

Returns

+

a newly allocated string containing the reformatted value.

+
+
+
+
+

g_mime_header_format_received ()

+
char *
+g_mime_header_format_received (GMimeHeader *header,
+                               GMimeFormatOptions *options,
+                               const char *value,
+                               const char *charset);
+

Parses the value + and then re-formats it to conform to the formatting options, +folding the value if necessary.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

header

a GMimeHeader

 

options

a GMimeFormatOptions or NULL.

[nullable]

value

a Received header value

 

charset

a charset (note: unused)

 
+
+
+

Returns

+

a newly allocated string containing the reformatted value.

+
+
+
+
+

g_mime_header_format_references ()

+
char *
+g_mime_header_format_references (GMimeHeader *header,
+                                 GMimeFormatOptions *options,
+                                 const char *value,
+                                 const char *charset);
+

Parses the value + and then re-formats it to conform to the formatting options, +folding the value if necessary.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

header

a GMimeHeader

 

options

a GMimeFormatOptions or NULL.

[nullable]

value

a References or In-Reply-To header value

 

charset

a charset (note: unused)

 
+
+
+

Returns

+

a newly allocated string containing the reformatted value.

+
+
+
+
+

g_mime_header_get_name ()

+
const char *
+g_mime_header_get_name (GMimeHeader *header);
+

Gets the header's name.

+
+

Parameters

+
+++++ + + + + + +

header

a GMimeHeader

 
+
+
+

Returns

+

the header name or NULL if invalid.

+
+
+
+
+

g_mime_header_get_raw_name ()

+
const char *
+g_mime_header_get_raw_name (GMimeHeader *header);
+

Gets the header's raw name. The raw header name is the complete string up to +(but not including) the ':' separating the header's name from its value. This +string may be different from the value returned by g_mime_header_get_name() +if the parsed message's header contained trailing whitespace after the header +name, such as: "Subject : this is the subject\r\n".

+
+

Parameters

+
+++++ + + + + + +

header

a GMimeHeader

 
+
+
+

Returns

+

the raw header name.

+
+
+
+
+

g_mime_header_get_offset ()

+
gint64
+g_mime_header_get_offset (GMimeHeader *header);
+

Gets the header's stream offset if known.

+
+

Parameters

+
+++++ + + + + + +

header

a GMimeHeader

 
+
+
+

Returns

+

the header offset or -1 if unknown.

+
+
+
+
+

g_mime_header_get_value ()

+
const char *
+g_mime_header_get_value (GMimeHeader *header);
+

Gets the header's value.

+
+

Parameters

+
+++++ + + + + + +

header

a GMimeHeader

 
+
+
+

Returns

+

the header's raw, unprocessed value or NULL if invalid.

+

Note: The returned value should be decoded with a function such as +g_mime_utils_header_decode_text() before displaying to the user.

+
+
+
+
+

g_mime_header_set_value ()

+
void
+g_mime_header_set_value (GMimeHeader *header,
+                         GMimeFormatOptions *options,
+                         const char *value,
+                         const char *charset);
+

Sets the header's value.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

header

a GMimeHeader

 

options

a GMimeFormatOptions or NULL.

[nullable]

value

the new header value

 

charset

a charset

 
+
+
+
+
+

g_mime_header_get_raw_value ()

+
const char *
+g_mime_header_get_raw_value (GMimeHeader *header);
+

Gets the header's raw (folded) value.

+
+

Parameters

+
+++++ + + + + + +

header

a GMimeHeader

 
+
+
+

Returns

+

the header value or NULL if invalid.

+
+
+
+
+

g_mime_header_set_raw_value ()

+
void
+g_mime_header_set_raw_value (GMimeHeader *header,
+                             const char *raw_value);
+

Sets the header's raw value.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

header

a GMimeHeader

 

raw_value

the raw value

 
+
+
+
+
+

g_mime_header_write_to_stream ()

+
ssize_t
+g_mime_header_write_to_stream (GMimeHeader *header,
+                               GMimeFormatOptions *options,
+                               GMimeStream *stream);
+

Write the header to the specified stream.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

header

a GMimeHeader

 

options

a GMimeFormatOptions or NULL.

[nullable]

stream

a GMimeStream

 
+
+
+

Returns

+

the number of bytes written, or -1 on fail.

+
+
+
+
+

g_mime_header_list_new ()

+
GMimeHeaderList *
+g_mime_header_list_new (GMimeParserOptions *options);
+

Creates a new GMimeHeaderList object.

+
+

Parameters

+
+++++ + + + + + +

options

a GMimeParserOptions or NULL.

[nullable]
+
+
+

Returns

+

a new header list object.

+
+
+
+
+

g_mime_header_list_get_count ()

+
int
+g_mime_header_list_get_count (GMimeHeaderList *headers);
+

Gets the number of headers contained within the header list.

+
+

Parameters

+
+++++ + + + + + +

headers

a GMimeHeaderList

 
+
+
+

Returns

+

the number of headers in the header list.

+
+
+
+
+

g_mime_header_list_clear ()

+
void
+g_mime_header_list_clear (GMimeHeaderList *headers);
+

Removes all of the headers from the GMimeHeaderList.

+
+

Parameters

+
+++++ + + + + + +

headers

a GMimeHeaderList

 
+
+
+
+
+

g_mime_header_list_contains ()

+
gboolean
+g_mime_header_list_contains (GMimeHeaderList *headers,
+                             const char *name);
+

Checks whether or not a header exists.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

headers

a GMimeHeaderList

 

name

header name

 
+
+
+

Returns

+

TRUE if the specified header exists or FALSE otherwise.

+
+
+
+
+

g_mime_header_list_get_header ()

+
GMimeHeader *
+g_mime_header_list_get_header (GMimeHeaderList *headers,
+                               const char *name);
+

Gets the first header with the specified name.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

headers

a GMimeHeaderList

 

name

header name

 
+
+
+

Returns

+

a GMimeHeader for the specified name +.

+

[transfer none]

+
+
+
+
+

g_mime_header_list_get_header_at ()

+
GMimeHeader *
+g_mime_header_list_get_header_at (GMimeHeaderList *headers,
+                                  int index);
+

Gets the header at the specified index + within the list.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

headers

a GMimeHeaderList

 

index

the 0-based index of the header

 
+
+
+

Returns

+

the header at position index +.

+

[transfer none]

+
+
+
+
+

g_mime_header_list_prepend ()

+
void
+g_mime_header_list_prepend (GMimeHeaderList *headers,
+                            const char *name,
+                            const char *value,
+                            const char *charset);
+

Prepends a header. If value + is NULL, a space will be set aside +for it (useful for setting the order of headers before values can +be obtained for them) otherwise the header will be unset.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

headers

a GMimeHeaderList

 

name

header name

 

value

header value

 

charset

a charset

 
+
+
+
+
+

g_mime_header_list_append ()

+
void
+g_mime_header_list_append (GMimeHeaderList *headers,
+                           const char *name,
+                           const char *value,
+                           const char *charset);
+

Appends a header. If value + is NULL, a space will be set aside for it +(useful for setting the order of headers before values can be +obtained for them) otherwise the header will be unset.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

headers

a GMimeHeaderList

 

name

header name

 

value

header value

 

charset

a charset

 
+
+
+
+
+

g_mime_header_list_set ()

+
void
+g_mime_header_list_set (GMimeHeaderList *headers,
+                        const char *name,
+                        const char *value,
+                        const char *charset);
+

Set the value of the specified header. If value + is NULL and the +header, name +, had not been previously set, a space will be set +aside for it (useful for setting the order of headers before values +can be obtained for them) otherwise the header will be unset.

+

Note: If there are multiple headers with the specified field name, +the first instance of the header will be replaced and further +instances will be removed.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

headers

a GMimeHeaderList

 

name

header name

 

value

header value

 

charset

a charset

 
+
+
+
+
+

g_mime_header_list_remove ()

+
gboolean
+g_mime_header_list_remove (GMimeHeaderList *headers,
+                           const char *name);
+

Remove the first instance of the specified header.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

headers

a GMimeHeaderList

 

name

header name

 
+
+
+

Returns

+

TRUE if the header was successfully removed or FALSE if +the specified header could not be found.

+
+
+
+
+

g_mime_header_list_remove_at ()

+
void
+g_mime_header_list_remove_at (GMimeHeaderList *headers,
+                              int index);
+

Removes the header at the specified index + from headers +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

headers

a GMimeHeaderList

 

index

the 0-based index of the header to remove

 
+
+
+
+
+

g_mime_header_list_write_to_stream ()

+
ssize_t
+g_mime_header_list_write_to_stream (GMimeHeaderList *headers,
+                                    GMimeFormatOptions *options,
+                                    GMimeStream *stream);
+

Write the headers to a stream.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

headers

a GMimeHeaderList

 

options

a GMimeFormatOptions or NULL.

[nullable]

stream

output stream

 
+
+
+

Returns

+

the number of bytes written or -1 on fail.

+
+
+
+
+

g_mime_header_list_to_string ()

+
char *
+g_mime_header_list_to_string (GMimeHeaderList *headers,
+                              GMimeFormatOptions *options);
+

Allocates a string buffer containing the raw rfc822 headers +contained in headers +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

headers

a GMimeHeaderList

 

options

a GMimeFormatOptions or NULL.

[nullable]
+
+
+

Returns

+

a string containing the header block.

+
+
+
+
+

Types and Values

+
+

struct GMimeHeader

+
struct GMimeHeader;
+

A message or mime-part header.

+
+

Members

+
+++++ + +
+
+
+
+
+

struct GMimeHeaderList

+
struct GMimeHeaderList;
+

A list of message or mime-part headers.

+
+
+
+

See Also

+

GMimeObject

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/gmime.html gmime-3.0.1/docs/reference/html/gmime.html --- gmime-2.6.22+dfsg2/docs/reference/html/gmime.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/gmime.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,98 @@ + + + + +Part I. GMime Overview: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+

+Part I. GMime Overview

+
+
+

+GMime is a powerful MIME (Multipurpose Internet Mail Extension) +utility library. It is meant for creating, editing, and parsing MIME +messages and structures. GMime is released under the 2.1 version of +the GNU Lesser General Public License. GMime is based on GLib 2.0's +GObject system allowing for a lot of flexibility. +

+

+GMime depends on the following libraries: +

+
++++ + + + + +

GLib

+A general-purpose utility library, not specific to graphical user interfaces. +GLib provides many useful data types, macros, type conversions, +string utilities, file utilities, a main loop abstraction, and so on. +

+

+

+
+

Table of Contents

+
+
+Compiling the GMime libraries — How to compile GMime itself +
+
+Compiling GMime Applications — +How to compile your GMime application + +
+
+Changes from 1.0 to 2.0 — +Incompatible changes made between version 1.0 and version 2.0 + +
+
+Changes from 2.0 to 2.2 — Incompatible changes made between version 2.0 and version 2.2 +
+
+Changes from 2.2 to 2.4 — Changes made between version 2.2 and version 2.4 +
+
+Changes from 2.4 to 2.6 — Changes made between version 2.4 and version 2.6 +
+
+Changes from 2.6 to 3.0 — Changes made between version 2.6 and version 3.0 +
+
+Mailing lists and bug reports — +Getting help with GMime + +
+
+Frequently Asked Questions — +Find answers to common questions in the GMime manual + +
+
+
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeMessage.html gmime-3.0.1/docs/reference/html/GMimeMessage.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeMessage.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeMessage.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,936 @@ + + + + +GMimeMessage: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeMessage

+

GMimeMessage — Messages

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GMimeMessage * + +g_mime_message_new () +
+InternetAddressList * + +g_mime_message_get_sender () +
+InternetAddressList * + +g_mime_message_get_from () +
+InternetAddressList * + +g_mime_message_get_reply_to () +
+InternetAddressList * + +g_mime_message_get_to () +
+InternetAddressList * + +g_mime_message_get_cc () +
+InternetAddressList * + +g_mime_message_get_bcc () +
+void + +g_mime_message_add_mailbox () +
+InternetAddressList * + +g_mime_message_get_addresses () +
+InternetAddressList * + +g_mime_message_get_all_recipients () +
+void + +g_mime_message_set_subject () +
const char * + +g_mime_message_get_subject () +
+void + +g_mime_message_set_date () +
+GDateTime * + +g_mime_message_get_date () +
+void + +g_mime_message_set_message_id () +
const char * + +g_mime_message_get_message_id () +
+void + +g_mime_message_set_mime_part () +
+GMimeObject * + +g_mime_message_get_mime_part () +
+void + +g_mime_message_foreach () +
+GMimeObject * + +g_mime_message_get_body () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
enumGMimeAddressType
structGMimeMessage
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeObject
+        ╰── GMimeMessage
+
+
+
+

Description

+

A GMimeMessage represents an rfc822 message.

+
+
+

Functions

+
+

g_mime_message_new ()

+
GMimeMessage *
+g_mime_message_new (gboolean pretty_headers);
+

If pretty_headers + is TRUE, then the standard rfc822 headers are +initialized so as to put headers in a nice friendly order. This is +strictly a cosmetic thing, so if you are unsure, it is safe to say +no (FALSE).

+
+

Parameters

+
+++++ + + + + + +

pretty_headers

make pretty headers

 
+
+
+

Returns

+

an empty GMimeMessage object.

+
+
+
+
+

g_mime_message_get_sender ()

+
InternetAddressList *
+g_mime_message_get_sender (GMimeMessage *message);
+

Gets the parsed list of addresses in the Sender header.

+
+

Parameters

+
+++++ + + + + + +

message

A GMimeMessage

 
+
+
+

Returns

+

the parsed list of addresses in the Sender header.

+

[transfer none]

+
+
+
+
+

g_mime_message_get_from ()

+
InternetAddressList *
+g_mime_message_get_from (GMimeMessage *message);
+

Gets the parsed list of addresses in the From header.

+
+

Parameters

+
+++++ + + + + + +

message

A GMimeMessage

 
+
+
+

Returns

+

the parsed list of addresses in the From header.

+

[transfer none]

+
+
+
+
+

g_mime_message_get_reply_to ()

+
InternetAddressList *
+g_mime_message_get_reply_to (GMimeMessage *message);
+

Gets the parsed list of addresses in the Reply-To header.

+
+

Parameters

+
+++++ + + + + + +

message

A GMimeMessage

 
+
+
+

Returns

+

the parsed list of addresses in the Reply-To header.

+

[transfer none]

+
+
+
+
+

g_mime_message_get_to ()

+
InternetAddressList *
+g_mime_message_get_to (GMimeMessage *message);
+

Gets combined list of parsed addresses in the To header(s).

+
+

Parameters

+
+++++ + + + + + +

message

A GMimeMessage

 
+
+
+

Returns

+

the parsed list of addresses in the To header(s).

+

[transfer none]

+
+
+
+
+

g_mime_message_get_cc ()

+
InternetAddressList *
+g_mime_message_get_cc (GMimeMessage *message);
+

Gets combined list of parsed addresses in the Cc header(s).

+
+

Parameters

+
+++++ + + + + + +

message

A GMimeMessage

 
+
+
+

Returns

+

the parsed list of addresses in the Cc header(s).

+

[transfer none]

+
+
+
+
+

g_mime_message_get_bcc ()

+
InternetAddressList *
+g_mime_message_get_bcc (GMimeMessage *message);
+

Gets combined list of parsed addresses in the Bcc header(s).

+
+

Parameters

+
+++++ + + + + + +

message

A GMimeMessage

 
+
+
+

Returns

+

the parsed list of addresses in the Bcc header(s).

+

[transfer none]

+
+
+
+
+

g_mime_message_add_mailbox ()

+
void
+g_mime_message_add_mailbox (GMimeMessage *message,
+                            GMimeAddressType type,
+                            const char *name,
+                            const char *addr);
+

Add a mailbox of a chosen type to the MIME message.

+

Note: The name + (and addr +) strings should be in UTF-8.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

message

A GMimeMessage

 

type

A GMimeAddressType

 

name

The name of the mailbox (or NULL)

 

addr

The address of the mailbox

 
+
+
+
+
+

g_mime_message_get_addresses ()

+
InternetAddressList *
+g_mime_message_get_addresses (GMimeMessage *message,
+                              GMimeAddressType type);
+

Gets a list of addresses of the specified type + from the message +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

message

A GMimeMessage

 

type

A GMimeAddressType

 
+
+
+

Returns

+

a list of addresses of the specified +type +from the message +.

+

[transfer none]

+
+
+
+
+

g_mime_message_get_all_recipients ()

+
InternetAddressList *
+g_mime_message_get_all_recipients (GMimeMessage *message);
+

Gets the complete list of recipients for message +.

+
+

Parameters

+
+++++ + + + + + +

message

A GMimeMessage

 
+
+
+

Returns

+

a newly allocated InternetAddressList +containing all recipients of the message or NULL if no recipients +are set.

+

[transfer full]

+
+
+
+
+

g_mime_message_set_subject ()

+
void
+g_mime_message_set_subject (GMimeMessage *message,
+                            const char *subject,
+                            const char *charset);
+

Set the subject of a message +.

+

Note: The subject + string should be in UTF-8.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

message

A GMimeMessage

 

subject

Subject string

 

charset

The charset to use for encoding the subject or NULL to use the default

 
+
+
+
+
+

g_mime_message_get_subject ()

+
const char *
+g_mime_message_get_subject (GMimeMessage *message);
+

Gets the subject of the message +.

+
+

Parameters

+
+++++ + + + + + +

message

A GMimeMessage

 
+
+
+

Returns

+

the subject of the message +in a form suitable for display +or NULL if no subject is set. If not NULL, the returned string +will be in UTF-8.

+
+
+
+
+

g_mime_message_set_date ()

+
void
+g_mime_message_set_date (GMimeMessage *message,
+                         GDateTime *date);
+

Sets the Date header on a MIME Message.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

message

A GMimeMessage

 

date

a date to be used in the Date header

 
+
+
+
+
+

g_mime_message_get_date ()

+
GDateTime *
+g_mime_message_get_date (GMimeMessage *message);
+

Gets the parsed date and time value from the Date header.

+
+

Parameters

+
+++++ + + + + + +

message

A GMimeMessage

 
+
+
+

Returns

+

a GDateTime on success or NULL if the date could not be parsed.

+
+
+
+
+

g_mime_message_set_message_id ()

+
void
+g_mime_message_set_message_id (GMimeMessage *message,
+                               const char *message_id);
+

Set the Message-Id on a message.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

message

A GMimeMessage

 

message_id

message-id (addr-spec portion)

 
+
+
+
+
+

g_mime_message_get_message_id ()

+
const char *
+g_mime_message_get_message_id (GMimeMessage *message);
+

Gets the Message-Id header of message +.

+
+

Parameters

+
+++++ + + + + + +

message

A GMimeMessage

 
+
+
+

Returns

+

the Message-Id of a message.

+
+
+
+
+

g_mime_message_set_mime_part ()

+
void
+g_mime_message_set_mime_part (GMimeMessage *message,
+                              GMimeObject *mime_part);
+

Set the root-level MIME part of the message.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

message

A GMimeMessage

 

mime_part

The root-level MIME Part

 
+
+
+
+
+

g_mime_message_get_mime_part ()

+
GMimeObject *
+g_mime_message_get_mime_part (GMimeMessage *message);
+

Gets the toplevel MIME part contained within message +.

+
+

Parameters

+
+++++ + + + + + +

message

A GMimeMessage

 
+
+
+

Returns

+

the toplevel MIME part of message +.

+

[transfer none]

+
+
+
+
+

g_mime_message_foreach ()

+
void
+g_mime_message_foreach (GMimeMessage *message,
+                        GMimeObjectForeachFunc callback,
+                        gpointer user_data);
+

Recursively calls callback + on each of the mime parts in the mime message.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

message

A GMimeMessage

 

callback

function to call on each of the mime parts +contained by the mime message.

[scope call]

user_data

user-supplied callback data

 
+
+
+
+
+

g_mime_message_get_body ()

+
GMimeObject *
+g_mime_message_get_body (GMimeMessage *message);
+

Attempts to identify the MIME part containing the body of the +message.

+
+

Parameters

+
+++++ + + + + + +

message

A GMimeMessage

 
+
+
+

Returns

+

a GMimeObject containing the textual +content that appears to be the main body of the message.

+

Note: This function is NOT guarenteed to always work as it +makes some assumptions that are not necessarily true. It is +recommended that you traverse the MIME structure yourself.

+

[transfer none]

+
+
+
+
+

Types and Values

+
+

enum GMimeAddressType

+

An address type.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

GMIME_ADDRESS_TYPE_SENDER

+

Represents the addresses in the Sender header.

+
 

GMIME_ADDRESS_TYPE_FROM

+

Represents the addresses in the From header.

+
 

GMIME_ADDRESS_TYPE_REPLY_TO

+

Represents the addresses in the Reply-To header.

+
 

GMIME_ADDRESS_TYPE_TO

+

Represents the recipients in the To header.

+
 

GMIME_ADDRESS_TYPE_CC

+

Represents the recipients in the Cc header.

+
 

GMIME_ADDRESS_TYPE_BCC

+

Represents the recipients in the Bcc header.

+
 
+
+
+
+
+

struct GMimeMessage

+
struct GMimeMessage;
+

A MIME Message object.

+
+

Members

+
+++++ + +
+
+
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeMessagePart.html gmime-3.0.1/docs/reference/html/GMimeMessagePart.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeMessagePart.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeMessagePart.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,259 @@ + + + + +GMimeMessagePart: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeMessagePart

+

GMimeMessagePart — Message parts

+
+
+

Functions

+ +
+
+

Types and Values

+
++++ + + + + +
structGMimeMessagePart
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeObject
+        ╰── GMimeMessagePart
+
+
+
+

Description

+

A GMimeMessagePart represents message/rfc822 and message/news MIME +parts.

+
+
+

Functions

+
+

g_mime_message_part_new ()

+
GMimeMessagePart *
+g_mime_message_part_new (const char *subtype);
+

Creates a new MIME message part object with a default content-type +of message/subtype +.

+
+

Parameters

+
+++++ + + + + + +

subtype

message subtype or NULL for "rfc822"

 
+
+
+

Returns

+

an empty MIME message part object with a default +content-type of message/subtype +.

+
+
+
+
+

g_mime_message_part_new_with_message ()

+
GMimeMessagePart *
+g_mime_message_part_new_with_message (const char *subtype,
+                                      GMimeMessage *message);
+

Creates a new MIME message part object with a default content-type +of message/subtype + containing message +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

subtype

message subtype or NULL for "rfc822"

 

message

message

 
+
+
+

Returns

+

a MIME message part object with a default content-type of +message/subtype +containing message +.

+
+
+
+
+

g_mime_message_part_get_message ()

+
GMimeMessage *
+g_mime_message_part_get_message (GMimeMessagePart *part);
+

Gets the message object on the message part object part +.

+
+

Parameters

+
+++++ + + + + + +

part

message part

 
+
+
+

Returns

+

the message part contained within part +.

+

[transfer none]

+
+
+
+
+

g_mime_message_part_set_message ()

+
void
+g_mime_message_part_set_message (GMimeMessagePart *part,
+                                 GMimeMessage *message);
+

Sets the message + object on the message part object part +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

part

message part

 

message

message

 
+
+
+
+
+

Types and Values

+
+

struct GMimeMessagePart

+
struct GMimeMessagePart;
+

A message/rfc822 or message/news MIME part.

+
+

Members

+
+++++ + +
+
+
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeMessagePartial.html gmime-3.0.1/docs/reference/html/GMimeMessagePartial.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeMessagePartial.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeMessagePartial.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,352 @@ + + + + +GMimeMessagePartial: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeMessagePartial

+

GMimeMessagePartial — Partial MIME parts

+
+
+

Functions

+ +
+
+

Types and Values

+
++++ + + + + +
structGMimeMessagePartial
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeObject
+        ╰── GMimePart
+            ╰── GMimeMessagePartial
+
+
+
+

Description

+

A GMimeMessagePartial represents the message/partial MIME part.

+
+
+

Functions

+
+

g_mime_message_partial_new ()

+
GMimeMessagePartial *
+g_mime_message_partial_new (const char *id,
+                            int number,
+                            int total);
+

Creates a new MIME message/partial object.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

id

message/partial part id

 

number

message/partial part number

 

total

total number of message/partial parts

 
+
+
+

Returns

+

an empty MIME message/partial object.

+
+
+
+
+

g_mime_message_partial_get_id ()

+
const char *
+g_mime_message_partial_get_id (GMimeMessagePartial *partial);
+

Gets the message/partial id parameter value.

+
+

Parameters

+
+++++ + + + + + +

partial

message/partial object

 
+
+
+

Returns

+

the message/partial id or NULL on fail.

+
+
+
+
+

g_mime_message_partial_get_number ()

+
int
+g_mime_message_partial_get_number (GMimeMessagePartial *partial);
+

Gets the message/partial part number.

+
+

Parameters

+
+++++ + + + + + +

partial

message/partial object

 
+
+
+

Returns

+

the message/partial part number or -1 on fail.

+
+
+
+
+

g_mime_message_partial_get_total ()

+
int
+g_mime_message_partial_get_total (GMimeMessagePartial *partial);
+

Gets the total number of message/partial parts needed to +reconstruct the original message.

+
+

Parameters

+
+++++ + + + + + +

partial

message/partial object

 
+
+
+

Returns

+

the total number of message/partial parts needed to +reconstruct the original message or -1 on fail.

+
+
+
+
+

g_mime_message_partial_reconstruct_message ()

+
GMimeMessage *
+g_mime_message_partial_reconstruct_message
+                               (GMimeMessagePartial **partials,
+                                size_t num);
+

Reconstructs the GMimeMessage from the given message/partial parts +in partials +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

partials

an array of message/partial mime parts

 

num

the number of elements in partials +

 
+
+
+

Returns

+

a GMimeMessage object on success or NULL +on fail.

+

[transfer full]

+
+
+
+
+

g_mime_message_partial_split_message ()

+
GMimeMessage **
+g_mime_message_partial_split_message (GMimeMessage *message,
+                                      size_t max_size,
+                                      size_t *nparts);
+

Splits message + into an array of GMimeMessage objects each +containing a single GMimeMessagePartial object containing +max_size + bytes or fewer. nparts + is set to the number of +GMimeMessagePartial objects created.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

message

message object

 

max_size

max size

 

nparts

number of parts.

[out]
+
+
+

Returns

+

an array of GMimeMessage objects and +sets nparts +to the number of messages returned or NULL on fail.

+

[nullable][transfer full]

+
+
+
+
+

Types and Values

+
+

struct GMimeMessagePartial

+
struct GMimeMessagePartial;
+

A message/partial MIME part.

+
+

Members

+
+++++ + +
+
+
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeMultipartEncrypted.html gmime-3.0.1/docs/reference/html/GMimeMultipartEncrypted.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeMultipartEncrypted.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeMultipartEncrypted.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,280 @@ + + + + +GMimeMultipartEncrypted: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeMultipartEncrypted

+

GMimeMultipartEncrypted — Encrypted MIME multiparts

+
+ +
+

Types and Values

+
++++ + + + + +
structGMimeMultipartEncrypted
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeObject
+        ╰── GMimeMultipart
+            ╰── GMimeMultipartEncrypted
+
+
+
+

Description

+

A GMimeMultipartEncrypted part is a special subclass of +GMimeMultipart to make it easier to manipulate the +multipart/encrypted MIME type.

+
+
+

Functions

+
+

g_mime_multipart_encrypted_new ()

+
GMimeMultipartEncrypted *
+g_mime_multipart_encrypted_new (void);
+

Creates a new MIME multipart/encrypted object.

+
+

Returns

+

an empty MIME multipart/encrypted object.

+
+
+
+
+

g_mime_multipart_encrypted_encrypt ()

+
GMimeMultipartEncrypted *
+g_mime_multipart_encrypted_encrypt (GMimeCryptoContext *ctx,
+                                    GMimeObject *entity,
+                                    gboolean sign,
+                                    const char *userid,
+                                    GMimeEncryptFlags flags,
+                                    GPtrArray *recipients,
+                                    GError **err);
+

Attempts to encrypt (and conditionally sign) the entity + MIME part +to the public keys of recipients + using the ctx + encryption +context. If successful, a new multipart/encrypted object is returned.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

ctx

a GMimeCryptoContext

 

entity

MIME part to encrypt

 

sign

TRUE if the content should also be signed or FALSE otherwise

 

userid

user id to use for signing (only used if sign +is TRUE).

[nullable]

flags

a GMimeEncryptFlags

 

recipients

an array of recipients to encrypt to.

[element-type utf8]

err

a GError

 
+
+
+

Returns

+

a new GMimeMultipartEncrypted object on success +or NULL on fail. If encrypting fails, an exception will be set on err +to provide +information as to why the failure occured.

+

[nullable][transfer full]

+
+
+
+
+

g_mime_multipart_encrypted_decrypt ()

+
GMimeObject *
+g_mime_multipart_encrypted_decrypt (GMimeMultipartEncrypted *encrypted,
+                                    GMimeDecryptFlags flags,
+                                    const char *session_key,
+                                    GMimeDecryptResult **result,
+                                    GError **err);
+

Attempts to decrypt the encrypted MIME part contained within the +multipart/encrypted object encrypted +.

+

When non-NULL, session_key + should be a NULL-terminated string, +such as the one returned by g_mime_decrypt_result_get_session_key() +from a previous decryption. If the sesion_key + is not valid, decryption +will fail.

+

If result + is non-NULL, then on a successful decrypt operation, it will be +updated to point to a newly-allocated GMimeDecryptResult with signature +status information as well as a list of recipients that the part was +encrypted to.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

encrypted

a GMimeMultipartEncrypted

 

flags

a GMimeDecryptFlags

 

session_key

session key to use or NULL

 

result

a GMimeDecryptResult.

[out][transfer full]

err

a GError

 
+
+
+

Returns

+

the decrypted MIME part on success or +NULL on fail. If the decryption fails, an exception will be set on +err +to provide information as to why the failure occured.

+

[nullable][transfer full]

+
+
+
+
+

Types and Values

+
+

struct GMimeMultipartEncrypted

+
struct GMimeMultipartEncrypted;
+

A multipart/encrypted MIME part.

+
+

Members

+
+++++ + +
+
+
+
+
+

See Also

+

GMimeMultipart

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeMultipart.html gmime-3.0.1/docs/reference/html/GMimeMultipart.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeMultipart.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeMultipart.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,905 @@ + + + + +GMimeMultipart: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeMultipart

+

GMimeMultipart — MIME multiparts

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GMimeMultipart * + +g_mime_multipart_new () +
+GMimeMultipart * + +g_mime_multipart_new_with_subtype () +
+void + +g_mime_multipart_set_prologue () +
const char * + +g_mime_multipart_get_prologue () +
+void + +g_mime_multipart_set_epilogue () +
const char * + +g_mime_multipart_get_epilogue () +
+void + +g_mime_multipart_set_boundary () +
const char * + +g_mime_multipart_get_boundary () +
+int + +g_mime_multipart_get_count () +
+gboolean + +g_mime_multipart_contains () +
+int + +g_mime_multipart_index_of () +
+void + +g_mime_multipart_add () +
+void + +g_mime_multipart_clear () +
+void + +g_mime_multipart_insert () +
+gboolean + +g_mime_multipart_remove () +
+GMimeObject * + +g_mime_multipart_remove_at () +
+GMimeObject * + +g_mime_multipart_replace () +
+GMimeObject * + +g_mime_multipart_get_part () +
+void + +g_mime_multipart_foreach () +
+GMimeObject * + +g_mime_multipart_get_subpart_from_content_id () +
+
+
+

Types and Values

+
++++ + + + + +
structGMimeMultipart
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeObject
+        ╰── GMimeMultipart
+            ├── GMimeMultipartEncrypted
+            ╰── GMimeMultipartSigned
+
+
+
+

Description

+

A GMimeMultipart represents all multipart MIME container parts.

+
+
+

Functions

+
+

g_mime_multipart_new ()

+
GMimeMultipart *
+g_mime_multipart_new (void);
+

Creates a new MIME multipart object with a default content-type of +multipart/mixed.

+
+

Returns

+

an empty MIME multipart object with a default content-type of +multipart/mixed.

+
+
+
+
+

g_mime_multipart_new_with_subtype ()

+
GMimeMultipart *
+g_mime_multipart_new_with_subtype (const char *subtype);
+

Creates a new MIME multipart object with a content-type of +multipart/subtype +.

+
+

Parameters

+
+++++ + + + + + +

subtype

content-type subtype

 
+
+
+

Returns

+

an empty MIME multipart object with a content-type of +multipart/subtype +.

+
+
+
+
+

g_mime_multipart_set_prologue ()

+
void
+g_mime_multipart_set_prologue (GMimeMultipart *multipart,
+                               const char *prologue);
+

Sets the prologue on the multipart.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

multipart

a GMimeMultipart object

 

prologue

prologue

 
+
+
+
+
+

g_mime_multipart_get_prologue ()

+
const char *
+g_mime_multipart_get_prologue (GMimeMultipart *multipart);
+

Gets the prologue on the multipart.

+
+

Parameters

+
+++++ + + + + + +

multipart

a GMimeMultipart object

 
+
+
+

Returns

+

a pointer to the prologue string on the multipart.

+
+
+
+
+

g_mime_multipart_set_epilogue ()

+
void
+g_mime_multipart_set_epilogue (GMimeMultipart *multipart,
+                               const char *epilogue);
+

Sets the epilogue on the multipart.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

multipart

a GMimeMultipart object

 

epilogue

epilogue

 
+
+
+
+
+

g_mime_multipart_get_epilogue ()

+
const char *
+g_mime_multipart_get_epilogue (GMimeMultipart *multipart);
+

Gets the epilogue on the multipart.

+
+

Parameters

+
+++++ + + + + + +

multipart

a GMimeMultipart object

 
+
+
+

Returns

+

a pointer to the epilogue string on the multipart.

+
+
+
+
+

g_mime_multipart_set_boundary ()

+
void
+g_mime_multipart_set_boundary (GMimeMultipart *multipart,
+                               const char *boundary);
+

Sets boundary + as the boundary on the multipart. If boundary + is +NULL, then a boundary will be auto-generated for you.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

multipart

a GMimeMultipart object

 

boundary

boundary or NULL to autogenerate one

 
+
+
+
+
+

g_mime_multipart_get_boundary ()

+
const char *
+g_mime_multipart_get_boundary (GMimeMultipart *multipart);
+

Gets the boundary on the multipart. If the internal boundary is +NULL, then an auto-generated boundary will be set on the multipart +and returned.

+
+

Parameters

+
+++++ + + + + + +

multipart

a GMimeMultipart object

 
+
+
+

Returns

+

the boundary on the multipart.

+
+
+
+
+

g_mime_multipart_get_count ()

+
int
+g_mime_multipart_get_count (GMimeMultipart *multipart);
+

Gets the number of parts contained within multipart +.

+
+

Parameters

+
+++++ + + + + + +

multipart

a GMimeMultipart object

 
+
+
+

Returns

+

the number of parts contained within multipart +.

+
+
+
+
+

g_mime_multipart_contains ()

+
gboolean
+g_mime_multipart_contains (GMimeMultipart *multipart,
+                           GMimeObject *part);
+

Checks if part + is contained within multipart +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

multipart

a GMimeMultipart object

 

part

a GMimeObject

 
+
+
+

Returns

+

TRUE if part +is a subpart of multipart +or FALSE +otherwise.

+
+
+
+
+

g_mime_multipart_index_of ()

+
int
+g_mime_multipart_index_of (GMimeMultipart *multipart,
+                           GMimeObject *part);
+

Gets the 0-based index of part + within multipart +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

multipart

a GMimeMultipart object

 

part

a GMimeObject

 
+
+
+

Returns

+

the 0-based index of part +within multipart +or -1 if not found.

+
+
+
+
+

g_mime_multipart_add ()

+
void
+g_mime_multipart_add (GMimeMultipart *multipart,
+                      GMimeObject *part);
+

Appends a mime part to multipart +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

multipart

a GMimeMultipart object

 

part

a GMimeObject

 
+
+
+
+
+

g_mime_multipart_clear ()

+
void
+g_mime_multipart_clear (GMimeMultipart *multipart);
+

Removes all subparts from multipart +.

+
+

Parameters

+
+++++ + + + + + +

multipart

a GMimeMultipart object

 
+
+
+
+
+

g_mime_multipart_insert ()

+
void
+g_mime_multipart_insert (GMimeMultipart *multipart,
+                         int index,
+                         GMimeObject *part);
+

Inserts part + into multipart + at the specified index +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

multipart

a GMimeMultipart object

 

part

a GMimeObject

 

index

the 0-based index to insert the part

 
+
+
+
+
+

g_mime_multipart_remove ()

+
gboolean
+g_mime_multipart_remove (GMimeMultipart *multipart,
+                         GMimeObject *part);
+

Removes the specified part + from multipart +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

multipart

a GMimeMultipart object

 

part

a GMimeObject

 
+
+
+

Returns

+

TRUE if the part was removed or FALSE otherwise.

+
+
+
+
+

g_mime_multipart_remove_at ()

+
GMimeObject *
+g_mime_multipart_remove_at (GMimeMultipart *multipart,
+                            int index);
+

Removes the part at the specified index + from multipart +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

multipart

a GMimeMultipart object

 

index

the 0-based index of the part to remove

 
+
+
+

Returns

+

the mime part that was removed or NULL +if the part was not contained within the multipart.

+

[transfer full]

+
+
+
+
+

g_mime_multipart_replace ()

+
GMimeObject *
+g_mime_multipart_replace (GMimeMultipart *multipart,
+                          int index,
+                          GMimeObject *replacement);
+

Replaces the part at the specified index + within multipart + with +replacement +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

multipart

a GMimeMultipart object

 

index

the 0-based index of the part to replace

 

replacement

a GMimeObject to use as the replacement

 
+
+
+

Returns

+

the part that was replaced or NULL +if the part was not contained within the multipart.

+

[transfer full]

+
+
+
+
+

g_mime_multipart_get_part ()

+
GMimeObject *
+g_mime_multipart_get_part (GMimeMultipart *multipart,
+                           int index);
+

Gets the part at the specified index + within the multipart.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

multipart

a GMimeMultipart object

 

index

the 0-based index of the part

 
+
+
+

Returns

+

the part at position index +.

+

[transfer none]

+
+
+
+
+

g_mime_multipart_foreach ()

+
void
+g_mime_multipart_foreach (GMimeMultipart *multipart,
+                          GMimeObjectForeachFunc callback,
+                          gpointer user_data);
+

Recursively calls callback + on each of multipart +'s subparts.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

multipart

a GMimeMultipart

 

callback

function to call for each of multipart +'s +subparts.

[scope call]

user_data

user-supplied callback data

 
+
+
+
+
+

g_mime_multipart_get_subpart_from_content_id ()

+
GMimeObject *
+g_mime_multipart_get_subpart_from_content_id
+                               (GMimeMultipart *multipart,
+                                const char *content_id);
+

Gets the mime part with the content-id content_id + from the +multipart multipart +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

multipart

a multipart

 

content_id

the content id of the part to look for

 
+
+
+

Returns

+

the GMimeObject whose content-id matches +the search string, or NULL if a match cannot be found.

+

[transfer none]

+
+
+
+
+

Types and Values

+
+

struct GMimeMultipart

+
struct GMimeMultipart;
+

A base MIME multipart object.

+
+

Members

+
+++++ + +
+
+
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeMultipartSigned.html gmime-3.0.1/docs/reference/html/GMimeMultipartSigned.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeMultipartSigned.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeMultipartSigned.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,239 @@ + + + + +GMimeMultipartSigned: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeMultipartSigned

+

GMimeMultipartSigned — Signed MIME multiparts

+
+ +
+

Types and Values

+
++++ + + + + +
structGMimeMultipartSigned
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeObject
+        ╰── GMimeMultipart
+            ╰── GMimeMultipartSigned
+
+
+
+

Description

+

A GMimeMultipartSigned part is a special subclass of +GMimeMultipart to make it easier to manipulate the +multipart/signed MIME type.

+
+
+

Functions

+
+

g_mime_multipart_signed_new ()

+
GMimeMultipartSigned *
+g_mime_multipart_signed_new (void);
+

Creates a new MIME multipart/signed object.

+
+

Returns

+

an empty MIME multipart/signed object.

+
+
+
+
+

g_mime_multipart_signed_sign ()

+
GMimeMultipartSigned *
+g_mime_multipart_signed_sign (GMimeCryptoContext *ctx,
+                              GMimeObject *entity,
+                              const char *userid,
+                              GError **err);
+

Attempts to sign the content + MIME part with userid +'s private key +using the ctx + signing context. If successful, a new multipart/signed +object is returned.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

ctx

a GMimeCryptoContext

 

entity

MIME part to sign

 

userid

user id to sign with

 

err

a GError

 
+
+
+

Returns

+

a new GMimeMultipartSigned object on success +or NULL on fail. If signing fails, an exception will be set on err +to provide +information as to why the failure occured.

+

[nullable][transfer full]

+
+
+
+
+

g_mime_multipart_signed_verify ()

+
GMimeSignatureList *
+g_mime_multipart_signed_verify (GMimeMultipartSigned *mps,
+                                GMimeVerifyFlags flags,
+                                GError **err);
+

Attempts to verify the signed MIME part contained within the +multipart/signed object mps +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

mps

a GMimeMultipartSigned

 

flags

a GMimeVerifyFlags

 

err

a GError

 
+
+
+

Returns

+

a new GMimeSignatureList object on +success or NULL on fail. If the verification fails, an exception +will be set on err +to provide information as to why the failure +occured.

+

[nullable][transfer full]

+
+
+
+
+

Types and Values

+
+

struct GMimeMultipartSigned

+
struct GMimeMultipartSigned;
+

A multipart/signed MIME part.

+
+

Members

+
+++++ + +
+
+
+
+
+

See Also

+

GMimeMultipart

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeObject.html gmime-3.0.1/docs/reference/html/GMimeObject.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeObject.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeObject.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,1244 @@ + + + + +GMimeObject: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeObject

+

GMimeObject — Abstract MIME objects

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+void + +(*GMimeObjectForeachFunc) () +
+void + +g_mime_object_register_type () +
+GMimeObject * + +g_mime_object_new () +
+GMimeObject * + +g_mime_object_new_type () +
+void + +g_mime_object_set_content_type () +
+GMimeContentType * + +g_mime_object_get_content_type () +
+void + +g_mime_object_set_content_type_parameter () +
const char * + +g_mime_object_get_content_type_parameter () +
+void + +g_mime_object_set_disposition () +
const char * + +g_mime_object_get_disposition () +
+void + +g_mime_object_set_content_disposition () +
+GMimeContentDisposition * + +g_mime_object_get_content_disposition () +
+void + +g_mime_object_set_content_disposition_parameter () +
const char * + +g_mime_object_get_content_disposition_parameter () +
+void + +g_mime_object_set_content_id () +
const char * + +g_mime_object_get_content_id () +
+void + +g_mime_object_prepend_header () +
+void + +g_mime_object_append_header () +
+gboolean + +g_mime_object_remove_header () +
+void + +g_mime_object_set_header () +
const char * + +g_mime_object_get_header () +
+char * + +g_mime_object_get_headers () +
+GMimeHeaderList * + +g_mime_object_get_header_list () +
+ssize_t + +g_mime_object_write_to_stream () +
+char * + +g_mime_object_to_string () +
+void + +g_mime_object_encode () +
+
+
+

Types and Values

+
++++ + + + + +
structGMimeObject
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeObject
+        ├── GMimeMessage
+        ├── GMimePart
+        ├── GMimeMultipart
+        ╰── GMimeMessagePart
+
+
+
+

Description

+

GMimeObject is an abstract class from which all message and MIME +parts are derived.

+
+
+

Functions

+
+

GMimeObjectForeachFunc ()

+
void
+(*GMimeObjectForeachFunc) (GMimeObject *parent,
+                           GMimeObject *part,
+                           gpointer user_data);
+

The function signature for a callback to g_mime_message_foreach() +and g_mime_multipart_foreach().

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

parent

parent GMimeObject

 

part

a GMimeObject

 

user_data

User-supplied callback data.

 
+
+
+
+
+

g_mime_object_register_type ()

+
void
+g_mime_object_register_type (const char *type,
+                             const char *subtype,
+                             GType object_type);
+

Registers the object type object_type + for use with the +g_mime_object_new_type() convenience function.

+

Note: You may use the wildcard "*" to match any type and/or +subtype.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

type

mime type

 

subtype

mime subtype

 

object_type

object type

 
+
+
+
+
+

g_mime_object_new ()

+
GMimeObject *
+g_mime_object_new (GMimeParserOptions *options,
+                   GMimeContentType *content_type);
+

Performs a lookup of registered GMimeObject subclasses, registered +using g_mime_object_register_type(), to find an appropriate class +capable of handling MIME parts of the specified Content-Type. If no +class has been registered to handle that type, it looks for a +registered class that can handle content_type +'s media type. If +that also fails, then it will use the generic part class, +GMimePart.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

options

a GMimeParserOptions or NULL.

[nullable]

content_type

a GMimeContentType object

 
+
+
+

Returns

+

an appropriate GMimeObject registered to handle MIME +parts appropriate for content_type +.

+
+
+
+
+

g_mime_object_new_type ()

+
GMimeObject *
+g_mime_object_new_type (GMimeParserOptions *options,
+                        const char *type,
+                        const char *subtype);
+

Performs a lookup of registered GMimeObject subclasses, registered +using g_mime_object_register_type(), to find an appropriate class +capable of handling MIME parts of type type +/subtype +. If no class +has been registered to handle that type, it looks for a registered +class that can handle type +. If that also fails, then it will use +the generic part class, GMimePart.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

options

a GMimeParserOptions or NULL.

[nullable]

type

mime type

 

subtype

mime subtype

 
+
+
+

Returns

+

an appropriate GMimeObject registered to handle mime-types +of type +/subtype +.

+
+
+
+
+

g_mime_object_set_content_type ()

+
void
+g_mime_object_set_content_type (GMimeObject *object,
+                                GMimeContentType *content_type);
+

Sets the content-type for the specified MIME object and then +serializes it to the Content-Type header field.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

object

a GMimeObject

 

content_type

a GMimeContentType object

 
+
+
+
+
+

g_mime_object_get_content_type ()

+
GMimeContentType *
+g_mime_object_get_content_type (GMimeObject *object);
+

Gets the GMimeContentType object for the given MIME object or +NULL on fail.

+
+

Parameters

+
+++++ + + + + + +

object

a GMimeObject

 
+
+
+

Returns

+

the content-type object for the specified +MIME object.

+

[transfer none]

+
+
+
+
+

g_mime_object_set_content_type_parameter ()

+
void
+g_mime_object_set_content_type_parameter
+                               (GMimeObject *object,
+                                const char *name,
+                                const char *value);
+

Sets the content-type param name + to the value value +.

+

Note: The name + string should be in US-ASCII while the value + +string should be in UTF-8.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

object

a GMimeObject

 

name

param name

 

value

param value

 
+
+
+
+
+

g_mime_object_get_content_type_parameter ()

+
const char *
+g_mime_object_get_content_type_parameter
+                               (GMimeObject *object,
+                                const char *name);
+

Gets the value of the content-type param name + set on the MIME part +object +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

object

a GMimeObject

 

name

param name

 
+
+
+

Returns

+

the value of the requested content-type param or NULL if +the param doesn't exist. If the param is set, the returned string +will be in UTF-8.

+
+
+
+
+

g_mime_object_set_disposition ()

+
void
+g_mime_object_set_disposition (GMimeObject *object,
+                               const char *disposition);
+

Sets the disposition to disposition + which may be one of +GMIME_DISPOSITION_ATTACHMENT or GMIME_DISPOSITION_INLINE or, by +your choice, any other string which would indicate how the MIME +part should be displayed by the MUA.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

object

a GMimeObject

 

disposition

disposition ("attachment" or "inline")

 
+
+
+
+
+

g_mime_object_get_disposition ()

+
const char *
+g_mime_object_get_disposition (GMimeObject *object);
+

Gets the MIME object's disposition if set or NULL otherwise.

+
+

Parameters

+
+++++ + + + + + +

object

a GMimeObject

 
+
+
+

Returns

+

the disposition string which is probably one of +GMIME_DISPOSITION_ATTACHMENT or GMIME_DISPOSITION_INLINE.

+
+
+
+
+

g_mime_object_set_content_disposition ()

+
void
+g_mime_object_set_content_disposition (GMimeObject *object,
+                                       GMimeContentDisposition *disposition);
+

Set the content disposition for the specified mime part and then +serializes it to the Content-Disposition header field.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

object

a GMimeObject

 

disposition

a GMimeContentDisposition object

 
+
+
+
+
+

g_mime_object_get_content_disposition ()

+
GMimeContentDisposition *
+g_mime_object_get_content_disposition (GMimeObject *object);
+

Gets the GMimeContentDisposition for the specified MIME object.

+
+

Parameters

+
+++++ + + + + + +

object

a GMimeObject

 
+
+
+

Returns

+

the GMimeContentDisposition set on the +MIME object.

+

[transfer none]

+
+
+
+
+

g_mime_object_set_content_disposition_parameter ()

+
void
+g_mime_object_set_content_disposition_parameter
+                               (GMimeObject *object,
+                                const char *name,
+                                const char *value);
+

Add a content-disposition parameter to the specified mime part.

+

Note: The name + string should be in US-ASCII while the value + +string should be in UTF-8.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

object

a GMimeObject

 

name

parameter name

 

value

parameter value

 
+
+
+
+
+

g_mime_object_get_content_disposition_parameter ()

+
const char *
+g_mime_object_get_content_disposition_parameter
+                               (GMimeObject *object,
+                                const char *name);
+

Gets the value of the Content-Disposition parameter specified by +name +, or NULL if the parameter does not exist.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

object

a GMimeObject

 

name

parameter name

 
+
+
+

Returns

+

the value of the requested content-disposition param or +NULL if the param doesn't exist. If the param is set, the returned +string will be in UTF-8.

+
+
+
+
+

g_mime_object_set_content_id ()

+
void
+g_mime_object_set_content_id (GMimeObject *object,
+                              const char *content_id);
+

Sets the Content-Id of the MIME object.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

object

a GMimeObject

 

content_id

content-id (addr-spec portion)

 
+
+
+
+
+

g_mime_object_get_content_id ()

+
const char *
+g_mime_object_get_content_id (GMimeObject *object);
+

Gets the Content-Id of the MIME object or NULL if one is not set.

+
+

Parameters

+
+++++ + + + + + +

object

a GMimeObject

 
+
+
+

Returns

+

a const pointer to the Content-Id header.

+
+
+
+
+

g_mime_object_prepend_header ()

+
void
+g_mime_object_prepend_header (GMimeObject *object,
+                              const char *header,
+                              const char *value,
+                              const char *charset);
+

Prepends a new header to the header list.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

object

a GMimeObject

 

header

header name

 

value

header value

 

charset

a charset

 
+
+
+
+
+

g_mime_object_append_header ()

+
void
+g_mime_object_append_header (GMimeObject *object,
+                             const char *header,
+                             const char *value,
+                             const char *charset);
+

Appends a new header to the header list.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

object

a GMimeObject

 

header

header name

 

value

header value

 

charset

a charset

 
+
+
+
+
+

g_mime_object_remove_header ()

+
gboolean
+g_mime_object_remove_header (GMimeObject *object,
+                             const char *header);
+

Removed the specified header if it exists.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

object

a GMimeObject

 

header

header name

 
+
+
+

Returns

+

TRUE if the header was removed or FALSE if it could not +be found.

+
+
+
+
+

g_mime_object_set_header ()

+
void
+g_mime_object_set_header (GMimeObject *object,
+                          const char *header,
+                          const char *value,
+                          const char *charset);
+

Sets a header to the specified value.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

object

a GMimeObject

 

header

header name

 

value

header value

 

charset

a charset

 
+
+
+
+
+

g_mime_object_get_header ()

+
const char *
+g_mime_object_get_header (GMimeObject *object,
+                          const char *header);
+

Gets the value of the first header with the specified name.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

object

a GMimeObject

 

header

header name

 
+
+
+

Returns

+

the value of the requested header if it +exists or NULL otherwise.

+
+
+
+
+

g_mime_object_get_headers ()

+
char *
+g_mime_object_get_headers (GMimeObject *object,
+                           GMimeFormatOptions *options);
+

Allocates a string buffer containing all of the MIME object's raw +headers.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

object

a GMimeObject

 

options

a GMimeFormatOptions or NULL.

[nullable]
+
+
+

Returns

+

an allocated string containing all of the raw MIME headers.

+

Note: The returned string will not be suitable for display.

+
+
+
+
+

g_mime_object_get_header_list ()

+
GMimeHeaderList *
+g_mime_object_get_header_list (GMimeObject *object);
+

Get the header list for object +.

+
+

Parameters

+
+++++ + + + + + +

object

a GMimeObject

 
+
+
+

Returns

+

the GMimeHeaderList for object +. Do not +free this pointer when you are done with it.

+

[transfer none]

+
+
+
+
+

g_mime_object_write_to_stream ()

+
ssize_t
+g_mime_object_write_to_stream (GMimeObject *object,
+                               GMimeFormatOptions *options,
+                               GMimeStream *stream);
+

Write the contents of the MIME object to stream +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

object

a GMimeObject

 

options

a GMimeFormatOptions or NULL.

[nullable]

stream

stream

 
+
+
+

Returns

+

the number of bytes written or -1 on fail.

+
+
+
+
+

g_mime_object_to_string ()

+
char *
+g_mime_object_to_string (GMimeObject *object,
+                         GMimeFormatOptions *options);
+

Allocates a string buffer containing the contents of object +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

object

a GMimeObject

 

options

a GMimeFormatOptions or NULL.

[nullable]
+
+
+

Returns

+

an allocated string containing the contents of the mime +object.

+
+
+
+
+

g_mime_object_encode ()

+
void
+g_mime_object_encode (GMimeObject *object,
+                      GMimeEncodingConstraint constraint);
+

Calculates and sets the most efficient Content-Transfer-Encoding +for this GMimeObject and all child parts based on the constraint + +provided.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

object

a GMimeObject

 

constraint

a GMimeEncodingConstraint

 
+
+
+
+
+

Types and Values

+
+

struct GMimeObject

+
struct GMimeObject;
+

Base class for all MIME parts.

+
+

Members

+
+++++ + +
+
+
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeParamList.html gmime-3.0.1/docs/reference/html/GMimeParamList.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeParamList.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeParamList.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,825 @@ + + + + +GMimeParamList: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeParamList

+

GMimeParamList — Content-Type and Content-Disposition parameters

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
const char * + +g_mime_param_get_name () +
const char * + +g_mime_param_get_value () +
+void + +g_mime_param_set_value () +
const char * + +g_mime_param_get_charset () +
+void + +g_mime_param_set_charset () +
const char * + +g_mime_param_get_lang () +
+void + +g_mime_param_set_lang () +
+GMimeParamEncodingMethod + +g_mime_param_get_encoding_method () +
+void + +g_mime_param_set_encoding_method () +
+GMimeParamList * + +g_mime_param_list_new () +
+GMimeParamList * + +g_mime_param_list_parse () +
+void + +g_mime_param_list_clear () +
+int + +g_mime_param_list_length () +
+void + +g_mime_param_list_set_parameter () +
+GMimeParam * + +g_mime_param_list_get_parameter () +
+GMimeParam * + +g_mime_param_list_get_parameter_at () +
+gboolean + +g_mime_param_list_remove () +
+gboolean + +g_mime_param_list_remove_at () +
+void + +g_mime_param_list_encode () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
structGMimeParam
structGMimeParamList
+
+
+

Object Hierarchy

+
    GObject
+    ├── GMimeParam
+    ╰── GMimeParamList
+
+
+
+

Description

+

A GMimeParam is a parameter name/value pair as found on MIME +header fields such as Content-Type and Content-Disposition.

+
+
+

Functions

+
+

g_mime_param_get_name ()

+
const char *
+g_mime_param_get_name (GMimeParam *param);
+

Gets the name of the parameter.

+
+

Parameters

+
+++++ + + + + + +

param

a GMimeParam

 
+
+
+

Returns

+

the name of the parameter.

+
+
+
+
+

g_mime_param_get_value ()

+
const char *
+g_mime_param_get_value (GMimeParam *param);
+

Gets the value of the parameter.

+
+

Parameters

+
+++++ + + + + + +

param

a GMimeParam

 
+
+
+

Returns

+

the value of the parameter.

+
+
+
+
+

g_mime_param_set_value ()

+
void
+g_mime_param_set_value (GMimeParam *param,
+                        const char *value);
+

Sets the parameter value to value +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

param

a GMimeParam

 

value

the new parameter value

 
+
+
+
+
+

g_mime_param_get_charset ()

+
const char *
+g_mime_param_get_charset (GMimeParam *param);
+

Gets the charset used for encoding the parameter.

+
+

Parameters

+
+++++ + + + + + +

param

a GMimeParam

 
+
+
+

Returns

+

the charset used for encoding the parameter.

+
+
+
+
+

g_mime_param_set_charset ()

+
void
+g_mime_param_set_charset (GMimeParam *param,
+                          const char *charset);
+

Sets the parameter charset used for encoding the value.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

param

a GMimeParam

 

charset

the charset or NULL to use the default

 
+
+
+
+
+

g_mime_param_get_lang ()

+
const char *
+g_mime_param_get_lang (GMimeParam *param);
+

Gets the language specifier used for encoding the parameter.

+
+

Parameters

+
+++++ + + + + + +

param

a GMimeParam

 
+
+
+

Returns

+

the language specifier used for encoding the parameter.

+
+
+
+
+

g_mime_param_set_lang ()

+
void
+g_mime_param_set_lang (GMimeParam *param,
+                       const char *lang);
+

Sets the parameter language specifier used for encoding the value.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

param

a GMimeParam

 

lang

the language specifier

 
+
+
+
+
+

g_mime_param_get_encoding_method ()

+
GMimeParamEncodingMethod
+g_mime_param_get_encoding_method (GMimeParam *param);
+

Gets the encoding method used for encoding the parameter.

+
+

Parameters

+
+++++ + + + + + +

param

a GMimeParam

 
+
+
+

Returns

+

the encoding method used for encoding the parameter.

+
+
+
+
+

g_mime_param_set_encoding_method ()

+
void
+g_mime_param_set_encoding_method (GMimeParam *param,
+                                  GMimeParamEncodingMethod method);
+

Sets the encoding method used for encoding the value.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

param

a GMimeParam

 

method

a GMimeParamEncodingMethod

 
+
+
+
+
+

g_mime_param_list_new ()

+
GMimeParamList *
+g_mime_param_list_new (void);
+

Creates a new Content-Type or Content-Disposition parameter list.

+
+

Returns

+

a new GMimeParamList.

+
+
+
+
+

g_mime_param_list_parse ()

+
GMimeParamList *
+g_mime_param_list_parse (GMimeParserOptions *options,
+                         const char *str);
+

Parses the input string into a parameter list.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

options

a GMimeParserOptions or NULL

 

str

a string to parse

 
+
+
+

Returns

+

a new GMimeParamList.

+

[transfer full]

+
+
+
+
+

g_mime_param_list_clear ()

+
void
+g_mime_param_list_clear (GMimeParamList *list);
+

Clears the list of parameters.

+
+

Parameters

+
+++++ + + + + + +

list

a GMimeParamList

 
+
+
+
+
+

g_mime_param_list_length ()

+
int
+g_mime_param_list_length (GMimeParamList *list);
+

Gets the length of the list.

+
+

Parameters

+
+++++ + + + + + +

list

a GMimeParamList

 
+
+
+

Returns

+

the number of GMimeParam items in the list.

+
+
+
+
+

g_mime_param_list_set_parameter ()

+
void
+g_mime_param_list_set_parameter (GMimeParamList *list,
+                                 const char *name,
+                                 const char *value);
+

Sets the specified parameter to value +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

list

a GMimeParamList

 

name

The name of the parameter

 

value

The parameter value

 
+
+
+
+
+

g_mime_param_list_get_parameter ()

+
GMimeParam *
+g_mime_param_list_get_parameter (GMimeParamList *list,
+                                 const char *name);
+

Gets the GMimeParam with the given name +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

list

list: a GMimeParamList

 

name

the name of the parameter

 
+
+
+

Returns

+

the requested GMimeParam.

+

[transfer none]

+
+
+
+
+

g_mime_param_list_get_parameter_at ()

+
GMimeParam *
+g_mime_param_list_get_parameter_at (GMimeParamList *list,
+                                    int index);
+

Gets the GMimeParam at the specified index +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

list

a GMimeParamList

 

index

the index of the requested parameter

 
+
+
+

Returns

+

the GMimeParam at the specified index.

+

[transfer none]

+
+
+
+
+

g_mime_param_list_remove ()

+
gboolean
+g_mime_param_list_remove (GMimeParamList *list,
+                          const char *name);
+

Removes a parameter from the GMimeParamList.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

list

a GMimeParamList

 

name

the name of the parameter

 
+
+
+

Returns

+

TRUE if the specified parameter was removed or FALSE otherwise.

+
+
+
+
+

g_mime_param_list_remove_at ()

+
gboolean
+g_mime_param_list_remove_at (GMimeParamList *list,
+                             int index);
+

Removes a GMimeParam from the GMimeParamList at the specified index.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

list

a GMimeParamList

 

index

index of the param to remove

 
+
+
+

Returns

+

TRUE if a GMimeParam was removed or FALSE otherwise.

+
+
+
+
+

g_mime_param_list_encode ()

+
void
+g_mime_param_list_encode (GMimeParamList *list,
+                          GMimeFormatOptions *options,
+                          gboolean fold,
+                          GString *str);
+

Encodes the parameter list into str +, folding lines if required.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

list

a GMimeParamList

 

options

a GMimeFormatOptions or NULL

 

fold

TRUE if the parameter list should be folded; otherwise, FALSE

 

str

the output string buffer

 
+
+
+
+
+

Types and Values

+
+

struct GMimeParam

+
struct GMimeParam;
+

A parameter name/value pair as used in the Content-Type and Content-Disposition headers.

+
+

Members

+
+++++ + +
+
+
+
+
+

struct GMimeParamList

+
struct GMimeParamList;
+

A list of Content-Type or Content-Disposition parameters.

+
+
+
+

See Also

+

GMimeContentType

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeParser.html gmime-3.0.1/docs/reference/html/GMimeParser.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeParser.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeParser.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,919 @@ + + + + +GMimeParser: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeParser

+

GMimeParser — Message and MIME part parser

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+void + +(*GMimeParserHeaderRegexFunc) () +
+GMimeParser * + +g_mime_parser_new () +
+GMimeParser * + +g_mime_parser_new_with_stream () +
+void + +g_mime_parser_init_with_stream () +
+gboolean + +g_mime_parser_get_persist_stream () +
+void + +g_mime_parser_set_persist_stream () +
+GMimeFormat + +g_mime_parser_get_format () +
+void + +g_mime_parser_set_format () +
+gboolean + +g_mime_parser_get_respect_content_length () +
+void + +g_mime_parser_set_respect_content_length () +
+void + +g_mime_parser_set_header_regex () +
+gint64 + +g_mime_parser_tell () +
+gboolean + +g_mime_parser_eos () +
+GMimeObject * + +g_mime_parser_construct_part () +
+GMimeMessage * + +g_mime_parser_construct_message () +
+char * + +g_mime_parser_get_mbox_marker () +
+gint64 + +g_mime_parser_get_mbox_marker_offset () +
+gint64 + +g_mime_parser_get_headers_begin () +
+gint64 + +g_mime_parser_get_headers_end () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
structGMimeParser
enumGMimeFormat
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeParser
+
+
+
+

Description

+

A GMimeParser parses a stream into a GMimeMessage or other +GMimeObject and can also handle parsing MBox formatted streams +into multiple GMimeMessage objects.

+
+
+

Functions

+
+

GMimeParserHeaderRegexFunc ()

+
void
+(*GMimeParserHeaderRegexFunc) (GMimeParser *parser,
+                               const char *header,
+                               const char *value,
+                               gint64 offset,
+                               gpointer user_data);
+

Function signature for the callback to +g_mime_parser_set_header_regex().

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

parser

The GMimeParser object.

 

header

The header field matched.

 

value

The header field value.

 

offset

The header field offset.

 

user_data

The user-supplied callback data.

 
+
+
+
+
+

g_mime_parser_new ()

+
GMimeParser *
+g_mime_parser_new (void);
+

Creates a new parser object.

+
+

Returns

+

a new parser object.

+
+
+
+
+

g_mime_parser_new_with_stream ()

+
GMimeParser *
+g_mime_parser_new_with_stream (GMimeStream *stream);
+

Creates a new parser object preset to parse stream +.

+
+

Parameters

+
+++++ + + + + + +

stream

raw message or part stream

 
+
+
+

Returns

+

a new parser object.

+
+
+
+
+

g_mime_parser_init_with_stream ()

+
void
+g_mime_parser_init_with_stream (GMimeParser *parser,
+                                GMimeStream *stream);
+

Initializes parser + to use stream +.

+

WARNING: Initializing a parser with a stream is comparable to +selling your soul (stream +) to the devil (parser +). You are +basically giving the parser complete control of the stream, this +means that you had better not touch the stream so long as the +parser is still using it. This means no reading, writing, seeking, +or resetting of the stream. Anything that will/could change the +current stream's offset is PROHIBITED.

+

It is also recommended that you not use g_mime_stream_tell() +because it will not necessarily give you the current parser + offset +since parser + handles its own internal read-ahead buffer. Instead, +it is recommended that you use g_mime_parser_tell() if you have a +reason to need the current offset of the parser +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

parser

a GMimeParser context

 

stream

raw message or part stream

 
+
+
+
+
+

g_mime_parser_get_persist_stream ()

+
gboolean
+g_mime_parser_get_persist_stream (GMimeParser *parser);
+

Gets whether or not the underlying stream is persistent.

+
+

Parameters

+
+++++ + + + + + +

parser

a GMimeParser context

 
+
+
+

Returns

+

TRUE if the parser +will leave the content on disk or +FALSE if it will load the content into memory.

+
+
+
+
+

g_mime_parser_set_persist_stream ()

+
void
+g_mime_parser_set_persist_stream (GMimeParser *parser,
+                                  gboolean persist);
+

Sets whether or not the parser +'s underlying stream is persistent.

+

If persist + is TRUE, the parser + will attempt to construct +messages/parts whose content will remain on disk rather than being +loaded into memory so as to reduce memory usage. This is the default.

+

If persist + is FALSE, the parser + will always load message content +into memory.

+

Note: This attribute only serves as a hint to the parser +. If the +underlying stream does not support seeking, then this attribute +will be ignored.

+

By default, this feature is enabled if the underlying stream is seekable.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

parser

a GMimeParser context

 

persist

persist attribute

 
+
+
+
+
+

g_mime_parser_get_format ()

+
GMimeFormat
+g_mime_parser_get_format (GMimeParser *parser);
+

Gets the format that the parser is set to parse.

+
+

Parameters

+
+++++ + + + + + +

parser

a GMimeParser context

 
+
+
+

Returns

+

the format that the parser is set to parse.

+
+
+
+
+

g_mime_parser_set_format ()

+
void
+g_mime_parser_set_format (GMimeParser *parser,
+                          GMimeFormat format);
+

Sets the format that the parser should expect the stream to be in.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

parser

a GMimeParser context

 

format

a GMimeFormat

 
+
+
+
+
+

g_mime_parser_get_respect_content_length ()

+
gboolean
+g_mime_parser_get_respect_content_length
+                               (GMimeParser *parser);
+

Gets whether or not parser + is set to use Content-Length for +determining the offset of the end of the message.

+
+

Parameters

+
+++++ + + + + + +

parser

a GMimeParser context

 
+
+
+

Returns

+

whether or not parser +is set to use Content-Length for +determining the offset of the end of the message.

+
+
+
+
+

g_mime_parser_set_respect_content_length ()

+
void
+g_mime_parser_set_respect_content_length
+                               (GMimeParser *parser,
+                                gboolean respect_content_length);
+

Sets whether or not parser + should respect Content-Length headers +when deciding where to look for the start of the next message. Only +used when the parser is also set to scan for From-lines.

+

Most notably useful when parsing broken Solaris mbox files (See +http://www.jwz.org/doc/content-length.html for details).

+

By default, this feature is disabled.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

parser

a GMimeParser context

 

respect_content_length

TRUE if the parser should use Content-Length headers or FALSE otherwise.

 
+
+
+
+
+

g_mime_parser_set_header_regex ()

+
void
+g_mime_parser_set_header_regex (GMimeParser *parser,
+                                const char *regex,
+                                GMimeParserHeaderRegexFunc header_cb,
+                                gpointer user_data);
+

Sets the regular expression pattern regex + on parser +. Whenever a +header matching the pattern regex + is parsed, header_cb + is called +with user_data + as the user_data argument.

+

If regex + is NULL, then the previously registered regex callback +is unregistered and no new callback is set.

+

[skip]

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

parser

a GMimeParser context

 

regex

regular expression

 

header_cb

callback function

 

user_data

user data

 
+
+
+
+
+

g_mime_parser_tell ()

+
gint64
+g_mime_parser_tell (GMimeParser *parser);
+

Gets the current stream offset from the parser's internal stream.

+
+

Parameters

+
+++++ + + + + + +

parser

a GMimeParser context

 
+
+
+

Returns

+

the current stream offset from the parser's internal stream +or -1 on error.

+
+
+
+
+

g_mime_parser_eos ()

+
gboolean
+g_mime_parser_eos (GMimeParser *parser);
+

Tests the end-of-stream indicator for parser +'s internal stream.

+
+

Parameters

+
+++++ + + + + + +

parser

a GMimeParser context

 
+
+
+

Returns

+

TRUE on EOS or FALSE otherwise.

+
+
+
+
+

g_mime_parser_construct_part ()

+
GMimeObject *
+g_mime_parser_construct_part (GMimeParser *parser,
+                              GMimeParserOptions *options);
+

Constructs a MIME part from parser +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

parser

a GMimeParser context

 

options

a GMimeParserOptions or NULL.

[nullable]
+
+
+

Returns

+

a MIME part based on parser +or NULL on +fail.

+

[nullable][transfer full]

+
+
+
+
+

g_mime_parser_construct_message ()

+
GMimeMessage *
+g_mime_parser_construct_message (GMimeParser *parser,
+                                 GMimeParserOptions *options);
+

Constructs a MIME message from parser +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

parser

a GMimeParser context

 

options

a GMimeParserOptions or NULL.

[nullable]
+
+
+

Returns

+

a MIME message or NULL on fail.

+

[nullable][transfer full]

+
+
+
+
+

g_mime_parser_get_mbox_marker ()

+
char *
+g_mime_parser_get_mbox_marker (GMimeParser *parser);
+

Gets the mbox-style From-line of the most recently parsed message +(gotten from g_mime_parser_construct_message()).

+
+

Parameters

+
+++++ + + + + + +

parser

a GMimeParser context

 
+
+
+

Returns

+

the mbox-style From-line of the most recently parsed +message or NULL on error.

+

[nullable]

+
+
+
+
+

g_mime_parser_get_mbox_marker_offset ()

+
gint64
+g_mime_parser_get_mbox_marker_offset (GMimeParser *parser);
+

Gets the offset of the most recently parsed mbox-style From-line +(gotten from g_mime_parser_construct_message()).

+
+

Parameters

+
+++++ + + + + + +

parser

a GMimeParser context

 
+
+
+

Returns

+

the offset of the most recently parsed mbox-style From-line +or -1 on error.

+
+
+
+
+

g_mime_parser_get_headers_begin ()

+
gint64
+g_mime_parser_get_headers_begin (GMimeParser *parser);
+

Gets the stream offset of the beginning of the headers of the most +recently parsed message.

+
+

Parameters

+
+++++ + + + + + +

parser

a GMimeParser context

 
+
+
+

Returns

+

the offset of the beginning of the headers of the most +recently parsed message or -1 on error.

+
+
+
+
+

g_mime_parser_get_headers_end ()

+
gint64
+g_mime_parser_get_headers_end (GMimeParser *parser);
+

Gets the stream offset of the end of the headers of the most +recently parsed message.

+
+

Parameters

+
+++++ + + + + + +

parser

a GMimeParser context

 
+
+
+

Returns

+

the offset of the end of the headers of the most recently +parsed message or -1 on error.

+
+
+
+
+

Types and Values

+
+

struct GMimeParser

+
struct GMimeParser;
+

A MIME parser context.

+
+

Members

+
+++++ + +
+
+
+
+
+

enum GMimeFormat

+

An enum of formats.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + +

GMIME_FORMAT_MESSAGE

+

The stream contains a single message.

+
 

GMIME_FORMAT_MBOX

+

The stream is in the UNIX mbox format.

+
 

GMIME_FORMAT_MMDF

+

The stream is in the MMDF format.

+
 
+
+
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimePart.html gmime-3.0.1/docs/reference/html/GMimePart.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimePart.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimePart.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,1136 @@ + + + + +GMimePart: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimePart

+

GMimePart — MIME parts

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GMimePart * + +g_mime_part_new () +
+GMimePart * + +g_mime_part_new_with_type () +
+gboolean + +g_mime_part_is_attachment () +
+void + +g_mime_part_set_content_description () +
const char * + +g_mime_part_get_content_description () +
+void + +g_mime_part_set_content_id () +
const char * + +g_mime_part_get_content_id () +
+void + +g_mime_part_set_content_md5 () +
const char * + +g_mime_part_get_content_md5 () +
+gboolean + +g_mime_part_verify_content_md5 () +
+void + +g_mime_part_set_content_location () +
const char * + +g_mime_part_get_content_location () +
+void + +g_mime_part_set_content_encoding () +
+GMimeContentEncoding + +g_mime_part_get_content_encoding () +
+GMimeContentEncoding + +g_mime_part_get_best_content_encoding () +
+void + +g_mime_part_set_filename () +
const char * + +g_mime_part_get_filename () +
+GMimeDataWrapper * + +g_mime_part_get_content () +
+void + +g_mime_part_set_content () +
+GMimeOpenPGPData + +g_mime_part_get_openpgp_data () +
+void + +g_mime_part_set_openpgp_data () +
+gboolean + +g_mime_part_openpgp_encrypt () +
+GMimeDecryptResult * + +g_mime_part_openpgp_decrypt () +
+gboolean + +g_mime_part_openpgp_sign () +
+GMimeSignatureList * + +g_mime_part_openpgp_verify () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
structGMimePart
enumGMimeOpenPGPData
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeObject
+        ╰── GMimePart
+            ├── GMimeApplicationPkcs7Mime
+            ├── GMimeMessagePartial
+            ╰── GMimeTextPart
+
+
+
+

Description

+

A GMimePart represents any MIME leaf part (meaning it has no +sub-parts).

+
+
+

Functions

+
+

g_mime_part_new ()

+
GMimePart *
+g_mime_part_new (void);
+

Creates a new MIME Part object with a default content-type of +application/octet-stream.

+
+

Returns

+

an empty MIME Part object with a default content-type of +application/octet-stream.

+
+
+
+
+

g_mime_part_new_with_type ()

+
GMimePart *
+g_mime_part_new_with_type (const char *type,
+                           const char *subtype);
+

Creates a new MIME Part with a sepcified type.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

type

content-type string

 

subtype

content-subtype string

 
+
+
+

Returns

+

an empty MIME Part object with the specified content-type.

+
+
+
+
+

g_mime_part_is_attachment ()

+
gboolean
+g_mime_part_is_attachment (GMimePart *mime_part);
+

Determines whether or not the part is an attachment based on the +value of the Content-Disposition header.

+
+

Parameters

+
+++++ + + + + + +

mime_part

a GMimePart object

 
+
+
+

Returns

+

TRUE if the part is an attachment, otherwise FALSE.

+
+
+
+
+

g_mime_part_set_content_description ()

+
void
+g_mime_part_set_content_description (GMimePart *mime_part,
+                                     const char *description);
+

Set the content description for the specified mime part.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

mime_part

a GMimePart object

 

description

content description

 
+
+
+
+
+

g_mime_part_get_content_description ()

+
const char *
+g_mime_part_get_content_description (GMimePart *mime_part);
+

Gets the value of the Content-Description for the specified mime +part if it exists or NULL otherwise.

+
+

Parameters

+
+++++ + + + + + +

mime_part

a GMimePart object

 
+
+
+

Returns

+

the content description for the specified mime part.

+
+
+
+
+

g_mime_part_set_content_id ()

+
void
+g_mime_part_set_content_id (GMimePart *mime_part,
+                            const char *content_id);
+

Set the content id for the specified mime part.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

mime_part

a GMimePart object

 

content_id

content id

 
+
+
+
+
+

g_mime_part_get_content_id ()

+
const char *
+g_mime_part_get_content_id (GMimePart *mime_part);
+

Gets the content-id of the specified mime part if it exists, or +NULL otherwise.

+
+

Parameters

+
+++++ + + + + + +

mime_part

a GMimePart object

 
+
+
+

Returns

+

the content id for the specified mime part.

+
+
+
+
+

g_mime_part_set_content_md5 ()

+
void
+g_mime_part_set_content_md5 (GMimePart *mime_part,
+                             const char *content_md5);
+

Set the content md5 for the specified mime part.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

mime_part

a GMimePart object

 

content_md5

content md5 or NULL to generate the md5 digest.

 
+
+
+
+
+

g_mime_part_get_content_md5 ()

+
const char *
+g_mime_part_get_content_md5 (GMimePart *mime_part);
+

Gets the md5sum contained in the Content-Md5 header of the +specified mime part if it exists, or NULL otherwise.

+
+

Parameters

+
+++++ + + + + + +

mime_part

a GMimePart object

 
+
+
+

Returns

+

the content md5 for the specified mime part.

+
+
+
+
+

g_mime_part_verify_content_md5 ()

+
gboolean
+g_mime_part_verify_content_md5 (GMimePart *mime_part);
+

Verify the content md5 for the specified mime part.

+
+

Parameters

+
+++++ + + + + + +

mime_part

a GMimePart object

 
+
+
+

Returns

+

TRUE if the md5 is valid or FALSE otherwise. Note: will +return FALSE if the mime part does not contain a Content-MD5.

+
+
+
+
+

g_mime_part_set_content_location ()

+
void
+g_mime_part_set_content_location (GMimePart *mime_part,
+                                  const char *content_location);
+

Set the content location for the specified mime part.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

mime_part

a GMimePart object

 

content_location

content location

 
+
+
+
+
+

g_mime_part_get_content_location ()

+
const char *
+g_mime_part_get_content_location (GMimePart *mime_part);
+

Gets the value of the Content-Location header if it exists, or +NULL otherwise.

+
+

Parameters

+
+++++ + + + + + +

mime_part

a GMimePart object

 
+
+
+

Returns

+

the content location for the specified mime part.

+
+
+
+
+

g_mime_part_set_content_encoding ()

+
void
+g_mime_part_set_content_encoding (GMimePart *mime_part,
+                                  GMimeContentEncoding encoding);
+

Set the content encoding for the specified mime part.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

mime_part

a GMimePart object

 

encoding

a GMimeContentEncoding

 
+
+
+
+
+

g_mime_part_get_content_encoding ()

+
GMimeContentEncoding
+g_mime_part_get_content_encoding (GMimePart *mime_part);
+

Gets the content encoding of the mime part.

+
+

Parameters

+
+++++ + + + + + +

mime_part

a GMimePart object

 
+
+
+

Returns

+

the content encoding for the specified mime part.

+
+
+
+
+

g_mime_part_get_best_content_encoding ()

+
GMimeContentEncoding
+g_mime_part_get_best_content_encoding (GMimePart *mime_part,
+                                       GMimeEncodingConstraint constraint);
+

Calculates the most efficient content encoding for the mime_part + +given the constraint +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

mime_part

a GMimePart object

 

constraint

a GMimeEncodingConstraint

 
+
+
+

Returns

+

the best content encoding for the specified mime part.

+
+
+
+
+

g_mime_part_set_filename ()

+
void
+g_mime_part_set_filename (GMimePart *mime_part,
+                          const char *filename);
+

Sets the "filename" parameter on the Content-Disposition and also sets the +"name" parameter on the Content-Type.

+

Note: The filename + string should be in UTF-8.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

mime_part

a GMimePart object

 

filename

the file name

 
+
+
+
+
+

g_mime_part_get_filename ()

+
const char *
+g_mime_part_get_filename (GMimePart *mime_part);
+

Gets the filename of the specificed mime part, or NULL if the +mime_part + does not have the filename or name parameter set.

+
+

Parameters

+
+++++ + + + + + +

mime_part

a GMimePart object

 
+
+
+

Returns

+

the filename of the specified mime_part +or NULL if +neither of the parameters is set. If a file name is set, the +returned string will be in UTF-8.

+
+
+
+
+

g_mime_part_get_content ()

+
GMimeDataWrapper *
+g_mime_part_get_content (GMimePart *mime_part);
+

Gets the internal data-wrapper of the specified mime part, or NULL +on error.

+
+

Parameters

+
+++++ + + + + + +

mime_part

a GMimePart object

 
+
+
+

Returns

+

the data-wrapper for the mime part's +contents.

+

[transfer none]

+
+
+
+
+

g_mime_part_set_content ()

+
void
+g_mime_part_set_content (GMimePart *mime_part,
+                         GMimeDataWrapper *content);
+

Sets the content on the mime part.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

mime_part

a GMimePart object

 

content

a GMimeDataWrapper content object

 
+
+
+
+
+

g_mime_part_get_openpgp_data ()

+
GMimeOpenPGPData
+g_mime_part_get_openpgp_data (GMimePart *mime_part);
+

Gets whether or not (and what type) of OpenPGP data is contained +within the GMimePart.

+
+

Parameters

+
+++++ + + + + + +

mime_part

a GMimePart

 
+
+
+

Returns

+

a GMimeOpenPGPData.

+
+
+
+
+

g_mime_part_set_openpgp_data ()

+
void
+g_mime_part_set_openpgp_data (GMimePart *mime_part,
+                              GMimeOpenPGPData data);
+

Sets whether or not (and what type) of OpenPGP data is contained +within the GMimePart.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

mime_part

a GMimePart

 

data

a GMimeOpenPGPData

 
+
+
+
+
+

g_mime_part_openpgp_encrypt ()

+
gboolean
+g_mime_part_openpgp_encrypt (GMimePart *mime_part,
+                             gboolean sign,
+                             const char *userid,
+                             GMimeEncryptFlags flags,
+                             GPtrArray *recipients,
+                             GError **err);
+

Encrypts (and optionally signs) the content of the mime_part + and then replaces +the content with the new, encrypted, content.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

mime_part

a GMimePart

 

sign

TRUE if the content should also be signed; otherwise, FALSE

 

userid

the key id (or email address) to use when signing (assuming sign +is TRUE).

[nullable]

flags

a set of GMimeEncryptFlags

 

recipients

an array of recipient key ids and/or email addresses.

[element-type utf8]

err

a GError

 
+
+
+

Returns

+

TRUE on success or FALSE on error.

+
+
+
+
+

g_mime_part_openpgp_decrypt ()

+
GMimeDecryptResult *
+g_mime_part_openpgp_decrypt (GMimePart *mime_part,
+                             GMimeDecryptFlags flags,
+                             const char *session_key,
+                             GError **err);
+

Decrypts the content of the mime_part + and then replaces the content with +the new, decrypted, content.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

mime_part

a GMimePart

 

flags

a set of GMimeDecryptFlags

 

session_key

the session key to use or NULL.

[nullable]

err

a GError

 
+
+
+

Returns

+

a GMimeDecryptResult on success or NULL on error.

+

[nullable][transfer full]

+
+
+
+
+

g_mime_part_openpgp_sign ()

+
gboolean
+g_mime_part_openpgp_sign (GMimePart *mime_part,
+                          const char *userid,
+                          GError **err);
+

Signs the content of the mime_part + and then replaces the content with +the new, signed, content.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

mime_part

a GMimePart

 

userid

the key id (or email address) to use for signing

 

err

a GError

 
+
+
+

Returns

+

TRUE on success or FALSE on error.

+
+
+
+
+

g_mime_part_openpgp_verify ()

+
GMimeSignatureList *
+g_mime_part_openpgp_verify (GMimePart *mime_part,
+                            GMimeVerifyFlags flags,
+                            GError **err);
+

Verifies the OpenPGP signature of the mime_part + and then replaces the content +with the original, raw, content.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

mime_part

a GMimePart

 

flags

a set of GMimeVerifyFlags

 

err

a GError

 
+
+
+

Returns

+

a GMimeSignatureList on success or NULL on error.

+

[nullable][transfer full]

+
+
+
+
+

Types and Values

+
+

struct GMimePart

+
struct GMimePart;
+

A leaf-node MIME part object.

+
+

Members

+
+++++ + +
+
+
+
+
+

enum GMimeOpenPGPData

+

The type of OpenPGP data contained within the content of the GMimePart, if any.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + +

GMIME_OPENPGP_DATA_NONE

+

The GMimePart does not contain any OpenPGP data.

+
 

GMIME_OPENPGP_DATA_ENCRYPTED

+

The GMimePart contains OpenPGP encrypted data.

+
 

GMIME_OPENPGP_DATA_SIGNED

+

The GMimePart contains OpenPGP signed data.

+
 
+
+
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimePkcs7Context.html gmime-3.0.1/docs/reference/html/GMimePkcs7Context.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimePkcs7Context.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimePkcs7Context.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,106 @@ + + + + +GMimePkcs7Context: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimePkcs7Context

+

GMimePkcs7Context — PKCS7 crypto contexts

+
+
+

Functions

+
++++ + + + + +
+GMimeCryptoContext * + +g_mime_pkcs7_context_new () +
+
+
+

Types and Values

+
++++ + + + + +
 GMimePkcs7Context
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeCryptoContext
+        ╰── GMimePkcs7Context
+
+
+
+

Description

+

A GMimePkcs7Context is a GMimeCryptoContext that uses GnuPG to do +all of the encryption and digital signatures.

+
+
+

Functions

+
+

g_mime_pkcs7_context_new ()

+
GMimeCryptoContext *
+g_mime_pkcs7_context_new (void);
+

Creates a new pkcs7 crypto context object.

+
+

Returns

+

a new pkcs7 crypto context object.

+

[transfer full]

+
+
+
+
+

Types and Values

+
+

GMimePkcs7Context

+
typedef struct _GMimePkcs7Context GMimePkcs7Context;
+

A PKCS7 crypto context.

+
+
+
+

See Also

+

GMimeCryptoContext

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/gmime-question-index.html gmime-3.0.1/docs/reference/html/gmime-question-index.html --- gmime-2.6.22+dfsg2/docs/reference/html/gmime-question-index.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/gmime-question-index.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,130 @@ + + + + +Frequently Asked Questions: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Frequently Asked Questions

+

Frequently Asked Questions — +Find answers to common questions in the GMime manual +

+
+
+

Questions and Answers

+

This is an "index" of the reference manual + organized by common "How do I..." questions. If you + aren't sure which documentation to read for the question you have, + this list is a good place to start. +

+
+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+1. General
+

1.1.

+

Where can I get help with GMime, submit a bug report, or make a feature request?

See the documentation on this + topic.

+

1.2.

+

How do I port from one GMime version to another?

See the list of + incompatible changes from 2.6 to 3.0.

+

1.3.

+

How does memory management work in GMime? Should I free data returned from functions?

+

Most accessor functions return a pointer to internal + members. When these internal members are objects + themselves (e.g. subclasses + of GObject), + there is no need to unref them unless otherwise stated in + the documentation for that particular function.

+

For accessor functions that return strings, they will be + declared "const" if they should not be freed. Non-const + strings should be freed with g_free().

+
+

1.4.

+

How do I use GMime with threads?

+

First, read the GThread documentation for + portable threading primitives.

+

Objects subclassing + GObject + are not thread-safe. This means that you'll have to do your own mutex + locking if you want to access the same GObjects from + multiple threads. +

+
+

1.5.

+

How do I use GMime with C++?

The GMime header files use the subset of C that's + also valid C++, so you can simply use the normal GMime API + in a C++ program.

+
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/gmime-resources.html gmime-3.0.1/docs/reference/html/gmime-resources.html --- gmime-2.6.22+dfsg2/docs/reference/html/gmime-resources.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/gmime-resources.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,76 @@ + + + + +Mailing lists and bug reports: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Mailing lists and bug reports

+

Mailing lists and bug reports — +Getting help with GMime +

+
+
+

Filing a bug report or feature request

+

+If you encounter a bug, misfeature, or missing feature in GMime, please +file a bug report at +https://github.com/jstedfast/gmime/issues. +We'd also appreciate reports of incomplete or misleading information in +the GMime documentation. +

+

+The issue tracker should also be used for feature requests, it's not only for bugs. +We track all GMime development in GitHub's issue tracker, so it's the way to be sure +that the GMime developers won't forget about an issue. +

+
+
+

Submitting Patches

+

+If you develop a bugfix or enhancement for GMime, please submit a pull request +if you can. Sending the patch (as generated by a diff -u) to +the mailing-list also works (although a pull request is preferred). Note that +all patches must be offered under the terms of the +LGPLv2.1 +license, so be sure you are authorized to give us the patch under +those terms. +

+

+If you want to discuss your patch before or after developing it, mail +gmime-devel-list@gnome.org. +

+
+
+

Mailing lists

+

There is currently only one mailing-list devoted to GMime + itself which is for both the development of and development with + GMime. You can subscribe to this list + at http://mail.gnome.org/mailman/listinfo/gmime-devel-list. +

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeSignature.html gmime-3.0.1/docs/reference/html/GMimeSignature.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeSignature.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeSignature.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,967 @@ + + + + +GMimeSignature: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeSignature

+

GMimeSignature — Digital signatures

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GMimeSignature * + +g_mime_signature_new () +
+GMimeCertificate * + +g_mime_signature_get_certificate () +
+void + +g_mime_signature_set_certificate () +
+GMimeSignatureStatus + +g_mime_signature_get_status () +
+void + +g_mime_signature_set_status () +
+time_t + +g_mime_signature_get_created () +
+void + +g_mime_signature_set_created () +
+time_t + +g_mime_signature_get_expires () +
+void + +g_mime_signature_set_expires () +
+GMimeSignatureList * + +g_mime_signature_list_new () +
+int + +g_mime_signature_list_length () +
+void + +g_mime_signature_list_clear () +
+int + +g_mime_signature_list_add () +
+void + +g_mime_signature_list_insert () +
+gboolean + +g_mime_signature_list_remove () +
+gboolean + +g_mime_signature_list_remove_at () +
+gboolean + +g_mime_signature_list_contains () +
+int + +g_mime_signature_list_index_of () +
+GMimeSignature * + +g_mime_signature_list_get_signature () +
+void + +g_mime_signature_list_set_signature () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + + + + + +
enumGMimeSignatureStatus
structGMimeSignature
structGMimeSignatureList
+
+
+

Object Hierarchy

+
    GObject
+    ├── GMimeSignature
+    ╰── GMimeSignatureList
+
+
+
+

Description

+

A GMimeSignature is an object containing useful information about a +digital signature as used in signing and encrypting data.

+
+
+

Functions

+
+

g_mime_signature_new ()

+
GMimeSignature *
+g_mime_signature_new (void);
+

Creates a new GMimeSignature object.

+
+

Returns

+

a new GMimeSignature object.

+
+
+
+
+

g_mime_signature_get_certificate ()

+
GMimeCertificate *
+g_mime_signature_get_certificate (GMimeSignature *sig);
+

Get the signature's certificate.

+
+

Parameters

+
+++++ + + + + + +

sig

a GMimeSignature

 
+
+
+

Returns

+

the signature's certificate.

+

[transfer none]

+
+
+
+
+

g_mime_signature_set_certificate ()

+
void
+g_mime_signature_set_certificate (GMimeSignature *sig,
+                                  GMimeCertificate *cert);
+

Set the signature's certificate.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

sig

a GMimeSignature

 

cert

a GMimeCertificate

 
+
+
+
+
+

g_mime_signature_get_status ()

+
GMimeSignatureStatus
+g_mime_signature_get_status (GMimeSignature *sig);
+

Get the signature status as a bitfield of GMimeSignatureStatus flags.

+
+

Parameters

+
+++++ + + + + + +

sig

a GMimeSignature

 
+
+
+

Returns

+

the signature status.

+
+
+
+
+

g_mime_signature_set_status ()

+
void
+g_mime_signature_set_status (GMimeSignature *sig,
+                             GMimeSignatureStatus status);
+

Set the status on the signature.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

sig

a GMimeSignature

 

status

a GMimeSignatureStatus

 
+
+
+
+
+

g_mime_signature_get_created ()

+
time_t
+g_mime_signature_get_created (GMimeSignature *sig);
+

Get the creation date of the signature.

+
+

Parameters

+
+++++ + + + + + +

sig

a GMimeSignature

 
+
+
+

Returns

+

the creation date of the signature or -1 if unknown.

+
+
+
+
+

g_mime_signature_set_created ()

+
void
+g_mime_signature_set_created (GMimeSignature *sig,
+                              time_t created);
+

Set the creation date of the signature.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

sig

a GMimeSignature

 

created

creation date

 
+
+
+
+
+

g_mime_signature_get_expires ()

+
time_t
+g_mime_signature_get_expires (GMimeSignature *sig);
+

Get the expiration date of the signature.

+
+

Parameters

+
+++++ + + + + + +

sig

a GMimeSignature

 
+
+
+

Returns

+

the expiration date of the signature or -1 if unknown.

+
+
+
+
+

g_mime_signature_set_expires ()

+
void
+g_mime_signature_set_expires (GMimeSignature *sig,
+                              time_t expires);
+

Set the expiration date of the signature.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

sig

a GMimeSignature

 

expires

expiration date

 
+
+
+
+
+

g_mime_signature_list_new ()

+
GMimeSignatureList *
+g_mime_signature_list_new (void);
+

Creates a new GMimeSignatureList.

+
+

Returns

+

a new GMimeSignatureList.

+
+
+
+
+

g_mime_signature_list_length ()

+
int
+g_mime_signature_list_length (GMimeSignatureList *list);
+

Gets the length of the list.

+
+

Parameters

+
+++++ + + + + + +

list

a GMimeSignatureList

 
+
+
+

Returns

+

the number of GMimeSignature objects in the list.

+
+
+
+
+

g_mime_signature_list_clear ()

+
void
+g_mime_signature_list_clear (GMimeSignatureList *list);
+

Clears the list of addresses.

+
+

Parameters

+
+++++ + + + + + +

list

a GMimeSignatureList

 
+
+
+
+
+

g_mime_signature_list_add ()

+
int
+g_mime_signature_list_add (GMimeSignatureList *list,
+                           GMimeSignature *sig);
+

Adds a GMimeSignature to the GMimeSignatureList.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

list

a GMimeSignatureList

 

sig

a GMimeSignature

 
+
+
+

Returns

+

the index of the added GMimeSignature.

+
+
+
+
+

g_mime_signature_list_insert ()

+
void
+g_mime_signature_list_insert (GMimeSignatureList *list,
+                              int index,
+                              GMimeSignature *sig);
+

Inserts a GMimeSignature into the GMimeSignatureList at the specified +index.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

list

a GMimeSignatureList

 

index

index to insert at

 

sig

a GMimeSignature

 
+
+
+
+
+

g_mime_signature_list_remove ()

+
gboolean
+g_mime_signature_list_remove (GMimeSignatureList *list,
+                              GMimeSignature *sig);
+

Removes a GMimeSignature from the GMimeSignatureList.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

list

a GMimeSignatureList

 

sig

a GMimeSignature

 
+
+
+

Returns

+

TRUE if the specified GMimeSignature was removed or FALSE +otherwise.

+
+
+
+
+

g_mime_signature_list_remove_at ()

+
gboolean
+g_mime_signature_list_remove_at (GMimeSignatureList *list,
+                                 int index);
+

Removes a GMimeSignature from the GMimeSignatureList at the specified +index.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

list

a GMimeSignatureList

 

index

index to remove

 
+
+
+

Returns

+

TRUE if an GMimeSignature was removed or FALSE otherwise.

+
+
+
+
+

g_mime_signature_list_contains ()

+
gboolean
+g_mime_signature_list_contains (GMimeSignatureList *list,
+                                GMimeSignature *sig);
+

Checks whether or not the specified GMimeSignature is contained within +the GMimeSignatureList.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

list

a GMimeSignatureList

 

sig

a GMimeSignature

 
+
+
+

Returns

+

TRUE if the specified GMimeSignature is contained within the +specified GMimeSignatureList or FALSE otherwise.

+
+
+
+
+

g_mime_signature_list_index_of ()

+
int
+g_mime_signature_list_index_of (GMimeSignatureList *list,
+                                GMimeSignature *sig);
+

Gets the index of the specified GMimeSignature inside the +GMimeSignatureList.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

list

a GMimeSignatureList

 

sig

a GMimeSignature

 
+
+
+

Returns

+

the index of the requested GMimeSignature within the +GMimeSignatureList or -1 if it is not contained within the +GMimeSignatureList.

+
+
+
+
+

g_mime_signature_list_get_signature ()

+
GMimeSignature *
+g_mime_signature_list_get_signature (GMimeSignatureList *list,
+                                     int index);
+

Gets the GMimeSignature at the specified index.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

list

a GMimeSignatureList

 

index

index of GMimeSignature to get

 
+
+
+

Returns

+

the GMimeSignature at the specified +index or NULL if the index is out of range.

+

[transfer none]

+
+
+
+
+

g_mime_signature_list_set_signature ()

+
void
+g_mime_signature_list_set_signature (GMimeSignatureList *list,
+                                     int index,
+                                     GMimeSignature *sig);
+

Sets the GMimeSignature at the specified index to sig +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

list

a GMimeSignatureList

 

index

index of GMimeSignature to set

 

sig

a GMimeSignature

 
+
+
+
+
+

Types and Values

+
+

enum GMimeSignatureStatus

+

A value representing the signature status bit flags for a particular +GMimeSignature.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

GMIME_SIGNATURE_STATUS_VALID

+

The signature is fully valid.

+
 

GMIME_SIGNATURE_STATUS_GREEN

+

The signature is good.

+
 

GMIME_SIGNATURE_STATUS_RED

+

The signature is bad.

+
 

GMIME_SIGNATURE_STATUS_KEY_REVOKED

+

The key has been revoked.

+
 

GMIME_SIGNATURE_STATUS_KEY_EXPIRED

+

The key has expired.

+
 

GMIME_SIGNATURE_STATUS_SIG_EXPIRED

+

The signature has expired.

+
 

GMIME_SIGNATURE_STATUS_KEY_MISSING

+

Can't verify due to missing key.

+
 

GMIME_SIGNATURE_STATUS_CRL_MISSING

+

CRL not available.

+
 

GMIME_SIGNATURE_STATUS_CRL_TOO_OLD

+

Available CRL is too old.

+
 

GMIME_SIGNATURE_STATUS_BAD_POLICY

+

A policy was not met.

+
 

GMIME_SIGNATURE_STATUS_SYS_ERROR

+

A system error occurred.

+
 

GMIME_SIGNATURE_STATUS_TOFU_CONFLICT

+

Tofu conflict detected.

+
 
+
+
+
+
+

struct GMimeSignature

+
struct GMimeSignature;
+

An object containing useful information about a signature.

+
+

Members

+
+++++ + +
+
+
+
+
+

struct GMimeSignatureList

+
struct GMimeSignatureList;
+

A collection of GMimeSignature objects.

+
+

Members

+
+++++ + +
+
+
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeStreamBuffer.html gmime-3.0.1/docs/reference/html/GMimeStreamBuffer.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeStreamBuffer.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeStreamBuffer.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,283 @@ + + + + +GMimeStreamBuffer: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeStreamBuffer

+

GMimeStreamBuffer — A buffered stream

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + +
+GMimeStream * + +g_mime_stream_buffer_new () +
+ssize_t + +g_mime_stream_buffer_gets () +
+void + +g_mime_stream_buffer_readln () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
enumGMimeStreamBufferMode
structGMimeStreamBuffer
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeStream
+        ╰── GMimeStreamBuffer
+
+
+
+

Description

+

A GMimeStreamBuffer can be used on top of any other type of stream +and has 3 modes: block reads, block writes, and cached reads. Block +reads are especially useful if you will be making a lot of small +reads from a stream that accesses the file system. Block writes are +useful for very much the same reason. The final mode, cached reads, +can become memory intensive but can be very helpful when inheriting +from a stream that does not support seeking (Note: this mode is the +least tested so be careful using it).

+
+
+

Functions

+
+

g_mime_stream_buffer_new ()

+
GMimeStream *
+g_mime_stream_buffer_new (GMimeStream *source,
+                          GMimeStreamBufferMode mode);
+

Creates a new GMimeStreamBuffer object.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

source

source stream

 

mode

buffering mode

 
+
+
+

Returns

+

a new buffer stream with source source +and mode mode +.

+
+
+
+
+

g_mime_stream_buffer_gets ()

+
ssize_t
+g_mime_stream_buffer_gets (GMimeStream *stream,
+                           char *buf,
+                           size_t max);
+

Reads in at most one less than max + characters from stream + and +stores them into the buffer pointed to by buf +. Reading stops after +an EOS or newline ('\n'). If a newline is read, it is stored into +the buffer. A '\0' is stored after the last character in the +buffer.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

stream

stream

 

buf

line buffer

 

max

max length of a line

 
+
+
+

Returns

+

the number of characters read into buf +on success or -1 +on fail.

+
+
+
+
+

g_mime_stream_buffer_readln ()

+
void
+g_mime_stream_buffer_readln (GMimeStream *stream,
+                             GByteArray *buffer);
+

Reads a single line into buffer +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

stream

stream

 

buffer

output buffer

 
+
+
+
+
+

Types and Values

+
+

enum GMimeStreamBufferMode

+

The buffering mode for a GMimeStreamBuffer stream.

+
+

Members

+
+++++ + + + + + + + + + + + + +

GMIME_STREAM_BUFFER_BLOCK_READ

+

Read in 4k blocks.

+
 

GMIME_STREAM_BUFFER_BLOCK_WRITE

+

Write in 4k blocks.

+
 
+
+
+
+
+

struct GMimeStreamBuffer

+
struct GMimeStreamBuffer;
+

A buffered stream wrapper around any GMimeStream object.

+
+

Members

+
+++++ + +
+
+
+
+
+

See Also

+

GMimeStream

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeStreamCat.html gmime-3.0.1/docs/reference/html/GMimeStreamCat.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeStreamCat.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeStreamCat.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,162 @@ + + + + +GMimeStreamCat: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeStreamCat

+

GMimeStreamCat — A concatenated stream

+
+
+

Functions

+
++++ + + + + + + + + + + +
+GMimeStream * + +g_mime_stream_cat_new () +
+int + +g_mime_stream_cat_add_source () +
+
+
+

Types and Values

+
++++ + + + + +
structGMimeStreamCat
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeStream
+        ╰── GMimeStreamCat
+
+
+
+

Description

+

A GMimeStream which chains together any number of other streams.

+
+
+

Functions

+
+

g_mime_stream_cat_new ()

+
GMimeStream *
+g_mime_stream_cat_new (void);
+

Creates a new GMimeStreamCat object.

+
+

Returns

+

a new GMimeStreamCat stream.

+
+
+
+
+

g_mime_stream_cat_add_source ()

+
int
+g_mime_stream_cat_add_source (GMimeStreamCat *cat,
+                              GMimeStream *source);
+

Adds the source + stream to the cat +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cat

a GMimeStreamCat

 

source

a source stream

 
+
+
+

Returns

+

0 on success or -1 on fail.

+
+
+
+
+

Types and Values

+
+

struct GMimeStreamCat

+
struct GMimeStreamCat;
+

A concatenation of other GMimeStream objects.

+
+

Members

+
+++++ + +
+
+
+
+
+

See Also

+

GMimeStream

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeStreamFile.html gmime-3.0.1/docs/reference/html/GMimeStreamFile.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeStreamFile.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeStreamFile.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,328 @@ + + + + +GMimeStreamFile: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeStreamFile

+

GMimeStreamFile — A Standard-C FILE-based stream

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + +
+GMimeStream * + +g_mime_stream_file_new () +
+GMimeStream * + +g_mime_stream_file_open () +
+GMimeStream * + +g_mime_stream_file_new_with_bounds () +
+gboolean + +g_mime_stream_file_get_owner () +
+void + +g_mime_stream_file_set_owner () +
+
+
+

Types and Values

+
++++ + + + + +
structGMimeStreamFile
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeStream
+        ╰── GMimeStreamFile
+
+
+
+

Description

+

A simple GMimeStream implementation that sits on top of the +Standard C FILE pointer based I/O layer. Unlike GMimeStreamFs, a +GMimeStreamFile will typically buffer read and write operations at +the FILE level and so it may be wasteful to wrap one in a +GMimeStreamBuffer stream.

+
+
+

Functions

+
+

g_mime_stream_file_new ()

+
GMimeStream *
+g_mime_stream_file_new (FILE *fp);
+

Creates a new GMimeStreamFile object around fp +.

+

Note: The created GMimeStreamFile object will own the FILE pointer +passed in.

+
+

Parameters

+
+++++ + + + + + +

fp

a FILE pointer

 
+
+
+

Returns

+

a stream using fp +.

+
+
+
+
+

g_mime_stream_file_open ()

+
GMimeStream *
+g_mime_stream_file_open (const char *path,
+                         const char *mode,
+                         GError **err);
+

Creates a new GMimeStreamFile object for the specified path +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

path

the path to a file

 

mode

as in fopen(3)

 

err

a GError

 
+
+
+

Returns

+

a stream using for reading and/or writing to the +specified file path or NULL on error.

+

[transfer full]

+
+
+
+
+

g_mime_stream_file_new_with_bounds ()

+
GMimeStream *
+g_mime_stream_file_new_with_bounds (FILE *fp,
+                                    gint64 start,
+                                    gint64 end);
+

Creates a new GMimeStreamFile object around fp + with bounds start + +and end +.

+

Note: The created GMimeStreamFile object will own the FILE pointer +passed in.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

fp

a FILE pointer

 

start

start boundary

 

end

end boundary

 
+
+
+

Returns

+

a stream using fp +with bounds start +and end +.

+
+
+
+
+

g_mime_stream_file_get_owner ()

+
gboolean
+g_mime_stream_file_get_owner (GMimeStreamFile *stream);
+

Gets whether or not stream + owns the backend FILE pointer.

+
+

Parameters

+
+++++ + + + + + +

stream

a GMimeStreamFile

 
+
+
+

Returns

+

TRUE if stream +owns the backend FILE pointer or FALSE +otherwise.

+
+
+
+
+

g_mime_stream_file_set_owner ()

+
void
+g_mime_stream_file_set_owner (GMimeStreamFile *stream,
+                              gboolean owner);
+

Sets whether or not stream + owns the backend FILE pointer.

+

Note: owner + should be TRUE if the stream should fclose() the +backend FILE pointer when destroyed or FALSE otherwise.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

stream

a GMimeStreamFile

 

owner

TRUE if this stream should own the FILE pointer or FALSE otherwise

 
+
+
+
+
+

Types and Values

+
+

struct GMimeStreamFile

+
struct GMimeStreamFile;
+

A GMimeStream wrapper around standard-c FILE pointers.

+
+

Members

+
+++++ + +
+
+
+
+
+

See Also

+

GMimeStream

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeStreamFilter.html gmime-3.0.1/docs/reference/html/GMimeStreamFilter.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeStreamFilter.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeStreamFilter.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,303 @@ + + + + +GMimeStreamFilter: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeStreamFilter

+

GMimeStreamFilter — A filtering stream

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + +
+GMimeStream * + +g_mime_stream_filter_new () +
+int + +g_mime_stream_filter_add () +
+void + +g_mime_stream_filter_remove () +
+gboolean + +g_mime_stream_filter_get_owner () +
+void + +g_mime_stream_filter_set_owner () +
+
+
+

Types and Values

+
++++ + + + + +
structGMimeStreamFilter
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeStream
+        ╰── GMimeStreamFilter
+
+
+
+

Description

+

A GMimeStream meant for filtering data passing through it.

+

This stream class is useful for converting data of one type to +another using GMimeFilter objects.

+

When data passes through a GMimeStreamFilter, it will pass through +GMimeFilter filters in the order they were added.

+
+
+

Functions

+
+

g_mime_stream_filter_new ()

+
GMimeStream *
+g_mime_stream_filter_new (GMimeStream *stream);
+

Creates a new GMimeStreamFilter object using stream + as the source +stream.

+
+

Parameters

+
+++++ + + + + + +

stream

source stream

 
+
+
+

Returns

+

a new filter stream with stream +as its source.

+
+
+
+
+

g_mime_stream_filter_add ()

+
int
+g_mime_stream_filter_add (GMimeStreamFilter *stream,
+                          GMimeFilter *filter);
+

Adds filter + to stream +. Filters are applied in the same order in +which they are added.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

stream

a GMimeStreamFilter

 

filter

a GMimeFilter

 
+
+
+

Returns

+

an id for the filter.

+
+
+
+
+

g_mime_stream_filter_remove ()

+
void
+g_mime_stream_filter_remove (GMimeStreamFilter *stream,
+                             int id);
+

Removed a filter from the stream based on the id (as returned from +filter_add).

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

stream

a GMimeStreamFilter

 

id

filter id

 
+
+
+
+
+

g_mime_stream_filter_get_owner ()

+
gboolean
+g_mime_stream_filter_get_owner (GMimeStreamFilter *stream);
+

Gets whether or not stream + owns the source stream.

+
+

Parameters

+
+++++ + + + + + +

stream

a GMimeStreamFilter

 
+
+
+

Returns

+

TRUE if stream +owns the source stream or FALSE +otherwise.

+
+
+
+
+

g_mime_stream_filter_set_owner ()

+
void
+g_mime_stream_filter_set_owner (GMimeStreamFilter *stream,
+                                gboolean owner);
+

Sets whether or not stream + owns the source stream..

+

Note: owner + should be TRUE if the stream should close() the +backend source stream when destroyed or FALSE otherwise.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

stream

a GMimeStreamFilter

 

owner

TRUE if this stream should own the source stream or FALSE otherwise

 
+
+
+
+
+

Types and Values

+
+

struct GMimeStreamFilter

+
struct GMimeStreamFilter;
+

A GMimeStream which passes data through any GMimeFilter objects.

+
+

Members

+
+++++ + +
+
+
+
+
+

See Also

+

Filters

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeStreamFs.html gmime-3.0.1/docs/reference/html/GMimeStreamFs.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeStreamFs.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeStreamFs.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,327 @@ + + + + +GMimeStreamFs: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeStreamFs

+

GMimeStreamFs — A low-level FileSystem stream

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + +
+GMimeStream * + +g_mime_stream_fs_new () +
+GMimeStream * + +g_mime_stream_fs_open () +
+GMimeStream * + +g_mime_stream_fs_new_with_bounds () +
+gboolean + +g_mime_stream_fs_get_owner () +
+void + +g_mime_stream_fs_set_owner () +
+
+
+

Types and Values

+
++++ + + + + +
structGMimeStreamFs
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeStream
+        ╰── GMimeStreamFs
+
+
+
+

Description

+

A simple GMimeStream implementation that sits on top of the +low-level UNIX file descriptor based I/O layer.

+
+
+

Functions

+
+

g_mime_stream_fs_new ()

+
GMimeStream *
+g_mime_stream_fs_new (int fd);
+

Creates a new GMimeStreamFs object around fd +.

+
+

Parameters

+
+++++ + + + + + +

fd

a file descriptor

 
+
+
+

Returns

+

a stream using fd +.

+
+
+
+
+

g_mime_stream_fs_open ()

+
GMimeStream *
+g_mime_stream_fs_open (const char *path,
+                       int flags,
+                       int mode,
+                       GError **err);
+

Creates a new GMimeStreamFs object for the specified path +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

path

the path to a file

 

flags

as in open(2)

 

mode

as in open(2)

 

err

a GError

 
+
+
+

Returns

+

a stream using for reading and/or writing to the +specified file path or NULL on error.

+

[transfer full]

+
+
+
+
+

g_mime_stream_fs_new_with_bounds ()

+
GMimeStream *
+g_mime_stream_fs_new_with_bounds (int fd,
+                                  gint64 start,
+                                  gint64 end);
+

Creates a new GMimeStreamFs object around fd + with bounds start + +and end +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

fd

a file descriptor

 

start

start boundary

 

end

end boundary

 
+
+
+

Returns

+

a stream using fd +with bounds start +and end +.

+
+
+
+
+

g_mime_stream_fs_get_owner ()

+
gboolean
+g_mime_stream_fs_get_owner (GMimeStreamFs *stream);
+

Gets whether or not stream + owns the backend file descriptor.

+
+

Parameters

+
+++++ + + + + + +

stream

a GMimeStreamFs

 
+
+
+

Returns

+

TRUE if stream +owns the backend file descriptor or FALSE +otherwise.

+
+
+
+
+

g_mime_stream_fs_set_owner ()

+
void
+g_mime_stream_fs_set_owner (GMimeStreamFs *stream,
+                            gboolean owner);
+

Sets whether or not stream + owns the backend file descriptor.

+

Note: owner + should be TRUE if the stream should close() the +backend file descriptor when destroyed or FALSE otherwise.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

stream

a GMimeStreamFs

 

owner

TRUE if this stream should own the file descriptor or FALSE otherwise

 
+
+
+
+
+

Types and Values

+
+

struct GMimeStreamFs

+
struct GMimeStreamFs;
+

A GMimeStream wrapper around POSIX file descriptors.

+
+

Members

+
+++++ + +
+
+
+
+
+

See Also

+

GMimeStream

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeStreamGIO.html gmime-3.0.1/docs/reference/html/GMimeStreamGIO.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeStreamGIO.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeStreamGIO.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,270 @@ + + + + +GMimeStreamGIO: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeStreamGIO

+

GMimeStreamGIO — A wrapper for GLib's GIO streams

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + +
+GMimeStream * + +g_mime_stream_gio_new () +
+GMimeStream * + +g_mime_stream_gio_new_with_bounds () +
+gboolean + +g_mime_stream_gio_get_owner () +
+void + +g_mime_stream_gio_set_owner () +
+
+
+

Types and Values

+
++++ + + + + +
structGMimeStreamGIO
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeStream
+        ╰── GMimeStreamGIO
+
+
+
+

Description

+

A simple GMimeStream implementation that sits on top of GLib's GIO +input and output streams.

+
+
+

Functions

+
+

g_mime_stream_gio_new ()

+
GMimeStream *
+g_mime_stream_gio_new (GFile *file);
+

Creates a new GMimeStreamGIO wrapper around a GFile object.

+
+

Parameters

+
+++++ + + + + + +

file

a GFile

 
+
+
+

Returns

+

a stream using file +.

+

[transfer full]

+
+
+
+
+

g_mime_stream_gio_new_with_bounds ()

+
GMimeStream *
+g_mime_stream_gio_new_with_bounds (GFile *file,
+                                   gint64 start,
+                                   gint64 end);
+

Creates a new GMimeStreamGIO stream around a GFile with bounds +start + and end +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

file

a GFile

 

start

start boundary

 

end

end boundary

 
+
+
+

Returns

+

a stream using file +with bounds start +and end +.

+

[transfer full]

+
+
+
+
+

g_mime_stream_gio_get_owner ()

+
gboolean
+g_mime_stream_gio_get_owner (GMimeStreamGIO *stream);
+

Gets whether or not stream + owns the backend GFile.

+
+

Parameters

+
+++++ + + + + + +

stream

a GMimeStreamGIO stream

 
+
+
+

Returns

+

TRUE if stream +owns the backend GFile or FALSE +otherwise.

+
+
+
+
+

g_mime_stream_gio_set_owner ()

+
void
+g_mime_stream_gio_set_owner (GMimeStreamGIO *stream,
+                             gboolean owner);
+

Sets whether or not stream + owns the backend GIO pointer.

+

Note: owner + should be TRUE if the stream should close() the +backend file descriptor when destroyed or FALSE otherwise.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

stream

a GMimeStreamGIO stream

 

owner

TRUE if this stream should own the GFile or FALSE otherwise

 
+
+
+
+
+

Types and Values

+
+

struct GMimeStreamGIO

+
struct GMimeStreamGIO;
+

A GMimeStream wrapper around GLib's GIO streams.

+
+

Members

+
+++++ + +
+
+
+
+
+

See Also

+

GMimeStream

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeStream.html gmime-3.0.1/docs/reference/html/GMimeStream.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeStream.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeStream.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,886 @@ + + + + +GMimeStream: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeStream

+

GMimeStream — Abstract stream class

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+void + +g_mime_stream_construct () +
+ssize_t + +g_mime_stream_read () +
+ssize_t + +g_mime_stream_write () +
+int + +g_mime_stream_flush () +
+gint64 + +g_mime_stream_seek () +
+gint64 + +g_mime_stream_tell () +
+int + +g_mime_stream_reset () +
+gboolean + +g_mime_stream_eos () +
+int + +g_mime_stream_close () +
+gint64 + +g_mime_stream_length () +
+GMimeStream * + +g_mime_stream_substream () +
+void + +g_mime_stream_set_bounds () +
+ssize_t + +g_mime_stream_write_string () +
+ssize_t + +g_mime_stream_printf () +
+gint64 + +g_mime_stream_write_to_stream () +
+gint64 + +g_mime_stream_writev () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + + + + + +
enumGMimeSeekWhence
 GMimeStreamIOVector
structGMimeStream
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeStream
+        ├── GMimeStreamBuffer
+        ├── GMimeStreamCat
+        ├── GMimeStreamFile
+        ├── GMimeStreamFilter
+        ├── GMimeStreamFs
+        ├── GMimeStreamGIO
+        ├── GMimeStreamMem
+        ├── GMimeStreamMmap
+        ├── GMimeStreamNull
+        ╰── GMimeStreamPipe
+
+
+
+

Description

+

Streams are the fundamental method for reading and writing data +used by GMime. You'll probably notice that the basic API is similar +to that of the low-level Unix I/O layer (read(), write(), lseek(), +etc) with some additional nicities such as a printf-like function.

+
+
+

Functions

+
+

g_mime_stream_construct ()

+
void
+g_mime_stream_construct (GMimeStream *stream,
+                         gint64 start,
+                         gint64 end);
+

Initializes a new stream with bounds start + and end +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

stream

a GMimeStream

 

start

start boundary

 

end

end boundary

 
+
+
+
+
+

g_mime_stream_read ()

+
ssize_t
+g_mime_stream_read (GMimeStream *stream,
+                    char *buf,
+                    size_t len);
+

Attempts to read up to len + bytes from stream + into buf +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

stream

a GMimeStream

 

buf

buffer.

[array length=len][element-type guint8]

len

buffer length

 
+
+
+

Returns

+

the number of bytes read or -1 on fail.

+
+
+
+
+

g_mime_stream_write ()

+
ssize_t
+g_mime_stream_write (GMimeStream *stream,
+                     const char *buf,
+                     size_t len);
+

Attempts to write up to len + bytes of buf + to stream +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

stream

a GMimeStream

 

buf

buffer

 

len

buffer length

 
+
+
+

Returns

+

the number of bytes written or -1 on fail.

+
+
+
+
+

g_mime_stream_flush ()

+
int
+g_mime_stream_flush (GMimeStream *stream);
+

Sync's the stream to disk.

+
+

Parameters

+
+++++ + + + + + +

stream

a GMimeStream

 
+
+
+

Returns

+

0 on success or -1 on fail.

+
+
+
+
+

g_mime_stream_seek ()

+
gint64
+g_mime_stream_seek (GMimeStream *stream,
+                    gint64 offset,
+                    GMimeSeekWhence whence);
+

Repositions the offset of the stream stream + to +the argument offset + according to the +directive whence + as follows:

+

GMIME_STREAM_SEEK_SET: Seek offset + bytes relative to + the beginning (bound_start) of the stream.

+

GMIME_STREAM_SEEK_CUR: Seek offset + bytes relative to the + current offset of the stream.

+

GMIME_STREAM_SEEK_END: Seek offset + bytes relative to the + end of the stream (bound_end if non-negative).

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

stream

a GMimeStream

 

offset

positional offset

 

whence

seek directive

 
+
+
+

Returns

+

the resultant position on success or -1 on fail.

+
+
+
+
+

g_mime_stream_tell ()

+
gint64
+g_mime_stream_tell (GMimeStream *stream);
+

Gets the current offset within the stream.

+
+

Parameters

+
+++++ + + + + + +

stream

a GMimeStream

 
+
+
+

Returns

+

the current position within the stream or -1 on fail.

+
+
+
+
+

g_mime_stream_reset ()

+
int
+g_mime_stream_reset (GMimeStream *stream);
+

Resets the stream.

+
+

Parameters

+
+++++ + + + + + +

stream

a GMimeStream

 
+
+
+

Returns

+

0 on success or -1 on fail.

+
+
+
+
+

g_mime_stream_eos ()

+
gboolean
+g_mime_stream_eos (GMimeStream *stream);
+

Tests the end-of-stream indicator for stream +.

+
+

Parameters

+
+++++ + + + + + +

stream

a GMimeStream

 
+
+
+

Returns

+

TRUE on EOS or FALSE otherwise.

+
+
+
+
+

g_mime_stream_close ()

+
int
+g_mime_stream_close (GMimeStream *stream);
+

Closes the stream.

+
+

Parameters

+
+++++ + + + + + +

stream

a GMimeStream

 
+
+
+

Returns

+

0 on success or -1 on fail.

+
+
+
+
+

g_mime_stream_length ()

+
gint64
+g_mime_stream_length (GMimeStream *stream);
+

Gets the length of the stream.

+
+

Parameters

+
+++++ + + + + + +

stream

a GMimeStream

 
+
+
+

Returns

+

the length of the stream or -1 if unknown.

+
+
+
+
+

g_mime_stream_substream ()

+
GMimeStream *
+g_mime_stream_substream (GMimeStream *stream,
+                         gint64 start,
+                         gint64 end);
+

Creates a new substream of stream + with bounds start + and end +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

stream

a GMimeStream

 

start

start boundary

 

end

end boundary

 
+
+
+

Returns

+

a substream of stream +with bounds start +and end +.

+

[transfer full]

+
+
+
+
+

g_mime_stream_set_bounds ()

+
void
+g_mime_stream_set_bounds (GMimeStream *stream,
+                          gint64 start,
+                          gint64 end);
+

Set the bounds on a stream.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

stream

a GMimeStream

 

start

start boundary

 

end

end boundary

 
+
+
+
+
+

g_mime_stream_write_string ()

+
ssize_t
+g_mime_stream_write_string (GMimeStream *stream,
+                            const char *str);
+

Writes string + to stream +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

stream

a GMimeStream

 

str

string to write

 
+
+
+

Returns

+

the number of bytes written or -1 on fail.

+
+
+
+
+

g_mime_stream_printf ()

+
ssize_t
+g_mime_stream_printf (GMimeStream *stream,
+                      const char *fmt,
+                      ...);
+

Write formatted output to a stream.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

stream

a GMimeStream

 

fmt

format

 

...

arguments

 
+
+
+

Returns

+

the number of bytes written or -1 on fail.

+
+
+
+
+

g_mime_stream_write_to_stream ()

+
gint64
+g_mime_stream_write_to_stream (GMimeStream *src,
+                               GMimeStream *dest);
+

Attempts to write the source stream to the destination stream.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

src

source stream

 

dest

destination stream

 
+
+
+

Returns

+

the number of bytes written or -1 on fail.

+
+
+
+
+

g_mime_stream_writev ()

+
gint64
+g_mime_stream_writev (GMimeStream *stream,
+                      GMimeStreamIOVector *vector,
+                      size_t count);
+

Writes at most count + blocks described by vector + to stream +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

stream

a GMimeStream

 

vector

a GMimeStreamIOVector

 

count

number of vector elements

 
+
+
+

Returns

+

the number of bytes written or -1 on fail.

+
+
+
+
+

Types and Values

+
+

enum GMimeSeekWhence

+

Relative seek position.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + +

GMIME_STREAM_SEEK_SET

+

Seek relative to the beginning of the stream.

+
 

GMIME_STREAM_SEEK_CUR

+

Seek relative to the current position in the stream.

+
 

GMIME_STREAM_SEEK_END

+

Seek relative to the end of the stream.

+
 
+
+
+
+
+

GMimeStreamIOVector

+
typedef struct {
+	void *data;
+	size_t len;
+} GMimeStreamIOVector;
+
+

An I/O vector for use with g_mime_stream_writev().

+
+

Members

+
+++++ + + + + + + + + + + + + +

void *data;

data to pass to the I/O function.

 

size_t len;

length of the data, in bytes.

 
+
+
+
+
+

struct GMimeStream

+
struct GMimeStream;
+

Abstract I/O stream class.

+
+

Members

+
+++++ + +
+
+
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeStreamMem.html gmime-3.0.1/docs/reference/html/GMimeStreamMem.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeStreamMem.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeStreamMem.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,355 @@ + + + + +GMimeStreamMem: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeStreamMem

+

GMimeStreamMem — A memory-backed stream

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GMimeStream * + +g_mime_stream_mem_new () +
+GMimeStream * + +g_mime_stream_mem_new_with_byte_array () +
+GMimeStream * + +g_mime_stream_mem_new_with_buffer () +
+GByteArray * + +g_mime_stream_mem_get_byte_array () +
+void + +g_mime_stream_mem_set_byte_array () +
+gboolean + +g_mime_stream_mem_get_owner () +
+void + +g_mime_stream_mem_set_owner () +
+
+
+

Types and Values

+
++++ + + + + +
structGMimeStreamMem
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeStream
+        ╰── GMimeStreamMem
+
+
+
+

Description

+

A simple GMimeStream implementation that uses a memory buffer for +storage.

+
+
+

Functions

+
+

g_mime_stream_mem_new ()

+
GMimeStream *
+g_mime_stream_mem_new (void);
+

Creates a new GMimeStreamMem object.

+
+

Returns

+

a new memory stream.

+
+
+
+
+

g_mime_stream_mem_new_with_byte_array ()

+
GMimeStream *
+g_mime_stream_mem_new_with_byte_array (GByteArray *array);
+

Creates a new GMimeStreamMem with data array +.

+
+

Parameters

+
+++++ + + + + + +

array

source data

 
+
+
+

Returns

+

a new memory stream using array +.

+
+
+
+
+

g_mime_stream_mem_new_with_buffer ()

+
GMimeStream *
+g_mime_stream_mem_new_with_buffer (const char *buffer,
+                                   size_t len);
+

Creates a new GMimeStreamMem object and initializes the stream +contents with the first len + bytes of buffer +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

buffer

stream data.

[array length=len][element-type guint8]

len

buffer length

 
+
+
+

Returns

+

a new memory stream initialized with buffer +.

+
+
+
+
+

g_mime_stream_mem_get_byte_array ()

+
GByteArray *
+g_mime_stream_mem_get_byte_array (GMimeStreamMem *mem);
+

Gets the byte array from the memory stream.

+
+

Parameters

+
+++++ + + + + + +

mem

a GMimeStreamMem

 
+
+
+

Returns

+

the byte array from the memory stream.

+

[transfer none]

+
+
+
+
+

g_mime_stream_mem_set_byte_array ()

+
void
+g_mime_stream_mem_set_byte_array (GMimeStreamMem *mem,
+                                  GByteArray *array);
+

Sets the byte array on the memory stream.

+

Note: The memory stream is not responsible for freeing the byte +array. Use g_mime_stream_mem_set_owner() to change this behavior.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

mem

a GMimeStreamMem

 

array

stream data

 
+
+
+
+
+

g_mime_stream_mem_get_owner ()

+
gboolean
+g_mime_stream_mem_get_owner (GMimeStreamMem *mem);
+

Gets whether or not mem + owns the backend memory buffer.

+
+

Parameters

+
+++++ + + + + + +

mem

a GMimeStreamMem

 
+
+
+

Returns

+

TRUE if mem +owns the backend memory buffer or FALSE +otherwise.

+
+
+
+
+

g_mime_stream_mem_set_owner ()

+
void
+g_mime_stream_mem_set_owner (GMimeStreamMem *mem,
+                             gboolean owner);
+

Sets whether or not mem + owns the backend memory buffer.

+

Note: owner + should be TRUE if the stream should free the backend +memory buffer when destroyed or FALSE otherwise.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

mem

a GMimeStreamMem

 

owner

TRUE if this stream should own the GByteArray or FALSE otherwise

 
+
+
+
+
+

Types and Values

+
+

struct GMimeStreamMem

+
struct GMimeStreamMem;
+

A memory-backed GMimeStream.

+
+

Members

+
+++++ + +
+
+
+
+
+

See Also

+

GMimeStream

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeStreamMmap.html gmime-3.0.1/docs/reference/html/GMimeStreamMmap.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeStreamMmap.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeStreamMmap.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,219 @@ + + + + +GMimeStreamMmap: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeStreamMmap

+

GMimeStreamMmap — A memory-mapped file stream

+
+
+

Functions

+
++++ + + + + + + + + + + +
+GMimeStream * + +g_mime_stream_mmap_new () +
+GMimeStream * + +g_mime_stream_mmap_new_with_bounds () +
+
+
+

Types and Values

+
++++ + + + + +
structGMimeStreamMmap
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeStream
+        ╰── GMimeStreamMmap
+
+
+
+

Description

+

A GMimeStream implementation using a memory-mapped file backing +store. This may be faster than GMimeStreamFs or GMimeStreamFile +but you'll have to do your own performance checking to be sure for +your particular application/platform.

+
+
+

Functions

+
+

g_mime_stream_mmap_new ()

+
GMimeStream *
+g_mime_stream_mmap_new (int fd,
+                        int prot,
+                        int flags);
+

Creates a new GMimeStreamMmap object around fd +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

fd

file descriptor

 

prot

protection flags

 

flags

map flags

 
+
+
+

Returns

+

a stream using fd +.

+
+
+
+
+

g_mime_stream_mmap_new_with_bounds ()

+
GMimeStream *
+g_mime_stream_mmap_new_with_bounds (int fd,
+                                    int prot,
+                                    int flags,
+                                    gint64 start,
+                                    gint64 end);
+

Creates a new GMimeStreamMmap object around fd + with bounds start + +and end +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

fd

file descriptor

 

prot

protection flags

 

flags

map flags

 

start

start boundary

 

end

end boundary

 
+
+
+

Returns

+

a stream using fd +with bounds start +and end +.

+
+
+
+
+

Types and Values

+
+

struct GMimeStreamMmap

+
struct GMimeStreamMmap;
+

A memory-mapped GMimeStream.

+
+

Members

+
+++++ + +
+
+
+
+
+

See Also

+

GMimeStream

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeStreamNull.html gmime-3.0.1/docs/reference/html/GMimeStreamNull.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeStreamNull.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeStreamNull.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,196 @@ + + + + +GMimeStreamNull: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeStreamNull

+

GMimeStreamNull — A null stream

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + +
+GMimeStream * + +g_mime_stream_null_new () +
+gboolean + +g_mime_stream_null_get_count_newlines () +
+void + +g_mime_stream_null_set_count_newlines () +
+
+
+

Types and Values

+
++++ + + + + +
structGMimeStreamNull
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeStream
+        ╰── GMimeStreamNull
+
+
+
+

Description

+

A GMimeStream which has no real backing storage at all. This +stream is useful for dry-runs and can also be useful for +determining statistics on source data which can be written to +streams but cannot be read as a stream itself (e.g. a GMimeObject +via g_mime_object_write_to_stream()).

+
+
+

Functions

+
+

g_mime_stream_null_new ()

+
GMimeStream *
+g_mime_stream_null_new (void);
+

Creates a new GMimeStreamNull object.

+
+

Returns

+

a new null stream (similar to /dev/null on Unix).

+
+
+
+
+

g_mime_stream_null_get_count_newlines ()

+
gboolean
+g_mime_stream_null_get_count_newlines (GMimeStreamNull *stream);
+

Gets whether or not the stream should keep track of the number of newlines +encountered.

+
+

Parameters

+
+++++ + + + + + +

stream

a GMimeStreamNull

 
+
+
+

Returns

+

TRUE if the stream should count the number of newlines or FALSE otherwise.

+
+
+
+
+

g_mime_stream_null_set_count_newlines ()

+
void
+g_mime_stream_null_set_count_newlines (GMimeStreamNull *stream,
+                                       gboolean count);
+

Sets whether or not the stream should keep track of the number of newlines +encountered.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

stream

a GMimeStreamNull

 

count

TRUE if newlines should be counted or FALSE otherwise

 
+
+
+
+
+

Types and Values

+
+

struct GMimeStreamNull

+
struct GMimeStreamNull;
+

A GMimeStream which has no backing store.

+
+

Members

+
+++++ + +
+
+
+
+
+

See Also

+

GMimeStream

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeStreamPipe.html gmime-3.0.1/docs/reference/html/GMimeStreamPipe.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeStreamPipe.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeStreamPipe.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,215 @@ + + + + +GMimeStreamPipe: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeStreamPipe

+

GMimeStreamPipe — A low-level pipe stream

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + +
+GMimeStream * + +g_mime_stream_pipe_new () +
+gboolean + +g_mime_stream_pipe_get_owner () +
+void + +g_mime_stream_pipe_set_owner () +
+
+
+

Types and Values

+
++++ + + + + +
structGMimeStreamPipe
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeStream
+        ╰── GMimeStreamPipe
+
+
+
+

Description

+

A simple GMimeStream implementation that sits on top of low-level +POSIX pipes.

+
+
+

Functions

+
+

g_mime_stream_pipe_new ()

+
GMimeStream *
+g_mime_stream_pipe_new (int fd);
+

Creates a new GMimeStreamPipe object around fd +.

+
+

Parameters

+
+++++ + + + + + +

fd

a pipe descriptor

 
+
+
+

Returns

+

a stream using fd +.

+
+
+
+
+

g_mime_stream_pipe_get_owner ()

+
gboolean
+g_mime_stream_pipe_get_owner (GMimeStreamPipe *stream);
+

Gets whether or not stream + owns the backend pipe descriptor.

+
+

Parameters

+
+++++ + + + + + +

stream

a GMimeStreamPipe

 
+
+
+

Returns

+

TRUE if stream +owns the backend pipe descriptor or FALSE +otherwise.

+
+
+
+
+

g_mime_stream_pipe_set_owner ()

+
void
+g_mime_stream_pipe_set_owner (GMimeStreamPipe *stream,
+                              gboolean owner);
+

Sets whether or not stream + owns the backend pipe descriptor.

+

Note: owner + should be TRUE if the stream should close() the +backend pipe descriptor when destroyed or FALSE otherwise.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

stream

a GMimeStreamPipe

 

owner

owner

 
+
+
+
+
+

Types and Values

+
+

struct GMimeStreamPipe

+
struct GMimeStreamPipe;
+

A GMimeStream wrapper around pipes.

+
+

Members

+
+++++ + +
+
+
+
+
+

See Also

+

GMimeStream

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/gmime-streams.html gmime-3.0.1/docs/reference/html/gmime-streams.html --- gmime-2.6.22+dfsg2/docs/reference/html/gmime-streams.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/gmime-streams.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,94 @@ + + + + +Streams: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Streams

+

Streams — How to use Streams

+
+
+

Overview of Streams

+

Streams are the fundamental method for reading and writing + data used by GMime. You'll probably notice that the basic API is + similar to that of the low-level Unix I/O layer (read(), write(), + lseek(), etc) with some additional nicities such as a printf-like + function.

+

The three (3) basic stream types are: GMimeStreamFile, + GMimeStreamFs and GMimeStreamMem. You can manipulate all three + streams using the GMimeStream interfaces. In addition, some of + these streams have extended interfaces to allow more fine grained + manipulation.

+

GMimeStreamFile and GMimeStreamFs are very similar in that + they are both meant for reading and writing data to the file + system (in the form of files). Since GMimeStreamFile is an + abstracted layer above the standard libc FILE type, one of the + added benefits is buffered I/O. GMimeStreamFs, on the other hand, + is an abstracted layer above Unix file descriptors. While a + GMimeStreamFs can be used on top of a UNIX socket or pipe, you + must be careful because sockets and pipes are not seekable + (see GMimeStreamPipe for a solution to this).

+

Unlike the previous 2 stream types, GMimeStreamMem does not + interact with the file system at all (except maybe the swap + partition/file indirectly). Memory streams are handy when you want + reads and writes to be nearly instantaneous and/or if you don't + want to create a temporary file on disk.

+

The five (5) advanced stream types are GMimeStreamMmap, + GMimeStreamNull, GMimeStreamPipe, GMimeStreamBuffer and + GMimeStreamFilter.

+

Our most simple stream, GMimeStreamNull, is the stream + equivalent of /dev/null on Unix systems. The main difference is + that GMimeStreamNull records the number of bytes written to it - + you may find this useful if you need to know the number of bytes a + GMimeObject (for example) will require.

+

GMimeStreamMmap is a memory-mapped stream. This isn't + guarenteed to work on all systems since not all systems support + the POSIX mmap system call, but for those that do - this might + present a faster stream than GMimeStreamFs and/or + GMimeStreamFile. You'll have to do some experimentation to know + for sure.

+

GMimeStreamPipe is just like GMimeStreamFs except that it + doesn't support seeking, thus being perfect for use with sockets + and pipes.

+

The GMimeStreamBuffer can be used on top of any other type + of stream and has 3 modes: block reads, block writes, and cached + reads. Block reads are especially useful if you will be making a + lot of small reads from a stream that accesses the file + system. Block writes are useful for very much the same reason. The + final mode, cached reads, can become memory intensive but can be + very helpful when inheriting from a stream that does not support + seeking (Note: this mode is the least tested so be careful using + it).

+

Our final stream type, GMimeStreamFilter, can also be used + on top of another stream. This stream, as you may have guessed, + filters reads and writes to its inherited stream. For example, one + could write a compression filter and apply it to a + GMimeStreamFilter and any further reads or writes would be + (un)compressed.

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/GMimeTextPart.html gmime-3.0.1/docs/reference/html/GMimeTextPart.html --- gmime-2.6.22+dfsg2/docs/reference/html/GMimeTextPart.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/GMimeTextPart.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,295 @@ + + + + +GMimeTextPart: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeTextPart

+

GMimeTextPart — textual MIME parts

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GMimeTextPart * + +g_mime_text_part_new () +
+GMimeTextPart * + +g_mime_text_part_new_with_subtype () +
const char * + +g_mime_text_part_get_charset () +
+void + +g_mime_text_part_set_charset () +
+char * + +g_mime_text_part_get_text () +
+void + +g_mime_text_part_set_text () +
+
+
+

Types and Values

+
++++ + + + + +
structGMimeTextPart
+
+
+

Object Hierarchy

+
    GObject
+    ╰── GMimeObject
+        ╰── GMimePart
+            ╰── GMimeTextPart
+
+
+
+

Description

+

A GMimeTextPart represents any text MIME part.

+
+
+

Functions

+
+

g_mime_text_part_new ()

+
GMimeTextPart *
+g_mime_text_part_new (void);
+

Creates a new text MIME part object with a default content-type of +text/plain.

+
+

Returns

+

an empty MIME Part object with a default content-type of +text/plain.

+
+
+
+
+

g_mime_text_part_new_with_subtype ()

+
GMimeTextPart *
+g_mime_text_part_new_with_subtype (const char *subtype);
+

Creates a new text MIME part with a sepcified subtype.

+
+

Parameters

+
+++++ + + + + + +

subtype

textual subtype string

 
+
+
+

Returns

+

an empty text MIME part object with the specified subtype.

+
+
+
+
+

g_mime_text_part_get_charset ()

+
const char *
+g_mime_text_part_get_charset (GMimeTextPart *mime_part);
+

Gets the value of the charset parameter on the Content-Type header.

+
+

Parameters

+
+++++ + + + + + +

mime_part

a GMimeTextPart

 
+
+
+

Returns

+

the value of the charset parameter or NULL if unavailable.

+
+
+
+
+

g_mime_text_part_set_charset ()

+
void
+g_mime_text_part_set_charset (GMimeTextPart *mime_part,
+                              const char *charset);
+

Sets the charset parameter on the Content-Type header to the specified value.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

mime_part

a GMimeTextPart

 

charset

the name of the charset

 
+
+
+
+
+

g_mime_text_part_get_text ()

+
char *
+g_mime_text_part_get_text (GMimeTextPart *mime_part);
+

Gets the text content of the mime_part + as a string.

+
+

Parameters

+
+++++ + + + + + +

mime_part

a GMimeTextPart

 
+
+
+

Returns

+

a newly allocated string containing the utf-8 encoded text content.

+
+
+
+
+

g_mime_text_part_set_text ()

+
void
+g_mime_text_part_set_text (GMimeTextPart *mime_part,
+                           const char *text);
+

Sets the specified text as the content and updates the charset parameter on the Content-Type header.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

mime_part

a GMimeTextPart

 

text

the text in utf-8

 
+
+
+
+
+

Types and Values

+
+

struct GMimeTextPart

+
struct GMimeTextPart;
+

A text MIME part object.

+
+

Members

+
+++++ + +
+
+
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/Headers.html gmime-3.0.1/docs/reference/html/Headers.html --- gmime-2.6.22+dfsg2/docs/reference/html/Headers.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/Headers.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,43 @@ + + + + +Message and MIME Headers: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+

+Message and MIME Headers

+
+
+GMimeHeaderList — Message and MIME part headers +
+
+GMimeContentType — Content-Type fields +
+
+GMimeContentDisposition — Content-Disposition fields +
+
+GMimeParamList — Content-Type and Content-Disposition parameters +
+
+
+ + + \ No newline at end of file Binary files /tmp/tmpIS_RQQ/UDbh1D_L26/gmime-2.6.22+dfsg2/docs/reference/html/home.png and /tmp/tmpIS_RQQ/lUbmpdA4HT/gmime-3.0.1/docs/reference/html/home.png differ diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/index.html gmime-3.0.1/docs/reference/html/index.html --- gmime-2.6.22+dfsg2/docs/reference/html/index.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/index.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,324 @@ + + + + +GMime 3.0 Reference Manual: GMime 3.0 Reference Manual + + + + + + + + +
+
+
+
+
+

+Jeffrey Stedfast +

+


+            
+          

+
+
+
+

+ This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. +

+

+ This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. +

+

+ You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +

+
+
+

Abstract

+

This manual documents the interfaces of the GMime + library and has some short notes to help get you up to speed + with using the library.

+
+
+
+
+
+
I. GMime Overview
+
+
+Compiling the GMime libraries — How to compile GMime itself +
+
+Compiling GMime Applications — +How to compile your GMime application + +
+
+Changes from 1.0 to 2.0 — +Incompatible changes made between version 1.0 and version 2.0 + +
+
+Changes from 2.0 to 2.2 — Incompatible changes made between version 2.0 and version 2.2 +
+
+Changes from 2.2 to 2.4 — Changes made between version 2.2 and version 2.4 +
+
+Changes from 2.4 to 2.6 — Changes made between version 2.4 and version 2.6 +
+
+Changes from 2.6 to 3.0 — Changes made between version 2.6 and version 3.0 +
+
+Mailing lists and bug reports — +Getting help with GMime + +
+
+Frequently Asked Questions — +Find answers to common questions in the GMime manual + +
+
+
II. GMime Fundamentals
+
+
+Streams — How to use Streams +
+
+Stream Filters — How to use Stream Filters +
+
+Data Wrappers — How to use Data Wrappers +
+
+
III. GMime Core Reference
+
+
+gmime — Initialization, shutdown and version-check routines +
+
+gmime-charset — Charset helper functions +
+
+gmime-iconv — Low-level routines for converting text from one charset to another +
+
+gmime-iconv-utils — High-level routines for converting text from one charset to another +
+
+gmime-encodings — MIME encoding functions +
+
+gmime-utils — MIME utility functions +
+
+GMimeReferences — a list of Message-Ids +
+
+GMimeFormatOptions — Format options +
+
+
IV. GMime Classes
+
+
Class hierarchy
+
Streams
+
+
+GMimeStream — Abstract stream class +
+
+GMimeStreamFile — A Standard-C FILE-based stream +
+
+GMimeStreamFs — A low-level FileSystem stream +
+
+GMimeStreamGIO — A wrapper for GLib's GIO streams +
+
+GMimeStreamMem — A memory-backed stream +
+
+GMimeStreamMmap — A memory-mapped file stream +
+
+GMimeStreamNull — A null stream +
+
+GMimeStreamFilter — A filtering stream +
+
+GMimeStreamBuffer — A buffered stream +
+
+GMimeStreamPipe — A low-level pipe stream +
+
+GMimeStreamCat — A concatenated stream +
+
+
Stream Filters
+
+
+GMimeFilter — Abstract filter class +
+
+GMimeFilterBasic — Basic transfer encoding filter +
+
+GMimeFilterBest — Determine the best charset/encoding to use for a stream +
+
+GMimeFilterCharset — Charset-conversion filter +
+
+GMimeFilterChecksum — Calculate a checksum +
+
+GMimeFilterDos2Unix — Convert line-endings from Windows/DOS (CRLF) to UNIX (LF). +
+
+GMimeFilterEnriched — Convert text/enriched or text/rtf to HTML +
+
+GMimeFilterFrom — Escape MBox From_ lines +
+
+GMimeFilterGZip — GNU Zip compression/decompression +
+
+GMimeFilterHTML — Convert plain text into HTML +
+
+GMimeFilterSmtpData — Byte-stuffs outgoing SMTP DATA. +
+
+GMimeFilterStrip — Strip trailing whitespace from the end of lines +
+
+GMimeFilterUnix2Dos — Convert line-endings from UNIX (LF) to Windows/DOS (CRLF). +
+
+GMimeFilterWindows — Determine if text is in a Microsoft Windows codepage +
+
+GMimeFilterYenc — yEncode or yDecode +
+
+
Data Wrappers
+
+GMimeDataWrapper — Content objects +
+
Message and MIME Headers
+
+
+GMimeHeaderList — Message and MIME part headers +
+
+GMimeContentType — Content-Type fields +
+
+GMimeContentDisposition — Content-Disposition fields +
+
+GMimeParamList — Content-Type and Content-Disposition parameters +
+
+
Internet Addresses
+
+
+InternetAddress — Internet addresses +
+
+InternetAddressGroup — rfc822 'group' address +
+
+InternetAddressMailbox — rfc822 'mailbox' address +
+
+InternetAddressList — A list of internet addresses +
+
+
MIME Messages and Parts
+
+
+GMimeObject — Abstract MIME objects +
+
+GMimeMessage — Messages +
+
+GMimePart — MIME parts +
+
+GMimeTextPart — textual MIME parts +
+
+GMimeMultipart — MIME multiparts +
+
+GMimeMultipartEncrypted — Encrypted MIME multiparts +
+
+GMimeMultipartSigned — Signed MIME multiparts +
+
+GMimeApplicationPkcs7Mime — Pkcs7 MIME parts +
+
+GMimeMessagePart — Message parts +
+
+GMimeMessagePartial — Partial MIME parts +
+
+GMimePartIter — MIME part iterators +
+
+
Parsing Messages and MIME Parts
+
+
+GMimeParserOptions — Parser options +
+
+GMimeParser — Message and MIME part parser +
+
+
Cryptography Contexts
+
+
+GMimeCertificate — Digital certificates +
+
+GMimeSignature — Digital signatures +
+
+GMimeCryptoContext — Encryption/signing contexts +
+
+GMimeGpgContext — GnuPG crypto contexts +
+
+GMimePkcs7Context — PKCS7 crypto contexts +
+
+
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/InternetAddresses.html gmime-3.0.1/docs/reference/html/InternetAddresses.html --- gmime-2.6.22+dfsg2/docs/reference/html/InternetAddresses.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/InternetAddresses.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,43 @@ + + + + +Internet Addresses: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+

+Internet Addresses

+
+
+InternetAddress — Internet addresses +
+
+InternetAddressGroup — rfc822 'group' address +
+
+InternetAddressMailbox — rfc822 'mailbox' address +
+
+InternetAddressList — A list of internet addresses +
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/InternetAddressGroup.html gmime-3.0.1/docs/reference/html/InternetAddressGroup.html --- gmime-2.6.22+dfsg2/docs/reference/html/InternetAddressGroup.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/InternetAddressGroup.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,255 @@ + + + + +InternetAddressGroup: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

InternetAddressGroup

+

InternetAddressGroup — rfc822 'group' address

+
+
+

Functions

+ +
+
+

Types and Values

+
++++ + + + + +
structInternetAddressGroup
+
+
+

Object Hierarchy

+
    GObject
+    ╰── InternetAddress
+        ╰── InternetAddressGroup
+
+
+
+

Description

+

An InternetAddressGroup represents an rfc822 'group' address.

+
+
+

Functions

+
+

internet_address_group_new ()

+
InternetAddress *
+internet_address_group_new (const char *name);
+

Creates a new InternetAddressGroup object with the specified +name +.

+
+

Parameters

+
+++++ + + + + + +

name

group name

 
+
+
+

Returns

+

a new InternetAddressGroup object.

+

Note: The name +string should be in UTF-8.

+
+
+
+
+

internet_address_group_get_members ()

+
InternetAddressList *
+internet_address_group_get_members (InternetAddressGroup *group);
+

Gets the InternetAddressList containing the group members of an +rfc822 group address.

+
+

Parameters

+
+++++ + + + + + +

group

a InternetAddressGroup

 
+
+
+

Returns

+

a InternetAddressList containing the +members of group +.

+

[transfer none]

+
+
+
+
+

internet_address_group_set_members ()

+
void
+internet_address_group_set_members (InternetAddressGroup *group,
+                                    InternetAddressList *members);
+

Set the members of the internet address group.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

group

a InternetAddressGroup

 

members

a InternetAddressList

 
+
+
+
+
+

internet_address_group_add_member ()

+
int
+internet_address_group_add_member (InternetAddressGroup *group,
+                                   InternetAddress *member);
+

Add a contact to the internet address group.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

group

a InternetAddressGroup

 

member

a InternetAddress

 
+
+
+

Returns

+

the index of the newly added member.

+
+
+
+
+

Types and Values

+
+

struct InternetAddressGroup

+
struct InternetAddressGroup;
+

An RFC 2822 Group address.

+
+

Members

+
+++++ + +
+
+
+
+
+

See Also

+

InternetAddress

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/InternetAddress.html gmime-3.0.1/docs/reference/html/InternetAddress.html --- gmime-2.6.22+dfsg2/docs/reference/html/InternetAddress.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/InternetAddress.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,300 @@ + + + + +InternetAddress: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

InternetAddress

+

InternetAddress — Internet addresses

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + +
const char * + +internet_address_get_name () +
+void + +internet_address_set_name () +
const char * + +internet_address_get_charset () +
+void + +internet_address_set_charset () +
+char * + +internet_address_to_string () +
+
+
+

Types and Values

+
++++ + + + + +
structInternetAddress
+
+
+

Object Hierarchy

+
    GObject
+    ╰── InternetAddress
+        ├── InternetAddressGroup
+        ╰── InternetAddressMailbox
+
+
+
+

Description

+

An InternetAddress is the base class for InternetAddressGroup and +InternetAddressMailbox.

+
+
+

Functions

+
+

internet_address_get_name ()

+
const char *
+internet_address_get_name (InternetAddress *ia);
+

Gets the display name of the InternetAddress.

+
+

Parameters

+
+++++ + + + + + +

ia

a InternetAddress

 
+
+
+

Returns

+

the name of the mailbox or group in a form suitable +for display if available or NULL otherwise. If the name is available, +the returned string will be in UTF-8.

+

[nullable]

+
+
+
+
+

internet_address_set_name ()

+
void
+internet_address_set_name (InternetAddress *ia,
+                           const char *name);
+

Set the display name of the InternetAddress.

+

Note: The name + string should be in UTF-8.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

ia

a InternetAddress

 

name

the display name for the address group or mailbox

 
+
+
+
+
+

internet_address_get_charset ()

+
const char *
+internet_address_get_charset (InternetAddress *ia);
+

Gets the charset to be used when encoding the name of the mailbox or group.

+
+

Parameters

+
+++++ + + + + + +

ia

a InternetAddress

 
+
+
+

Returns

+

the charset to be used when encoding the name of the +mailbox or group if available or NULL otherwise.

+

[nullable]

+
+
+
+
+

internet_address_set_charset ()

+
void
+internet_address_set_charset (InternetAddress *ia,
+                              const char *charset);
+

Set the charset to use for encoding the name of the mailbox or group.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

ia

a InternetAddress

 

charset

the charset to use when encoding the name or NULL to use the defaults.

[nullable]
+
+
+
+
+

internet_address_to_string ()

+
char *
+internet_address_to_string (InternetAddress *ia,
+                            GMimeFormatOptions *options,
+                            gboolean encode);
+

Allocates a string containing the contents of the InternetAddress +object.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

ia

Internet Address object

 

options

a GMimeFormatOptions or NULL.

[nullable]

encode

TRUE if the address should be rfc2047 encoded

 
+
+
+

Returns

+

the InternetAddress object as an allocated string in +rfc822 format.

+
+
+
+
+

Types and Values

+
+

struct InternetAddress

+
struct InternetAddress;
+

An RFC 2822 Address object.

+
+

Members

+
+++++ + +
+
+
+
+ +
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/InternetAddressList.html gmime-3.0.1/docs/reference/html/InternetAddressList.html --- gmime-2.6.22+dfsg2/docs/reference/html/InternetAddressList.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/InternetAddressList.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,757 @@ + + + + +InternetAddressList: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

InternetAddressList

+

InternetAddressList — A list of internet addresses

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+InternetAddressList * + +internet_address_list_new () +
+InternetAddressList * + +internet_address_list_parse () +
+int + +internet_address_list_length () +
+void + +internet_address_list_clear () +
+int + +internet_address_list_add () +
+void + +internet_address_list_insert () +
+gboolean + +internet_address_list_remove () +
+gboolean + +internet_address_list_remove_at () +
+gboolean + +internet_address_list_contains () +
+int + +internet_address_list_index_of () +
+InternetAddress * + +internet_address_list_get_address () +
+void + +internet_address_list_set_address () +
+void + +internet_address_list_prepend () +
+void + +internet_address_list_append () +
+char * + +internet_address_list_to_string () +
+void + +internet_address_list_encode () +
+
+
+

Types and Values

+
++++ + + + + +
structInternetAddressList
+
+
+

Object Hierarchy

+
    GObject
+    ╰── InternetAddressList
+
+
+
+

Description

+

An InternetAddressList is a collection of InternetAddress +objects.

+
+
+

Functions

+
+

internet_address_list_new ()

+
InternetAddressList *
+internet_address_list_new (void);
+

Creates a new InternetAddressList.

+
+

Returns

+

a new InternetAddressList.

+
+
+
+
+

internet_address_list_parse ()

+
InternetAddressList *
+internet_address_list_parse (GMimeParserOptions *options,
+                             const char *str);
+

Construct a list of internet addresses from the given string.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

options

a GMimeParserOptions or NULL.

[nullable]

str

a string containing internet addresses

 
+
+
+

Returns

+

a InternetAddressList or NULL if the +input string does not contain any addresses.

+

[nullable][transfer full]

+
+
+
+
+

internet_address_list_length ()

+
int
+internet_address_list_length (InternetAddressList *list);
+

Gets the length of the list.

+
+

Parameters

+
+++++ + + + + + +

list

a InternetAddressList

 
+
+
+

Returns

+

the number of InternetAddress objects in the list.

+
+
+
+
+

internet_address_list_clear ()

+
void
+internet_address_list_clear (InternetAddressList *list);
+

Clears the list of addresses.

+
+

Parameters

+
+++++ + + + + + +

list

a InternetAddressList

 
+
+
+
+
+

internet_address_list_add ()

+
int
+internet_address_list_add (InternetAddressList *list,
+                           InternetAddress *ia);
+

Adds an InternetAddress to the InternetAddressList.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

list

a InternetAddressList

 

ia

a InternetAddress

 
+
+
+

Returns

+

the index of the added InternetAddress.

+
+
+
+
+

internet_address_list_insert ()

+
void
+internet_address_list_insert (InternetAddressList *list,
+                              int index,
+                              InternetAddress *ia);
+

Inserts an InternetAddress into the InternetAddressList at the +specified index.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

list

a InternetAddressList

 

index

index to insert at

 

ia

a InternetAddress

 
+
+
+
+
+

internet_address_list_remove ()

+
gboolean
+internet_address_list_remove (InternetAddressList *list,
+                              InternetAddress *ia);
+

Removes an InternetAddress from the InternetAddressList.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

list

a InternetAddressList

 

ia

a InternetAddress

 
+
+
+

Returns

+

TRUE if the specified InternetAddress was removed or +FALSE otherwise.

+
+
+
+
+

internet_address_list_remove_at ()

+
gboolean
+internet_address_list_remove_at (InternetAddressList *list,
+                                 int index);
+

Removes an InternetAddress from the InternetAddressList at the +specified index.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

list

a InternetAddressList

 

index

index to remove

 
+
+
+

Returns

+

TRUE if an InternetAddress was removed or FALSE +otherwise.

+
+
+
+
+

internet_address_list_contains ()

+
gboolean
+internet_address_list_contains (InternetAddressList *list,
+                                InternetAddress *ia);
+

Checks whether or not the specified InternetAddress is contained +within the InternetAddressList.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

list

a InternetAddressList

 

ia

a InternetAddress

 
+
+
+

Returns

+

TRUE if the specified InternetAddress is contained +within the specified InternetAddressList or FALSE otherwise.

+
+
+
+
+

internet_address_list_index_of ()

+
int
+internet_address_list_index_of (InternetAddressList *list,
+                                InternetAddress *ia);
+

Gets the index of the specified InternetAddress inside the +InternetAddressList.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

list

a InternetAddressList

 

ia

a InternetAddress

 
+
+
+

Returns

+

the index of the requested InternetAddress within the +InternetAddressList or -1 if it is not contained within the +InternetAddressList.

+
+
+
+
+

internet_address_list_get_address ()

+
InternetAddress *
+internet_address_list_get_address (InternetAddressList *list,
+                                   int index);
+

Gets the InternetAddress at the specified index.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

list

a InternetAddressList

 

index

index of InternetAddress to get

 
+
+
+

Returns

+

the InternetAddress at the specified +index or NULL if the index is out of range.

+

[transfer none]

+
+
+
+
+

internet_address_list_set_address ()

+
void
+internet_address_list_set_address (InternetAddressList *list,
+                                   int index,
+                                   InternetAddress *ia);
+

Sets the InternetAddress at the specified index to ia +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

list

a InternetAddressList

 

index

index of InternetAddress to set

 

ia

a InternetAddress

 
+
+
+
+
+

internet_address_list_prepend ()

+
void
+internet_address_list_prepend (InternetAddressList *list,
+                               InternetAddressList *prepend);
+

Inserts all of the addresses in prepend + to the beginning of list +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

list

a InternetAddressList

 

prepend

a InternetAddressList

 
+
+
+
+
+

internet_address_list_append ()

+
void
+internet_address_list_append (InternetAddressList *list,
+                              InternetAddressList *append);
+

Adds all of the addresses in append + to list +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

list

a InternetAddressList

 

append

a InternetAddressList

 
+
+
+
+
+

internet_address_list_to_string ()

+
char *
+internet_address_list_to_string (InternetAddressList *list,
+                                 GMimeFormatOptions *options,
+                                 gboolean encode);
+

Allocates a string buffer containing the rfc822 formatted addresses +in list +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

list

list of internet addresses

 

options

a GMimeFormatOptions or NULL.

[nullable]

encode

TRUE if the address should be rfc2047 encoded

 
+
+
+

Returns

+

a string containing the list of addresses in rfc822 +format or NULL if no addresses are contained in the list.

+

[nullable]

+
+
+
+
+

internet_address_list_encode ()

+
void
+internet_address_list_encode (InternetAddressList *list,
+                              GMimeFormatOptions *options,
+                              GString *str);
+

Writes the rfc2047-encoded rfc822 formatted addresses in list + to +str +, folding appropriately.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

list

list of internet addresses

 

options

a GMimeFormatOptions or NULL.

[nullable]

str

string to write to

 
+
+
+
+
+

Types and Values

+
+

struct InternetAddressList

+
struct InternetAddressList;
+

A collection of InternetAddress objects.

+
+

Members

+
+++++ + +
+
+
+
+
+

See Also

+

InternetAddress

+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/InternetAddressMailbox.html gmime-3.0.1/docs/reference/html/InternetAddressMailbox.html --- gmime-2.6.22+dfsg2/docs/reference/html/InternetAddressMailbox.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/InternetAddressMailbox.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,251 @@ + + + + +InternetAddressMailbox: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

InternetAddressMailbox

+

InternetAddressMailbox — rfc822 'mailbox' address

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + +
+InternetAddress * + +internet_address_mailbox_new () +
const char * + +internet_address_mailbox_get_addr () +
+void + +internet_address_mailbox_set_addr () +
const char * + +internet_address_mailbox_get_idn_addr () +
+
+
+

Types and Values

+
++++ + + + + +
structInternetAddressMailbox
+
+
+

Object Hierarchy

+
    GObject
+    ╰── InternetAddress
+        ╰── InternetAddressMailbox
+
+
+
+

Description

+

An InternetAddressMailbox represents what is a typical "email +address".

+
+
+

Functions

+
+

internet_address_mailbox_new ()

+
InternetAddress *
+internet_address_mailbox_new (const char *name,
+                              const char *addr);
+

Creates a new InternetAddress object with the specified name + and +addr +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

name

person's name

 

addr

person's address

 
+
+
+

Returns

+

a new InternetAddressMailbox object.

+

Note: The name +string should be in UTF-8.

+
+
+
+
+

internet_address_mailbox_get_addr ()

+
const char *
+internet_address_mailbox_get_addr (InternetAddressMailbox *mailbox);
+

Gets the addr-spec of the internet address mailbox.

+
+

Parameters

+
+++++ + + + + + +

mailbox

a InternetAddressMailbox

 
+
+
+

Returns

+

the addr-spec string.

+
+
+
+
+

internet_address_mailbox_set_addr ()

+
void
+internet_address_mailbox_set_addr (InternetAddressMailbox *mailbox,
+                                   const char *addr);
+

Set the mailbox address.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

mailbox

a InternetAddressMailbox

 

addr

contact's email address

 
+
+
+
+
+

internet_address_mailbox_get_idn_addr ()

+
const char *
+internet_address_mailbox_get_idn_addr (InternetAddressMailbox *mailbox);
+

Gets the IDN ascii-encoded addr-spec.

+
+

Parameters

+
+++++ + + + + + +

mailbox

a InternetAddressMailbox

 
+
+
+

Returns

+

the encoded addr-spec string.

+
+
+
+
+

Types and Values

+
+

struct InternetAddressMailbox

+
struct InternetAddressMailbox;
+

An RFC 2822 Mailbox address.

+
+

Members

+
+++++ + +
+
+
+
+
+

See Also

+

InternetAddress

+
+
+ + + \ No newline at end of file Binary files /tmp/tmpIS_RQQ/UDbh1D_L26/gmime-2.6.22+dfsg2/docs/reference/html/left-insensitive.png and /tmp/tmpIS_RQQ/lUbmpdA4HT/gmime-3.0.1/docs/reference/html/left-insensitive.png differ Binary files /tmp/tmpIS_RQQ/UDbh1D_L26/gmime-2.6.22+dfsg2/docs/reference/html/left.png and /tmp/tmpIS_RQQ/lUbmpdA4HT/gmime-3.0.1/docs/reference/html/left.png differ diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/MimeParts.html gmime-3.0.1/docs/reference/html/MimeParts.html --- gmime-2.6.22+dfsg2/docs/reference/html/MimeParts.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/MimeParts.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,64 @@ + + + + +MIME Messages and Parts: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+

+MIME Messages and Parts

+
+
+GMimeObject — Abstract MIME objects +
+
+GMimeMessage — Messages +
+
+GMimePart — MIME parts +
+
+GMimeTextPart — textual MIME parts +
+
+GMimeMultipart — MIME multiparts +
+
+GMimeMultipartEncrypted — Encrypted MIME multiparts +
+
+GMimeMultipartSigned — Signed MIME multiparts +
+
+GMimeApplicationPkcs7Mime — Pkcs7 MIME parts +
+
+GMimeMessagePart — Message parts +
+
+GMimeMessagePartial — Partial MIME parts +
+
+GMimePartIter — MIME part iterators +
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/Parsers.html gmime-3.0.1/docs/reference/html/Parsers.html --- gmime-2.6.22+dfsg2/docs/reference/html/Parsers.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/Parsers.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,37 @@ + + + + +Parsing Messages and MIME Parts: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+

+Parsing Messages and MIME Parts

+
+
+GMimeParserOptions — Parser options +
+
+GMimeParser — Message and MIME part parser +
+
+
+ + + \ No newline at end of file Binary files /tmp/tmpIS_RQQ/UDbh1D_L26/gmime-2.6.22+dfsg2/docs/reference/html/right-insensitive.png and /tmp/tmpIS_RQQ/lUbmpdA4HT/gmime-3.0.1/docs/reference/html/right-insensitive.png differ Binary files /tmp/tmpIS_RQQ/UDbh1D_L26/gmime-2.6.22+dfsg2/docs/reference/html/right.png and /tmp/tmpIS_RQQ/lUbmpdA4HT/gmime-3.0.1/docs/reference/html/right.png differ diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/Streams.html gmime-3.0.1/docs/reference/html/Streams.html --- gmime-2.6.22+dfsg2/docs/reference/html/Streams.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/Streams.html 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,64 @@ + + + + +Streams: GMime 3.0 Reference Manual + + + + + + + + + + + + + + + + +
+

+Streams

+
+
+GMimeStream — Abstract stream class +
+
+GMimeStreamFile — A Standard-C FILE-based stream +
+
+GMimeStreamFs — A low-level FileSystem stream +
+
+GMimeStreamGIO — A wrapper for GLib's GIO streams +
+
+GMimeStreamMem — A memory-backed stream +
+
+GMimeStreamMmap — A memory-mapped file stream +
+
+GMimeStreamNull — A null stream +
+
+GMimeStreamFilter — A filtering stream +
+
+GMimeStreamBuffer — A buffered stream +
+
+GMimeStreamPipe — A low-level pipe stream +
+
+GMimeStreamCat — A concatenated stream +
+
+
+ + + \ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/reference/html/style.css gmime-3.0.1/docs/reference/html/style.css --- gmime-2.6.22+dfsg2/docs/reference/html/style.css 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/html/style.css 2017-05-21 16:42:45.000000000 +0000 @@ -0,0 +1,479 @@ +body +{ + font-family: cantarell, sans-serif; +} +.synopsis, .classsynopsis +{ + /* tango:aluminium 1/2 */ + background: #eeeeec; + background: rgba(238, 238, 236, 0.5); + border: solid 1px rgb(238, 238, 236); + padding: 0.5em; +} +.programlisting +{ + /* tango:sky blue 0/1 */ + /* fallback for no rgba support */ + background: #e6f3ff; + border: solid 1px #729fcf; + background: rgba(114, 159, 207, 0.1); + border: solid 1px rgba(114, 159, 207, 0.2); + padding: 0.5em; +} +.variablelist +{ + padding: 4px; + margin-left: 3em; +} +.variablelist td:first-child +{ + vertical-align: top; +} + +div.gallery-float +{ + float: left; + padding: 10px; +} +div.gallery-float img +{ + border-style: none; +} +div.gallery-spacer +{ + clear: both; +} + +a, a:visited +{ + text-decoration: none; + /* tango:sky blue 2 */ + color: #3465a4; +} +a:hover +{ + text-decoration: underline; + /* tango:sky blue 1 */ + color: #729fcf; +} + +div.informaltable table +{ + border-collapse: separate; + border-spacing: 1em 0.3em; + border: none; +} + +div.informaltable table td, div.informaltable table th +{ + vertical-align: top; +} + +.function_type, +.variable_type, +.property_type, +.signal_type, +.parameter_name, +.struct_member_name, +.union_member_name, +.define_keyword, +.datatype_keyword, +.typedef_keyword +{ + text-align: right; +} + +/* dim non-primary columns */ +.c_punctuation, +.function_type, +.variable_type, +.property_type, +.signal_type, +.define_keyword, +.datatype_keyword, +.typedef_keyword, +.property_flags, +.signal_flags, +.parameter_annotations, +.enum_member_annotations, +.struct_member_annotations, +.union_member_annotations +{ + color: #888a85; +} + +.function_type a, +.function_type a:visited, +.function_type a:hover, +.property_type a, +.property_type a:visited, +.property_type a:hover, +.signal_type a, +.signal_type a:visited, +.signal_type a:hover, +.signal_flags a, +.signal_flags a:visited, +.signal_flags a:hover +{ + color: #729fcf; +} + +td p +{ + margin: 0.25em; +} + +div.table table +{ + border-collapse: collapse; + border-spacing: 0px; + /* tango:aluminium 3 */ + border: solid 1px #babdb6; +} + +div.table table td, div.table table th +{ + /* tango:aluminium 3 */ + border: solid 1px #babdb6; + padding: 3px; + vertical-align: top; +} + +div.table table th +{ + /* tango:aluminium 2 */ + background-color: #d3d7cf; +} + +h4 +{ + color: #555753; + margin-top: 1em; + margin-bottom: 1em; +} + +hr +{ + /* tango:aluminium 1 */ + color: #d3d7cf; + background: #d3d7cf; + border: none 0px; + height: 1px; + clear: both; + margin: 2.0em 0em 2.0em 0em; +} + +dl.toc dt +{ + padding-bottom: 0.25em; +} + +dl.toc > dt +{ + padding-top: 0.25em; + padding-bottom: 0.25em; + font-weight: bold; +} + +dl.toc > dl +{ + padding-bottom: 0.5em; +} + +.parameter +{ + font-style: normal; +} + +.footer +{ + padding-top: 3.5em; + /* tango:aluminium 3 */ + color: #babdb6; + text-align: center; + font-size: 80%; +} + +.informalfigure, +.figure +{ + margin: 1em; +} + +.informalexample, +.example +{ + margin-top: 1em; + margin-bottom: 1em; +} + +.warning +{ + /* tango:orange 0/1 */ + background: #ffeed9; + background: rgba(252, 175, 62, 0.1); + border-color: #ffb04f; + border-color: rgba(252, 175, 62, 0.2); +} +.note +{ + /* tango:chameleon 0/0.5 */ + background: #d8ffb2; + background: rgba(138, 226, 52, 0.1); + border-color: #abf562; + border-color: rgba(138, 226, 52, 0.2); +} +div.blockquote +{ + border-color: #eeeeec; +} +.note, .warning, div.blockquote +{ + padding: 0.5em; + border-width: 1px; + border-style: solid; + margin: 2em; +} +.note p, .warning p +{ + margin: 0; +} + +div.warning h3.title, +div.note h3.title +{ + display: none; +} + +p + div.section +{ + margin-top: 1em; +} + +div.refnamediv, +div.refsynopsisdiv, +div.refsect1, +div.refsect2, +div.toc, +div.section +{ + margin-bottom: 1em; +} + +/* blob links */ +h2 .extralinks, h3 .extralinks +{ + float: right; + /* tango:aluminium 3 */ + color: #babdb6; + font-size: 80%; + font-weight: normal; +} + +.lineart +{ + color: #d3d7cf; + font-weight: normal; +} + +.annotation +{ + /* tango:aluminium 5 */ + color: #555753; + font-weight: normal; +} + +.structfield +{ + font-style: normal; + font-weight: normal; +} + +acronym,abbr +{ + border-bottom: 1px dotted gray; +} + +/* code listings */ + +.listing_code .programlisting .normal, +.listing_code .programlisting .normal a, +.listing_code .programlisting .number, +.listing_code .programlisting .cbracket, +.listing_code .programlisting .symbol { color: #555753; } +.listing_code .programlisting .comment, +.listing_code .programlisting .linenum { color: #babdb6; } /* tango: aluminium 3 */ +.listing_code .programlisting .function, +.listing_code .programlisting .function a, +.listing_code .programlisting .preproc { color: #204a87; } /* tango: sky blue 3 */ +.listing_code .programlisting .string { color: #ad7fa8; } /* tango: plum */ +.listing_code .programlisting .keyword, +.listing_code .programlisting .usertype, +.listing_code .programlisting .type, +.listing_code .programlisting .type a { color: #4e9a06; } /* tango: chameleon 3 */ + +.listing_frame { + /* tango:sky blue 1 */ + border: solid 1px #729fcf; + border: solid 1px rgba(114, 159, 207, 0.2); + padding: 0px; +} + +.listing_lines, .listing_code { + margin-top: 0px; + margin-bottom: 0px; + padding: 0.5em; +} +.listing_lines { + /* tango:sky blue 0.5 */ + background: #a6c5e3; + background: rgba(114, 159, 207, 0.2); + /* tango:aluminium 6 */ + color: #2e3436; +} +.listing_code { + /* tango:sky blue 0 */ + background: #e6f3ff; + background: rgba(114, 159, 207, 0.1); +} +.listing_code .programlisting { + /* override from previous */ + border: none 0px; + padding: 0px; + background: none; +} +.listing_lines pre, .listing_code pre { + margin: 0px; +} + +@media screen { + /* these have a as a first child, but since there are no parent selectors + * we can't use that. */ + a.footnote + { + position: relative; + top: 0em ! important; + } + /* this is needed so that the local anchors are displayed below the naviagtion */ + div.footnote a[name], div.refnamediv a[name], div.refsect1 a[name], div.refsect2 a[name], div.index a[name], div.glossary a[name], div.sect1 a[name] + { + display: inline-block; + position: relative; + top:-5em; + } + /* this seems to be a bug in the xsl style sheets when generating indexes */ + div.index div.index + { + top: 0em; + } + /* make space for the fixed navigation bar and add space at the bottom so that + * link targets appear somewhat close to top + */ + body + { + padding-top: 2.5em; + padding-bottom: 500px; + max-width: 60em; + } + p + { + max-width: 60em; + } + /* style and size the navigation bar */ + table.navigation#top + { + position: fixed; + background: #e2e2e2; + border-bottom: solid 1px #babdb6; + border-spacing: 5px; + margin-top: 0; + margin-bottom: 0; + top: 0; + left: 0; + z-index: 10; + } + table.navigation#top td + { + padding-left: 6px; + padding-right: 6px; + } + .navigation a, .navigation a:visited + { + /* tango:sky blue 3 */ + color: #204a87; + } + .navigation a:hover + { + /* tango:sky blue 2 */ + color: #3465a4; + } + td.shortcuts + { + /* tango:sky blue 2 */ + color: #3465a4; + font-size: 80%; + white-space: nowrap; + } + td.shortcuts .dim + { + color: #babdb6; + } + .navigation .title + { + font-size: 80%; + max-width: none; + margin: 0px; + font-weight: normal; + } +} +@media screen and (min-width: 60em) { + /* screen larger than 60em */ + body { margin: auto; } +} +@media screen and (max-width: 60em) { + /* screen less than 60em */ + #nav_hierarchy { display: none; } + #nav_interfaces { display: none; } + #nav_prerequisites { display: none; } + #nav_derived_interfaces { display: none; } + #nav_implementations { display: none; } + #nav_child_properties { display: none; } + #nav_style_properties { display: none; } + #nav_index { display: none; } + #nav_glossary { display: none; } + .gallery_image { display: none; } + .property_flags { display: none; } + .signal_flags { display: none; } + .parameter_annotations { display: none; } + .enum_member_annotations { display: none; } + .struct_member_annotations { display: none; } + .union_member_annotations { display: none; } + /* now that a column is hidden, optimize space */ + col.parameters_name { width: auto; } + col.parameters_description { width: auto; } + col.struct_members_name { width: auto; } + col.struct_members_description { width: auto; } + col.enum_members_name { width: auto; } + col.enum_members_description { width: auto; } + col.union_members_name { width: auto; } + col.union_members_description { width: auto; } + .listing_lines { display: none; } +} +@media print { + table.navigation { + visibility: collapse; + display: none; + } + div.titlepage table.navigation { + visibility: visible; + display: table; + background: #e2e2e2; + border: solid 1px #babdb6; + margin-top: 0; + margin-bottom: 0; + top: 0; + left: 0; + height: 3em; + } +} + Binary files /tmp/tmpIS_RQQ/UDbh1D_L26/gmime-2.6.22+dfsg2/docs/reference/html/up-insensitive.png and /tmp/tmpIS_RQQ/lUbmpdA4HT/gmime-3.0.1/docs/reference/html/up-insensitive.png differ Binary files /tmp/tmpIS_RQQ/UDbh1D_L26/gmime-2.6.22+dfsg2/docs/reference/html/up.png and /tmp/tmpIS_RQQ/lUbmpdA4HT/gmime-3.0.1/docs/reference/html/up.png differ diff -Nru gmime-2.6.22+dfsg2/docs/reference/Makefile.am gmime-3.0.1/docs/reference/Makefile.am --- gmime-2.6.22+dfsg2/docs/reference/Makefile.am 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/docs/reference/Makefile.am 2017-03-28 23:46:25.000000000 +0000 @@ -19,7 +19,7 @@ SCAN_OPTIONS = --deprecated-guards="GMIME_DISABLE_DEPRECATED" # Extra options to pass to gtkdoc-scangobj -SCANGOBJ_OPTIONS=--type-init-func="g_mime_init (0)" +SCANGOBJ_OPTIONS=--type-init-func="g_mime_init ()" # Extra options to supply to gtkdoc-mkdb MKDB_OPTIONS = --sgml-mode --output-format=xml --ignore-files=trio @@ -44,6 +44,7 @@ changes-2.2.sgml \ changes-2.4.sgml \ changes-2.6.sgml \ + changes-3.0.sgml \ compiling.sgml \ data-wrappers.sgml \ filters.sgml \ @@ -58,10 +59,11 @@ # Header files to ignore when scanning IGNORE_HFILES = \ - gmime-application-pkcs7-mime.h \ gmime-charset-map-private.h \ gmime-table-private.h \ gmime-parse-utils.h \ + gmime-gpgme-utils.h \ + gmime-internal.h \ gmime-common.h \ gmime-events.h diff -Nru gmime-2.6.22+dfsg2/docs/reference/Makefile.in gmime-3.0.1/docs/reference/Makefile.in --- gmime-2.6.22+dfsg2/docs/reference/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/reference/Makefile.in 2017-05-21 16:38:02.000000000 +0000 @@ -0,0 +1,874 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# -*- mode: makefile -*- + +#################################### +# Everything below here is generic # +#################################### +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = docs/reference +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gpgme.m4 \ + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/introspection.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/vapigen.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/gtk-doc.make +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DB2HTML = @DB2HTML@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DOLT_BASH = @DOLT_BASH@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMIME_API_VERSION = @GMIME_API_VERSION@ +GMIME_BINARY_AGE = @GMIME_BINARY_AGE@ +GMIME_CFLAGS = @GMIME_CFLAGS@ +GMIME_INCLUDEDIR = @GMIME_INCLUDEDIR@ +GMIME_INTERFACE_AGE = @GMIME_INTERFACE_AGE@ +GMIME_LIBDIR = @GMIME_LIBDIR@ +GMIME_LIBS = @GMIME_LIBS@ +GMIME_LIBS_PRIVATE = @GMIME_LIBS_PRIVATE@ +GMIME_MAJOR_VERSION = @GMIME_MAJOR_VERSION@ +GMIME_MICRO_VERSION = @GMIME_MICRO_VERSION@ +GMIME_MINOR_VERSION = @GMIME_MINOR_VERSION@ +GMIME_VERSION = @GMIME_VERSION@ +GOBJECT_QUERY = @GOBJECT_QUERY@ +GPGME_CONFIG = @GPGME_CONFIG@ +GPGME_PTHREAD_CFLAGS = @GPGME_PTHREAD_CFLAGS@ +GPGME_PTHREAD_LIBS = @GPGME_PTHREAD_LIBS@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = $(datadir)/gtk-doc/html +ICONV_LIBS = @ICONV_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBIDN_CFLAGS = @LIBIDN_CFLAGS@ +LIBIDN_LIBS = @LIBIDN_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTCOMPILE = @LTCOMPILE@ +LTCXXCOMPILE = @LTCXXCOMPILE@ +LTLIBOBJS = @LTLIBOBJS@ +LTP = @LTP@ +LTP_GENHTML = @LTP_GENHTML@ +LT_AGE = @LT_AGE@ +LT_CURRENT = @LT_CURRENT@ +LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@ +LT_RELEASE = @LT_RELEASE@ +LT_REVISION = @LT_REVISION@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MV = @MV@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM = @RM@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHTOOL = @SHTOOL@ +STRIP = @STRIP@ +TAR = @TAR@ +VAPIGEN = @VAPIGEN@ +VAPIGEN_MAKEFILE = @VAPIGEN_MAKEFILE@ +VAPIGEN_VAPIDIR = @VAPIGEN_VAPIDIR@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# The name of the module. +DOC_MODULE_VERSION = $(GMIME_MAJOR_VERSION).$(GMIME_MINOR_VERSION) +DOC_MODULE = gmime + +# The top-level SGML file. +DOC_MAIN_SGML_FILE = gmime-docs.sgml + +# The directory containing the source code (if it contains documentation). +DOC_SOURCE_DIR = $(top_srcdir)/gmime + +# Images to copy into HTML directory +HTML_IMAGES = + +# Extra options to supply to gtkdoc-scan +SCAN_OPTIONS = --deprecated-guards="GMIME_DISABLE_DEPRECATED" + +# Extra options to pass to gtkdoc-scangobj +SCANGOBJ_OPTIONS = --type-init-func="g_mime_init ()" + +# Extra options to supply to gtkdoc-mkdb +MKDB_OPTIONS = --sgml-mode --output-format=xml --ignore-files=trio + +# CFLAGS and LDFLAGS for compiling scan program. Only needed +# if $(DOC_MODULE).types is non-empty. +AM_CPPFLAGS = \ + -I$(top_srcdir) \ + -I$(top_builddir) \ + -I$(top_builddir)/gmime \ + $(GLIB_CFLAGS) + +GTKDOC_LIBS = \ + $(top_builddir)/util/libutil.la \ + $(top_builddir)/gmime/libgmime-$(GMIME_API_VERSION).la \ + $(GLIB_LIBS) + + +# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE) +content_files = \ + building.sgml \ + changes-2.0.sgml \ + changes-2.2.sgml \ + changes-2.4.sgml \ + changes-2.6.sgml \ + changes-3.0.sgml \ + compiling.sgml \ + data-wrappers.sgml \ + filters.sgml \ + question_index.sgml \ + resources.sgml \ + streams.sgml \ + tree_index.sgml + + +# Used for dependencies +HFILE_GLOB = $(top_srcdir)/gmime/*.h +CFILE_GLOB = $(top_srcdir)/gmime/*.c + +# Header files to ignore when scanning +IGNORE_HFILES = \ + gmime-charset-map-private.h \ + gmime-table-private.h \ + gmime-parse-utils.h \ + gmime-gpgme-utils.h \ + gmime-internal.h \ + gmime-common.h \ + gmime-events.h + + +# Extra options to supply to gtkdoc-fixref +FIXXREF_OPTIONS = +@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) +@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) +@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_RUN = +@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_RUN = $(LIBTOOL) --mode=execute + +# We set GPATH here; this gives us semantics for GNU make +# which are more like other make's VPATH, when it comes to +# whether a source that is a target of one rule is then +# searched for in VPATH/GPATH. +# +GPATH = $(srcdir) +TARGET_DIR = $(HTML_DIR)/$(DOC_MODULE) +SETUP_FILES = \ + $(content_files) \ + $(expand_content_files) \ + $(DOC_MAIN_SGML_FILE) \ + $(DOC_MODULE)-sections.txt \ + $(DOC_MODULE)-overrides.txt + + +# Other files to distribute +EXTRA_DIST = $(HTML_IMAGES) $(SETUP_FILES) $(DOC_MODULE)-docs.sgml \ + gmime.hierarchy +DOC_STAMPS = setup-build.stamp scan-build.stamp sgml-build.stamp \ + html-build.stamp pdf-build.stamp \ + sgml.stamp html.stamp pdf.stamp + +SCANOBJ_FILES = \ + $(DOC_MODULE).args \ + $(DOC_MODULE).hierarchy \ + $(DOC_MODULE).interfaces \ + $(DOC_MODULE).prerequisites \ + $(DOC_MODULE).signals + +REPORT_FILES = \ + $(DOC_MODULE)-undocumented.txt \ + $(DOC_MODULE)-undeclared.txt \ + $(DOC_MODULE)-unused.txt + +CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) gtkdoc-check.test +@GTK_DOC_BUILD_HTML_FALSE@HTML_BUILD_STAMP = +@GTK_DOC_BUILD_HTML_TRUE@HTML_BUILD_STAMP = html-build.stamp +@GTK_DOC_BUILD_PDF_FALSE@PDF_BUILD_STAMP = +@GTK_DOC_BUILD_PDF_TRUE@PDF_BUILD_STAMP = pdf-build.stamp + +#### setup #### +GTK_DOC_V_SETUP = $(GTK_DOC_V_SETUP_$(V)) +GTK_DOC_V_SETUP_ = $(GTK_DOC_V_SETUP_$(AM_DEFAULT_VERBOSITY)) +GTK_DOC_V_SETUP_0 = @echo " DOC Preparing build"; + +#### scan #### +GTK_DOC_V_SCAN = $(GTK_DOC_V_SCAN_$(V)) +GTK_DOC_V_SCAN_ = $(GTK_DOC_V_SCAN_$(AM_DEFAULT_VERBOSITY)) +GTK_DOC_V_SCAN_0 = @echo " DOC Scanning header files"; +GTK_DOC_V_INTROSPECT = $(GTK_DOC_V_INTROSPECT_$(V)) +GTK_DOC_V_INTROSPECT_ = $(GTK_DOC_V_INTROSPECT_$(AM_DEFAULT_VERBOSITY)) +GTK_DOC_V_INTROSPECT_0 = @echo " DOC Introspecting gobjects"; + +#### xml #### +GTK_DOC_V_XML = $(GTK_DOC_V_XML_$(V)) +GTK_DOC_V_XML_ = $(GTK_DOC_V_XML_$(AM_DEFAULT_VERBOSITY)) +GTK_DOC_V_XML_0 = @echo " DOC Building XML"; + +#### html #### +GTK_DOC_V_HTML = $(GTK_DOC_V_HTML_$(V)) +GTK_DOC_V_HTML_ = $(GTK_DOC_V_HTML_$(AM_DEFAULT_VERBOSITY)) +GTK_DOC_V_HTML_0 = @echo " DOC Building HTML"; +GTK_DOC_V_XREF = $(GTK_DOC_V_XREF_$(V)) +GTK_DOC_V_XREF_ = $(GTK_DOC_V_XREF_$(AM_DEFAULT_VERBOSITY)) +GTK_DOC_V_XREF_0 = @echo " DOC Fixing cross-references"; + +#### pdf #### +GTK_DOC_V_PDF = $(GTK_DOC_V_PDF_$(V)) +GTK_DOC_V_PDF_ = $(GTK_DOC_V_PDF_$(AM_DEFAULT_VERBOSITY)) +GTK_DOC_V_PDF_0 = @echo " DOC Building PDF"; +BUILT_EXTRA_DIST = +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/gtk-doc.make $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu docs/reference/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu docs/reference/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/gtk-doc.make $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am +check: check-am +@ENABLE_GTK_DOC_FALSE@all-local: +all-am: Makefile all-local +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-local mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-local + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-data-local + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic \ + maintainer-clean-local + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-local + +.MAKE: install-am install-strip + +.PHONY: all all-am all-local check check-am clean clean-generic \ + clean-libtool clean-local cscopelist-am ctags-am dist-hook \ + distclean distclean-generic distclean-libtool distclean-local \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-data-local \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-html install-html-am install-info install-info-am \ + install-man install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + maintainer-clean-local mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ + uninstall-am uninstall-local + +.PRECIOUS: Makefile + + +gtkdoc-check.test: Makefile + $(AM_V_GEN)echo "#!/bin/sh -e" > $@; \ + echo "$(GTKDOC_CHECK_PATH) || exit 1" >> $@; \ + chmod +x $@ + +all-gtk-doc: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) +.PHONY: all-gtk-doc + +@ENABLE_GTK_DOC_TRUE@all-local: all-gtk-doc + +docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) + +$(REPORT_FILES): sgml-build.stamp + +setup-build.stamp: + -$(GTK_DOC_V_SETUP)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ + files=`echo $(SETUP_FILES) $(DOC_MODULE).types`; \ + if test "x$$files" != "x" ; then \ + for file in $$files ; do \ + destdir=`dirname $(abs_builddir)/$$file`; \ + test -d "$$destdir" || mkdir -p "$$destdir"; \ + test -f $(abs_srcdir)/$$file && \ + cp -pf $(abs_srcdir)/$$file $(abs_builddir)/$$file || true; \ + done; \ + fi; \ + fi + $(AM_V_at)touch setup-build.stamp + +scan-build.stamp: setup-build.stamp $(HFILE_GLOB) $(CFILE_GLOB) + $(GTK_DOC_V_SCAN)_source_dir='' ; \ + for i in $(DOC_SOURCE_DIR) ; do \ + _source_dir="$${_source_dir} --source-dir=$$i" ; \ + done ; \ + gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES) + $(GTK_DOC_V_INTROSPECT)if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \ + scanobj_options=""; \ + gtkdoc-scangobj 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$$?" = "0"; then \ + if test "x$(V)" = "x1"; then \ + scanobj_options="--verbose"; \ + fi; \ + fi; \ + CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \ + gtkdoc-scangobj $(SCANGOBJ_OPTIONS) $$scanobj_options --module=$(DOC_MODULE); \ + else \ + for i in $(SCANOBJ_FILES) ; do \ + test -f $$i || touch $$i ; \ + done \ + fi + $(AM_V_at)touch scan-build.stamp + +$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp + @true + +sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(HFILE_GLOB) $(CFILE_GLOB) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files) xml/gtkdocentities.ent + $(GTK_DOC_V_XML)_source_dir='' ; \ + for i in $(DOC_SOURCE_DIR) ; do \ + _source_dir="$${_source_dir} --source-dir=$$i" ; \ + done ; \ + gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS) + $(AM_V_at)touch sgml-build.stamp + +sgml.stamp: sgml-build.stamp + @true + +xml/gtkdocentities.ent: Makefile + $(GTK_DOC_V_XML)$(MKDIR_P) $(@D) && ( \ + echo ""; \ + echo ""; \ + echo ""; \ + echo ""; \ + echo ""; \ + echo ""; \ + echo ""; \ + ) > $@ + +html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files) + $(GTK_DOC_V_HTML)rm -rf html && mkdir html && \ + mkhtml_options=""; \ + gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$$?" = "0"; then \ + if test "x$(V)" = "x1"; then \ + mkhtml_options="$$mkhtml_options --verbose"; \ + fi; \ + fi; \ + gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \ + if test "$$?" = "0"; then \ + mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \ + fi; \ + cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) + -@test "x$(HTML_IMAGES)" = "x" || \ + for file in $(HTML_IMAGES) ; do \ + if test -f $(abs_srcdir)/$$file ; then \ + cp $(abs_srcdir)/$$file $(abs_builddir)/html; \ + fi; \ + if test -f $(abs_builddir)/$$file ; then \ + cp $(abs_builddir)/$$file $(abs_builddir)/html; \ + fi; \ + done; + $(GTK_DOC_V_XREF)gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) + $(AM_V_at)touch html-build.stamp + +pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files) + $(GTK_DOC_V_PDF)rm -f $(DOC_MODULE).pdf && \ + mkpdf_options=""; \ + gtkdoc-mkpdf 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$$?" = "0"; then \ + if test "x$(V)" = "x1"; then \ + mkpdf_options="$$mkpdf_options --verbose"; \ + fi; \ + fi; \ + if test "x$(HTML_IMAGES)" != "x"; then \ + for img in $(HTML_IMAGES); do \ + part=`dirname $$img`; \ + echo $$mkpdf_options | grep >/dev/null "\-\-imgdir=$$part "; \ + if test $$? != 0; then \ + mkpdf_options="$$mkpdf_options --imgdir=$$part"; \ + fi; \ + done; \ + fi; \ + gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS) + $(AM_V_at)touch pdf-build.stamp + +############## + +clean-local: + @rm -f *~ *.bak + @rm -rf .libs + @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-types" ; then \ + rm -f $(DOC_MODULE).types; \ + fi + @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-sections" ; then \ + rm -f $(DOC_MODULE)-sections.txt; \ + fi + +distclean-local: + @rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \ + $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt + @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ + rm -f $(SETUP_FILES) $(DOC_MODULE).types; \ + fi + +maintainer-clean-local: + @rm -rf xml html + +install-data-local: + @installfiles=`echo $(builddir)/html/*`; \ + if test "$$installfiles" = '$(builddir)/html/*'; \ + then echo 1>&2 'Nothing to install' ; \ + else \ + if test -n "$(DOC_MODULE_VERSION)"; then \ + installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ + else \ + installdir="$(DESTDIR)$(TARGET_DIR)"; \ + fi; \ + $(mkinstalldirs) $${installdir} ; \ + for i in $$installfiles; do \ + echo ' $(INSTALL_DATA) '$$i ; \ + $(INSTALL_DATA) $$i $${installdir}; \ + done; \ + if test -n "$(DOC_MODULE_VERSION)"; then \ + mv -f $${installdir}/$(DOC_MODULE).devhelp2 \ + $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \ + fi; \ + $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \ + fi + +uninstall-local: + @if test -n "$(DOC_MODULE_VERSION)"; then \ + installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ + else \ + installdir="$(DESTDIR)$(TARGET_DIR)"; \ + fi; \ + rm -rf $${installdir} + +# +# Require gtk-doc when making dist +# +@HAVE_GTK_DOC_TRUE@dist-check-gtkdoc: docs +@HAVE_GTK_DOC_FALSE@dist-check-gtkdoc: +@HAVE_GTK_DOC_FALSE@ @echo "*** gtk-doc is needed to run 'make dist'. ***" +@HAVE_GTK_DOC_FALSE@ @echo "*** gtk-doc was not found when 'configure' ran. ***" +@HAVE_GTK_DOC_FALSE@ @echo "*** please install gtk-doc and rerun 'configure'. ***" +@HAVE_GTK_DOC_FALSE@ @false + +dist-hook: dist-check-gtkdoc all-gtk-doc dist-hook-local + @mkdir $(distdir)/html + @cp ./html/* $(distdir)/html + @-cp ./$(DOC_MODULE).pdf $(distdir)/ + @-cp ./$(DOC_MODULE).types $(distdir)/ + @-cp ./$(DOC_MODULE)-sections.txt $(distdir)/ + @cd $(distdir) && rm -f $(DISTCLEANFILES) + @$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html + +.PHONY : dist-hook-local docs + +dist-hook-local: $(BUILT_EXTRA_DIST) + files='$(BUILT_EXTRA_DIST)'; \ + for f in $$files; do \ + if test -f $$f; then d=.; else d=$(srcdir); fi; \ + cp $$d/$$f $(distdir) || exit 1; done + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff -Nru gmime-2.6.22+dfsg2/docs/reference/question_index.sgml gmime-3.0.1/docs/reference/question_index.sgml --- gmime-2.6.22+dfsg2/docs/reference/question_index.sgml 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/docs/reference/question_index.sgml 2017-04-23 16:04:10.000000000 +0000 @@ -31,8 +31,8 @@ How do I port from one GMime version to another? - See the list of - incompatible changes from 2.4 to 2.6. + See the list of + incompatible changes from 2.6 to 3.0. @@ -56,12 +56,9 @@ First, read the GThread documentation for portable threading primitives. - Secondly, all functions - in gmime-charset, gmime-iconv - and gmime-utils should - be thread-safe. Objects subclassing + Objects subclassing GObject - are not. This means that you'll have to do your own mutex + are not thread-safe. This means that you'll have to do your own mutex locking if you want to access the same GObjects from multiple threads. diff -Nru gmime-2.6.22+dfsg2/docs/reference/resources.sgml gmime-3.0.1/docs/reference/resources.sgml --- gmime-2.6.22+dfsg2/docs/reference/resources.sgml 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/docs/reference/resources.sgml 2017-03-20 13:44:23.000000000 +0000 @@ -1,4 +1,4 @@ - + Mailing lists and bug reports 3 @@ -15,35 +15,30 @@ If you encounter a bug, misfeature, or missing feature in GMime, please file a bug report at -http://bugzilla.gnome.org. +https://github.com/jstedfast/gmime/issues. We'd also appreciate reports of incomplete or misleading information in -the GMime documentation; file those against the "docs" component of the -"gmime" product in Bugzilla. +the GMime documentation. -The bug tracker should definitely be used for feature requests, it's -not only for bugs. We track all GMime development in Bugzilla, so it's -the way to be sure the GMime developers won't forget about an issue. +The issue tracker should also be used for feature requests, it's not only for bugs. +We track all GMime development in GitHub's issue tracker, so it's the way to be sure +that the GMime developers won't forget about an issue. Submitting Patches -If you develop a bugfix or enhancement for GMime, please file that in -Bugzilla as well. Bugzilla allows you to attach files; please attach a -patch generated by the diff utility, using the - option to make the patch more readable. All -patches must be offered under the terms of -the LGPLv2.1 +If you develop a bugfix or enhancement for GMime, please submit a pull request +if you can. Sending the patch (as generated by a diff -u) to +the mailing-list also works (although a pull request is preferred). Note that +all patches must be offered under the terms of the +LGPLv2.1 license, so be sure you are authorized to give us the patch under those terms. If you want to discuss your patch before or after developing it, mail -gmime-devel-list@gnome.org, -but be sure to file -the Bugzilla report as -well, this way it's less likely to slip through the cracks. +gmime-devel-list@gnome.org. diff -Nru gmime-2.6.22+dfsg2/docs/reference/streams.sgml gmime-3.0.1/docs/reference/streams.sgml --- gmime-2.6.22+dfsg2/docs/reference/streams.sgml 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/docs/reference/streams.sgml 2017-04-23 16:04:05.000000000 +0000 @@ -1,12 +1,12 @@ - GMime Streams + Streams GMime Library - GMime Streams - How to use GMime Streams + Streams + How to use Streams Overview of Streams @@ -29,7 +29,8 @@ added benefits is buffered I/O. GMimeStreamFs, on the other hand, is an abstracted layer above Unix file descriptors. While a GMimeStreamFs can be used on top of a UNIX socket or pipe, you - must be careful because sockets and pipes are not seekable. + must be careful because sockets and pipes are not seekable + (see GMimeStreamPipe for a solution to this). Unlike the previous 2 stream types, GMimeStreamMem does not interact with the file system at all (except maybe the swap @@ -37,8 +38,9 @@ reads and writes to be nearly instantaneous and/or if you don't want to create a temporary file on disk. - The four (4) advanced stream types are GMimeStreamMmap, - GMimeStreamNull, GMimeStreamBuffer and GMimeStreamFilter. + The five (5) advanced stream types are GMimeStreamMmap, + GMimeStreamNull, GMimeStreamPipe, GMimeStreamBuffer and + GMimeStreamFilter. Our most simple stream, GMimeStreamNull, is the stream equivalent of /dev/null on Unix systems. The main difference is @@ -53,6 +55,10 @@ GMimeStreamFile. You'll have to do some experimentation to know for sure. + GMimeStreamPipe is just like GMimeStreamFs except that it + doesn't support seeking, thus being perfect for use with sockets + and pipes. + The GMimeStreamBuffer can be used on top of any other type of stream and has 3 modes: block reads, block writes, and cached reads. Block reads are especially useful if you will be making a diff -Nru gmime-2.6.22+dfsg2/docs/tutorial/gmime-tut.sgml gmime-3.0.1/docs/tutorial/gmime-tut.sgml --- gmime-2.6.22+dfsg2/docs/tutorial/gmime-tut.sgml 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/docs/tutorial/gmime-tut.sgml 2017-04-08 17:01:10.000000000 +0000 @@ -5,8 +5,8 @@ - GMime 2.6 tutorial - Oct 28, 2010 + GMime 3.0 tutorial + Apr 5, 2017 Jeffrey @@ -108,7 +108,7 @@ - gcc -g -Wall -o simple simple.c `pkg-config --cflags --libs gmime-2.4` + gcc -g -Wall -o simple simple.c `pkg-config --cflags --libs gmime-3.0` @@ -127,7 +127,7 @@ use file descriptors) but with a few extras taken from the higher-level Standard C I/O API. - Let's take a moment to regres back to our early days of + Let's take a moment to think back to our early days of programming where we learned how to write "Hello World!" on the console: @@ -156,7 +156,7 @@ GMimeStream *stream; /* initialize GMime */ - g_mime_init (0); + g_mime_init (); /* create a stream around stdout */ stream = g_mime_stream_file_new (stdout); @@ -184,14 +184,8 @@ have left. The first function called in the second example is - g_mime_init with a value of - 0. If you haven't guessed, - g_mime_init initializes the GMime library. It - takes a single bit-mask argument specifying which options to - enable. Currently there is only one optional bit-flag, - GMIME_INIT_FLAG_UTF8 which is the default - anyway, so a value of 0 is used here. The - UTF-8 flag only exists for historical reasons. + g_mime_init. If you haven't guessed, + g_mime_init initializes the GMime library. The only other line that should need explaining might be: @@ -220,7 +214,7 @@ GMimeStream *stream; /* initialize GMime */ - g_mime_init (0); + g_mime_init (); /* create a stream around stdout */ stream = g_mime_stream_fs_new (dup (fileno (stdout))); @@ -551,13 +545,12 @@ GMimeFilterCharset which provides a convenient way to convert text streams of one charset into another charset. - GMimeFilterCRLF will likely become very useful to you if + GMimeFilterUnix2Dos will likely become very useful to you if you are implementing any internet standards or DOS/UNIX compatability. This filter is meant for converting line endings from the traditional UNIX sequence (LF) to the internet standard - (and DOS) sequence, CRLF, and vice versa. Also included in this - filter is a way to escape and unescape lines beginning with '.' - in the method used by the SMTP and POP protocols. + (and DOS) sequence. There's also a GMimeFilterDos2Unix to perform + the opposite conversion. GMimeFilterFrom is one you will likely need to use if ever you need to write to an mbox-formatted mail spool. At present, diff -Nru gmime-2.6.22+dfsg2/docs/tutorial/html/book1.html gmime-3.0.1/docs/tutorial/html/book1.html --- gmime-2.6.22+dfsg2/docs/tutorial/html/book1.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/tutorial/html/book1.html 2017-05-21 16:43:14.000000000 +0000 @@ -0,0 +1,175 @@ + +GMime 3.0 tutorial

  Next >>>
  Tutorial Availability
\ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/tutorial/html/c15.html gmime-3.0.1/docs/tutorial/html/c15.html --- gmime-2.6.22+dfsg2/docs/tutorial/html/c15.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/tutorial/html/c15.html 2017-05-21 16:43:14.000000000 +0000 @@ -0,0 +1,147 @@ + +Tutorial Availability
GMime 3.0 tutorial
<<< PreviousNext >>>

Tutorial Availability

A copy of this tutorial is distributed with each source-code +release of GMime in both SGML and HTML formats. For binary +distributions, please check with your vendor.

An online version of this tutorial is also available at http://spruce.sourceforge.net/gmime/tutorial/. +


<<< PreviousHomeNext >>>
GMime 3.0 tutorial Introduction
\ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/tutorial/html/c166.html gmime-3.0.1/docs/tutorial/html/c166.html --- gmime-2.6.22+dfsg2/docs/tutorial/html/c166.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/tutorial/html/c166.html 2017-05-21 16:43:14.000000000 +0000 @@ -0,0 +1,237 @@ + +MIME, MIME, and more MIME
GMime 3.0 tutorial
<<< Previous 

MIME, MIME, and more MIME

GMimePart

Since most people seem to want to know how to "save an + attachment", let's start there.

Given a GMimePart object, the first step to saving an + attachment is probably going to be figuring out what the + filename is. To do that, you'll likely want to do something + like:

static void
+save_attachment (GMimePart *part)
+{
+	GMimeDataWrapper *content;
+	const char *filename;
+	GMimeStream *stream;
+	int fd;
+	
+	filename = g_mime_part_get_filename (part);
+	...
+      

The g_mime_part_get_filename() function + will first check for a filename parameter in + the Content-Disposition header. If that parameter exists, + it will return the value as the filename. However, if that does + not exist, it will fall back to checking for the + name parameter sometimes found in the + Content-Type header and return that value if it exists + (Microsoft Outlook, for example, will set the name parameter, + but will not set the filename parameter). If neither of these + param values are found, it will simply return + NULL.

Now that you've got a filename for the MIME part (well, + assuming that it isn't NULL - in which case you'll have to + prompt the user or make up your own filename or something), the + next step is to open an output stream and write the MIME part's + content to disk:

	...
+	if ((fd = open (filename, O_CREAT | O_WRONLY, 0666)) == -1)
+		return;
+	
+	stream = g_mime_stream_fs_new (fd);
+	
+	content = g_mime_part_get_content_object (part);
+	g_mime_data_wrapper_write_to_stream (content, stream);
+	g_mime_stream_flush (stream);
+	g_object_unref (stream);
+}
+      

In order to get the content of a MIME part (eg. the body + of a part, not including the headers), you'll want to use + g_mime_part_get_content_object(). To write + the content object to a stream, you can use + g_mime_data_wrapper_write_to_stream(). On + fail, this function will return -1, otherwise + it will return some positive value which will usually equate to + the number of bytes written (but not always, due to filter + transformations); generally it's a good idea to not rely on the + returned value for anything other than error-checking.


<<< PreviousHome 
Filter Class Overview  
\ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/tutorial/html/c20.html gmime-3.0.1/docs/tutorial/html/c20.html --- gmime-2.6.22+dfsg2/docs/tutorial/html/c20.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/tutorial/html/c20.html 2017-05-21 16:43:14.000000000 +0000 @@ -0,0 +1,176 @@ + +Introduction
GMime 3.0 tutorial
<<< PreviousNext >>>

Introduction

GMime is a library for parsing and creating messages using the +Multipurpose Internet Mail Extension (MIME) format. It is licensed +under the GNU Lesser General +Public License (LGPL) so you are free to develop your Free +Software applications using GMime without having to spend anything for +licenses or royalties.

The primary author and maintainer of GMime is:

GMime is essentially an object-oriented application programmers +interface (API). Although written completely in C, it is implemented +using the idea of classes and callback functions (pointers to +functions).

GMime is built upon another library called GLib which also +serves as the foundation for such libraries as the GIMP ToolKit +(Gtk+). GLib is mostly a portability layer but also contains +additional functionality such as hash tables, linked lists, etc. For +more information on GLib, you should see the API reference at http://library.gnome.org/devel/glib/stable/.


<<< PreviousHomeNext >>>
Tutorial Availability Getting Started
\ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/tutorial/html/c32.html gmime-3.0.1/docs/tutorial/html/c32.html --- gmime-2.6.22+dfsg2/docs/tutorial/html/c32.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/tutorial/html/c32.html 2017-05-21 16:43:14.000000000 +0000 @@ -0,0 +1,160 @@ + +Getting Started
GMime 3.0 tutorial
<<< PreviousNext >>>

Getting Started

The first thing you need to do, of course, is download the +GMime source and install it. You can always get the latest version +from http://download.gnome.org/pub/GNOME/sources/gmime/. GMime +uses GNU autoconf for configuration. Once untar'd, type +./configure --help to see a list of options.

More information about building GMime is available in either the +source distribution under docs/reference/ or via +the online reference at http://library.gnome.org/devel/gmime/stable/gmime-building.html.


<<< PreviousHomeNext >>>
Introduction Getting Down to the Basics
\ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/tutorial/html/c40.html gmime-3.0.1/docs/tutorial/html/c40.html --- gmime-2.6.22+dfsg2/docs/tutorial/html/c40.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/tutorial/html/c40.html 2017-05-21 16:43:14.000000000 +0000 @@ -0,0 +1,162 @@ + +Getting Down to the Basics
GMime 3.0 tutorial
<<< PreviousNext >>>

Getting Down to the Basics

Compiling

The first thing you need to learn how to do is compile + your program with the proper compiler flags so that your program + will include the correct GMime headers and linker flags.

To compile and link a simple program, you'll want to do + the following:

          gcc -g -Wall -o simple simple.c `pkg-config --cflags --libs gmime-3.0`
+        

+


<<< PreviousHomeNext >>>
Getting Started GMimeStream Basics
\ No newline at end of file Binary files /tmp/tmpIS_RQQ/UDbh1D_L26/gmime-2.6.22+dfsg2/docs/tutorial/html/stylesheet-images/caution.gif and /tmp/tmpIS_RQQ/lUbmpdA4HT/gmime-3.0.1/docs/tutorial/html/stylesheet-images/caution.gif differ Binary files /tmp/tmpIS_RQQ/UDbh1D_L26/gmime-2.6.22+dfsg2/docs/tutorial/html/stylesheet-images/home.gif and /tmp/tmpIS_RQQ/lUbmpdA4HT/gmime-3.0.1/docs/tutorial/html/stylesheet-images/home.gif differ Binary files /tmp/tmpIS_RQQ/UDbh1D_L26/gmime-2.6.22+dfsg2/docs/tutorial/html/stylesheet-images/important.gif and /tmp/tmpIS_RQQ/lUbmpdA4HT/gmime-3.0.1/docs/tutorial/html/stylesheet-images/important.gif differ Binary files /tmp/tmpIS_RQQ/UDbh1D_L26/gmime-2.6.22+dfsg2/docs/tutorial/html/stylesheet-images/next.gif and /tmp/tmpIS_RQQ/lUbmpdA4HT/gmime-3.0.1/docs/tutorial/html/stylesheet-images/next.gif differ Binary files /tmp/tmpIS_RQQ/UDbh1D_L26/gmime-2.6.22+dfsg2/docs/tutorial/html/stylesheet-images/note.gif and /tmp/tmpIS_RQQ/lUbmpdA4HT/gmime-3.0.1/docs/tutorial/html/stylesheet-images/note.gif differ Binary files /tmp/tmpIS_RQQ/UDbh1D_L26/gmime-2.6.22+dfsg2/docs/tutorial/html/stylesheet-images/prev.gif and /tmp/tmpIS_RQQ/lUbmpdA4HT/gmime-3.0.1/docs/tutorial/html/stylesheet-images/prev.gif differ Binary files /tmp/tmpIS_RQQ/UDbh1D_L26/gmime-2.6.22+dfsg2/docs/tutorial/html/stylesheet-images/tip.gif and /tmp/tmpIS_RQQ/lUbmpdA4HT/gmime-3.0.1/docs/tutorial/html/stylesheet-images/tip.gif differ Binary files /tmp/tmpIS_RQQ/UDbh1D_L26/gmime-2.6.22+dfsg2/docs/tutorial/html/stylesheet-images/toc-blank.gif and /tmp/tmpIS_RQQ/lUbmpdA4HT/gmime-3.0.1/docs/tutorial/html/stylesheet-images/toc-blank.gif differ Binary files /tmp/tmpIS_RQQ/UDbh1D_L26/gmime-2.6.22+dfsg2/docs/tutorial/html/stylesheet-images/toc-minus.gif and /tmp/tmpIS_RQQ/lUbmpdA4HT/gmime-3.0.1/docs/tutorial/html/stylesheet-images/toc-minus.gif differ Binary files /tmp/tmpIS_RQQ/UDbh1D_L26/gmime-2.6.22+dfsg2/docs/tutorial/html/stylesheet-images/toc-plus.gif and /tmp/tmpIS_RQQ/lUbmpdA4HT/gmime-3.0.1/docs/tutorial/html/stylesheet-images/toc-plus.gif differ Binary files /tmp/tmpIS_RQQ/UDbh1D_L26/gmime-2.6.22+dfsg2/docs/tutorial/html/stylesheet-images/up.gif and /tmp/tmpIS_RQQ/lUbmpdA4HT/gmime-3.0.1/docs/tutorial/html/stylesheet-images/up.gif differ Binary files /tmp/tmpIS_RQQ/UDbh1D_L26/gmime-2.6.22+dfsg2/docs/tutorial/html/stylesheet-images/warning.gif and /tmp/tmpIS_RQQ/lUbmpdA4HT/gmime-3.0.1/docs/tutorial/html/stylesheet-images/warning.gif differ diff -Nru gmime-2.6.22+dfsg2/docs/tutorial/html/x102.html gmime-3.0.1/docs/tutorial/html/x102.html --- gmime-2.6.22+dfsg2/docs/tutorial/html/x102.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/tutorial/html/x102.html 2017-05-21 16:43:14.000000000 +0000 @@ -0,0 +1,447 @@ + +Stream Class Overview
GMime 3.0 tutorial
<<< PreviousGetting Down to the BasicsNext >>>

Stream Class Overview

There are a number of stream classes included with GMime, + but we are only going to go over the more widely useful stream + classes. You should be able to figure out the others on your + own.

We've already seen GMimeStreamFile and GMimeStreamFs in + action in the prevous chapter, so let's skip them and start with + GMimeStreamMem.

GMimeStremMem is a stream abstraction that reads and + writes to a memory buffer. Like any other stream, the basic + stream functions (read, write, seek, substream, eos, etc) apply + here as well. Internally, GMimeStreamMem uses the GLib + GByteArray structure for storage so you may want to read up on + that.

There are several ways to instantiate a GMimeStreamMem + object. You will probably use + g_mime_stream_mem_new() most of the + time. There may be times, however, when you will already have a + memory buffer that you'd like to use as a stream. There are + several ways to create a GMimeStreamMem object to use this + buffer (or a copy of it).

The first is + g_mime_stream_mem_new_with_byte_array(). This + assumes that you are already using a GByteArray and want to use + it as a stream. As explained in the previous chapter about + GMimeStreamFile and ownership, the same applies here. When the + GMimeStreamMem is destroyed, so is the GByteArray structure and + the memory buffer it contained. To get around this, create a new + GMimeStreamMem object using + g_mime_stream_mem_new() and then use + g_mime_stream_mem_set_byte_array() to set the + GByteArray as the memory buffer. This will make it so that + GMimeStreamMem does not own the GByteArray, so when the + GMimeStremMem object is destroyed, the GByteArray will + remain.

Also at your disposal for creating GMimeStreamMem objects + with an initial buffer is + g_mime_stream_mem_new_with_buffer(). This + function, however, will duplicate the buffer passed to it so if + you have memory quotas you are trying to keep, you may wish to + find a way to use one of the above methods.

That pretty much sums up how to use GMimeStreamMem. The + next most widely used stream class is probably + GMimeStreamBuffer. This stream class actually wraps another + stream object adding additional functionality such as read and + write buffering and a few additional read methods.

As you may or may not know, buffering reads and writes is + a great way to improve I/O performance in applications. The time + it takes to do a lot of small reads and writes accumulates + fast.

When using a GMimeStreamBuffer in + GMIME_STREAM_BUFFER_BLOCK_READ mode, a block + of 4K (4096 bytes) will be read into an intermediate + buffer. Each time your application performs a read on this + GMimeStreamBuffer stream, a chunk of that intermediate buffer + will be copied to your read buffer until all 4K have been read, + at which point GMimeStreamBuffer will pre-scan the next 4K and so + on.

Similarly, using mode + GMIME_STREAM_BUFFER_BLOCK_WRITE will copy + each of your application write-buffers into an intermediate 4K + buffer. When that 4K buffer fills up, it will be flushed to the + underlying stream. You may also use + g_mime_stream_flush() to force the + intermediate buffer to be written to the underlying + stream.

Note that the intermediate buffer size is 4096 bytes. You + should be aware that if you will mostly be reading and writing + blocks of larger than 4K, it is probably best to avoid using + GMimeStreamBuffer as it will not likely gain you any performance + and may decrease performance instead.

GMimeStreamBuffer also adds 2 convenience functions for + reading. While they will both work with any stream class, they + are obviously much faster if used with a GMimeStreamBuffer in + mode GMIME_STREAM_BUFFER_BLOCK_READ. These + functions are:

ssize_t g_mime_stream_buffer_gets (GMimeStream *stream, char *buf, size_t max);
+
+void    g_mime_stream_buffer_readln (GMimeStream *stream, GByteArray *buffer);
+      

The first function is similar to Standard C's + fgets() function (although the arguments are + in a slightly different order). It reads up to the first + max - 1 bytes, stopping after a + \n character, if found. buf + will always be nul-terminated.

The second function, + g_mime_stream_buffer_readln(), has no + Standard C equivalent that I am aware of, but you should get the + idea of what it does based on the function name (I hope). It + reads exactly one (1) line (including the \n + character) and appends it to the end of + buffer.

The last stream class you really need to know (and the + last one I have the patience to explain) is + GMimeStreamFilter. This is a special stream class which you can + attach GMimeFilters to so that reading/writing to this stream + will automagically convert the stream from one form to + another. GMime uses this stream internally for converting base64 + encoded attachments into their raw form and vice versa.

As previously mentioned in the last chapter concerning + g_mime_stream_reset(), resetting a + GMimeStreamFilter stream will also reset all of the filters + applied.

A great example usage of GMimeStreamFilter can be found in + the src/uuencode.c source file found in the + source distribution. Here's a clip of that source file + illustrating how to use stream filters:

	GMimeStream *istream, *ostream, *fstream;
+	GMimeFilter *filter;
+	int fd;
+	
+	...
+	
+	if (g_mime_stream_printf (ostream, "begin %.3o %s\n", st.st_mode & 0777, name) == -1) {
+		fprintf (stderr, "%s: %s\n", progname, strerror (errno));
+		g_object_unref (ostream);
+		exit (1);
+	}
+	
+	istream = g_mime_stream_fs_new (fd);
+	
+	fstream = g_mime_stream_filter_new (ostream);
+	
+	filter = g_mime_filter_basic_new (GMIME_CONTENT_ENCODING_UUENCODE, TRUE);
+	g_mime_stream_filter_add ((GMimeStreamFilter *) fstream, filter);
+	g_object_unref (filter);
+	
+	if (g_mime_stream_write_to_stream (istream, fstream) == -1) {
+		fprintf (stderr, "%s: %s\n", progname, strerror (errno));
+		g_object_unref (fstream);
+		g_object_unref (istream);
+		g_object_unref (ostream);
+		exit (1);
+	}
+	
+	g_mime_stream_flush (fstream);
+	g_object_unref (fstream);
+	g_object_unref (istream);
+	
+	if (g_mime_stream_write_string (ostream, "end\n") == -1) {
+		fprintf (stderr, "%s: %s\n", progname, strerror (errno));
+		g_object_unref (ostream);
+		exit (1);
+	}
+	
+	g_object_unref (ostream);
+      

The above snippet of code will read the contents of the input + stream (istream) and write it to our output + stream (ostream), but only after it has + passed through our filter-stream + (fstream). The filter attached to + fstream is one of the basic MIME filters that + encodes data in the traditional UUCP format. You have probably + run a program to do this many times in the past using the UNIX + command uuencode. Never thought writing a + replacement for uuencode could be so easy, + did you? Well, it is. And not only is it that + easy, but it also runs faster than the + uuencode shipped with GNU Sharutils (at least + up to and including the 4.2.1 release).


<<< PreviousHomeNext >>>
GMimeStream BasicsUpFilter Class Overview
\ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/tutorial/html/x151.html gmime-3.0.1/docs/tutorial/html/x151.html --- gmime-2.6.22+dfsg2/docs/tutorial/html/x151.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/tutorial/html/x151.html 2017-05-21 16:43:14.000000000 +0000 @@ -0,0 +1,239 @@ + +Filter Class Overview
GMime 3.0 tutorial
<<< PreviousGetting Down to the BasicsNext >>>

Filter Class Overview

GMime comes pre-bundled with a number of stream filters + for your convenience and more may be added in the future. For + now, let's breeze through a summary of some of the more important + ones:

GMimeFilterBasic is used quite a lot internally in GMime + for encoding and decoding the content of MIME parts. This class + contains a mode for encoding and decoding each of Base64, + Quoted-Printable, and Uuencode.

If you are interested in converting between charsets for + your users, you will likely want to become familiar with + GMimeFilterCharset which provides a convenient way to convert + text streams of one charset into another charset.

GMimeFilterUnix2Dos will likely become very useful to you if + you are implementing any internet standards or DOS/UNIX + compatability. This filter is meant for converting line endings + from the traditional UNIX sequence (LF) to the internet standard + (and DOS) sequence. There's also a GMimeFilterDos2Unix to perform + the opposite conversion.

GMimeFilterFrom is one you will likely need to use if ever + you need to write to an mbox-formatted mail spool. At present, + it has 2 modes: GMIME_FILTER_FROM_MODE_ESCAPE + and GMIME_FILTER_FROM_MODE_ARMOR. If you are + writing to an mbox-formatted spool, you will always want to use + the ESCAPE mode which will escape lines + beginning with "From " by prepending a '>' character, resulting + in ">From ". The other mode might come in handy if you are + implementing a multipart/signed method where you are + quoted-printable encoding a text stream and need to special-case + From-lines in order to protect against UNIX systems which will + alter the message when writing it to an mbox file such as the + previously mentioned filter mode. The result is something like + "=46rom " which prevents the need to prepend a '>' character + when the message arrives at a UNIX machine.

Also included are: GMimeFilterBest (which will likely not + concern you), GMimeFilterEnriched (which will convert + text/enriched and/or text/rtf to text/html), and GMimeFilterHTML + which will convert text/plain into text/html with options to + wrap strings that appear to be hyperlinks with appropriate <a + href=...> tags; GMimeFilterStrip (again, likely this won't + concern you), and finally GMimeFilterYenc which will encode or + decode the YEncode encoding.

For an example on how to use filters, please see the end + of the previous chapter where it talks about GMimeStreamFilter + and provides a snippet from + src/uuencode.c

Note: Since it may be non-obvious, filters are applied + to a stream in the same order that they are added to the + GMimeFilterStream. This means that if you add a base64 encode + filter and then add a CRLF filter, the stream will first be + base64 encoded and then the end-of-line formatting will be + canonicalised to CRLF.


<<< PreviousHomeNext >>>
Stream Class OverviewUpMIME, MIME, and more MIME
\ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/tutorial/html/x49.html gmime-3.0.1/docs/tutorial/html/x49.html --- gmime-2.6.22+dfsg2/docs/tutorial/html/x49.html 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/tutorial/html/x49.html 2017-05-21 16:43:14.000000000 +0000 @@ -0,0 +1,528 @@ + +GMimeStream Basics
GMime 3.0 tutorial
<<< PreviousGetting Down to the BasicsNext >>>

GMimeStream Basics

Before we get too deep into using GMime, it is important + to understand how to use the underlying I/O classes since GMime + is so very heavily dependant upon them.

If you've looked at the API at all already, you will have + probably noticed that the stream functions work very much like + those of the standard low-level UNIX I/O functions (those that + use file descriptors) but with a few extras taken from the + higher-level Standard C I/O API.

Let's take a moment to think back to our early days of + programming where we learned how to write "Hello World!" on the + console:

#include <stdio.h>
+
+int main (int argc, char **argv)
+{
+	fprintf (stdout, "Hello World!\n");
+	fflush (stdout);
+	
+	return 0;
+}
+      

Everyone should recognize what that program does. The + above program, rewritten to use GMime's stream classes would + look something like this:

#include <stdio.h>
+#include <gmime/gmime.h>
+
+int main (int argc, char **argv)
+{
+	GMimeStream *stream;
+	
+	/* initialize GMime */
+	g_mime_init ();
+	
+	/* create a stream around stdout */
+	stream = g_mime_stream_file_new (stdout);
+	
+	/* 'printf' */
+	g_mime_stream_printf (stream, "Hello World!\n");
+	
+	/* flush stdout */
+	g_mime_stream_flush (stream);
+	
+	/* free/close the stream */
+	g_object_unref (stream);
+	
+	return 0;
+}
+      

Hopefully, the only thing that may be new to you in either + of the above examples is the flushing of the stream after + writing to it. Most likely, in both examples, it is an unneeded + call, however it is there for completeness and you should + probably get into the habbit of flushing a stream after you've + finished writing to it. Like fflush(), g_mime_stream_flush() + will flush any write-buffers that the previous write-calls may + have left.

The first function called in the second example is + g_mime_init. If you haven't guessed, + g_mime_init initializes the GMime library.

The only other line that should need explaining might be:

	stream = g_mime_stream_file_new (stdout);
+      

This line creates a new object of type GMimeStreamFile which + takes a FILE* argument. Once the + GMimeStreamFile is created, it takes ownership of the + FILE* so be careful if you want to be able to + ever use that FILE* handle again later in + your program or if you do not wish for it to be closed when the + GMimeStreamFile is closed later.

One way of working around this is to do something like the + following example:

#include <stdio.h>
+#include <unistd.h>
+#include <gmime/gmime.h>
+
+int main (int argc, char **argv)
+{
+	GMimeStream *stream;
+	
+	/* initialize GMime */
+	g_mime_init ();
+	
+	/* create a stream around stdout */
+	stream = g_mime_stream_fs_new (dup (fileno (stdout)));
+	
+	/* 'printf' */
+	g_mime_stream_printf (stream, "Hello World!\n");
+	
+	/* flush stdout */
+	g_mime_stream_flush (stream);
+	
+	/* free/close the stream */
+	g_object_unref (stream);
+	
+	return 0;
+}
+      

Here we have made a duplicate copy of stdout to give to + g_mime_stream_fs_new(). GMimeStreamFs is the + second type of stream meant for basic I/O, but instead of using + a FILE* handle, it instead uses an integer + file descriptor. The fileno() function + returns the integer file descriptor for a given + FILE* handle. The dup() + function makes a duplicate of the file descriptor passed to + it. More information can be read about these 2 functions by + using man on your local UNIX system or by + reading the Reference Manual for your libc.

There are also some functions to tell GMimeStreamFile, + GMimeStreamFs and GMimeStreamMem that they are not the owners of + the backend storage and so when they are destroyed, they should + not close the file or free the memory buffer + (respectively). These functions are:

void g_mime_stream_file_set_owner (GMimeStreamFile *stream, gboolean owner);
+void g_mime_stream_fs_set_owner (GMimeStreamFs *stream, gboolean owner);
+void g_mime_stream_mem_set_owner (GMimeStreamMem *stream, gboolean owner);
+      

Next, let's examine some of the other stream + functions.

	g_mime_stream_eos (stream);
+      

This function is useful for finding out if the + End-Of-Stream has been reached. This is similar in functionality + to Standard C's feof() function.

	g_mime_stream_reset (stream);
+      

This function will reset the state of a stream. Usually + this only means 'rewinding' to the beginning of the file. For + more complex streams, such as GMimeStreamFilter, however, this + will also reset the state of all of the filters that have been + attached to it (more on this later).

	g_mime_stream_length (stream);
+      

This function will return the length of the stream if + known, or -1 otherwise. For the most part, this function should + be avoided unless you absolutely need to know the stream length + and there is no other way to get it. The reason to avoid using + it is that it may be inaccurate if any filters are to be applied + as well as possibly being slow depending on the underlying + storage device.

	g_mime_stream_substream (stream, start, end);
+      

This function will return a substream of the original + stream, where the beginning of the new substream is the start + offset and the end is the end offset. These start and end + offsets MUST be within the bounds of the original + stream. Substreams can be useful if you want to only allow + reading and writing to a subsection of the original + stream.

	g_mime_stream_read (stream, buf, n);
+      

Like POSIX read(), this function will + try to read n bytes from the stream + into buf, but be warned that it is not + guaranteed to read the full requested buffer size if that much + data is not currently available.

	g_mime_stream_write (stream, buf, n);
+      

Like POSIX write() and standard + C's fwrite(), this function will write a + buffer of the specified length to the underlying + stream. However, unlike the POSIX write() + function, it will only fail if an irrecoverable error has + occurred and so it is not necessary to loop write attempts until + the entire buffer is written.

	g_mime_stream_seek (stream, offset, GMIME_STREAM_SEEK_SET);
+	g_mime_stream_seek (stream, offset, GMIME_STREAM_SEEK_CUR);
+	g_mime_stream_seek (stream, offset, GMIME_STREAM_SEEK_END);
+      

This function works exactly like the + POSIX lseek() or standard + C's fseek() functions.


<<< PreviousHomeNext >>>
Getting Down to the BasicsUpStream Class Overview
\ No newline at end of file diff -Nru gmime-2.6.22+dfsg2/docs/tutorial/Makefile.in gmime-3.0.1/docs/tutorial/Makefile.in --- gmime-2.6.22+dfsg2/docs/tutorial/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/docs/tutorial/Makefile.in 2017-05-21 16:38:02.000000000 +0000 @@ -0,0 +1,525 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = docs/tutorial +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gpgme.m4 \ + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/introspection.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/vapigen.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DB2HTML = @DB2HTML@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DOLT_BASH = @DOLT_BASH@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMIME_API_VERSION = @GMIME_API_VERSION@ +GMIME_BINARY_AGE = @GMIME_BINARY_AGE@ +GMIME_CFLAGS = @GMIME_CFLAGS@ +GMIME_INCLUDEDIR = @GMIME_INCLUDEDIR@ +GMIME_INTERFACE_AGE = @GMIME_INTERFACE_AGE@ +GMIME_LIBDIR = @GMIME_LIBDIR@ +GMIME_LIBS = @GMIME_LIBS@ +GMIME_LIBS_PRIVATE = @GMIME_LIBS_PRIVATE@ +GMIME_MAJOR_VERSION = @GMIME_MAJOR_VERSION@ +GMIME_MICRO_VERSION = @GMIME_MICRO_VERSION@ +GMIME_MINOR_VERSION = @GMIME_MINOR_VERSION@ +GMIME_VERSION = @GMIME_VERSION@ +GOBJECT_QUERY = @GOBJECT_QUERY@ +GPGME_CONFIG = @GPGME_CONFIG@ +GPGME_PTHREAD_CFLAGS = @GPGME_PTHREAD_CFLAGS@ +GPGME_PTHREAD_LIBS = @GPGME_PTHREAD_LIBS@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBIDN_CFLAGS = @LIBIDN_CFLAGS@ +LIBIDN_LIBS = @LIBIDN_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTCOMPILE = @LTCOMPILE@ +LTCXXCOMPILE = @LTCXXCOMPILE@ +LTLIBOBJS = @LTLIBOBJS@ +LTP = @LTP@ +LTP_GENHTML = @LTP_GENHTML@ +LT_AGE = @LT_AGE@ +LT_CURRENT = @LT_CURRENT@ +LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@ +LT_RELEASE = @LT_RELEASE@ +LT_REVISION = @LT_REVISION@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MV = @MV@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM = @RM@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHTOOL = @SHTOOL@ +STRIP = @STRIP@ +TAR = @TAR@ +VAPIGEN = @VAPIGEN@ +VAPIGEN_MAKEFILE = @VAPIGEN_MAKEFILE@ +VAPIGEN_VAPIDIR = @VAPIGEN_VAPIDIR@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +EXTRA_DIST = gmime-tut.sgml +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu docs/tutorial/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu docs/tutorial/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am dist-hook distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + +.PHONY: html + +html: +@HAVE_DOCBOOK_TRUE@ if test -w $(srcdir); then \ +@HAVE_DOCBOOK_TRUE@ (cd $(srcdir); \ +@HAVE_DOCBOOK_TRUE@ $(DB2HTML) -o html gmime-tut.sgml); \ +@HAVE_DOCBOOK_TRUE@ fi +@HAVE_DOCBOOK_FALSE@ echo "***" +@HAVE_DOCBOOK_FALSE@ echo "*** Warning: Tutorial not built" +@HAVE_DOCBOOK_FALSE@ echo "***" + +dist-hook: html +@HAVE_DOCBOOK_TRUE@ cp -Rp $(srcdir)/html $(distdir) +@HAVE_DOCBOOK_FALSE@ echo "*** DISTRIBUTION IS INCOMPLETE" +@HAVE_DOCBOOK_FALSE@ echo "***" + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff -Nru gmime-2.6.22+dfsg2/examples/basic-example.c gmime-3.0.1/examples/basic-example.c --- gmime-2.6.22+dfsg2/examples/basic-example.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/examples/basic-example.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -35,7 +35,6 @@ #include #ifndef G_OS_WIN32 -static const char *path = "/usr/bin/gpg"; static const char *passphrase = "no.secret"; static gboolean @@ -68,7 +67,7 @@ g_object_unref (stream); /* parse the message from the stream */ - message = g_mime_parser_construct_message (parser); + message = g_mime_parser_construct_message (parser, NULL); /* free the parser (and the stream) */ g_object_unref (parser); @@ -136,37 +135,19 @@ } #ifndef G_OS_WIN32 -static GMimeSignatureStatus -sig_status (GMimeSignatureList *signatures) -{ - GMimeSignatureStatus status = GMIME_SIGNATURE_STATUS_GOOD; - GMimeSignature *sig; - int i; - - if (!signatures || signatures->array->len == 0) - return GMIME_SIGNATURE_STATUS_ERROR; - - for (i = 0; i < g_mime_signature_list_length (signatures); i++) { - sig = g_mime_signature_list_get_signature (signatures, i); - status = MAX (status, sig->status); - } - - return status; -} - static void verify_foreach_callback (GMimeObject *parent, GMimeObject *part, gpointer user_data) { - GMimeCryptoContext *ctx = user_data; - if (GMIME_IS_MULTIPART_SIGNED (part)) { /* this is a multipart/signed part, so we can verify the pgp signature */ GMimeMultipartSigned *mps = (GMimeMultipartSigned *) part; GMimeSignatureList *signatures; + GMimeSignature *sig; GError *err = NULL; const char *str; + int i; - if (!(signatures = g_mime_multipart_signed_verify (mps, ctx, &err))) { + if (!(signatures = g_mime_multipart_signed_verify (mps, GMIME_VERIFY_NONE, &err))) { /* an error occured - probably couldn't start gpg? */ /* for more information about GError, see: @@ -177,19 +158,15 @@ g_error_free (err); } else { /* print out validity info - GOOD vs BAD and "why" */ - switch (sig_status (signatures)) { - case GMIME_SIGNATURE_STATUS_GOOD: - str = "Good"; - break; - case GMIME_SIGNATURE_STATUS_BAD: - str = "Bad"; - break; - case GMIME_SIGNATURE_STATUS_ERROR: - str = "Error"; - break; - default: - str = NULL; - break; + for (i = 0; i < g_mime_signature_list_length (signatures); i++) { + sig = g_mime_signature_list_get_signature (signatures, i); + + if ((sig->status & GMIME_SIGNATURE_STATUS_RED) != 0) + str = "Bad"; + else if ((sig->status & GMIME_SIGNATURE_STATUS_GREEN) != 0) + str = "Good"; + else + str = "Error"; } g_object_unref (signatures); @@ -198,10 +175,10 @@ } static void -verify_signed_parts (GMimeMessage *message, GMimeCryptoContext *ctx) +verify_signed_parts (GMimeMessage *message) { /* descend the mime tree and verify any signed parts */ - g_mime_message_foreach (message, verify_foreach_callback, ctx); + g_mime_message_foreach (message, verify_foreach_callback, NULL); } #endif @@ -215,7 +192,7 @@ g_mime_stream_file_set_owner ((GMimeStreamFile *) stream, FALSE); /* write the message to the stream */ - g_mime_object_write_to_stream ((GMimeObject *) message, stream); + g_mime_object_write_to_stream ((GMimeObject *) message, NULL, stream); /* flush the stream (kinda like fflush() in libc's stdio) */ g_mime_stream_flush (stream); @@ -224,35 +201,24 @@ g_object_unref (stream); } -#define PART_CONTENT "Hello, this is the new text/plain part's content text." +#define TEXT_CONTENT "Hello, this is the new text/plain part's content text." static void add_a_mime_part (GMimeMessage *message) { GMimeMultipart *multipart; GMimeDataWrapper *content; - GMimePart *mime_part; + GMimeTextPart *mime_part; GMimeStream *stream; /* create the new part that we are going to add... */ - mime_part = g_mime_part_new_with_type ("text", "plain"); - - /* create the parts' content stream */ - stream = g_mime_stream_mem_new_with_buffer (PART_CONTENT, strlen (PART_CONTENT)); - - /* create the content object - since the stream is not base64 - or QP encoded or anything, we can use - GMIME_CONTENT_ENCODING_DEFAULT as the encoding type (_DEFAULT - is the same as saying "nothing specified") */ - content = g_mime_data_wrapper_new_with_stream (stream, GMIME_CONTENT_ENCODING_DEFAULT); - g_object_unref (stream); + mime_part = g_mime_text_part_new_with_subtype ("plain"); - /* set the content object on the new mime part */ - g_mime_part_set_content_object (mime_part, content); - g_object_unref (content); + /* set the text content of the mime part */ + g_mime_text_part_set_text (mime_part, TEXT_CONTENT); /* if we want, we can tell GMime that the content should be base64 encoded when written to disk... */ - g_mime_part_set_content_encoding (mime_part, GMIME_CONTENT_ENCODING_BASE64); + g_mime_part_set_content_encoding ((GMimePart *) mime_part, GMIME_CONTENT_ENCODING_BASE64); /* the "polite" way to modify a mime structure that we didn't create is to create a new toplevel multipart/mixed part and @@ -304,20 +270,20 @@ if (argc < 2) { printf ("Usage: a.out \n"); return 0; - } else { - if ((fd = open (argv[1], O_RDONLY, 0)) == -1) { - fprintf (stderr, "Cannot open message `%s': %s\n", argv[1], g_strerror (errno)); - return 0; - } + } + + if ((fd = open (argv[1], O_RDONLY, 0)) == -1) { + fprintf (stderr, "Cannot open message `%s': %s\n", argv[1], g_strerror (errno)); + return 0; } /* init the gmime library */ - g_mime_init (0); + g_mime_init (); /* parse the message */ message = parse_message (fd); if (message == NULL) { - printf("Error parsing message"); + printf ("Error parsing message\n"); return 1; } @@ -326,18 +292,8 @@ #ifndef G_OS_WIN32 #ifdef ENABLE_CRYPTOGRAPHY - /* create our crypto context */ - ctx = g_mime_gpg_context_new (request_passwd, path); - - /* don't allow auto key-retrival */ - g_mime_gpg_context_set_auto_key_retrieve ((GMimeGpgContext *) ctx, FALSE); - - /* set the always_trust flag so that gpg will be spawned with `gpg --always-trust` */ - g_mime_gpg_context_set_always_trust ((GMimeGpgContext *) ctx, TRUE); - /* verify any signed parts */ - verify_signed_parts (message, ctx); - g_object_unref (ctx); + verify_signed_parts (message); #endif #endif diff -Nru gmime-2.6.22+dfsg2/examples/imap-example.c gmime-3.0.1/examples/imap-example.c --- gmime-2.6.22+dfsg2/examples/imap-example.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/examples/imap-example.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -50,7 +50,6 @@ { const char *start, *inptr; GString *str; - char *buf; str = g_string_new (""); @@ -68,32 +67,41 @@ } } - buf = str->str; - g_string_free (str, FALSE); - - return buf; + return g_string_free (str, FALSE); } static void write_part_bodystructure (GMimeObject *part, FILE *fp) { + GMimeContentType *content_type; + GMimeParamList *params; + const char *subtype; GMimeParam *param; + int i, n; fputc ('(', fp); - fprintf (fp, "\"%s\" ", part->content_type->type); - if (part->content_type->subtype) - fprintf (fp, "\"%s\" ", part->content_type->subtype); + content_type = g_mime_object_get_content_type (part); + + fprintf (fp, "\"%s\" ", g_mime_content_type_get_media_type (content_type)); + + if ((subtype = g_mime_content_type_get_media_subtype (content_type))) + fprintf (fp, "\"%s\" ", subtype); else fputs ("\"\"", fp); /* Content-Type params */ - if ((param = part->content_type->params)) { + params = g_mime_content_type_get_parameters (content_type); + if ((n = g_mime_param_list_length (params)) > 0) { fputc ('(', fp); - while (param) { - fprintf (fp, "\"%s\" \"%s\"", param->name, param->value); - if ((param = param->next)) + for (i = 0; i < n; i++) { + if (i > 0) fputc (' ', fp); + + param = g_mime_param_list_get_parameter_at (params, i); + fprintf (fp, "\"%s\" \"%s\"", g_mime_param_get_name (param), + g_mime_param_get_value (param)); + } fputs (") ", fp); } else { @@ -103,7 +111,6 @@ if (GMIME_IS_MULTIPART (part)) { GMimeMultipart *multipart = (GMimeMultipart *) part; GMimeObject *subpart; - int i, n; n = g_mime_multipart_get_count (multipart); for (i = 0; i < n; i++) { @@ -120,9 +127,8 @@ /* print envelope */ fputc ('(', fp); - nstring = g_mime_message_get_date_as_string (message); - fprintf (fp, "\"%s\" ", nstring); - g_free (nstring); + str = g_mime_object_get_header ((GMimeObject *) message, "Date"); + fprintf (fp, "\"%s\" ", str); if ((str = g_mime_object_get_header ((GMimeObject *) message, "Subject"))) nstring = escape_string (str); @@ -192,14 +198,23 @@ /* print body */ write_part_bodystructure ((GMimeObject *) message->mime_part, fp); } else if (GMIME_IS_PART (part)) { - if (GMIME_OBJECT (part)->disposition) { - fprintf (fp, "\"%s\" ", GMIME_OBJECT (part)->disposition->disposition); - if ((param = GMIME_OBJECT (part)->disposition->params)) { + GMimeContentDisposition *disposition; + + disposition = g_mime_object_get_content_disposition (part); + + if (disposition) { + fprintf (fp, "\"%s\" ", g_mime_content_disposition_get_disposition (disposition)); + + params = g_mime_content_disposition_get_parameters (disposition); + if ((n = g_mime_param_list_length (params)) > 0) { fputc ('(', fp); - while (param) { - fprintf (fp, "\"%s\" \"%s\"", param->name, param->value); - if ((param = param->next)) + for (i = 0; i < n; i++) { + if (i > 0) fputc (' ', fp); + + param = g_mime_param_list_get_parameter_at (params, i); + fprintf (fp, "\"%s\" \"%s\"", g_mime_param_get_name (param), + g_mime_param_get_value (param)); } fputs (") ", fp); } else { @@ -209,7 +224,7 @@ fputs ("NIL NIL ", fp); } - switch (GMIME_PART (part)->encoding) { + switch (g_mime_part_get_content_encoding ((GMimePart *) part)) { case GMIME_CONTENT_ENCODING_7BIT: fputs ("\"7bit\"", fp); break; @@ -254,6 +269,7 @@ static void write_header (GMimeMessage *message, const char *uid) { + GMimeFormatOptions *format = g_mime_format_options_get_default (); char *buf; FILE *fp; @@ -261,7 +277,7 @@ fp = fopen (buf, "wt"); g_free (buf); - buf = g_mime_object_get_headers ((GMimeObject *) message); + buf = g_mime_object_get_headers ((GMimeObject *) message, format); fwrite (buf, 1, strlen (buf), fp); g_free (buf); @@ -272,8 +288,10 @@ static void write_part (GMimeObject *part, const char *uid, const char *spec) { + GMimeFormatOptions *format = g_mime_format_options_get_default (); GMimeStream *istream, *ostream; GMimeMultipart *multipart; + GMimeDataWrapper *content; GMimeMessage *message; GMimeObject *subpart; char *buf, *id; @@ -284,7 +302,7 @@ fp = fopen (buf, "wt"); g_free (buf); - buf = g_mime_object_get_headers (part); + buf = g_mime_object_get_headers (part, format); fwrite (buf, 1, strlen (buf), fp); g_free (buf); @@ -307,10 +325,10 @@ fp = fopen (buf, "wt"); g_free (buf); - message = GMIME_MESSAGE_PART (part)->message; + message = g_mime_message_part_get_message ((GMimeMessagePart *) part); ostream = g_mime_stream_file_new (fp); - g_mime_object_write_to_stream (GMIME_OBJECT (message), ostream); + g_mime_object_write_to_stream ((GMimeObject *) message, format, ostream); g_object_unref (ostream); } else if (GMIME_IS_PART (part)) { buf = g_strdup_printf ("%s/%s.TEXT", uid, spec); @@ -318,7 +336,8 @@ g_free (buf); ostream = g_mime_stream_file_new (fp); - istream = g_mime_data_wrapper_get_stream (GMIME_PART (part)->content); + content = g_mime_part_get_content ((GMimePart *) part); + istream = g_mime_data_wrapper_get_stream (content); g_mime_stream_write_to_stream (istream, ostream); g_object_unref (ostream); } @@ -351,11 +370,11 @@ struct { char *type; char *subtype; - GMimeParam *params; + GMimeParamList *params; } content; struct { char *type; - GMimeParam *params; + GMimeParamList *params; } disposition; char *encoding; struct _envelope *envelope; @@ -415,49 +434,53 @@ return qstring; } -static GMimeParam * -decode_param (unsigned char **in, unsigned char *inend) +static gboolean +decode_param (unsigned char **in, unsigned char *inend, char **name, char **value) { GMimeParam *param; - char *name, *val; + char *n, *v; - if (!(name = decode_qstring (in, inend))) - return NULL; + if (!(n = decode_qstring (in, inend))) + return FALSE; - g_assert ((val = decode_qstring (in, inend))); + if (!(v = decode_qstring (in, inend))) { + g_free (n); + return FALSE; + } - param = g_mime_param_new (name, val); - g_free (name); - g_free (val); + *name = n; + *value = v; - return param; + return TRUE; } -static GMimeParam * +static GMimeParamList * decode_params (unsigned char **in, unsigned char *inend) { - GMimeParam *params, *tail, *n; + GMimeParamList *params; unsigned char *inptr; + char *name, *value; inptr = *in; - params = NULL; - tail = (GMimeParam *) ¶ms; + + params = g_mime_param_list_new (); while (inptr < inend && *inptr == ' ') inptr++; if (inptr == inend) { g_assert_not_reached (); - return NULL; + return params; } if (strncmp ((const char *) inptr, "NIL", 3) != 0) { g_assert (*inptr == '('); inptr++; - while ((n = decode_param (&inptr, inend)) != NULL) { - tail->next = n; - tail = n; + while (decode_param (&inptr, inend, &name, &value)) { + g_mime_param_list_set_parameter (params, name, value); + g_free (value); + g_free (name); while (inptr < inend && *inptr == ' ') inptr++; @@ -597,7 +620,7 @@ bodystruct_dump (struct _bodystruct *part, int depth) { GMimeParam *param; - int i; + int i, n; for (i = 0; i < depth; i++) fputs (" ", stderr); @@ -606,10 +629,11 @@ part->content.subtype); if (part->content.params) { - param = part->content.params; - while (param) { - fprintf (stderr, "; %s=%s", param->name, param->value); - param = param->next; + n = g_mime_param_list_length (part->content.params); + for (i = 0; i < n; i++) { + param = g_mime_param_list_get_parameter_at (part->content.params, i); + fprintf (stderr, "; %s=%s", g_mime_param_get_name (param), + g_mime_param_get_value (param)); } } @@ -662,10 +686,11 @@ fputs (" ", stderr); fprintf (stderr, "Content-Disposition: %s", part->disposition.type); if (part->disposition.params) { - param = part->disposition.params; - while (param) { - fprintf (stderr, "; %s=%s", param->name, param->value); - param = param->next; + n = g_mime_param_list_length (part->disposition.params); + for (i = 0; i < n; i++) { + param = g_mime_param_list_get_parameter_at (part->disposition.params, i); + fprintf (stderr, "; %s=%s", g_mime_param_get_name (param), + g_mime_param_get_value (param)); } } @@ -691,11 +716,11 @@ g_free (node->content.type); g_free (node->content.subtype); if (node->content.params) - g_mime_param_destroy (node->content.params); + g_object_unref (node->content.params); g_free (node->disposition.type); if (node->disposition.params) - g_mime_param_destroy (node->disposition.params); + g_object_unref (node->disposition.params); g_free (node->encoding); @@ -743,7 +768,7 @@ content = g_mime_data_wrapper_new_with_stream (stream, part->encoding); g_object_unref (stream); - g_mime_part_set_content_object (part, content); + g_mime_part_set_content (part, content); } static void @@ -756,7 +781,7 @@ int fd; filename = g_strdup_printf ("%s/%s.TEXT", uid, spec); - if ((fd = open (filename, O_RDONLY, 0))) { + if ((fd = open (filename, O_RDONLY, 0)) == -1) { g_mime_message_part_set_message (msgpart, NULL); g_free (filename); return; @@ -766,10 +791,9 @@ stream = g_mime_stream_fs_new (fd); parser = g_mime_parser_new_with_stream (stream); - g_mime_parser_set_scan_from (parser, FALSE); g_object_unref (stream); - message = g_mime_parser_construct_message (parser); + message = g_mime_parser_construct_message (parser, NULL); g_object_unref (parser); g_mime_message_part_set_message (msgpart, message); @@ -821,10 +845,9 @@ stream = g_mime_stream_fs_new (fd); parser = g_mime_parser_new_with_stream (stream); - g_mime_parser_set_scan_from (parser, FALSE); g_object_unref (stream); - subpart = g_mime_parser_construct_part (parser); + subpart = g_mime_parser_construct_part (parser, NULL); g_object_unref (parser); if (GMIME_IS_MULTIPART (subpart)) { @@ -845,6 +868,8 @@ static void reconstruct_message (const char *uid) { + GMimeFormatOptions *format = g_mime_format_options_get_default (); + GMimeObject *mime_part; GMimeMessage *message; GMimeParser *parser; GMimeStream *stream; @@ -861,15 +886,16 @@ stream = g_mime_stream_fs_new (fd); parser = g_mime_parser_new_with_stream (stream); - g_mime_parser_set_scan_from (parser, FALSE); g_object_unref (stream); /* constructs message object and toplevel mime part (although the toplevel mime part will not have any content... */ - message = g_mime_parser_construct_message (parser); + message = g_mime_parser_construct_message (parser, NULL); g_object_unref (parser); - if (GMIME_IS_MULTIPART (message->mime_part)) { + mime_part = g_mime_message_get_mime_part (message); + + if (GMIME_IS_MULTIPART (mime_part)) { struct _bodystruct *body; GByteArray *buffer; GMimeStream *mem; @@ -888,16 +914,16 @@ g_mime_stream_write_to_stream (stream, mem); g_object_unref (stream); - buffer = GMIME_STREAM_MEM (mem)->buffer; + buffer = g_mime_stream_mem_get_byte_array ((GMimeStreamMem *) mem); body = bodystruct_parse (buffer->data, buffer->len); g_object_unref (mem); bodystruct_dump (body, 0); - reconstruct_multipart ((GMimeMultipart *) message->mime_part, body, uid, "1"); + reconstruct_multipart ((GMimeMultipart *) mime_part, body, uid, "1"); bodystruct_free (body); - } else if (GMIME_IS_PART (message->mime_part)) { - reconstruct_part_content ((GMimePart *) message->mime_part, uid, "1"); + } else if (GMIME_IS_PART (mime_part)) { + reconstruct_part_content ((GMimePart *) mime_part, uid, "1"); } filename = g_strdup_printf ("%s/MESSAGE", uid); @@ -908,7 +934,7 @@ g_free (filename); stream = g_mime_stream_fs_new (fd); - g_mime_object_write_to_stream ((GMimeObject *) message, stream); + g_mime_object_write_to_stream ((GMimeObject *) message, format, stream); g_object_unref (message); g_object_unref (stream); } @@ -916,7 +942,7 @@ int main (int argc, char **argv) { - gboolean scan_from = FALSE; + GMimeFormat format = GMIME_FORMAT_MESSAGE; GMimeMessage *message; GMimeParser *parser; GMimeStream *stream; @@ -926,10 +952,10 @@ if (argc < 2) return 0; - g_mime_init (0); + g_mime_init (); - if (!strcmp (argv[i], "-f")) { - scan_from = TRUE; + if (!strcmp (argv[i], "--mbox")) { + format = GMIME_FORMAT_MBOX; i++; } @@ -939,10 +965,10 @@ stream = g_mime_stream_fs_new (fd); parser = g_mime_parser_new_with_stream (stream); - g_mime_parser_set_scan_from (parser, scan_from); + g_mime_parser_set_format (parser, format); g_object_unref (stream); - message = g_mime_parser_construct_message (parser); + message = g_mime_parser_construct_message (parser, NULL); g_object_unref (parser); if (message) { diff -Nru gmime-2.6.22+dfsg2/examples/Makefile.in gmime-3.0.1/examples/Makefile.in --- gmime-2.6.22+dfsg2/examples/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/examples/Makefile.in 2017-05-21 16:38:03.000000000 +0000 @@ -0,0 +1,841 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +noinst_PROGRAMS = basic-example$(EXEEXT) imap-example$(EXEEXT) \ + uuencode$(EXEEXT) uudecode$(EXEEXT) +subdir = examples +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gpgme.m4 \ + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/introspection.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/vapigen.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_basic_example_OBJECTS = basic-example.$(OBJEXT) +basic_example_OBJECTS = $(am_basic_example_OBJECTS) +am__DEPENDENCIES_1 = +am__DEPENDENCIES_2 = $(top_builddir)/util/libutil.la \ + $(top_builddir)/gmime/libgmime-$(GMIME_API_VERSION).la \ + $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +basic_example_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(basic_example_LDFLAGS) $(LDFLAGS) -o $@ +am_imap_example_OBJECTS = imap-example.$(OBJEXT) +imap_example_OBJECTS = $(am_imap_example_OBJECTS) +imap_example_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(imap_example_LDFLAGS) $(LDFLAGS) -o $@ +am__uudecode_SOURCES_DIST = getopt.c getopt.h getopt1.c uudecode.c +@SYSTEM_GETOPT_FALSE@am__objects_1 = getopt.$(OBJEXT) \ +@SYSTEM_GETOPT_FALSE@ getopt1.$(OBJEXT) +am_uudecode_OBJECTS = $(am__objects_1) uudecode.$(OBJEXT) +uudecode_OBJECTS = $(am_uudecode_OBJECTS) +uudecode_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(uudecode_LDFLAGS) $(LDFLAGS) -o $@ +am__uuencode_SOURCES_DIST = getopt.c getopt.h getopt1.c uuencode.c +am_uuencode_OBJECTS = $(am__objects_1) uuencode.$(OBJEXT) +uuencode_OBJECTS = $(am_uuencode_OBJECTS) +uuencode_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(uuencode_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(basic_example_SOURCES) $(imap_example_SOURCES) \ + $(uudecode_SOURCES) $(uuencode_SOURCES) +DIST_SOURCES = $(basic_example_SOURCES) $(imap_example_SOURCES) \ + $(am__uudecode_SOURCES_DIST) $(am__uuencode_SOURCES_DIST) +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp README +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DB2HTML = @DB2HTML@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DOLT_BASH = @DOLT_BASH@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMIME_API_VERSION = @GMIME_API_VERSION@ +GMIME_BINARY_AGE = @GMIME_BINARY_AGE@ +GMIME_CFLAGS = @GMIME_CFLAGS@ +GMIME_INCLUDEDIR = @GMIME_INCLUDEDIR@ +GMIME_INTERFACE_AGE = @GMIME_INTERFACE_AGE@ +GMIME_LIBDIR = @GMIME_LIBDIR@ +GMIME_LIBS = @GMIME_LIBS@ +GMIME_LIBS_PRIVATE = @GMIME_LIBS_PRIVATE@ +GMIME_MAJOR_VERSION = @GMIME_MAJOR_VERSION@ +GMIME_MICRO_VERSION = @GMIME_MICRO_VERSION@ +GMIME_MINOR_VERSION = @GMIME_MINOR_VERSION@ +GMIME_VERSION = @GMIME_VERSION@ +GOBJECT_QUERY = @GOBJECT_QUERY@ +GPGME_CONFIG = @GPGME_CONFIG@ +GPGME_PTHREAD_CFLAGS = @GPGME_PTHREAD_CFLAGS@ +GPGME_PTHREAD_LIBS = @GPGME_PTHREAD_LIBS@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBIDN_CFLAGS = @LIBIDN_CFLAGS@ +LIBIDN_LIBS = @LIBIDN_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTCOMPILE = @LTCOMPILE@ +LTCXXCOMPILE = @LTCXXCOMPILE@ +LTLIBOBJS = @LTLIBOBJS@ +LTP = @LTP@ +LTP_GENHTML = @LTP_GENHTML@ +LT_AGE = @LT_AGE@ +LT_CURRENT = @LT_CURRENT@ +LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@ +LT_RELEASE = @LT_RELEASE@ +LT_REVISION = @LT_REVISION@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MV = @MV@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM = @RM@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHTOOL = @SHTOOL@ +STRIP = @STRIP@ +TAR = @TAR@ +VAPIGEN = @VAPIGEN@ +VAPIGEN_MAKEFILE = @VAPIGEN_MAKEFILE@ +VAPIGEN_VAPIDIR = @VAPIGEN_VAPIDIR@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = . +extra_DIST = README +AM_CPPFLAGS = -I$(top_srcdir) $(GMIME_CFLAGS) $(GLIB_CFLAGS) +DEPS = \ + $(top_builddir)/util/libutil.la \ + $(top_builddir)/gmime/libgmime-$(GMIME_API_VERSION).la + +LDADDS = \ + $(top_builddir)/util/libutil.la \ + $(top_builddir)/gmime/libgmime-$(GMIME_API_VERSION).la \ + $(GLIB_LIBS) + +@SYSTEM_GETOPT_FALSE@GETOPT_SOURCES = getopt.c getopt.h getopt1.c +@SYSTEM_GETOPT_TRUE@GETOPT_SOURCES = +basic_example_SOURCES = basic-example.c +basic_example_LDFLAGS = +basic_example_DEPENDENCIES = $(DEPS) +basic_example_LDADD = $(LDADDS) +imap_example_SOURCES = imap-example.c +imap_example_LDFLAGS = +imap_example_DEPENDENCIES = $(DEPS) +imap_example_LDADD = $(LDADDS) +uuencode_SOURCES = $(GETOPT_SOURCES) uuencode.c +uuencode_LDFLAGS = +uuencode_DEPENDENCIES = $(DEPS) +uuencode_LDADD = $(LDADDS) +uudecode_SOURCES = $(GETOPT_SOURCES) uudecode.c +uudecode_LDFLAGS = +uudecode_DEPENDENCIES = $(DEPS) +uudecode_LDADD = $(LDADDS) +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu examples/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +basic-example$(EXEEXT): $(basic_example_OBJECTS) $(basic_example_DEPENDENCIES) $(EXTRA_basic_example_DEPENDENCIES) + @rm -f basic-example$(EXEEXT) + $(AM_V_CCLD)$(basic_example_LINK) $(basic_example_OBJECTS) $(basic_example_LDADD) $(LIBS) + +imap-example$(EXEEXT): $(imap_example_OBJECTS) $(imap_example_DEPENDENCIES) $(EXTRA_imap_example_DEPENDENCIES) + @rm -f imap-example$(EXEEXT) + $(AM_V_CCLD)$(imap_example_LINK) $(imap_example_OBJECTS) $(imap_example_LDADD) $(LIBS) + +uudecode$(EXEEXT): $(uudecode_OBJECTS) $(uudecode_DEPENDENCIES) $(EXTRA_uudecode_DEPENDENCIES) + @rm -f uudecode$(EXEEXT) + $(AM_V_CCLD)$(uudecode_LINK) $(uudecode_OBJECTS) $(uudecode_LDADD) $(LIBS) + +uuencode$(EXEEXT): $(uuencode_OBJECTS) $(uuencode_DEPENDENCIES) $(EXTRA_uuencode_DEPENDENCIES) + @rm -f uuencode$(EXEEXT) + $(AM_V_CCLD)$(uuencode_LINK) $(uuencode_OBJECTS) $(uuencode_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/basic-example.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-example.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uudecode.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uuencode.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile $(PROGRAMS) +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(am__recursive_targets) install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-am clean clean-generic clean-libtool \ + clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff -Nru gmime-2.6.22+dfsg2/examples/uudecode.c gmime-3.0.1/examples/uudecode.c --- gmime-2.6.22+dfsg2/examples/uudecode.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/examples/uudecode.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -76,7 +76,7 @@ if ((fd = open (filename, flags, mode)) == -1) return NULL; } else { - fd = (flags & O_RDONLY) == O_RDONLY ? 0 : 1; + fd = (flags & O_WRONLY) == O_WRONLY ? 1 : 0; if ((fd = dup (fd)) == -1) return NULL; } @@ -159,7 +159,6 @@ if (p == NULL) { fprintf (stderr, "%s: %s: No `begin' line\n", progname, (!strcmp (infile, DEFAULT_FILENAME)) ? "stdin" : infile); - fclose (fin); goto nexti; } @@ -234,9 +233,10 @@ fflush (fout); fclose (fout); - fclose (fin); nexti: + fclose (fin); + if (str) { g_string_free (str, TRUE); str = NULL; diff -Nru gmime-2.6.22+dfsg2/examples/uuencode.c gmime-3.0.1/examples/uuencode.c --- gmime-2.6.22+dfsg2/examples/uuencode.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/examples/uuencode.c 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -Nru gmime-2.6.22+dfsg2/gmime/charset-map.c gmime-3.0.1/gmime/charset-map.c --- gmime-2.6.22+dfsg2/gmime/charset-map.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/charset-map.c 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License diff -Nru gmime-2.6.22+dfsg2/gmime/gen-table.c gmime-3.0.1/gmime/gen-table.c --- gmime-2.6.22+dfsg2/gmime/gen-table.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gen-table.c 2017-03-28 23:46:25.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -149,8 +149,8 @@ header_decode_init (); printf ("/* THIS FILE IS AUTOGENERATED: DO NOT EDIT! */\n\n"); - printf ("/**\n * To regenerate:\n * make gen-table\n"); - printf (" * ./gen-table > gmime-table-private.h\n **/\n\n"); + printf ("/*\n * To regenerate:\n * make gen-table\n"); + printf (" * ./gen-table > gmime-table-private.h\n */\n\n"); /* print out the table */ printf ("static unsigned short gmime_special_table[256] = {"); @@ -206,7 +206,7 @@ printf ("#define CHARS_ATTRCHAR \"*'%% \" /* attribute-char from rfc2184 */\n"); printf ("\n"); - printf ("#define GMIME_FOLD_LEN 76\n"); + printf ("#define GMIME_FOLD_LEN 78\n"); return 0; } diff -Nru gmime-2.6.22+dfsg2/gmime/GMime-2.6.metadata gmime-3.0.1/gmime/GMime-2.6.metadata --- gmime-2.6.22+dfsg2/gmime/GMime-2.6.metadata 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/GMime-2.6.metadata 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -InternetAddress - .to_string#method name="to_new_string" -References struct=false - -// G-I can't handle non-boxed types -HeaderIter struct=false -PartIter struct=false -Param struct=false - .next#method name="get_next" nullable - -// G-I doesn't allow non-nullable return values (bug #660879) -Message - .get_mime_part nullable -Object - .get_content_type_parameter nullable -Parser - .construct_message nullable - -// G-I doesn't have a time_t type -utils_header_decode_date type="time_t" - -// G-I doesn't support annotations on fields (bug #561619) -Filter - .backbuf type="uint8[]" array_length_field="backsize" - .outreal type="uint8[]" - .outbuf type="unowned uint8[]" array_length_field="outsize" - .outptr type="unowned uint8[]" diff -Nru gmime-2.6.22+dfsg2/gmime/GMime-3.0.metadata gmime-3.0.1/gmime/GMime-3.0.metadata --- gmime-2.6.22+dfsg2/gmime/GMime-3.0.metadata 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/gmime/GMime-3.0.metadata 2017-04-08 17:01:10.000000000 +0000 @@ -0,0 +1,21 @@ +InternetAddress + .to_string#method name="to_new_string" +References struct=false + +// G-I can't handle non-boxed types +PartIter struct=false + +// G-I doesn't allow non-nullable return values (bug #660879) +Message + .get_mime_part nullable +Object + .get_content_type_parameter nullable +Parser + .construct_message nullable + +// G-I doesn't support annotations on fields (bug #561619) +Filter + .backbuf type="uint8[]" array_length_field="backsize" + .outreal type="uint8[]" + .outbuf type="unowned uint8[]" array_length_field="outsize" + .outptr type="unowned uint8[]" diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-application-pkcs7-mime.c gmime-3.0.1/gmime/gmime-application-pkcs7-mime.c --- gmime-2.6.22+dfsg2/gmime/gmime-application-pkcs7-mime.c 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-application-pkcs7-mime.c 2017-04-08 17:01:10.000000000 +0000 @@ -0,0 +1,540 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2017 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "gmime-application-pkcs7-mime.h" +#include "gmime-filter-dos2unix.h" +#include "gmime-stream-filter.h" +#include "gmime-filter-basic.h" +#include "gmime-stream-mem.h" +#include "gmime-internal.h" +#include "gmime-parser.h" +#include "gmime-error.h" + +#define _(x) x + +/** + * SECTION: gmime-application-pkcs7-mime + * @title: GMimeApplicationPkcs7Mime + * @short_description: Pkcs7 MIME parts + * @see_also: + * + * A #GMimeApplicationPkcs7Mime represents the application/pkcs7-mime MIME part. + **/ + +/* GObject class methods */ +static void g_mime_application_pkcs7_mime_class_init (GMimeApplicationPkcs7MimeClass *klass); +static void g_mime_application_pkcs7_mime_init (GMimeApplicationPkcs7Mime *catpart, GMimeApplicationPkcs7MimeClass *klass); +static void g_mime_application_pkcs7_mime_finalize (GObject *object); + +/* GMimeObject class methods */ +static void application_pkcs7_mime_set_content_type (GMimeObject *object, GMimeContentType *content_type); + + +static GMimePartClass *parent_class = NULL; + + +GType +g_mime_application_pkcs7_mime_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeApplicationPkcs7MimeClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_application_pkcs7_mime_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeApplicationPkcs7Mime), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_application_pkcs7_mime_init, + }; + + type = g_type_register_static (GMIME_TYPE_PART, "GMimeApplicationPkcs7Mime", &info, 0); + } + + return type; +} + + +static void +g_mime_application_pkcs7_mime_class_init (GMimeApplicationPkcs7MimeClass *klass) +{ + GMimeObjectClass *object_class = GMIME_OBJECT_CLASS (klass); + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_PART); + + gobject_class->finalize = g_mime_application_pkcs7_mime_finalize; + + object_class->set_content_type = application_pkcs7_mime_set_content_type; +} + +static void +g_mime_application_pkcs7_mime_init (GMimeApplicationPkcs7Mime *pkcs7_mime, GMimeApplicationPkcs7MimeClass *klass) +{ + pkcs7_mime->smime_type = GMIME_SECURE_MIME_TYPE_UNKNOWN; +} + +static void +g_mime_application_pkcs7_mime_finalize (GObject *object) +{ + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +static void +application_pkcs7_mime_set_content_type (GMimeObject *object, GMimeContentType *content_type) +{ + GMimeApplicationPkcs7Mime *pkcs7_mime = (GMimeApplicationPkcs7Mime *) object; + const char *value; + + if ((value = g_mime_content_type_get_parameter (content_type, "smime-type")) != NULL) { + if (!g_ascii_strcasecmp (value, "compressed-data")) + pkcs7_mime->smime_type = GMIME_SECURE_MIME_TYPE_COMPRESSED_DATA; + else if (!g_ascii_strcasecmp (value, "enveloped-data")) + pkcs7_mime->smime_type = GMIME_SECURE_MIME_TYPE_ENVELOPED_DATA; + else if (!g_ascii_strcasecmp (value, "signed-data")) + pkcs7_mime->smime_type = GMIME_SECURE_MIME_TYPE_SIGNED_DATA; + else if (!g_ascii_strcasecmp (value, "certs-only")) + pkcs7_mime->smime_type = GMIME_SECURE_MIME_TYPE_CERTS_ONLY; + else + pkcs7_mime->smime_type = GMIME_SECURE_MIME_TYPE_UNKNOWN; + } else { + pkcs7_mime->smime_type = GMIME_SECURE_MIME_TYPE_UNKNOWN; + } + + GMIME_OBJECT_CLASS (parent_class)->set_content_type (object, content_type); +} + +/** + * g_mime_application_pkcs7_mime_new: + * @type: The type of S/MIME data contained within the part. + * + * Creates a new application/pkcs7-mime object. + * + * Returns: an empty application/pkcs7-mime object. + **/ +GMimeApplicationPkcs7Mime * +g_mime_application_pkcs7_mime_new (GMimeSecureMimeType type) +{ + GMimeApplicationPkcs7Mime *pkcs7_mime; + GMimeContentType *content_type; + const char *name; + + g_return_val_if_fail (type != GMIME_SECURE_MIME_TYPE_UNKNOWN, NULL); + + pkcs7_mime = g_object_new (GMIME_TYPE_APPLICATION_PKCS7_MIME, NULL); + content_type = g_mime_content_type_new ("application", "pkcs7-mime"); + + switch (type) { + case GMIME_SECURE_MIME_TYPE_COMPRESSED_DATA: + g_mime_content_type_set_parameter (content_type, "smime-type", "compressed-data"); + name = "smime.p7z"; + break; + case GMIME_SECURE_MIME_TYPE_ENVELOPED_DATA: + g_mime_content_type_set_parameter (content_type, "smime-type", "enveloped-data"); + name = "smime.p7m"; + break; + case GMIME_SECURE_MIME_TYPE_SIGNED_DATA: + g_mime_content_type_set_parameter (content_type, "smime-type", "signed-data"); + name = "smime.p7m"; + break; + case GMIME_SECURE_MIME_TYPE_CERTS_ONLY: + g_mime_content_type_set_parameter (content_type, "smime-type", "certs-only"); + name = "smime.p7c"; + break; + default: + break; + } + + g_mime_object_set_content_type ((GMimeObject *) pkcs7_mime, content_type); + g_object_unref (content_type); + + g_mime_part_set_filename ((GMimePart *) pkcs7_mime, name); + g_mime_part_set_content_encoding ((GMimePart *) pkcs7_mime, GMIME_CONTENT_ENCODING_BASE64); + + return pkcs7_mime; +} + + +/** + * g_mime_application_pkcs7_mime_get_smime_type: + * @pkcs7_mime: A #GMimeApplicationPkcs7Mime object + * + * Gets the smime-type value of the Content-Type header. + * + * Returns: the smime-type value. + **/ +GMimeSecureMimeType +g_mime_application_pkcs7_mime_get_smime_type (GMimeApplicationPkcs7Mime *pkcs7_mime) +{ + g_return_val_if_fail (GMIME_IS_APPLICATION_PKCS7_MIME (pkcs7_mime), GMIME_SECURE_MIME_TYPE_UNKNOWN); + + return pkcs7_mime->smime_type; +} + + +#if 0 +GMimeApplicationPkcs7Mime * +g_mime_application_pkcs7_mime_compress (GMimePkcs7Context *ctx, GMimeObject *entity, GError **err) +{ +} + + +GMimeObject * +g_mime_application_pkcs7_mime_decompress (GMimeApplicationPkcs7Mime *pkcs7_mime, GMimePkcs7Context *ctx) +{ +} +#endif + + +/** + * g_mime_application_pkcs7_mime_encrypt: + * @entity: a #GMimeObject to encrypt + * @flags: a #GMimeEncryptFlags + * @recipients: (element-type utf8): an array of recipients to encrypt to + * @err: a #GError + * + * Attempts to encrypt the @entity MIME part to the public keys of @recipients + * using S/MIME. If successful, a new application/pkcs7-mime object is returned. + * + * Returns: (nullable) (transfer full): a new #GMimeApplicationPkcs7Mime object on success + * or %NULL on fail. If encrypting fails, an exception will be set on @err to provide + * information as to why the failure occured. + **/ +GMimeApplicationPkcs7Mime * +g_mime_application_pkcs7_mime_encrypt (GMimeObject *entity, GMimeEncryptFlags flags, GPtrArray *recipients, GError **err) +{ + GMimeApplicationPkcs7Mime *pkcs7_mime; + GMimeStream *ciphertext, *stream; + GMimeContentType *content_type; + GMimeFormatOptions *options; + GMimeDataWrapper *content; + GMimeCryptoContext *ctx; + GMimeFilter *filter; + + g_return_val_if_fail (GMIME_IS_OBJECT (entity), NULL); + g_return_val_if_fail (recipients != NULL, NULL); + + if (!(ctx = g_mime_crypto_context_new ("application/pkcs7-mime"))) { + g_set_error (err, GMIME_ERROR, GMIME_ERROR_PROTOCOL_ERROR, + _("Cannot encrypt application/pkcs7-mime part: no crypto context registered for this type.")); + + return NULL; + } + + options = _g_mime_format_options_clone (NULL, FALSE); + g_mime_format_options_set_newline_format (options, GMIME_NEWLINE_FORMAT_DOS); + + /* get the cleartext */ + stream = g_mime_stream_mem_new (); + g_mime_object_write_to_stream (entity, options, stream); + g_mime_format_options_free (options); + + /* reset the content stream */ + g_mime_stream_reset (stream); + + /* encrypt the content stream */ + ciphertext = g_mime_stream_mem_new (); + if (g_mime_crypto_context_encrypt (ctx, FALSE, NULL, flags, recipients, stream, ciphertext, err) == -1) { + g_object_unref (ciphertext); + g_object_unref (stream); + g_object_unref (ctx); + return NULL; + } + + g_object_unref (stream); + g_mime_stream_reset (ciphertext); + g_object_unref (ctx); + + /* construct the application/pkcs7-mime part */ + pkcs7_mime = g_mime_application_pkcs7_mime_new (GMIME_SECURE_MIME_TYPE_ENVELOPED_DATA); + content = g_mime_data_wrapper_new_with_stream (ciphertext, GMIME_CONTENT_ENCODING_DEFAULT); + g_mime_part_set_content ((GMimePart *) pkcs7_mime, content); + g_object_unref (ciphertext); + g_object_unref (content); + + return pkcs7_mime; +} + + +/** + * g_mime_application_pkcs7_mime_decrypt: + * @pkcs7_mime: a #GMimeApplicationPkcs7Mime + * @flags: a #GMimeDecryptFlags + * @session_key: session key to use or %NULL + * @result: the decryption result + * @err: a #GError + * + * Attempts to decrypt the encrypted application/pkcs7-mime part. + * + * When non-%NULL, @session_key should be a %NULL-terminated string, + * such as the one returned by g_mime_decrypt_result_get_session_key() + * from a previous decryption. If the @sesion_key is not valid, decryption + * will fail. + * + * If @result is non-%NULL, then on a successful decrypt operation, it will be + * updated to point to a newly-allocated #GMimeDecryptResult with signature + * status information as well as a list of recipients that the part was + * encrypted to. + * + * Returns: (nullable) (transfer full): the decrypted MIME part on success or + * %NULL on fail. If the decryption fails, an exception will be set on + * @err to provide information as to why the failure occured. + **/ +GMimeObject * +g_mime_application_pkcs7_mime_decrypt (GMimeApplicationPkcs7Mime *pkcs7_mime, + GMimeDecryptFlags flags, const char *session_key, + GMimeDecryptResult **result, GError **err) +{ + GMimeStream *filtered, *ciphertext, *stream; + GMimeDataWrapper *content; + GMimeCryptoContext *ctx; + GMimeDecryptResult *res; + GMimeObject *decrypted; + GMimeFilter *filter; + GMimeParser *parser; + + g_return_val_if_fail (GMIME_IS_APPLICATION_PKCS7_MIME (pkcs7_mime), NULL); + + if (result) + *result = NULL; + + if (!(ctx = g_mime_crypto_context_new ("application/pkcs7-mime"))) { + g_set_error (err, GMIME_ERROR, GMIME_ERROR_PROTOCOL_ERROR, + _("Cannot decrypt application/pkcs7-mime part: no crypto context registered for this type.")); + + return NULL; + } + + /* get the ciphertext stream */ + content = g_mime_part_get_content ((GMimePart *) pkcs7_mime); + ciphertext = g_mime_stream_mem_new (); + g_mime_data_wrapper_write_to_stream (content, ciphertext); + g_mime_stream_reset (ciphertext); + + stream = g_mime_stream_mem_new (); + filtered = g_mime_stream_filter_new (stream); + filter = g_mime_filter_dos2unix_new (FALSE); + g_mime_stream_filter_add ((GMimeStreamFilter *) filtered, filter); + g_object_unref (filter); + + /* decrypt the content stream */ + if (!(res = g_mime_crypto_context_decrypt (ctx, flags, session_key, ciphertext, filtered, err))) { + g_object_unref (ciphertext); + g_object_unref (filtered); + g_object_unref (stream); + g_object_unref (ctx); + + return NULL; + } + + g_mime_stream_flush (filtered); + g_object_unref (ciphertext); + g_object_unref (filtered); + g_object_unref (ctx); + + g_mime_stream_reset (stream); + parser = g_mime_parser_new (); + g_mime_parser_init_with_stream (parser, stream); + g_object_unref (stream); + + decrypted = g_mime_parser_construct_part (parser, NULL); + g_object_unref (parser); + + if (!decrypted) { + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_PARSE_ERROR, + _("Cannot decrypt application/pkcs7-mime part: failed to parse decrypted content.")); + + g_object_unref (res); + + return NULL; + } + + if (!result) + g_object_unref (res); + else + *result = res; + + return decrypted; +} + + +/** + * g_mime_application_pkcs7_mime_sign: + * @entity: a #GMimeObject + * @userid: the user id to sign with + * @err: a #GError + * + * Attempts to sign the @entity MIME part with @userid's private key using + * S/MIME. If successful, a new application/pkcs7-mime object is returned. + * + * Returns: (nullable) (transfer full): a new #GMimeApplicationPkcs7Mime object on success + * or %NULL on fail. If signing fails, an exception will be set on @err to provide + * information as to why the failure occured. + **/ +GMimeApplicationPkcs7Mime * +g_mime_application_pkcs7_mime_sign (GMimeObject *entity, const char *userid, GError **err) +{ + GMimeApplicationPkcs7Mime *pkcs7_mime; + GMimeStream *ciphertext, *stream; + GMimeContentType *content_type; + GMimeFormatOptions *options; + GMimeDataWrapper *content; + GMimeCryptoContext *ctx; + GMimeFilter *filter; + + g_return_val_if_fail (GMIME_IS_OBJECT (entity), NULL); + g_return_val_if_fail (userid != NULL, NULL); + + if (!(ctx = g_mime_crypto_context_new ("application/pkcs7-mime"))) { + g_set_error (err, GMIME_ERROR, GMIME_ERROR_PROTOCOL_ERROR, + _("Cannot sign application/pkcs7-mime part: no crypto context registered for this type.")); + + return NULL; + } + + options = _g_mime_format_options_clone (NULL, FALSE); + g_mime_format_options_set_newline_format (options, GMIME_NEWLINE_FORMAT_DOS); + + /* get the cleartext */ + stream = g_mime_stream_mem_new (); + g_mime_object_write_to_stream (entity, options, stream); + g_mime_format_options_free (options); + + /* reset the content stream */ + g_mime_stream_reset (stream); + + /* sign the content stream */ + ciphertext = g_mime_stream_mem_new (); + if (g_mime_crypto_context_sign (ctx, FALSE, userid, stream, ciphertext, err) == -1) { + g_object_unref (ciphertext); + g_object_unref (stream); + g_object_unref (ctx); + return NULL; + } + + g_object_unref (stream); + g_mime_stream_reset (ciphertext); + g_object_unref (ctx); + + /* construct the application/pkcs7-mime part */ + pkcs7_mime = g_mime_application_pkcs7_mime_new (GMIME_SECURE_MIME_TYPE_SIGNED_DATA); + content = g_mime_data_wrapper_new_with_stream (ciphertext, GMIME_CONTENT_ENCODING_DEFAULT); + g_mime_part_set_content ((GMimePart *) pkcs7_mime, content); + g_object_unref (ciphertext); + g_object_unref (content); + + return pkcs7_mime; +} + + +/** + * g_mime_application_pkcs7_mime_verify: + * @pkcs7_mime: a #GMimeApplicationPkcs7Mime + * @flags: a #GMimeVerifyFlags + * @entity: (out) (transfer full): the extracted entity + * @err: a #GError + * + * Attempts to verify the signed @pkcs7_mime part and extract the original + * MIME entity. + * + * Returns: (nullable) (transfer full): a new #GMimeSignatureList object on + * success or %NULL on fail. If the verification fails, an exception + * will be set on @err to provide information as to why the failure + * occured. + **/ +GMimeSignatureList * +g_mime_application_pkcs7_mime_verify (GMimeApplicationPkcs7Mime *pkcs7_mime, GMimeVerifyFlags flags, GMimeObject **entity, GError **err) +{ + GMimeStream *filtered, *ciphertext, *stream; + GMimeSignatureList *signatures; + GMimeDataWrapper *content; + GMimeCryptoContext *ctx; + GMimeFilter *filter; + GMimeParser *parser; + + g_return_val_if_fail (GMIME_IS_APPLICATION_PKCS7_MIME (pkcs7_mime), NULL); + g_return_val_if_fail (entity != NULL, NULL); + + *entity = NULL; + + if (!(ctx = g_mime_crypto_context_new ("application/pkcs7-mime"))) { + g_set_error (err, GMIME_ERROR, GMIME_ERROR_PROTOCOL_ERROR, + _("Cannot verify application/pkcs7-mime part: no crypto context registered for this type.")); + + return NULL; + } + + /* get the ciphertext stream */ + content = g_mime_part_get_content ((GMimePart *) pkcs7_mime); + ciphertext = g_mime_stream_mem_new (); + g_mime_data_wrapper_write_to_stream (content, ciphertext); + g_mime_stream_reset (ciphertext); + + stream = g_mime_stream_mem_new (); + filtered = g_mime_stream_filter_new (stream); + filter = g_mime_filter_dos2unix_new (FALSE); + g_mime_stream_filter_add ((GMimeStreamFilter *) filtered, filter); + g_object_unref (filter); + + /* decrypt the content stream */ + if (!(signatures = g_mime_crypto_context_verify (ctx, flags, ciphertext, NULL, filtered, err))) { + g_object_unref (ciphertext); + g_object_unref (filtered); + g_object_unref (stream); + g_object_unref (ctx); + + return NULL; + } + + g_mime_stream_flush (filtered); + g_object_unref (ciphertext); + g_object_unref (filtered); + g_object_unref (ctx); + + g_mime_stream_reset (stream); + parser = g_mime_parser_new (); + g_mime_parser_init_with_stream (parser, stream); + g_object_unref (stream); + + *entity = g_mime_parser_construct_part (parser, NULL); + g_object_unref (parser); + + if (*entity == NULL) { + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_PARSE_ERROR, + _("Cannot verify application/pkcs7-mime part: failed to parse extracted content.")); + + g_object_unref (signatures); + + return NULL; + } + + return signatures; +} diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-application-pkcs7-mime.h gmime-3.0.1/gmime/gmime-application-pkcs7-mime.h --- gmime-2.6.22+dfsg2/gmime/gmime-application-pkcs7-mime.h 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-application-pkcs7-mime.h 2017-03-13 22:50:07.000000000 +0000 @@ -0,0 +1,102 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2017 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_APPLICATION_PKCS7_MIME_H__ +#define __GMIME_APPLICATION_PKCS7_MIME_H__ + +#include + +#include +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_APPLICATION_PKCS7_MIME (g_mime_application_pkcs7_mime_get_type ()) +#define GMIME_APPLICATION_PKCS7_MIME(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_APPLICATION_PKCS7_MIME, GMimeApplicationPkcs7Mime)) +#define GMIME_APPLICATION_PKCS7_MIME_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_APPLICATION_PKCS7_MIME, GMimeApplicationPkcs7MimeClass)) +#define GMIME_IS_APPLICATION_PKCS7_MIME(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_APPLICATION_PKCS7_MIME)) +#define GMIME_IS_APPLICATION_PKCS7_MIME_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_APPLICATION_PKCS7_MIME)) +#define GMIME_APPLICATION_PKCS7_MIME_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_APPLICATION_PKCS7_MIME, GMimeApplicationPkcs7MimeClass)) + +typedef struct _GMimeApplicationPkcs7Mime GMimeApplicationPkcs7Mime; +typedef struct _GMimeApplicationPkcs7MimeClass GMimeApplicationPkcs7MimeClass; + +/** + * GMimeSecureMimeType: + * @GMIME_SECURE_MIME_TYPE_COMPRESSED_DATA: The S/MIME content contains compressed data. + * @GMIME_SECURE_MIME_TYPE_ENVELOPED_DATA: The S/MIME content contains enveloped data. + * @GMIME_SECURE_MIME_TYPE_SIGNED_DATA: The S/MIME content contains signed data. + * @GMIME_SECURE_MIME_TYPE_CERTS_ONLY: The S/MIME content contains only certificates. + * @GMIME_SECURE_MIME_TYPE_UNKNOWN: The S/MIME content is unknown. + * + * The S/MIME data type. + **/ +typedef enum _GMimeSecureMimeType { + GMIME_SECURE_MIME_TYPE_COMPRESSED_DATA, + GMIME_SECURE_MIME_TYPE_ENVELOPED_DATA, + GMIME_SECURE_MIME_TYPE_SIGNED_DATA, + GMIME_SECURE_MIME_TYPE_CERTS_ONLY, + GMIME_SECURE_MIME_TYPE_UNKNOWN, +} GMimeSecureMimeType; + +/** + * GMimeApplicationPkcs7Mime: + * @parent_object: parent #GMimePart object + * @smime_type: The smime-type Content-Type parameter. + * + * An application/pkcs7-mime MIME part. + **/ +struct _GMimeApplicationPkcs7Mime { + GMimePart parent_object; + + GMimeSecureMimeType smime_type; +}; + +struct _GMimeApplicationPkcs7MimeClass { + GMimePartClass parent_class; + +}; + + +GType g_mime_application_pkcs7_mime_get_type (void); + +GMimeApplicationPkcs7Mime *g_mime_application_pkcs7_mime_new (GMimeSecureMimeType type); + +GMimeSecureMimeType g_mime_application_pkcs7_mime_get_smime_type (GMimeApplicationPkcs7Mime *pkcs7_mime); + +/*GMimeApplicationPkcs7Mime *g_mime_application_pkcs7_mime_compress (GMimeObject *entity, GError **err);*/ +/*GMimeObject *g_mime_application_pkcs7_mime_decompress (GMimeApplicationPkcs7Mime *pkcs7_mime);*/ + +GMimeApplicationPkcs7Mime *g_mime_application_pkcs7_mime_encrypt (GMimeObject *entity, GMimeEncryptFlags flags, + GPtrArray *recipients, GError **err); + +GMimeObject *g_mime_application_pkcs7_mime_decrypt (GMimeApplicationPkcs7Mime *pkcs7_mime, + GMimeDecryptFlags flags, const char *session_key, + GMimeDecryptResult **result, GError **err); + +GMimeApplicationPkcs7Mime *g_mime_application_pkcs7_mime_sign (GMimeObject *entity, const char *userid, GError **err); + +GMimeSignatureList *g_mime_application_pkcs7_mime_verify (GMimeApplicationPkcs7Mime *pkcs7_mime, GMimeVerifyFlags flags, + GMimeObject **entity, GError **err); + +G_END_DECLS + +#endif /* __GMIME_APPLICATION_PKCS7_MIME_H__ */ diff -Nru gmime-2.6.22+dfsg2/gmime/gmime.c gmime-3.0.1/gmime/gmime.c --- gmime-2.6.22+dfsg2/gmime/gmime.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -26,11 +26,12 @@ #include #include -#ifdef ENABLE_SMIME +#ifdef ENABLE_CRYPTO #include #endif #include "gmime.h" +#include "gmime-internal.h" #ifdef ENABLE_CRYPTOGRAPHY #include "gmime-pkcs7-context.h" @@ -47,20 +48,7 @@ * Initialization, shutdown, and version-check functions. **/ -extern gboolean _g_mime_enable_rfc2047_workarounds (void); -extern gboolean _g_mime_use_only_user_charsets (void); - -extern void g_mime_iconv_utils_shutdown (void); -extern void g_mime_iconv_utils_init (void); - -extern void _g_mime_iconv_cache_unlock (void); -extern void _g_mime_iconv_cache_lock (void); -extern void _g_mime_iconv_utils_unlock (void); -extern void _g_mime_iconv_utils_lock (void); -extern void _g_mime_charset_unlock (void); -extern void _g_mime_charset_lock (void); -extern void _g_mime_msgid_unlock (void); -extern void _g_mime_msgid_lock (void); +extern void g_mime_crypto_context_shutdown (void); GQuark gmime_gpgme_error_quark; GQuark gmime_error_quark; @@ -71,13 +59,7 @@ const guint gmime_interface_age = GMIME_INTERFACE_AGE; const guint gmime_binary_age = GMIME_BINARY_AGE; -G_LOCK_DEFINE_STATIC (iconv_cache); -G_LOCK_DEFINE_STATIC (iconv_utils); -G_LOCK_DEFINE_STATIC (charset); -G_LOCK_DEFINE_STATIC (msgid); - static unsigned int initialized = 0; -static guint32 enable = 0; /** @@ -109,19 +91,17 @@ /** * g_mime_init: - * @flags: initialization flags * * Initializes GMime. - * - * Note: Calls g_mime_charset_map_init() and g_mime_iconv_init() as - * well. **/ void -g_mime_init (guint32 flags) +g_mime_init (void) { + initialized = MAX (initialized, 0); + if (initialized++) return; - + /* seed the random number generator (needed by boundary generator) */ srand ((unsigned int) time (NULL)); @@ -130,31 +110,22 @@ tzset (); #endif - enable = flags; - #if !GLIB_CHECK_VERSION(2, 35, 1) g_type_init (); #endif -#ifdef G_THREADS_ENABLED - g_mutex_init (&G_LOCK_NAME (iconv_cache)); - g_mutex_init (&G_LOCK_NAME (iconv_utils)); - g_mutex_init (&G_LOCK_NAME (charset)); - g_mutex_init (&G_LOCK_NAME (msgid)); -#endif - + g_mime_format_options_init (); + g_mime_parser_options_init (); g_mime_charset_map_init (); - g_mime_iconv_utils_init (); - g_mime_iconv_init (); -#ifdef ENABLE_SMIME +#ifdef ENABLE_CRYPTO /* gpgme_check_version() initializes GpgMe */ gpgme_check_version (NULL); -#endif /* ENABLE_SMIME */ +#endif /* ENABLE_CRYPTO */ gmime_gpgme_error_quark = g_quark_from_static_string ("gmime-gpgme"); gmime_error_quark = g_quark_from_static_string ("gmime"); - + /* register our GObject types with the GType system */ g_mime_crypto_context_get_type (); g_mime_decrypt_result_get_type (); @@ -162,7 +133,7 @@ g_mime_signature_list_get_type (); g_mime_certificate_get_type (); g_mime_signature_get_type (); -#ifdef ENABLE_CRYPTOGRAPHY +#ifdef ENABLE_CRYPTO g_mime_gpg_context_get_type (); g_mime_pkcs7_context_get_type (); #endif @@ -171,13 +142,15 @@ g_mime_filter_basic_get_type (); g_mime_filter_best_get_type (); g_mime_filter_charset_get_type (); - g_mime_filter_crlf_get_type (); + g_mime_filter_checksum_get_type (); + g_mime_filter_dos2unix_get_type (); g_mime_filter_enriched_get_type (); g_mime_filter_from_get_type (); g_mime_filter_gzip_get_type (); g_mime_filter_html_get_type (); - g_mime_filter_md5_get_type (); + g_mime_filter_smtp_data_get_type (); g_mime_filter_strip_get_type (); + g_mime_filter_unix2dos_get_type (); g_mime_filter_windows_get_type (); g_mime_filter_yenc_get_type (); @@ -193,20 +166,31 @@ g_mime_stream_null_get_type (); g_mime_stream_pipe_get_type (); + g_mime_format_options_get_type (); + g_mime_parser_options_get_type (); + g_mime_parser_get_type (); g_mime_message_get_type (); g_mime_data_wrapper_get_type (); - g_mime_content_type_get_type (); - g_mime_content_disposition_get_type (); internet_address_get_type (); internet_address_list_get_type (); internet_address_group_get_type (); internet_address_mailbox_get_type (); + g_mime_param_get_type (); + g_mime_header_get_type (); + g_mime_param_list_get_type (); + g_mime_header_list_get_type (); + g_mime_content_type_get_type (); + g_mime_content_disposition_get_type (); + /* register our default mime object types */ g_mime_object_type_registry_init (); g_mime_object_register_type ("*", "*", g_mime_part_get_type ()); + g_mime_object_register_type ("text", "*", g_mime_text_part_get_type ()); + g_mime_object_register_type ("application", "x-pkcs7-mime", g_mime_application_pkcs7_mime_get_type ()); + g_mime_object_register_type ("application", "pkcs7-mime", g_mime_application_pkcs7_mime_get_type ()); g_mime_object_register_type ("multipart", "*", g_mime_multipart_get_type ()); g_mime_object_register_type ("multipart", "encrypted", g_mime_multipart_encrypted_get_type ()); g_mime_object_register_type ("multipart", "signed", g_mime_multipart_signed_get_type ()); @@ -214,14 +198,25 @@ g_mime_object_register_type ("message", "rfc2822", g_mime_message_part_get_type ()); g_mime_object_register_type ("message", "news", g_mime_message_part_get_type ()); g_mime_object_register_type ("message", "partial", g_mime_message_partial_get_type ()); + + g_mime_crypto_context_register ("application/x-pgp-signature", g_mime_gpg_context_new); + g_mime_crypto_context_register ("application/pgp-signature", g_mime_gpg_context_new); + g_mime_crypto_context_register ("application/x-pgp-encrypted", g_mime_gpg_context_new); + g_mime_crypto_context_register ("application/pgp-encrypted", g_mime_gpg_context_new); + g_mime_crypto_context_register ("application/pgp-keys", g_mime_gpg_context_new); + + g_mime_crypto_context_register ("application/x-pkcs7-signature", g_mime_pkcs7_context_new); + g_mime_crypto_context_register ("application/pkcs7-signature", g_mime_pkcs7_context_new); + g_mime_crypto_context_register ("application/x-pkcs7-mime", g_mime_pkcs7_context_new); + g_mime_crypto_context_register ("application/pkcs7-mime", g_mime_pkcs7_context_new); + g_mime_crypto_context_register ("application/pkcs7-keys", g_mime_pkcs7_context_new); } /** * g_mime_shutdown: * - * Frees internally allocated tables created in g_mime_init(). Also - * calls g_mime_charset_map_shutdown() and g_mime_iconv_shutdown(). + * Frees internally allocated tables created in g_mime_init(). **/ void g_mime_shutdown (void) @@ -230,82 +225,8 @@ return; g_mime_object_type_registry_shutdown (); + g_mime_crypto_context_shutdown (); + g_mime_format_options_shutdown (); + g_mime_parser_options_shutdown (); g_mime_charset_map_shutdown (); - g_mime_iconv_utils_shutdown (); - g_mime_iconv_shutdown (); - -#ifdef G_THREADS_ENABLED - if (glib_check_version (2, 37, 4) == NULL) { - /* The implementation of g_mutex_clear() prior - * to glib 2.37.4 did not properly reset the - * internal mutex pointer to NULL, so re-initializing - * GMime would not properly re-initialize the mutexes. - **/ - g_mutex_clear (&G_LOCK_NAME (iconv_cache)); - g_mutex_clear (&G_LOCK_NAME (iconv_utils)); - g_mutex_clear (&G_LOCK_NAME (charset)); - g_mutex_clear (&G_LOCK_NAME (msgid)); - } -#endif -} - - -gboolean -_g_mime_enable_rfc2047_workarounds (void) -{ - return (enable & GMIME_ENABLE_RFC2047_WORKAROUNDS); -} - -gboolean -_g_mime_use_only_user_charsets (void) -{ - return (enable & GMIME_ENABLE_USE_ONLY_USER_CHARSETS); -} - -void -_g_mime_iconv_cache_unlock (void) -{ - return G_UNLOCK (iconv_cache); -} - -void -_g_mime_iconv_cache_lock (void) -{ - return G_LOCK (iconv_cache); -} - -void -_g_mime_iconv_utils_unlock (void) -{ - return G_UNLOCK (iconv_utils); -} - -void -_g_mime_iconv_utils_lock (void) -{ - return G_LOCK (iconv_utils); -} - -void -_g_mime_charset_unlock (void) -{ - return G_UNLOCK (charset); -} - -void -_g_mime_charset_lock (void) -{ - return G_LOCK (charset); -} - -void -_g_mime_msgid_unlock (void) -{ - return G_UNLOCK (msgid); -} - -void -_g_mime_msgid_lock (void) -{ - return G_LOCK (msgid); } diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-certificate.c gmime-3.0.1/gmime/gmime-certificate.c --- gmime-2.6.22+dfsg2/gmime/gmime-certificate.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-certificate.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -85,7 +85,7 @@ { cert->pubkey_algo = GMIME_PUBKEY_ALGO_DEFAULT; cert->digest_algo = GMIME_DIGEST_ALGO_DEFAULT; - cert->trust = GMIME_CERTIFICATE_TRUST_NONE; + cert->trust = GMIME_TRUST_UNKNOWN; cert->issuer_serial = NULL; cert->issuer_name = NULL; cert->fingerprint = NULL; @@ -122,19 +122,19 @@ GMimeCertificate * g_mime_certificate_new (void) { - return g_object_newv (GMIME_TYPE_CERTIFICATE, 0, NULL); + return g_object_new (GMIME_TYPE_CERTIFICATE, NULL); } /** * g_mime_certificate_set_trust: * @cert: a #GMimeCertificate - * @trust: a #GMimeCertificateTrust value + * @trust: a #GMimeTrust value * * Set the certificate trust. **/ void -g_mime_certificate_set_trust (GMimeCertificate *cert, GMimeCertificateTrust trust) +g_mime_certificate_set_trust (GMimeCertificate *cert, GMimeTrust trust) { g_return_if_fail (GMIME_IS_CERTIFICATE (cert)); @@ -150,10 +150,10 @@ * * Returns: the certificate trust. **/ -GMimeCertificateTrust +GMimeTrust g_mime_certificate_get_trust (GMimeCertificate *cert) { - g_return_val_if_fail (GMIME_IS_CERTIFICATE (cert), GMIME_CERTIFICATE_TRUST_NONE); + g_return_val_if_fail (GMIME_IS_CERTIFICATE (cert), GMIME_TRUST_UNKNOWN); return cert->trust; } @@ -550,13 +550,10 @@ g_mime_certificate_list_finalize (GObject *object) { GMimeCertificateList *list = (GMimeCertificateList *) object; - GMimeCertificate *cert; guint i; - for (i = 0; i < list->array->len; i++) { - cert = (GMimeCertificate *) list->array->pdata[i]; - g_object_unref (cert); - } + for (i = 0; i < list->array->len; i++) + g_object_unref (list->array->pdata[i]); g_ptr_array_free (list->array, TRUE); @@ -574,7 +571,7 @@ GMimeCertificateList * g_mime_certificate_list_new (void) { - return g_object_newv (GMIME_TYPE_CERTIFICATE_LIST, 0, NULL); + return g_object_new (GMIME_TYPE_CERTIFICATE_LIST, NULL); } @@ -599,7 +596,7 @@ * g_mime_certificate_list_clear: * @list: a #GMimeCertificateList * - * Clears the list of addresses. + * Clears the list of certificates. **/ void g_mime_certificate_list_clear (GMimeCertificateList *list) @@ -701,21 +698,19 @@ if ((index = g_mime_certificate_list_index_of (list, cert)) == -1) return FALSE; - g_mime_certificate_list_remove_at (list, index); - - return TRUE; + return g_mime_certificate_list_remove_at (list, index); } /** * g_mime_certificate_list_remove_at: * @list: a #GMimeCertificateList - * @index: index to remove + * @index: index of the certificate to remove * * Removes a #GMimeCertificate from the #GMimeCertificateList at the specified * index. * - * Returns: %TRUE if an #GMimeCertificate was removed or %FALSE otherwise. + * Returns: %TRUE if a #GMimeCertificate was removed or %FALSE otherwise. **/ gboolean g_mime_certificate_list_remove_at (GMimeCertificateList *list, int index) diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-certificate.h gmime-3.0.1/gmime/gmime-certificate.h --- gmime-2.6.22+dfsg2/gmime/gmime-certificate.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-certificate.h 2017-03-20 13:44:23.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -65,22 +65,28 @@ * @GMIME_DIGEST_ALGO_SHA512: The SHA-512 hash algorithm. * @GMIME_DIGEST_ALGO_SHA224: The SHA-224 hash algorithm. * @GMIME_DIGEST_ALGO_MD4: The MD4 hash algorithm. + * @GMIME_DIGEST_ALGO_CRC32: The CRC32 hash algorithm. + * @GMIME_DIGEST_ALGO_CRC32_RFC1510: The rfc1510 CRC32 hash algorithm. + * @GMIME_DIGEST_ALGO_CRC32_RFC2440: The rfc2440 CRC32 hash algorithm. * * A hash algorithm. **/ typedef enum { - GMIME_DIGEST_ALGO_DEFAULT = 0, - GMIME_DIGEST_ALGO_MD5 = 1, - GMIME_DIGEST_ALGO_SHA1 = 2, - GMIME_DIGEST_ALGO_RIPEMD160 = 3, - GMIME_DIGEST_ALGO_MD2 = 5, - GMIME_DIGEST_ALGO_TIGER192 = 6, - GMIME_DIGEST_ALGO_HAVAL5160 = 7, - GMIME_DIGEST_ALGO_SHA256 = 8, - GMIME_DIGEST_ALGO_SHA384 = 9, - GMIME_DIGEST_ALGO_SHA512 = 10, - GMIME_DIGEST_ALGO_SHA224 = 11, - GMIME_DIGEST_ALGO_MD4 = 301 + GMIME_DIGEST_ALGO_DEFAULT = 0, + GMIME_DIGEST_ALGO_MD5 = 1, + GMIME_DIGEST_ALGO_SHA1 = 2, + GMIME_DIGEST_ALGO_RIPEMD160 = 3, + GMIME_DIGEST_ALGO_MD2 = 5, + GMIME_DIGEST_ALGO_TIGER192 = 6, + GMIME_DIGEST_ALGO_HAVAL5160 = 7, + GMIME_DIGEST_ALGO_SHA256 = 8, + GMIME_DIGEST_ALGO_SHA384 = 9, + GMIME_DIGEST_ALGO_SHA512 = 10, + GMIME_DIGEST_ALGO_SHA224 = 11, + GMIME_DIGEST_ALGO_MD4 = 301, + GMIME_DIGEST_ALGO_CRC32 = 302, + GMIME_DIGEST_ALGO_CRC32_RFC1510 = 303, + GMIME_DIGEST_ALGO_CRC32_RFC2440 = 304 } GMimeDigestAlgo; /** @@ -91,7 +97,11 @@ * @GMIME_PUBKEY_ALGO_RSA_S: A signature-only RSA algorithm. * @GMIME_PUBKEY_ALGO_ELG_E: An encryption-only ElGamal algorithm. * @GMIME_PUBKEY_ALGO_DSA: The DSA algorithm. + * @GMIME_PUBKEY_ALGO_ECC: The Eliptic Curve algorithm. * @GMIME_PUBKEY_ALGO_ELG: The ElGamal algorithm. + * @GMIME_PUBKEY_ALGO_ECDSA: The Eliptic Curve + DSA algorithm. + * @GMIME_PUBKEY_ALGO_ECDH: The Eliptic Curve + Diffie Helman algorithm. + * @GMIME_PUBKEY_ALGO_EDDSA: The Eliptic Curve + DSA algorithm. * * A public-key algorithm. **/ @@ -102,28 +112,32 @@ GMIME_PUBKEY_ALGO_RSA_S = 3, GMIME_PUBKEY_ALGO_ELG_E = 16, GMIME_PUBKEY_ALGO_DSA = 17, - GMIME_PUBKEY_ALGO_ELG = 20 + GMIME_PUBKEY_ALGO_ECC = 18, + GMIME_PUBKEY_ALGO_ELG = 20, + GMIME_PUBKEY_ALGO_ECDSA = 301, + GMIME_PUBKEY_ALGO_ECDH = 302, + GMIME_PUBKEY_ALGO_EDDSA = 303 } GMimePubKeyAlgo; /** - * GMimeCertificateTrust: - * @GMIME_CERTIFICATE_TRUST_NONE: No trust assigned. - * @GMIME_CERTIFICATE_TRUST_NEVER: Never trust this certificate. - * @GMIME_CERTIFICATE_TRUST_UNDEFINED: Undefined trust for this certificate. - * @GMIME_CERTIFICATE_TRUST_MARGINAL: Trust this certificate maginally. - * @GMIME_CERTIFICATE_TRUST_FULLY: Trust this certificate fully. - * @GMIME_CERTIFICATE_TRUST_ULTIMATE: Trust this certificate ultimately. + * GMimeTrust: + * @GMIME_TRUST_UNKNOWN: The certificate or key is of unknown validity. + * @GMIME_TRUST_UNDEFINED: The validity of the certificate or key is undefined. + * @GMIME_TRUST_NEVER: The certificate or key should never be treated as valid. + * @GMIME_TRUST_MARGINAL: The certificate or key is marginally valid. + * @GMIME_TRUST_FULL: The certificate or key is fully valid. + * @GMIME_TRUST_ULTIMATE: The certificate or key is ultimately valid. * - * The trust value of a certificate. + * The trust level of a certificate or key. **/ typedef enum { - GMIME_CERTIFICATE_TRUST_NONE, - GMIME_CERTIFICATE_TRUST_NEVER, - GMIME_CERTIFICATE_TRUST_UNDEFINED, - GMIME_CERTIFICATE_TRUST_MARGINAL, - GMIME_CERTIFICATE_TRUST_FULLY, - GMIME_CERTIFICATE_TRUST_ULTIMATE -} GMimeCertificateTrust; + GMIME_TRUST_UNKNOWN = 0, + GMIME_TRUST_UNDEFINED = 1, + GMIME_TRUST_NEVER = 2, + GMIME_TRUST_MARGINAL = 3, + GMIME_TRUST_FULL = 4, + GMIME_TRUST_ULTIMATE = 5 +} GMimeTrust; /** * GMimeCertificate: @@ -147,7 +161,7 @@ GMimePubKeyAlgo pubkey_algo; GMimeDigestAlgo digest_algo; - GMimeCertificateTrust trust; + GMimeTrust trust; char *issuer_serial; char *issuer_name; char *fingerprint; @@ -168,8 +182,8 @@ GMimeCertificate *g_mime_certificate_new (void); -void g_mime_certificate_set_trust (GMimeCertificate *cert, GMimeCertificateTrust trust); -GMimeCertificateTrust g_mime_certificate_get_trust (GMimeCertificate *cert); +void g_mime_certificate_set_trust (GMimeCertificate *cert, GMimeTrust trust); +GMimeTrust g_mime_certificate_get_trust (GMimeCertificate *cert); void g_mime_certificate_set_pubkey_algo (GMimeCertificate *cert, GMimePubKeyAlgo algo); GMimePubKeyAlgo g_mime_certificate_get_pubkey_algo (GMimeCertificate *cert); diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-charset.c gmime-3.0.1/gmime/gmime-charset.c --- gmime-2.6.22+dfsg2/gmime/gmime-charset.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-charset.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -165,15 +165,14 @@ }; static GHashTable *iconv_charsets = NULL; -static char **user_charsets = NULL; static char *locale_charset = NULL; static char *locale_lang = NULL; +static int initialized = 0; #ifdef G_THREADS_ENABLED -extern void _g_mime_charset_unlock (void); -extern void _g_mime_charset_lock (void); -#define CHARSET_UNLOCK() _g_mime_charset_unlock () -#define CHARSET_LOCK() _g_mime_charset_lock () +static GMutex lock; +#define CHARSET_UNLOCK() g_mutex_unlock (&lock); +#define CHARSET_LOCK() g_mutex_lock (&lock); #else #define CHARSET_UNLOCK() #define CHARSET_LOCK() @@ -188,9 +187,20 @@ void g_mime_charset_map_shutdown (void) { - if (!iconv_charsets) + if (--initialized) return; +#ifdef G_THREADS_ENABLED + if (glib_check_version (2, 37, 4) == NULL) { + /* The implementation of g_mutex_clear() prior + * to glib 2.37.4 did not properly reset the + * internal mutex pointer to NULL, so re-initializing + * GMime would not properly re-initialize the mutexes. + **/ + g_mutex_clear (&lock); + } +#endif + g_hash_table_destroy (iconv_charsets); iconv_charsets = NULL; @@ -256,9 +266,15 @@ char *charset, *iconv_name, *locale; int i; - if (iconv_charsets) + initialized = MAX (initialized, 0); + + if (initialized++) return; +#ifdef G_THREADS_ENABLED + g_mutex_init (&lock); +#endif + iconv_charsets = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); for (i = 0; known_iconv_charsets[i].charset != NULL; i++) { @@ -345,11 +361,6 @@ const char * g_mime_locale_charset (void) { - CHARSET_LOCK (); - if (!iconv_charsets) - g_mime_charset_map_init (); - CHARSET_UNLOCK (); - return locale_charset ? locale_charset : "iso-8859-1"; } @@ -359,16 +370,11 @@ * * Gets the user's locale language code (or %NULL by default). * - * Returns: the user's locale language code (or %NULL by default). + * Returns: (nullable): the user's locale language code (or %NULL by default). **/ const char * g_mime_locale_language (void) { - CHARSET_LOCK (); - if (!iconv_charsets) - g_mime_charset_map_init (); - CHARSET_UNLOCK (); - return locale_lang; } @@ -381,8 +387,8 @@ * @charset. Currently only handles CJK and Russian/Ukranian * charset->lang mapping. Everything else will return %NULL. * - * Returns: a language code that is specific to @charset, or %NULL on - * fail. + * Returns: (nullable): a language code that is specific to @charset, + * or %NULL on fail. **/ const char * g_mime_charset_language (const char *charset) @@ -436,8 +442,6 @@ strdown (name); CHARSET_LOCK (); - if (!iconv_charsets) - g_mime_charset_map_init (); iconv_name = g_hash_table_lookup (iconv_charsets, name); if (iconv_name) { @@ -783,8 +787,8 @@ * * Gets the best charset name based on the charset mask @charset. * - * Returns: a pointer to a string containing the best charset name that - * can represent the charset mask @charset. + * Returns: (nullable): the charset name that best represents the charset + * mask @charset or %NULL for us-ascii. **/ const char * g_mime_charset_best_name (GMimeCharset *charset) @@ -805,8 +809,8 @@ * * Computes the best charset to use to encode this text buffer. * - * Returns: the charset name best suited for the input text or %NULL if - * it is US-ASCII safe. + * Returns: (nullable): the charset name best suited for the input text + * or %NULL if it is ascii-safe. **/ const char * g_mime_charset_best (const char *inbuf, size_t inlen) @@ -908,42 +912,3 @@ return rc != (size_t) -1; } - - -/** - * g_mime_set_user_charsets: - * @charsets: an array of user-preferred charsets - * - * Set a list of charsets for GMime to use as a hint for encoding and - * decoding headers. The charset list should be in order of preference - * (e.g. most preferred first, least preferred last). - **/ -void -g_mime_set_user_charsets (const char **charsets) -{ - if (user_charsets) - g_strfreev (user_charsets); - - if (charsets == NULL || charsets[0] == NULL) { - user_charsets = NULL; - return; - } - - user_charsets = g_strdupv ((char **) charsets); -} - - -/** - * g_mime_user_charsets: - * - * Get the list of user-preferred charsets set with - * g_mime_set_user_charsets(). - * - * Returns: (array zero-terminated=1) (transfer none): an array of - * user-set charsets or %NULL if none set. - **/ -const char ** -g_mime_user_charsets (void) -{ - return (const char **) user_charsets; -} diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-charset.h gmime-3.0.1/gmime/gmime-charset.h --- gmime-2.6.22+dfsg2/gmime/gmime-charset.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-charset.h 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -69,10 +69,6 @@ const char *text, size_t len); -void g_mime_set_user_charsets (const char **charsets); -const char **g_mime_user_charsets (void); - - G_END_DECLS #endif /* __GMIME_CHARSET_H__ */ diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-charset-map-private.h gmime-3.0.1/gmime/gmime-charset-map-private.h --- gmime-2.6.22+dfsg2/gmime/gmime-charset-map-private.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-charset-map-private.h 2017-03-28 23:46:26.000000000 +0000 @@ -247,7 +247,40 @@ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, }; -#define m022 m002 +static unsigned char m022[256] = { + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +}; #define m031 m021 @@ -521,112 +554,145 @@ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, }; #define m1b2 m002 -#define m1c1 m1b1 +static unsigned char m1c1[256] = { + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +}; #define m1c2 m002 static unsigned char m1d1[256] = { - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, }; #define m1d2 m002 static unsigned char m1e1[256] = { - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, }; #define m1e2 m002 @@ -671,38 +737,38 @@ }; static unsigned char m201[256] = { - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x78, 0x70, 0x70, 0x74, 0x74, 0xf8, 0xf8, 0x70, - 0xfc, 0xfd, 0x74, 0x70, 0xfd, 0xfd, 0x75, 0x70, - 0x7c, 0x7c, 0x74, 0x30, 0x30, 0x78, 0xfc, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0xfc, 0x30, 0xf8, 0xf8, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x34, 0x34, 0xf8, 0x30, 0x30, 0x38, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x70, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x70, - 0x30, 0x70, 0x70, 0x70, 0x70, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x76, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x78, 0x60, 0x60, 0x64, 0x64, 0xf8, 0xf8, 0x60, + 0xfc, 0xfd, 0x64, 0x60, 0xfd, 0xfd, 0x65, 0x60, + 0x7c, 0x7c, 0x64, 0x60, 0x60, 0x78, 0xfc, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0xfc, 0x60, 0xf8, 0xf8, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x64, 0x64, 0xf8, 0x60, 0x60, 0x78, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x60, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, + 0x20, 0x60, 0x60, 0x60, 0x60, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x60, 0x20, 0x20, 0x66, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, }; #define m202 m002 @@ -743,38 +809,38 @@ }; static unsigned char m211[256] = { - 0x30, 0x30, 0x30, 0xf8, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x70, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x70, 0x30, 0x30, 0xf4, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x70, 0x74, 0x30, 0x30, 0x30, 0x70, 0x30, - 0x30, 0x30, 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x70, 0x70, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x70, 0x70, 0x70, 0x70, 0x30, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xb0, 0xb0, 0x30, 0x30, 0x30, 0x30, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0xf8, 0xf8, 0xf8, 0xf8, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x78, 0x30, 0x78, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x20, 0x20, 0x20, 0xf8, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x60, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x60, 0x20, 0x20, 0xe4, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x60, 0x64, 0x20, 0x20, 0x20, 0x60, 0x20, + 0x20, 0x20, 0x20, 0x78, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x60, 0x60, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x60, 0x60, 0x60, 0x60, 0x20, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xa0, 0xa0, 0x20, 0x20, 0x20, 0x20, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0xf8, 0xf8, 0xf8, 0xf8, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x78, 0x20, 0x78, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, }; #define m212 m002 @@ -815,21 +881,21 @@ }; static unsigned char m221[256] = { - 0x78, 0x30, 0x78, 0x78, 0x30, 0x30, 0x30, 0x78, - 0xf8, 0x30, 0x30, 0x78, 0x30, 0x30, 0x30, 0xf0, - 0x30, 0xf0, 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0xf8, 0x30, 0x30, 0xf8, 0xf8, 0x30, - 0xf8, 0x30, 0x30, 0x30, 0x30, 0xf0, 0x30, 0xf8, - 0xf8, 0xf8, 0xf8, 0xf8, 0x78, 0x30, 0xf0, 0x30, - 0x30, 0x30, 0x30, 0x30, 0xf8, 0xf8, 0xb0, 0xb0, - 0x30, 0x30, 0x30, 0x30, 0x70, 0xf8, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0xb0, 0x30, 0x30, 0x30, 0xb0, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0xf8, 0xf8, 0x30, 0x30, 0xf0, 0xf0, 0x38, 0x38, - 0x30, 0x30, 0x78, 0x78, 0x30, 0x30, 0xb0, 0xb0, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x78, 0x20, 0x78, 0x78, 0x20, 0x20, 0x20, 0x78, + 0xf8, 0x20, 0x20, 0x78, 0x20, 0x20, 0x20, 0xe0, + 0x20, 0xe0, 0x38, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0xf8, 0x20, 0x20, 0xf8, 0xf8, 0x20, + 0xf8, 0x20, 0x20, 0x20, 0x20, 0xe0, 0x20, 0xf8, + 0xf8, 0xf8, 0xf8, 0xf8, 0x78, 0x20, 0xe0, 0x20, + 0x20, 0x20, 0x20, 0x20, 0xf8, 0xf8, 0xa0, 0xa0, + 0x20, 0x20, 0x20, 0x20, 0x60, 0xf8, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0xa0, 0x20, 0x20, 0x20, 0xa0, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0xf8, 0xf8, 0x20, 0x20, 0xe0, 0xe0, 0x38, 0x38, + 0x20, 0x20, 0x78, 0x78, 0x20, 0x20, 0xa0, 0xa0, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x78, 0x20, 0x20, 0x78, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, @@ -1173,8 +1239,41 @@ 0x20, 0x20, 0x20, 0xb8, 0x38, 0x38, 0x38, 0x20, }; -#define m302 m002 - +static unsigned char m302[256] = { + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +}; + static unsigned char m311[256] = { 0x20, 0x20, 0x20, 0x20, 0x20, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, @@ -1243,96 +1342,54 @@ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; #define m322 m002 static unsigned char m331[256] = { - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x20, 0x20, 0x20, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x20, 0x20, 0x20, 0x20, 0x60, - 0x60, 0x20, 0x20, 0x60, 0x20, 0x20, 0x60, 0x20, - 0x60, 0x20, 0x20, 0x60, 0x60, 0x60, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, -}; - -static unsigned char m332[256] = { - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, + 0x40, 0x00, 0x00, 0x40, 0x40, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; -#define m341 m271 +#define m332 m002 #define m342 m002 -#define m351 m271 +#define m352 m002 -static unsigned char m352[256] = { - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +static unsigned char m362[256] = { 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, @@ -1342,7 +1399,14 @@ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, @@ -1360,9 +1424,7 @@ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, }; -#define m361 m271 - -static unsigned char m362[256] = { +static unsigned char m372[256] = { 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, @@ -1397,92 +1459,49 @@ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, }; -#define m371 m271 - -#define m372 m362 +#define m382 m372 -#define m381 m271 +#define m392 m372 -#define m382 m362 +#define m3a2 m372 -#define m391 m271 +#define m3b2 m372 -#define m392 m362 +#define m3c2 m372 -static unsigned char m3a1[256] = { - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -#define m3a2 m362 - -#define m3b2 m362 - -#define m3c2 m362 +#define m3d2 m372 -#define m3d2 m362 +#define m3e2 m372 -#define m3e2 m362 +#define m3f2 m372 -#define m3f2 m362 +#define m402 m372 -#define m402 m362 +#define m412 m372 -#define m412 m362 +#define m422 m372 -#define m422 m362 +#define m432 m372 -#define m432 m362 +#define m442 m372 -#define m442 m362 +#define m452 m372 -#define m452 m362 +#define m462 m372 -#define m462 m362 +#define m472 m372 -#define m472 m362 +#define m482 m372 -#define m482 m362 +#define m492 m372 -#define m492 m362 +#define m4a2 m372 -#define m4a2 m362 +#define m4b2 m372 -#define m4b2 m362 +#define m4c2 m372 -#define m4c2 m362 - -#define m4d2 m362 +#define m4d2 m372 static unsigned char m4e1[256] = { 0xf8, 0xf8, 0x20, 0xf8, 0x20, 0x20, 0x00, 0xf8, @@ -2243,7 +2262,7 @@ 0x03, 0x03, 0x02, 0x03, 0x02, 0x03, 0x03, 0x02, 0x03, 0x03, 0x02, 0x03, 0x03, 0x02, 0x03, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x03, 0x02, 0x03, 0x03, 0x03, 0x03, + 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, 0x03, 0x03, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, @@ -2391,7 +2410,7 @@ 0x03, 0x03, 0x03, 0x03, 0x02, 0x03, 0x03, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x02, 0x03, 0x02, 0x03, }; static unsigned char m5b1[256] = { @@ -2790,7 +2809,7 @@ 0x02, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, 0x03, 0x02, 0x02, 0x03, 0x03, 0x02, 0x02, - 0x03, 0x02, 0x02, 0x03, 0x03, 0x03, 0x02, 0x02, + 0x03, 0x02, 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x02, 0x03, 0x03, 0x03, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, @@ -4476,7 +4495,7 @@ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x03, 0x02, 0x03, 0x03, 0x02, 0x03, 0x03, - 0x03, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, 0x03, 0x02, 0x02, 0x03, 0x02, 0x03, 0x03, 0x02, 0x03, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x02, 0x02, 0x03, 0x03, @@ -4760,7 +4779,7 @@ 0x03, 0x03, 0x03, 0x02, 0x03, 0x03, 0x02, 0x00, 0x00, 0x03, 0x03, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, - 0x02, 0x03, 0x03, 0x03, 0x02, 0x03, 0x02, 0x02, + 0x02, 0x03, 0x03, 0x03, 0x02, 0x03, 0x02, 0x03, 0x03, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x03, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, @@ -5605,7 +5624,7 @@ 0x00, 0x03, 0x03, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, 0x03, 0x03, 0x03, 0x02, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, + 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, 0x03, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, @@ -6303,7 +6322,7 @@ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x02, 0x02, 0x02, 0x03, 0x03, 0x02, 0x02, 0x02, + 0x02, 0x03, 0x02, 0x03, 0x03, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, 0x03, 0x02, 0x03, @@ -8764,65 +8783,88 @@ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; -static unsigned char me01[256] = { - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, +static unsigned char mf62[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, }; -#define me11 me01 - -#define me21 me01 - -#define me31 me01 - -#define me41 me01 - -#define me51 me01 - -#define me61 me01 +static unsigned char mf72[256] = { + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +}; -static unsigned char me71[256] = { - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, +static unsigned char mf82[256] = { + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -8962,10 +9004,10 @@ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, - 0x03, 0x02, 0x03, 0x00, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x00, 0x03, 0x03, 0x03, 0x03, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, - 0x02, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -9015,7 +9057,7 @@ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xc0, 0xc0, 0x40, 0xf8, 0x00, 0xf8, 0x40, 0x00, + 0xd0, 0xd0, 0x50, 0xf8, 0x00, 0xf8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -9033,8 +9075,7 @@ 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -9050,7 +9091,8 @@ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -9074,8 +9116,8 @@ { NULL, m281, m282, }, { NULL, m291, m292, }, { NULL, m2a1, m2a2, }, { NULL, m2b1, m2b2, }, { NULL, m2c1, m2c2, }, { NULL, m2d1, m2d2, }, { NULL, m2e1, m2e2, }, { NULL, m2f1, m2f2, }, { NULL, m301, m302, }, { NULL, m311, m312, }, { NULL, m321, m322, }, { NULL, m331, m332, }, - { NULL, m341, m342, }, { NULL, m351, m352, }, { NULL, m361, m362, }, { NULL, m371, m372, }, - { NULL, m381, m382, }, { NULL, m391, m392, }, { NULL, m3a1, m3a2, }, { NULL, NULL, m3b2, }, + { NULL, NULL, m342, }, { NULL, NULL, m352, }, { NULL, NULL, m362, }, { NULL, NULL, m372, }, + { NULL, NULL, m382, }, { NULL, NULL, m392, }, { NULL, NULL, m3a2, }, { NULL, NULL, m3b2, }, { NULL, NULL, m3c2, }, { NULL, NULL, m3d2, }, { NULL, NULL, m3e2, }, { NULL, NULL, m3f2, }, { NULL, NULL, m402, }, { NULL, NULL, m412, }, { NULL, NULL, m422, }, { NULL, NULL, m432, }, { NULL, NULL, m442, }, { NULL, NULL, m452, }, { NULL, NULL, m462, }, { NULL, NULL, m472, }, @@ -9117,13 +9159,13 @@ { NULL, md41, NULL, }, { NULL, md51, NULL, }, { NULL, md61, NULL, }, { NULL, md71, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, - { NULL, me01, NULL, }, { NULL, me11, NULL, }, { NULL, me21, NULL, }, { NULL, me31, NULL, }, - { NULL, me41, NULL, }, { NULL, me51, NULL, }, { NULL, me61, NULL, }, { NULL, me71, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, - { NULL, NULL, NULL, }, { NULL, mf91, NULL, }, { NULL, mfa1, mfa2, }, { NULL, NULL, NULL, }, + { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, + { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, mf62, }, { NULL, NULL, mf72, }, + { NULL, NULL, mf82, }, { NULL, mf91, NULL, }, { NULL, mfa1, mfa2, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, mfe2, }, { NULL, mff1, mff2, }, }; diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-common.c gmime-3.0.1/gmime/gmime-common.c --- gmime-2.6.22+dfsg2/gmime/gmime-common.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-common.c 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -23,11 +23,49 @@ #include #endif +#include +#include #include +#include +#include +#include #include "gmime-table-private.h" #include "gmime-common.h" +void +g_mime_read_random_pool (unsigned char *buffer, size_t bytes) +{ +#ifdef __unix__ + size_t nread = 0; + ssize_t n; + int fd; + + if ((fd = open ("/dev/urandom", O_RDONLY)) == -1) { + if ((fd = open ("/dev/random", O_RDONLY)) == -1) + return; + } + + do { + do { + n = read (fd, (char *) buffer + nread, bytes - nread); + } while (n == -1 && errno == EINTR); + + if (n == -1 || n == 0) + break; + + nread += n; + } while (nread < bytes); + + close (fd); +#else + size_t i; + + for (i = 0; i < bytes; i++) + buffer[i] = (unsigned char) (rand () % 256); +#endif +} + #ifndef g_tolower #define g_tolower(x) (((x) >= 'A' && (x) <= 'Z') ? (x) - 'A' + 'a' : (x)) #endif diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-common.h gmime-3.0.1/gmime/gmime-common.h --- gmime-2.6.22+dfsg2/gmime/gmime-common.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-common.h 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -22,10 +22,16 @@ #ifndef __GMIME_COMMON_H__ #define __GMIME_COMMON_H__ +#include +#include +#include + #include G_BEGIN_DECLS +G_GNUC_INTERNAL void g_mime_read_random_pool (unsigned char *buffer, size_t bytes); + G_GNUC_INTERNAL int g_mime_strcase_equal (gconstpointer v, gconstpointer v2); G_GNUC_INTERNAL guint g_mime_strcase_hash (gconstpointer key); diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-content-type.c gmime-3.0.1/gmime/gmime-content-type.c --- gmime-2.6.22+dfsg2/gmime/gmime-content-type.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-content-type.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -57,6 +57,8 @@ static void g_mime_content_type_init (GMimeContentType *content_type, GMimeContentTypeClass *klass); static void g_mime_content_type_finalize (GObject *object); +static void param_list_changed (GMimeParamList *list, gpointer args, GMimeContentType *content_type); + static GObjectClass *parent_class = NULL; @@ -99,11 +101,12 @@ static void g_mime_content_type_init (GMimeContentType *content_type, GMimeContentTypeClass *klass) { - content_type->param_hash = g_hash_table_new (g_mime_strcase_hash, g_mime_strcase_equal); - content_type->priv = g_mime_event_new ((GObject *) content_type); - content_type->params = NULL; + content_type->changed = g_mime_event_new ((GObject *) content_type); + content_type->params = g_mime_param_list_new (); content_type->subtype = NULL; content_type->type = NULL; + + g_mime_event_add (content_type->params->changed, (GMimeEventCallback) param_list_changed, content_type); } static void @@ -111,9 +114,8 @@ { GMimeContentType *content_type = (GMimeContentType *) object; - g_hash_table_destroy (content_type->param_hash); - g_mime_param_destroy (content_type->params); - g_mime_event_destroy (content_type->priv); + g_mime_event_free (content_type->changed); + g_object_unref (content_type->params); g_free (content_type->subtype); g_free (content_type->type); @@ -121,10 +123,17 @@ } +static void +param_list_changed (GMimeParamList *list, gpointer args, GMimeContentType *content_type) +{ + g_mime_event_emit (content_type->changed, NULL); +} + + /** * g_mime_content_type_new: - * @type: MIME type (or %NULL for "text") - * @subtype: MIME subtype (or %NULL for "plain") + * @type: the MIME type or %NULL for the default value + * @subtype: the MIME subtype or %NULL for the default value * * Creates a Content-Type object with type @type and subtype @subtype. * @@ -133,52 +142,54 @@ GMimeContentType * g_mime_content_type_new (const char *type, const char *subtype) { - GMimeContentType *mime_type; + GMimeContentType *content_type; - mime_type = g_object_newv (GMIME_TYPE_CONTENT_TYPE, 0, NULL); + content_type = g_object_new (GMIME_TYPE_CONTENT_TYPE, NULL); if (type && *type && subtype && *subtype) { - mime_type->type = g_strdup (type); - mime_type->subtype = g_strdup (subtype); + content_type->type = g_strdup (type); + content_type->subtype = g_strdup (subtype); } else { if (type && *type) { - mime_type->type = g_strdup (type); + content_type->type = g_strdup (type); if (!g_ascii_strcasecmp (type, "text")) { - mime_type->subtype = g_strdup ("plain"); + content_type->subtype = g_strdup ("plain"); } else if (!g_ascii_strcasecmp (type, "multipart")) { - mime_type->subtype = g_strdup ("mixed"); + content_type->subtype = g_strdup ("mixed"); } else { - g_free (mime_type->type); - mime_type->type = g_strdup ("application"); - mime_type->subtype = g_strdup ("octet-stream"); + g_free (content_type->type); + content_type->type = g_strdup ("application"); + content_type->subtype = g_strdup ("octet-stream"); } } else { - mime_type->type = g_strdup ("application"); - mime_type->subtype = g_strdup ("octet-stream"); + content_type->type = g_strdup ("application"); + content_type->subtype = g_strdup ("octet-stream"); } w(g_warning ("Invalid or incomplete type: %s%s%s: defaulting to %s/%s", type ? type : "", subtype ? "/" : "", subtype ? subtype : "", - mime_type->type, mime_type->subtype)); + content_type->type, content_type->subtype)); } - return mime_type; + return content_type; } /** - * g_mime_content_type_new_from_string: + * g_mime_content_type_parse: + * @options: (nullable): a #GMimeParserOptions or %NULL * @str: input string containing a content-type (and params) * - * Constructs a new Content-Type object based on the input string. + * Parses the input string into a #GMimeContentType object. * - * Returns: a new #GMimeContentType object based on the input string. + * Returns: (transfer full): a new #GMimeContentType object. **/ GMimeContentType * -g_mime_content_type_new_from_string (const char *str) +g_mime_content_type_parse (GMimeParserOptions *options, const char *str) { - GMimeContentType *mime_type; + GMimeContentType *content_type; const char *inptr = str; + GMimeParamList *params; char *type, *subtype; g_return_val_if_fail (str != NULL, NULL); @@ -186,82 +197,116 @@ if (!g_mime_parse_content_type (&inptr, &type, &subtype)) return g_mime_content_type_new ("application", "octet-stream"); - mime_type = g_object_newv (GMIME_TYPE_CONTENT_TYPE, 0, NULL); - mime_type->subtype = subtype; - mime_type->type = type; + content_type = g_object_new (GMIME_TYPE_CONTENT_TYPE, NULL); + content_type->subtype = subtype; + content_type->type = type; /* skip past any remaining junk that shouldn't be here... */ - decode_lwsp (&inptr); + skip_cfws (&inptr); while (*inptr && *inptr != ';') inptr++; - if (*inptr++ == ';' && *inptr) { - GMimeParam *param; - - param = mime_type->params = g_mime_param_new_from_string (inptr); - while (param != NULL) { - g_hash_table_insert (mime_type->param_hash, param->name, param); - param = param->next; - } + if (*inptr++ == ';' && *inptr && (params = g_mime_param_list_parse (options, inptr))) { + g_mime_event_add (params->changed, (GMimeEventCallback) param_list_changed, content_type); + g_object_unref (content_type->params); + content_type->params = params; } - return mime_type; + return content_type; } /** - * g_mime_content_type_to_string: - * @mime_type: a #GMimeContentType object + * g_mime_content_type_get_mime_type: + * @content_type: a #GMimeContentType * * Allocates a string buffer containing the type and subtype defined - * by the @mime_type. + * by the @content_type. * * Returns: an allocated string containing the type and subtype of the * content-type in the format: type/subtype. **/ char * -g_mime_content_type_to_string (GMimeContentType *mime_type) +g_mime_content_type_get_mime_type (GMimeContentType *content_type) { - char *string; + char *mime_type; - g_return_val_if_fail (GMIME_IS_CONTENT_TYPE (mime_type), NULL); + g_return_val_if_fail (GMIME_IS_CONTENT_TYPE (content_type), NULL); /* type and subtype should never be NULL, but check anyway */ - string = g_strdup_printf ("%s/%s", mime_type->type ? mime_type->type : "text", - mime_type->subtype ? mime_type->subtype : "plain"); + mime_type = g_strdup_printf ("%s/%s", content_type->type ? content_type->type : "text", + content_type->subtype ? content_type->subtype : "plain"); - return string; + return mime_type; +} + + +/** + * g_mime_content_type_encode: + * @content_type: a #GMimeContentType + * @options: (nullable): a #GMimeFormatOptions or %NULL + * + * Encodes the Content-Disposition header. + * + * Returns: a new string containing the encoded header value. + **/ +char * +g_mime_content_type_encode (GMimeContentType *content_type, GMimeFormatOptions *options) +{ + char *raw_value; + GString *str; + guint len, n; + + g_return_val_if_fail (GMIME_IS_CONTENT_TYPE (content_type), NULL); + + /* we need to have this so wrapping is correct */ + str = g_string_new ("Content-Type:"); + n = str->len; + + g_string_append_c (str, ' '); + g_string_append (str, content_type->type ? content_type->type : "text"); + g_string_append_c (str, '/'); + g_string_append (str, content_type->subtype ? content_type->subtype : "plain"); + + g_mime_param_list_encode (content_type->params, options, TRUE, str); + len = str->len - n; + + raw_value = g_string_free (str, FALSE); + + memmove (raw_value, raw_value + n, len + 1); + + return raw_value; } /** * g_mime_content_type_is_type: - * @mime_type: a #GMimeContentType object + * @content_type: a #GMimeContentType * @type: MIME type to compare against * @subtype: MIME subtype to compare against * * Compares the given type and subtype with that of the given mime * type object. * - * Returns: TRUE if the MIME types match or FALSE otherwise. You may + * Returns: %TRUE if the MIME types match or %FALSE otherwise. You may * use "*" in place of @type and/or @subtype as a wilcard. **/ gboolean -g_mime_content_type_is_type (GMimeContentType *mime_type, const char *type, const char *subtype) +g_mime_content_type_is_type (GMimeContentType *content_type, const char *type, const char *subtype) { - g_return_val_if_fail (GMIME_IS_CONTENT_TYPE (mime_type), FALSE); - g_return_val_if_fail (mime_type->type != NULL, FALSE); - g_return_val_if_fail (mime_type->subtype != NULL, FALSE); + g_return_val_if_fail (GMIME_IS_CONTENT_TYPE (content_type), FALSE); + g_return_val_if_fail (content_type->type != NULL, FALSE); + g_return_val_if_fail (content_type->subtype != NULL, FALSE); g_return_val_if_fail (type != NULL, FALSE); g_return_val_if_fail (subtype != NULL, FALSE); - if (!strcmp (type, "*") || !g_ascii_strcasecmp (mime_type->type, type)) { + if (!strcmp (type, "*") || !g_ascii_strcasecmp (content_type->type, type)) { if (!strcmp (subtype, "*")) { /* special case */ return TRUE; } - if (!g_ascii_strcasecmp (mime_type->subtype, subtype)) + if (!g_ascii_strcasecmp (content_type->subtype, subtype)) return TRUE; } @@ -271,130 +316,104 @@ /** * g_mime_content_type_set_media_type: - * @mime_type: a #GMimeContentType object + * @content_type: a #GMimeContentType * @type: media type * * Sets the Content-Type's media type. **/ void -g_mime_content_type_set_media_type (GMimeContentType *mime_type, const char *type) +g_mime_content_type_set_media_type (GMimeContentType *content_type, const char *type) { char *buf; - g_return_if_fail (GMIME_IS_CONTENT_TYPE (mime_type)); + g_return_if_fail (GMIME_IS_CONTENT_TYPE (content_type)); g_return_if_fail (type != NULL); buf = g_strdup (type); - g_free (mime_type->type); - mime_type->type = buf; + g_free (content_type->type); + content_type->type = buf; - g_mime_event_emit (mime_type->priv, NULL); + g_mime_event_emit (content_type->changed, NULL); } /** * g_mime_content_type_get_media_type: - * @mime_type: a #GMimeContentType object + * @content_type: a #GMimeContentType * * Gets the Content-Type's media type. * * Returns: the Content-Type's media type. **/ const char * -g_mime_content_type_get_media_type (GMimeContentType *mime_type) +g_mime_content_type_get_media_type (GMimeContentType *content_type) { - g_return_val_if_fail (GMIME_IS_CONTENT_TYPE (mime_type), NULL); + g_return_val_if_fail (GMIME_IS_CONTENT_TYPE (content_type), NULL); - return mime_type->type; + return content_type->type; } /** * g_mime_content_type_set_media_subtype: - * @mime_type: a #GMimeContentType object + * @content_type: a #GMimeContentType * @subtype: media subtype * * Sets the Content-Type's media subtype. **/ void -g_mime_content_type_set_media_subtype (GMimeContentType *mime_type, const char *subtype) +g_mime_content_type_set_media_subtype (GMimeContentType *content_type, const char *subtype) { char *buf; - g_return_if_fail (GMIME_IS_CONTENT_TYPE (mime_type)); + g_return_if_fail (GMIME_IS_CONTENT_TYPE (content_type)); g_return_if_fail (subtype != NULL); buf = g_strdup (subtype); - g_free (mime_type->subtype); - mime_type->subtype = buf; + g_free (content_type->subtype); + content_type->subtype = buf; - g_mime_event_emit (mime_type->priv, NULL); + g_mime_event_emit (content_type->changed, NULL); } /** * g_mime_content_type_get_media_subtype: - * @mime_type: a #GMimeContentType object + * @content_type: a #GMimeContentType * * Gets the Content-Type's media sub-type. * * Returns: the Content-Type's media sub-type. **/ const char * -g_mime_content_type_get_media_subtype (GMimeContentType *mime_type) -{ - g_return_val_if_fail (GMIME_IS_CONTENT_TYPE (mime_type), NULL); - - return mime_type->subtype; -} - - -/** - * g_mime_content_type_set_params: - * @mime_type: a #GMimeContentType object - * @params: a list of #GMimeParam objects - * - * Sets the Content-Type's parameter list. - **/ -void -g_mime_content_type_set_params (GMimeContentType *mime_type, GMimeParam *params) +g_mime_content_type_get_media_subtype (GMimeContentType *content_type) { - g_return_if_fail (GMIME_IS_CONTENT_TYPE (mime_type)); + g_return_val_if_fail (GMIME_IS_CONTENT_TYPE (content_type), NULL); - /* clear the current list/hash */ - g_hash_table_remove_all (mime_type->param_hash); - g_mime_param_destroy (mime_type->params); - mime_type->params = params; - - while (params != NULL) { - g_hash_table_insert (mime_type->param_hash, params->name, params); - params = params->next; - } - - g_mime_event_emit (mime_type->priv, NULL); + return content_type->subtype; } /** - * g_mime_content_type_get_params: - * @mime_type: a #GMimeContentType object + * g_mime_content_type_get_parameters: + * @content_type: a #GMimeContentType * * Gets the Content-Type's parameter list. * - * Returns: the Content-Type's parameter list. + * Returns: (transfer none): the Content-Type's parameter list. **/ -const GMimeParam * -g_mime_content_type_get_params (GMimeContentType *mime_type) +GMimeParamList * +g_mime_content_type_get_parameters (GMimeContentType *content_type) { - g_return_val_if_fail (GMIME_IS_CONTENT_TYPE (mime_type), NULL); + g_return_val_if_fail (GMIME_IS_CONTENT_TYPE (content_type), NULL); - return mime_type->params; + return content_type->params; } /** * g_mime_content_type_set_parameter: - * @mime_type: MIME Content-Type + * @content_type: a #GMimeContentType * @name: parameter name (aka attribute) * @value: parameter value * @@ -404,30 +423,17 @@ * UTF-8. **/ void -g_mime_content_type_set_parameter (GMimeContentType *mime_type, const char *name, const char *value) +g_mime_content_type_set_parameter (GMimeContentType *content_type, const char *name, const char *value) { - GMimeParam *param = NULL; - - g_return_if_fail (GMIME_IS_CONTENT_TYPE (mime_type)); - g_return_if_fail (name != NULL); - g_return_if_fail (value != NULL); - - if ((param = g_hash_table_lookup (mime_type->param_hash, name))) { - g_free (param->value); - param->value = g_strdup (value); - } else { - param = g_mime_param_new (name, value); - mime_type->params = g_mime_param_append_param (mime_type->params, param); - g_hash_table_insert (mime_type->param_hash, param->name, param); - } + g_return_if_fail (GMIME_IS_CONTENT_TYPE (content_type)); - g_mime_event_emit (mime_type->priv, NULL); + g_mime_param_list_set_parameter (content_type->params, name, value); } /** * g_mime_content_type_get_parameter: - * @mime_type: a #GMimeContentType object + * @content_type: a #GMimeContentType * @name: parameter name (aka attribute) * * Gets the parameter value specified by @name if it's available. @@ -437,14 +443,13 @@ * will be in UTF-8. **/ const char * -g_mime_content_type_get_parameter (GMimeContentType *mime_type, const char *name) +g_mime_content_type_get_parameter (GMimeContentType *content_type, const char *name) { GMimeParam *param; - g_return_val_if_fail (GMIME_IS_CONTENT_TYPE (mime_type), NULL); - g_return_val_if_fail (name != NULL, NULL); + g_return_val_if_fail (GMIME_IS_CONTENT_TYPE (content_type), NULL); - if (!(param = g_hash_table_lookup (mime_type->param_hash, name))) + if (!(param = g_mime_param_list_get_parameter (content_type->params, name))) return NULL; return param->value; diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-content-type.h gmime-3.0.1/gmime/gmime-content-type.h --- gmime-2.6.22+dfsg2/gmime/gmime-content-type.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-content-type.h 2017-03-18 01:31:54.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -42,24 +42,20 @@ /** * GMimeContentType: * @parent_object: parent #GObject - * @param_hash: parameter hash keyed by param name - * @params: a #GMimeParam list - * @priv: private fields * @type: media type * @subtype: media subtype + * @params: a #GMimeParam list * * A data structure representing a Content-Type. **/ struct _GMimeContentType { GObject parent_object; - GHashTable *param_hash; - GMimeParam *params; - - gpointer priv; + char *type, *subtype; + GMimeParamList *params; - char *type; - char *subtype; + /* < private > */ + gpointer changed; }; struct _GMimeContentTypeClass { @@ -69,25 +65,25 @@ GType g_mime_content_type_get_type (void); - GMimeContentType *g_mime_content_type_new (const char *type, const char *subtype); -GMimeContentType *g_mime_content_type_new_from_string (const char *str); +GMimeContentType *g_mime_content_type_parse (GMimeParserOptions *options, const char *str); + +char *g_mime_content_type_get_mime_type (GMimeContentType *content_type); -char *g_mime_content_type_to_string (GMimeContentType *mime_type); +char *g_mime_content_type_encode (GMimeContentType *content_type, GMimeFormatOptions *options); -gboolean g_mime_content_type_is_type (GMimeContentType *mime_type, const char *type, const char *subtype); +gboolean g_mime_content_type_is_type (GMimeContentType *content_type, const char *type, const char *subtype); -void g_mime_content_type_set_media_type (GMimeContentType *mime_type, const char *type); -const char *g_mime_content_type_get_media_type (GMimeContentType *mime_type); +void g_mime_content_type_set_media_type (GMimeContentType *content_type, const char *type); +const char *g_mime_content_type_get_media_type (GMimeContentType *content_type); -void g_mime_content_type_set_media_subtype (GMimeContentType *mime_type, const char *subtype); -const char *g_mime_content_type_get_media_subtype (GMimeContentType *mime_type); +void g_mime_content_type_set_media_subtype (GMimeContentType *content_type, const char *subtype); +const char *g_mime_content_type_get_media_subtype (GMimeContentType *content_type); -void g_mime_content_type_set_params (GMimeContentType *mime_type, GMimeParam *params); -const GMimeParam *g_mime_content_type_get_params (GMimeContentType *mime_type); +GMimeParamList *g_mime_content_type_get_parameters (GMimeContentType *content_type); -void g_mime_content_type_set_parameter (GMimeContentType *mime_type, const char *name, const char *value); -const char *g_mime_content_type_get_parameter (GMimeContentType *mime_type, const char *name); +void g_mime_content_type_set_parameter (GMimeContentType *content_type, const char *name, const char *value); +const char *g_mime_content_type_get_parameter (GMimeContentType *content_type, const char *name); G_END_DECLS diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-crypto-context.c gmime-3.0.1/gmime/gmime-crypto-context.c --- gmime-2.6.22+dfsg2/gmime/gmime-crypto-context.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-crypto-context.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -26,6 +26,7 @@ #include #include "gmime-crypto-context.h" +#include "gmime-common.h" #include "gmime-error.h" @@ -46,45 +47,37 @@ static GMimeDigestAlgo crypto_digest_id (GMimeCryptoContext *ctx, const char *name); -static const char *crypto_digest_name (GMimeCryptoContext *ctx, GMimeDigestAlgo ); +static const char *crypto_digest_name (GMimeCryptoContext *ctx, GMimeDigestAlgo digest); static const char *crypto_get_signature_protocol (GMimeCryptoContext *ctx); - static const char *crypto_get_encryption_protocol (GMimeCryptoContext *ctx); - static const char *crypto_get_key_exchange_protocol (GMimeCryptoContext *ctx); -static int crypto_set_retrieve_session_key (GMimeCryptoContext *ctx, gboolean retrieve_session_key, - GError **err); -static gboolean crypto_get_retrieve_session_key (GMimeCryptoContext *ctx); - -static int crypto_sign (GMimeCryptoContext *ctx, const char *userid, - GMimeDigestAlgo digest, GMimeStream *istream, - GMimeStream *ostream, GError **err); +static int crypto_sign (GMimeCryptoContext *ctx, gboolean detach, const char *userid, + GMimeStream *istream, GMimeStream *ostream, GError **err); -static GMimeSignatureList *crypto_verify (GMimeCryptoContext *ctx, GMimeDigestAlgo digest, +static GMimeSignatureList *crypto_verify (GMimeCryptoContext *ctx, GMimeVerifyFlags flags, GMimeStream *istream, GMimeStream *sigstream, - GError **err); + GMimeStream *ostream, GError **err); -static int crypto_encrypt (GMimeCryptoContext *ctx, gboolean sign, - const char *userid, GMimeDigestAlgo digest, - GPtrArray *recipients, GMimeStream *istream, - GMimeStream *ostream, GError **err); +static int crypto_encrypt (GMimeCryptoContext *ctx, gboolean sign, const char *userid, + GMimeEncryptFlags flags, GPtrArray *recipients, + GMimeStream *istream, GMimeStream *ostream, + GError **err); -static GMimeDecryptResult *crypto_decrypt (GMimeCryptoContext *ctx, GMimeStream *istream, +static GMimeDecryptResult *crypto_decrypt (GMimeCryptoContext *ctx, GMimeDecryptFlags flags, + const char *session_key, GMimeStream *istream, GMimeStream *ostream, GError **err); -static GMimeDecryptResult *crypto_decrypt_session (GMimeCryptoContext *ctx, const char *session_key, - GMimeStream *istream, GMimeStream *ostream, - GError **err); - static int crypto_import_keys (GMimeCryptoContext *ctx, GMimeStream *istream, GError **err); -static int crypto_export_keys (GMimeCryptoContext *ctx, GPtrArray *keys, +static int crypto_export_keys (GMimeCryptoContext *ctx, const char *keys[], GMimeStream *ostream, GError **err); +static GHashTable *type_hash = NULL; + static GObjectClass *parent_class = NULL; @@ -107,6 +100,8 @@ }; type = g_type_register_static (G_TYPE_OBJECT, "GMimeCryptoContext", &info, 0); + + type_hash = g_hash_table_new_full (g_mime_strcase_hash, g_mime_strcase_equal, g_free, NULL); } return type; @@ -128,14 +123,11 @@ klass->verify = crypto_verify; klass->encrypt = crypto_encrypt; klass->decrypt = crypto_decrypt; - klass->decrypt_session = crypto_decrypt_session; klass->import_keys = crypto_import_keys; klass->export_keys = crypto_export_keys; klass->get_signature_protocol = crypto_get_signature_protocol; klass->get_encryption_protocol = crypto_get_encryption_protocol; klass->get_key_exchange_protocol = crypto_get_key_exchange_protocol; - klass->get_retrieve_session_key = crypto_get_retrieve_session_key; - klass->set_retrieve_session_key = crypto_set_retrieve_session_key; } static void @@ -151,88 +143,70 @@ } +void +g_mime_crypto_context_shutdown (void) +{ + g_hash_table_destroy (type_hash); + type_hash = NULL; +} + + /** - * g_mime_crypto_context_set_request_password: - * @ctx: a #GMimeCryptoContext - * @request_passwd: a callback function for requesting a password + * g_mime_crypto_context_register: (skip) + * @protocol: crypto protocol + * @callback: a #GMimeCryptoContextNewFunc * - * Sets the function used by the @ctx for requesting a password from - * the user. + * Registers the callback for the specified @protocol. **/ void -g_mime_crypto_context_set_request_password (GMimeCryptoContext *ctx, GMimePasswordRequestFunc request_passwd) +g_mime_crypto_context_register (const char *protocol, GMimeCryptoContextNewFunc callback) { - g_return_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx)); + g_return_if_fail (protocol != NULL); + g_return_if_fail (callback != NULL); - ctx->request_passwd = request_passwd; + g_hash_table_replace (type_hash, g_strdup (protocol), callback); } -static gboolean -crypto_get_retrieve_session_key (GMimeCryptoContext *ctx) -{ - return FALSE; -} - /** - * g_mime_crypto_context_get_retrieve_session_key: - * @ctx: a #GMimeCryptoContext + * g_mime_crypto_context_new: + * @protocol: the crypto protocol * - * Gets whether or not the @ctx is configured to retrieve a session - * key during decryption (see g_mime_decrypt_result_get_session_key()). + * Creates a new crypto context for the specified @protocol. * - * Returns: %TRUE if the @ctx is configured to retrieve a session key - * or %FALSE otherwise. + * Returns: (nullable): a newly allocated #GMimeCryptoContext. **/ -gboolean -g_mime_crypto_context_get_retrieve_session_key (GMimeCryptoContext *ctx) +GMimeCryptoContext * +g_mime_crypto_context_new (const char *protocol) { - g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), FALSE); + GMimeCryptoContextNewFunc func; - return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->get_retrieve_session_key (ctx); -} - -static int -crypto_set_retrieve_session_key (GMimeCryptoContext *ctx, gboolean retrieve_session_key, - GError **err) -{ - if (!retrieve_session_key) - return 0; + g_return_val_if_fail (protocol != NULL, NULL); - g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, - "Session key retrieval is not supported by this crypto context"); + if (!(func = g_hash_table_lookup (type_hash, protocol))) + return NULL; - return -1; + return func (); } + /** - * g_mime_crypto_context_set_retrieve_session_key: + * g_mime_crypto_context_set_request_password: (skip) * @ctx: a #GMimeCryptoContext - * @retrieve_session_key: whether to retrieve session keys during decryption - * @err: a #GError - * - * Configures whether @ctx should produce a session key during future - * decryption operations (see - * g_mime_decrypt_result_get_session_key()). + * @request_passwd: a callback function for requesting a password * - * Returns: %0 on success or %-1 on fail. + * Sets the function used by the @ctx for requesting a password from + * the user. **/ -int -g_mime_crypto_context_set_retrieve_session_key (GMimeCryptoContext *ctx, - gboolean retrieve_session_key, - GError **err) -{ - if (!GMIME_IS_CRYPTO_CONTEXT (ctx)) { - g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, - "Not a GMimeCryptoContext, can't set retrieve_session_key"); - return -1; - } +void +g_mime_crypto_context_set_request_password (GMimeCryptoContext *ctx, GMimePasswordRequestFunc request_passwd) +{ + g_return_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx)); - return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->set_retrieve_session_key (ctx, retrieve_session_key, err); + ctx->request_passwd = request_passwd; } - static GMimeDigestAlgo crypto_digest_id (GMimeCryptoContext *ctx, const char *name) { @@ -247,7 +221,7 @@ * Gets the function used by the @ctx for requesting a password from * the user. * - * Returns: a #GMimePasswordRequestFunc or %NULL if not set. + * Returns: (nullable): a #GMimePasswordRequestFunc or %NULL if not set. **/ GMimePasswordRequestFunc g_mime_crypto_context_get_request_password (GMimeCryptoContext *ctx) @@ -291,7 +265,7 @@ * * Gets the digest name based on the digest id @digest. * - * Returns: the equivalent digest name or %NULL on fail. + * Returns: (nullable): the equivalent digest name or %NULL on fail. **/ const char * g_mime_crypto_context_digest_name (GMimeCryptoContext *ctx, GMimeDigestAlgo digest) @@ -315,7 +289,7 @@ * * Gets the signature protocol for the crypto context. * - * Returns: the signature protocol or %NULL if not supported. + * Returns: (nullable): the signature protocol or %NULL if not supported. **/ const char * g_mime_crypto_context_get_signature_protocol (GMimeCryptoContext *ctx) @@ -339,7 +313,7 @@ * * Gets the encryption protocol for the crypto context. * - * Returns: the encryption protocol or %NULL if not supported. + * Returns: (nullable): the encryption protocol or %NULL if not supported. **/ const char * g_mime_crypto_context_get_encryption_protocol (GMimeCryptoContext *ctx) @@ -363,7 +337,7 @@ * * Gets the key exchange protocol for the crypto context. * - * Returns: the key exchange protocol or %NULL if not supported. + * Returns: (nullable): the key exchange protocol or %NULL if not supported. **/ const char * g_mime_crypto_context_get_key_exchange_protocol (GMimeCryptoContext *ctx) @@ -375,11 +349,11 @@ static int -crypto_sign (GMimeCryptoContext *ctx, const char *userid, GMimeDigestAlgo digest, +crypto_sign (GMimeCryptoContext *ctx, gboolean detach, const char *userid, GMimeStream *istream, GMimeStream *ostream, GError **err) { - g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, - "Signing is not supported by this crypto context"); + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, + "Signing is not supported by this crypto context"); return -1; } @@ -388,35 +362,34 @@ /** * g_mime_crypto_context_sign: * @ctx: a #GMimeCryptoContext + * @detach: %TRUE if @ostream should be the detached signature; otherwise, %FALSE * @userid: private key to use to sign the stream - * @digest: digest algorithm to use * @istream: input stream * @ostream: output stream * @err: a #GError * * Signs the input stream and writes the resulting signature to the output stream. * - * Returns: the #GMimeDigestAlgo used on success (useful if @digest is - * specified as #GMIME_DIGEST_ALGO_DEFAULT) or %-1 on fail. + * Returns: the #GMimeDigestAlgo used on success or %-1 on fail. **/ int -g_mime_crypto_context_sign (GMimeCryptoContext *ctx, const char *userid, GMimeDigestAlgo digest, +g_mime_crypto_context_sign (GMimeCryptoContext *ctx, gboolean detach, const char *userid, GMimeStream *istream, GMimeStream *ostream, GError **err) { g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), -1); g_return_val_if_fail (GMIME_IS_STREAM (istream), -1); g_return_val_if_fail (GMIME_IS_STREAM (ostream), -1); - return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->sign (ctx, userid, digest, istream, ostream, err); + return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->sign (ctx, detach, userid, istream, ostream, err); } static GMimeSignatureList * -crypto_verify (GMimeCryptoContext *ctx, GMimeDigestAlgo digest, GMimeStream *istream, - GMimeStream *sigstream, GError **err) +crypto_verify (GMimeCryptoContext *ctx, GMimeVerifyFlags flags, GMimeStream *istream, GMimeStream *sigstream, + GMimeStream *ostream, GError **err) { - g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, - "Verifying is not supported by this crypto context"); + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, + "Verifying is not supported by this crypto context"); return NULL; } @@ -425,36 +398,38 @@ /** * g_mime_crypto_context_verify: * @ctx: a #GMimeCryptoContext - * @digest: digest algorithm used, if known + * @flags: a #GMimeVerifyFlags * @istream: input stream - * @sigstream: optional detached-signature stream + * @sigstream: (nullable): detached-signature stream + * @ostream: (nullable): output stream for use with encapsulated signature input streams * @err: a #GError * - * Verifies the signature. If @istream is a clearsigned stream, - * you should pass %NULL as the sigstream parameter. Otherwise - * @sigstream is assumed to be the signature stream and is used to - * verify the integirity of the @istream. + * Verifies the signature. If @istream is a clearsigned stream, you + * should pass %NULL as the @sigstream parameter and may wish to + * provide an @ostream argument for GMime to output the original + * plaintext into. Otherwise @sigstream is assumed to be the signature + * stream and is used to verify the integirity of the @istream. * - * Returns: (transfer full): a #GMimeSignatureList object containing + * Returns: (nullable) (transfer full): a #GMimeSignatureList object containing * the status of each signature or %NULL on error. **/ GMimeSignatureList * -g_mime_crypto_context_verify (GMimeCryptoContext *ctx, GMimeDigestAlgo digest, GMimeStream *istream, - GMimeStream *sigstream, GError **err) +g_mime_crypto_context_verify (GMimeCryptoContext *ctx, GMimeVerifyFlags flags, GMimeStream *istream, + GMimeStream *sigstream, GMimeStream *ostream, GError **err) { g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), NULL); g_return_val_if_fail (GMIME_IS_STREAM (istream), NULL); - return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->verify (ctx, digest, istream, sigstream, err); + return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->verify (ctx, flags, istream, sigstream, ostream, err); } static int -crypto_encrypt (GMimeCryptoContext *ctx, gboolean sign, const char *userid, GMimeDigestAlgo digest, +crypto_encrypt (GMimeCryptoContext *ctx, gboolean sign, const char *userid, GMimeEncryptFlags flags, GPtrArray *recipients, GMimeStream *istream, GMimeStream *ostream, GError **err) { - g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, - "Encryption is not supported by this crypto context"); + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, + "Encryption is not supported by this crypto context"); return -1; } @@ -464,10 +439,9 @@ * g_mime_crypto_context_encrypt: * @ctx: a #GMimeCryptoContext * @sign: sign as well as encrypt - * @userid: key id (or email address) to use when signing (assuming @sign is %TRUE) - * @digest: digest algorithm to use when signing - * @recipients: (element-type utf8): an array of recipient key ids - * and/or email addresses + * @userid: (nullable): the key id (or email address) to use when signing (assuming @sign is %TRUE) + * @flags: a set of #GMimeEncryptFlags + * @recipients: (element-type utf8): an array of recipient key ids and/or email addresses * @istream: cleartext input stream * @ostream: ciphertext output stream * @err: a #GError @@ -478,34 +452,23 @@ * Returns: %0 on success or %-1 on fail. **/ int -g_mime_crypto_context_encrypt (GMimeCryptoContext *ctx, gboolean sign, const char *userid, GMimeDigestAlgo digest, +g_mime_crypto_context_encrypt (GMimeCryptoContext *ctx, gboolean sign, const char *userid, GMimeEncryptFlags flags, GPtrArray *recipients, GMimeStream *istream, GMimeStream *ostream, GError **err) { g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), -1); g_return_val_if_fail (GMIME_IS_STREAM (istream), -1); g_return_val_if_fail (GMIME_IS_STREAM (ostream), -1); - return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->encrypt (ctx, sign, userid, digest, recipients, istream, ostream, err); + return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->encrypt (ctx, sign, userid, flags, recipients, istream, ostream, err); } static GMimeDecryptResult * -crypto_decrypt (GMimeCryptoContext *ctx, GMimeStream *istream, - GMimeStream *ostream, GError **err) -{ - g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, - "Decryption is not supported by this crypto context"); - - return NULL; -} - -static GMimeDecryptResult * -crypto_decrypt_session (GMimeCryptoContext *ctx, const char *session_key, - GMimeStream *istream, GMimeStream *ostream, - GError **err) +crypto_decrypt (GMimeCryptoContext *ctx, GMimeDecryptFlags flags, const char *session_key, + GMimeStream *istream, GMimeStream *ostream, GError **err) { - g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, - "Decryption with a session key is not supported by this crypto context"); + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, + "Decrysption is not supported by this crypto context"); return NULL; } @@ -514,57 +477,19 @@ /** * g_mime_crypto_context_decrypt: * @ctx: a #GMimeCryptoContext + * @flags: a set of #GMimeDecryptFlags + * @session_key: (nullable): the session key to use or %NULL * @istream: input/ciphertext stream * @ostream: output/cleartext stream * @err: a #GError * - * Decrypts the ciphertext input stream and writes the resulting - * cleartext to the output stream. - * - * If the encrypted input stream was also signed, the returned - * #GMimeDecryptResult will have a non-%NULL list of signatures, each with a - * #GMimeSignatureStatus (among other details about each signature). - * - * On success, the returned #GMimeDecryptResult will contain a list of - * certificates, one for each recipient, that the original encrypted stream - * was encrypted to. - * - * Note: It *may* be possible to maliciously design an encrypted stream such - * that recursively decrypting it will result in an endless loop, causing - * a denial of service attack on your application. - * - * Returns: (transfer full): a #GMimeDecryptResult on success or %NULL - * on error. - **/ -GMimeDecryptResult * -g_mime_crypto_context_decrypt (GMimeCryptoContext *ctx, GMimeStream *istream, - GMimeStream *ostream, GError **err) -{ - g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), NULL); - g_return_val_if_fail (GMIME_IS_STREAM (istream), NULL); - g_return_val_if_fail (GMIME_IS_STREAM (ostream), NULL); - - return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->decrypt (ctx, istream, ostream, err); -} - -/** - * g_mime_crypto_context_decrypt_session: - * @ctx: a #GMimeCryptoContext - * @session_key: session key to use - * @istream: input/ciphertext stream - * @ostream: output/cleartext stream - * @err: a #GError - * - * Decrypts the ciphertext input stream using a specific session key - * and writes the resulting cleartext to the output stream. If - * @session_key is non-%NULL, but is not valid for the ciphertext, the - * decryption will fail even if other available secret key material - * may have been able to decrypt it. If @session_key is %NULL, this - * does the same thing as g_mime_crypto_context_decrypt(). + * Decrypts the ciphertext input stream and writes the resulting cleartext + * to the output stream. * * When non-%NULL, @session_key should be a %NULL-terminated string, * such as the one returned by g_mime_decrypt_result_get_session_key() - * from a previous decryption. + * from a previous decryption. If the @sesion_key is not valid, decryption + * will fail. * * If the encrypted input stream was also signed, the returned * #GMimeDecryptResult will have a non-%NULL list of signatures, each with a @@ -582,26 +507,22 @@ * on error. **/ GMimeDecryptResult * -g_mime_crypto_context_decrypt_session (GMimeCryptoContext *ctx, const char *session_key, - GMimeStream *istream, GMimeStream *ostream, - GError **err) +g_mime_crypto_context_decrypt (GMimeCryptoContext *ctx, GMimeDecryptFlags flags, const char *session_key, + GMimeStream *istream, GMimeStream *ostream, GError **err) { g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), NULL); g_return_val_if_fail (GMIME_IS_STREAM (istream), NULL); g_return_val_if_fail (GMIME_IS_STREAM (ostream), NULL); - if (session_key == NULL) - return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->decrypt (ctx, istream, ostream, err); - else - return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->decrypt_session (ctx, session_key, istream, ostream, err); + return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->decrypt (ctx, flags, session_key, istream, ostream, err); } static int crypto_import_keys (GMimeCryptoContext *ctx, GMimeStream *istream, GError **err) { - g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, - "You may not import keys with this crypto"); + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, + "You may not import keys with this crypto"); return -1; } @@ -616,7 +537,7 @@ * Imports a stream of keys/certificates contained within @istream * into the key/certificate database controlled by @ctx. * - * Returns: %0 on success or %-1 on fail. + * Returns: the total number of keys imported on success or %-1 on fail. **/ int g_mime_crypto_context_import_keys (GMimeCryptoContext *ctx, GMimeStream *istream, GError **err) @@ -629,11 +550,11 @@ static int -crypto_export_keys (GMimeCryptoContext *ctx, GPtrArray *keys, +crypto_export_keys (GMimeCryptoContext *ctx, const char *keys[], GMimeStream *ostream, GError **err) { - g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, - "You may not export keys with this crypto"); + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, + "You may not export keys with this crypto"); return -1; } @@ -642,27 +563,30 @@ /** * g_mime_crypto_context_export_keys: * @ctx: a #GMimeCryptoContext - * @keys: (element-type utf8): an array of key ids + * @keys: an array of key ids, terminated by a %NULL element * @ostream: output stream * @err: a #GError * * Exports the keys/certificates in @keys to the stream @ostream from * the key/certificate database controlled by @ctx. * + * If @keys is %NULL or contains only a %NULL element, then all keys + * will be exported. + * * Returns: %0 on success or %-1 on fail. **/ int -g_mime_crypto_context_export_keys (GMimeCryptoContext *ctx, GPtrArray *keys, +g_mime_crypto_context_export_keys (GMimeCryptoContext *ctx, const char *keys[], GMimeStream *ostream, GError **err) { g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), -1); g_return_val_if_fail (GMIME_IS_STREAM (ostream), -1); - g_return_val_if_fail (keys != NULL, -1); return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->export_keys (ctx, keys, ostream, err); } + static void g_mime_decrypt_result_class_init (GMimeDecryptResultClass *klass); static void g_mime_decrypt_result_init (GMimeDecryptResult *cert, GMimeDecryptResultClass *klass); static void g_mime_decrypt_result_finalize (GObject *object); @@ -744,7 +668,7 @@ GMimeDecryptResult * g_mime_decrypt_result_new (void) { - return g_object_newv (GMIME_TYPE_DECRYPT_RESULT, 0, NULL); + return g_object_new (GMIME_TYPE_DECRYPT_RESULT, NULL); } @@ -823,7 +747,7 @@ * * Gets a list of signatures if the encrypted stream had also been signed. * - * Returns: (transfer none): a #GMimeSignatureList or %NULL if the + * Returns: (nullable) (transfer none): a #GMimeSignatureList or %NULL if the * stream was not signed. **/ GMimeSignatureList * @@ -893,7 +817,7 @@ * Returns: the mdc digest algorithm used. **/ GMimeDigestAlgo -g_mime_decryption_result_get_mdc (GMimeDecryptResult *result) +g_mime_decrypt_result_get_mdc (GMimeDecryptResult *result) { g_return_val_if_fail (GMIME_IS_DECRYPT_RESULT (result), GMIME_DIGEST_ALGO_DEFAULT); @@ -904,9 +828,9 @@ /** * g_mime_decrypt_result_set_session_key: * @result: a #GMimeDecryptResult - * @session_key: a pointer to a null-terminated string representing the session key + * @session_key: (nullable): a string representing the session key or %NULL to unset the key * - * Set the session_key to be returned by this decryption result. + * Set the session key to be returned by this decryption result. **/ void g_mime_decrypt_result_set_session_key (GMimeDecryptResult *result, const char *session_key) @@ -918,7 +842,7 @@ g_free (result->session_key); } - result->session_key = g_strdup (session_key); + result->session_key = session_key ? g_strdup (session_key) : NULL; } @@ -926,16 +850,13 @@ * g_mime_decrypt_result_get_session_key: * @result: a #GMimeDecryptResult * - * Get the session_key used for this decryption, if the underlying - * crypto context is capable of and (configured to) retrieve session - * keys during decryption. See, for example, - * g_mime_crypto_context_set_retrieve_session_key(). + * Get the session key used for this decryption. * - * Returns: the session_key digest algorithm used, or NULL if no + * Returns: (nullable): the session key digest algorithm used, or %NULL if no * session key was requested or found. **/ const char * -g_mime_decryption_result_get_session_key (GMimeDecryptResult *result) +g_mime_decrypt_result_get_session_key (GMimeDecryptResult *result) { g_return_val_if_fail (GMIME_IS_DECRYPT_RESULT (result), NULL); diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-crypto-context.h gmime-3.0.1/gmime/gmime-crypto-context.h --- gmime-2.6.22+dfsg2/gmime/gmime-crypto-context.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-crypto-context.h 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -52,7 +52,7 @@ * GMimePasswordRequestFunc: * @ctx: the #GMimeCryptoContext making the request * @user_id: the user_id of the password being requested - * @prompt_ctx: a string containing some helpful context for the prompt + * @prompt: a string containing some helpful context for the prompt * @reprompt: %TRUE if this password request is a reprompt due to a previously bad password response * @response: a stream for the application to write the password to (followed by a newline '\n' character) * @err: a #GError for the callback to set if an error occurs @@ -62,11 +62,64 @@ * * Returns: %TRUE on success or %FALSE on error. **/ -typedef gboolean (* GMimePasswordRequestFunc) (GMimeCryptoContext *ctx, const char *user_id, const char *prompt_ctx, +typedef gboolean (* GMimePasswordRequestFunc) (GMimeCryptoContext *ctx, const char *user_id, const char *prompt, gboolean reprompt, GMimeStream *response, GError **err); /** + * GMimeCryptoContextNewFunc: + * + * A callback used to create a new instance of a #GMimeCryptoContext subclass. + * + * Returns: a new #GMimeCryptoContext instance. + **/ +typedef GMimeCryptoContext * (* GMimeCryptoContextNewFunc) (void); + + +/** + * GMimeDecryptFlags: + * @GMIME_DECRYPT_NONE: No flags specified. + * @GMIME_DECRYPT_EXPORT_SESSION_KEY: Export the decryption session-key + * + * Decryption flags. + **/ +typedef enum { + GMIME_DECRYPT_NONE = 0, + GMIME_DECRYPT_EXPORT_SESSION_KEY = 1 << 0, +} GMimeDecryptFlags; + + +/** + * GMimeEncryptFlags: + * @GMIME_ENCRYPT_NONE: No flags specified. + * @GMIME_ENCRYPT_ALWAYS_TRUST: Always trust the specified keys. + * @GMIME_ENCRYPT_NO_COMPRESS: Don't compress the plaintext before encrypting. + * @GMIME_ENCRYPT_SYMMETRIC: Encrypt symmetrically. + * @GMIME_ENCRYPT_THROW_KEYIDS: Do not include the key ids in the ciphertext. + * + * Encryption flags. + **/ +typedef enum { + GMIME_ENCRYPT_NONE = 0, + GMIME_ENCRYPT_ALWAYS_TRUST = 1, + GMIME_ENCRYPT_NO_COMPRESS = 16, + GMIME_ENCRYPT_SYMMETRIC = 32, + GMIME_ENCRYPT_THROW_KEYIDS = 64, +} GMimeEncryptFlags; + + +/** + * GMimeVerifyFlags: + * @GMIME_VERIFY_NONE: No flags specified. + * + * Signature verification flags. + **/ +typedef enum { + GMIME_VERIFY_NONE = 0 +} GMimeVerifyFlags; + + +/** * GMimeCryptoContext: * @parent_object: parent #GObject * @request_passwd: a callback for requesting a password @@ -83,100 +136,77 @@ GObjectClass parent_class; GMimeDigestAlgo (* digest_id) (GMimeCryptoContext *ctx, const char *name); - const char * (* digest_name) (GMimeCryptoContext *ctx, GMimeDigestAlgo digest); const char * (* get_signature_protocol) (GMimeCryptoContext *ctx); - const char * (* get_encryption_protocol) (GMimeCryptoContext *ctx); - const char * (* get_key_exchange_protocol) (GMimeCryptoContext *ctx); - int (* sign) (GMimeCryptoContext *ctx, const char *userid, - GMimeDigestAlgo digest, GMimeStream *istream, + int (* sign) (GMimeCryptoContext *ctx, gboolean detach, + const char *userid, GMimeStream *istream, GMimeStream *ostream, GError **err); - GMimeSignatureList * (* verify) (GMimeCryptoContext *ctx, GMimeDigestAlgo digest, + GMimeSignatureList * (* verify) (GMimeCryptoContext *ctx, GMimeVerifyFlags flags, GMimeStream *istream, GMimeStream *sigstream, - GError **err); + GMimeStream *ostream, GError **err); int (* encrypt) (GMimeCryptoContext *ctx, gboolean sign, - const char *userid, GMimeDigestAlgo digest, + const char *userid, GMimeEncryptFlags flags, GPtrArray *recipients, GMimeStream *istream, GMimeStream *ostream, GError **err); - GMimeDecryptResult * (* decrypt) (GMimeCryptoContext *ctx, GMimeStream *istream, + GMimeDecryptResult * (* decrypt) (GMimeCryptoContext *ctx, GMimeDecryptFlags flags, + const char *session_key, GMimeStream *istream, GMimeStream *ostream, GError **err); int (* import_keys) (GMimeCryptoContext *ctx, GMimeStream *istream, GError **err); - int (* export_keys) (GMimeCryptoContext *ctx, GPtrArray *keys, + int (* export_keys) (GMimeCryptoContext *ctx, const char *keys[], GMimeStream *ostream, GError **err); - - GMimeDecryptResult * (* decrypt_session) (GMimeCryptoContext *ctx, const char *session_key, - GMimeStream *istream, GMimeStream *ostream, - GError **err); - - gboolean (* get_retrieve_session_key) (GMimeCryptoContext *ctx); - - int (* set_retrieve_session_key) (GMimeCryptoContext *ctx, - gboolean retrieve_session_key, - GError **err); }; GType g_mime_crypto_context_get_type (void); -void g_mime_crypto_context_set_request_password (GMimeCryptoContext *ctx, GMimePasswordRequestFunc request_passwd); +void g_mime_crypto_context_register (const char *protocol, GMimeCryptoContextNewFunc callback); +GMimeCryptoContext *g_mime_crypto_context_new (const char *protocol); -gboolean g_mime_crypto_context_get_retrieve_session_key (GMimeCryptoContext *ctx); - -int g_mime_crypto_context_set_retrieve_session_key (GMimeCryptoContext *ctx, - gboolean retrieve_session_key, - GError **err); +void g_mime_crypto_context_set_request_password (GMimeCryptoContext *ctx, GMimePasswordRequestFunc request_passwd); /* digest algo mapping */ GMimeDigestAlgo g_mime_crypto_context_digest_id (GMimeCryptoContext *ctx, const char *name); - const char *g_mime_crypto_context_digest_name (GMimeCryptoContext *ctx, GMimeDigestAlgo digest); /* protocol routines */ const char *g_mime_crypto_context_get_signature_protocol (GMimeCryptoContext *ctx); - const char *g_mime_crypto_context_get_encryption_protocol (GMimeCryptoContext *ctx); - const char *g_mime_crypto_context_get_key_exchange_protocol (GMimeCryptoContext *ctx); /* crypto routines */ -int g_mime_crypto_context_sign (GMimeCryptoContext *ctx, const char *userid, - GMimeDigestAlgo digest, GMimeStream *istream, - GMimeStream *ostream, GError **err); +int g_mime_crypto_context_sign (GMimeCryptoContext *ctx, gboolean detach, const char *userid, + GMimeStream *istream, GMimeStream *ostream, GError **err); -GMimeSignatureList *g_mime_crypto_context_verify (GMimeCryptoContext *ctx, GMimeDigestAlgo digest, +GMimeSignatureList *g_mime_crypto_context_verify (GMimeCryptoContext *ctx, GMimeVerifyFlags flags, GMimeStream *istream, GMimeStream *sigstream, - GError **err); + GMimeStream *ostream, GError **err); -int g_mime_crypto_context_encrypt (GMimeCryptoContext *ctx, gboolean sign, - const char *userid, GMimeDigestAlgo digest, - GPtrArray *recipients, GMimeStream *istream, - GMimeStream *ostream, GError **err); +int g_mime_crypto_context_encrypt (GMimeCryptoContext *ctx, gboolean sign, const char *userid, + GMimeEncryptFlags flags, GPtrArray *recipients, + GMimeStream *istream, GMimeStream *ostream, + GError **err); -GMimeDecryptResult *g_mime_crypto_context_decrypt (GMimeCryptoContext *ctx, GMimeStream *istream, +GMimeDecryptResult *g_mime_crypto_context_decrypt (GMimeCryptoContext *ctx, GMimeDecryptFlags flags, + const char *session_key, GMimeStream *istream, GMimeStream *ostream, GError **err); -GMimeDecryptResult *g_mime_crypto_context_decrypt_session (GMimeCryptoContext *ctx, const char *session_key, - GMimeStream *istream, GMimeStream *ostream, - GError **err); - /* key/certificate routines */ int g_mime_crypto_context_import_keys (GMimeCryptoContext *ctx, GMimeStream *istream, GError **err); -int g_mime_crypto_context_export_keys (GMimeCryptoContext *ctx, GPtrArray *keys, +int g_mime_crypto_context_export_keys (GMimeCryptoContext *ctx, const char *keys[], GMimeStream *ostream, GError **err); - /** * GMimeCipherAlgo: * @GMIME_CIPHER_ALGO_DEFAULT: The default (or unknown) cipher. diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-data-wrapper.c gmime-3.0.1/gmime/gmime-data-wrapper.c --- gmime-2.6.22+dfsg2/gmime/gmime-data-wrapper.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-data-wrapper.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -117,7 +117,7 @@ GMimeDataWrapper * g_mime_data_wrapper_new (void) { - return g_object_newv (GMIME_TYPE_DATA_WRAPPER, 0, NULL); + return g_object_new (GMIME_TYPE_DATA_WRAPPER, NULL); } diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-data-wrapper.h gmime-3.0.1/gmime/gmime-data-wrapper.h --- gmime-2.6.22+dfsg2/gmime/gmime-data-wrapper.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-data-wrapper.h 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-disposition.c gmime-3.0.1/gmime/gmime-disposition.c --- gmime-2.6.22+dfsg2/gmime/gmime-disposition.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-disposition.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -46,6 +46,8 @@ static void g_mime_content_disposition_init (GMimeContentDisposition *disposition, GMimeContentDispositionClass *klass); static void g_mime_content_disposition_finalize (GObject *object); +static void param_list_changed (GMimeParamList *list, gpointer args, GMimeContentDisposition *disposition); + static GObjectClass *parent_class = NULL; @@ -88,10 +90,11 @@ static void g_mime_content_disposition_init (GMimeContentDisposition *disposition, GMimeContentDispositionClass *klass) { - disposition->param_hash = g_hash_table_new (g_mime_strcase_hash, g_mime_strcase_equal); - disposition->priv = g_mime_event_new ((GObject *) disposition); + disposition->changed = g_mime_event_new ((GObject *) disposition); + disposition->params = g_mime_param_list_new (); disposition->disposition = NULL; - disposition->params = NULL; + + g_mime_event_add (disposition->params->changed, (GMimeEventCallback) param_list_changed, disposition); } static void @@ -99,15 +102,21 @@ { GMimeContentDisposition *disposition = (GMimeContentDisposition *) object; - g_hash_table_destroy (disposition->param_hash); - g_mime_param_destroy (disposition->params); - g_mime_event_destroy (disposition->priv); + g_mime_event_free (disposition->changed); + g_object_unref (disposition->params); g_free (disposition->disposition); G_OBJECT_CLASS (parent_class)->finalize (object); } +static void +param_list_changed (GMimeParamList *list, gpointer args, GMimeContentDisposition *disposition) +{ + g_mime_event_emit (disposition->changed, NULL); +} + + /** * g_mime_content_disposition_new: * @@ -120,7 +129,7 @@ { GMimeContentDisposition *disposition; - disposition = g_object_newv (GMIME_TYPE_CONTENT_DISPOSITION, 0, NULL); + disposition = g_object_new (GMIME_TYPE_CONTENT_DISPOSITION, NULL); disposition->disposition = g_strdup (GMIME_DISPOSITION_ATTACHMENT); return disposition; @@ -128,25 +137,26 @@ /** - * g_mime_content_disposition_new_from_string: - * @str: Content-Disposition field value or %NULL + * g_mime_content_disposition_parse: + * @options: (nullable): a #GMimeParserOptions or %NULL + * @str: Content-Disposition field value * - * Creates a new #GMimeContentDisposition object. + * Parses the input string into a #GMimeContentDisposition object. * - * Returns: a new #GMimeContentDisposition object. + * Returns: (transfer full): a new #GMimeContentDisposition object. **/ GMimeContentDisposition * -g_mime_content_disposition_new_from_string (const char *str) +g_mime_content_disposition_parse (GMimeParserOptions *options, const char *str) { GMimeContentDisposition *disposition; const char *inptr = str; - GMimeParam *param; + GMimeParamList *params; char *value; if (str == NULL) return g_mime_content_disposition_new (); - disposition = g_object_newv (GMIME_TYPE_CONTENT_DISPOSITION, 0, NULL); + disposition = g_object_new (GMIME_TYPE_CONTENT_DISPOSITION, NULL); /* get content disposition part */ @@ -158,13 +168,10 @@ disposition->disposition = g_strstrip (value); /* parse the parameters, if any */ - if (*inptr++ == ';' && *inptr) { - param = disposition->params = g_mime_param_new_from_string (inptr); - - while (param) { - g_hash_table_insert (disposition->param_hash, param->name, param); - param = param->next; - } + if (*inptr++ == ';' && *inptr && (params = g_mime_param_list_parse (options, inptr))) { + g_mime_event_add (params->changed, (GMimeEventCallback) param_list_changed, disposition); + g_object_unref (disposition->params); + disposition->params = params; } return disposition; @@ -193,7 +200,7 @@ g_free (disposition->disposition); disposition->disposition = buf; - g_mime_event_emit (disposition->priv, NULL); + g_mime_event_emit (disposition->changed, NULL); } @@ -216,41 +223,15 @@ /** - * g_mime_content_disposition_set_params: - * @disposition: a #GMimeContentDisposition object - * @params: a list of #GMimeParam objects - * - * Sets the Content-Disposition's parameter list. - **/ -void -g_mime_content_disposition_set_params (GMimeContentDisposition *disposition, GMimeParam *params) -{ - g_return_if_fail (GMIME_IS_CONTENT_DISPOSITION (disposition)); - - /* destroy the current list/hash */ - g_hash_table_remove_all (disposition->param_hash); - g_mime_param_destroy (disposition->params); - disposition->params = params; - - while (params != NULL) { - g_hash_table_insert (disposition->param_hash, params->name, params); - params = params->next; - } - - g_mime_event_emit (disposition->priv, NULL); -} - - -/** - * g_mime_content_disposition_get_params: + * g_mime_content_disposition_get_parameters: * @disposition: a #GMimeContentDisposition object * * Gets the Content-Disposition parameter list. * - * Returns: the list of #GMimeParam's set on @disposition. + * Returns: (transfer none): the Content-Disposition's parameter list. **/ -const GMimeParam * -g_mime_content_disposition_get_params (GMimeContentDisposition *disposition) +GMimeParamList * +g_mime_content_disposition_get_parameters (GMimeContentDisposition *disposition) { g_return_val_if_fail (GMIME_IS_CONTENT_DISPOSITION (disposition), NULL); @@ -272,22 +253,9 @@ void g_mime_content_disposition_set_parameter (GMimeContentDisposition *disposition, const char *name, const char *value) { - GMimeParam *param = NULL; - g_return_if_fail (GMIME_IS_CONTENT_DISPOSITION (disposition)); - g_return_if_fail (name != NULL); - g_return_if_fail (value != NULL); - if ((param = g_hash_table_lookup (disposition->param_hash, name))) { - g_free (param->value); - param->value = g_strdup (value); - } else { - param = g_mime_param_new (name, value); - disposition->params = g_mime_param_append_param (disposition->params, param); - g_hash_table_insert (disposition->param_hash, param->name, param); - } - - g_mime_event_emit (disposition->priv, NULL); + g_mime_param_list_set_parameter (disposition->params, name, value); } @@ -308,9 +276,8 @@ GMimeParam *param; g_return_val_if_fail (GMIME_IS_CONTENT_DISPOSITION (disposition), NULL); - g_return_val_if_fail (name != NULL, NULL); - if (!(param = g_hash_table_lookup (disposition->param_hash, name))) + if (!(param = g_mime_param_list_get_parameter (disposition->params, name))) return NULL; return param->value; @@ -324,8 +291,6 @@ * Determines if a Content-Disposition has a value of "attachment". * * Returns: %TRUE if the value matches "attachment", otherwise %FALSE. - * - * Since: 2.6.21 **/ gboolean g_mime_content_disposition_is_attachment (GMimeContentDisposition *disposition) @@ -337,34 +302,35 @@ /** - * g_mime_content_disposition_to_string: + * g_mime_content_disposition_encode: * @disposition: a #GMimeContentDisposition object - * @fold: fold header if needed + * @options: (nullable): a #GMimeFormatOptions or %NULL * - * Allocates a string buffer containing the Content-Disposition header - * represented by the disposition object @disposition. + * Encodes the Content-Disposition header. * - * Returns: a string containing the disposition header + * Returns: a new string containing the encoded header value. **/ char * -g_mime_content_disposition_to_string (GMimeContentDisposition *disposition, gboolean fold) +g_mime_content_disposition_encode (GMimeContentDisposition *disposition, GMimeFormatOptions *options) { - GString *string; - char *header, *buf; + char *raw_value; + GString *str; + guint len, n; g_return_val_if_fail (GMIME_IS_CONTENT_DISPOSITION (disposition), NULL); /* we need to have this so wrapping is correct */ - string = g_string_new ("Content-Disposition: "); + str = g_string_new ("Content-Disposition:"); + n = str->len; - g_string_append (string, disposition->disposition); - g_mime_param_write_to_string (disposition->params, fold, string); + g_string_append_c (str, ' '); + g_string_append (str, disposition->disposition); + g_mime_param_list_encode (disposition->params, options, TRUE, str); + len = str->len - n; - header = string->str; - g_string_free (string, FALSE); + raw_value = g_string_free (str, FALSE); - buf = header + strlen ("Content-Disposition: "); - memmove (header, buf, strlen (buf) + 1); + memmove (raw_value, raw_value + n, len + 1); - return header; + return raw_value; } diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-disposition.h gmime-3.0.1/gmime/gmime-disposition.h --- gmime-2.6.22+dfsg2/gmime/gmime-disposition.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-disposition.h 2017-03-18 01:31:54.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -58,22 +58,19 @@ /** * GMimeContentDisposition: * @parent_object: parent #GObject - * @param_hash: parameter hash table keyed by param name - * @params: a #GMimeParam list - * @priv: private fields * @disposition: disposition + * @params: a #GMimeParam list * * A data structure representing a Content-Disposition. **/ struct _GMimeContentDisposition { GObject parent_object; - GHashTable *param_hash; - GMimeParam *params; - - gpointer priv; - char *disposition; + GMimeParamList *params; + + /* < private > */ + gpointer changed; }; struct _GMimeContentDispositionClass { @@ -85,13 +82,12 @@ GMimeContentDisposition *g_mime_content_disposition_new (void); -GMimeContentDisposition *g_mime_content_disposition_new_from_string (const char *str); +GMimeContentDisposition *g_mime_content_disposition_parse (GMimeParserOptions *options, const char *str); void g_mime_content_disposition_set_disposition (GMimeContentDisposition *disposition, const char *value); const char *g_mime_content_disposition_get_disposition (GMimeContentDisposition *disposition); -void g_mime_content_disposition_set_params (GMimeContentDisposition *disposition, GMimeParam *params); -const GMimeParam *g_mime_content_disposition_get_params (GMimeContentDisposition *disposition); +GMimeParamList *g_mime_content_disposition_get_parameters (GMimeContentDisposition *disposition); void g_mime_content_disposition_set_parameter (GMimeContentDisposition *disposition, const char *name, const char *value); @@ -100,7 +96,7 @@ gboolean g_mime_content_disposition_is_attachment (GMimeContentDisposition *disposition); -char *g_mime_content_disposition_to_string (GMimeContentDisposition *disposition, gboolean fold); +char *g_mime_content_disposition_encode (GMimeContentDisposition *disposition, GMimeFormatOptions *options); G_END_DECLS diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-encodings.c gmime-3.0.1/gmime/gmime-encodings.c --- gmime-2.6.22+dfsg2/gmime/gmime-encodings.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-encodings.c 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast and Michael Zucchi + * Copyright (C) 2000-2017 Jeffrey Stedfast and Michael Zucchi * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-encodings.h gmime-3.0.1/gmime/gmime-encodings.h --- gmime-2.6.22+dfsg2/gmime/gmime-encodings.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-encodings.h 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-error.h gmime-3.0.1/gmime/gmime-error.h --- gmime-2.6.22+dfsg2/gmime/gmime-error.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-error.h 2017-04-23 02:08:13.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -48,12 +48,11 @@ /* errno is a positive value, so negative values should be safe to use */ enum { - GMIME_ERROR_GENERAL = 0, - GMIME_ERROR_NOT_SUPPORTED = -1, - GMIME_ERROR_PARSE_ERROR = -2, - GMIME_ERROR_PROTOCOL_ERROR = -3, - GMIME_ERROR_BAD_PASSWORD = -4, - GMIME_ERROR_NO_VALID_RECIPIENTS = -5 + GMIME_ERROR_GENERAL = -1, + GMIME_ERROR_NOT_SUPPORTED = -2, + GMIME_ERROR_INVALID_OPERATION = -3, + GMIME_ERROR_PARSE_ERROR = -4, + GMIME_ERROR_PROTOCOL_ERROR = -5 }; diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-events.c gmime-3.0.1/gmime/gmime-events.c --- gmime-2.6.22+dfsg2/gmime/gmime-events.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-events.c 2017-03-18 01:31:54.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -24,11 +24,8 @@ #endif #include "gmime-events.h" -#include "list.h" typedef struct _EventListener { - struct _EventListener *next; - struct _EventListener *prev; GMimeEventCallback callback; gpointer user_data; int blocked; @@ -42,8 +39,6 @@ listener = g_slice_new (EventListener); listener->user_data = user_data; listener->callback = callback; - listener->prev = NULL; - listener->next = NULL; listener->blocked = 0; return listener; @@ -57,8 +52,8 @@ struct _GMimeEvent { + GPtrArray *array; gpointer owner; - List list; }; @@ -76,7 +71,7 @@ GMimeEvent *event; event = g_slice_new (GMimeEvent); - list_init (&event->list); + event->array = g_ptr_array_new (); event->owner = owner; return event; @@ -84,40 +79,37 @@ /** - * g_mime_event_destroy: + * g_mime_event_free: * @event: a #GMimeEvent * - * Destroys an event context. + * Frees an event context. **/ void -g_mime_event_destroy (GMimeEvent *event) +g_mime_event_free (GMimeEvent *event) { - EventListener *node, *next; + guint i; - node = (EventListener *) event->list.head; - while (node->next) { - next = node->next; - event_listener_free (node); - node = next; - } + for (i = 0; i < event->array->len; i++) + event_listener_free (event->array->pdata[i]); + g_ptr_array_free (event->array, TRUE); g_slice_free (GMimeEvent, event); } -static EventListener * -g_mime_event_find_listener (GMimeEvent *event, GMimeEventCallback callback, gpointer user_data) +static int +g_mime_event_index_of (GMimeEvent *event, GMimeEventCallback callback, gpointer user_data) { - EventListener *node; + EventListener *listener; + int i; - node = (EventListener *) event->list.head; - while (node->next) { - if (node->callback == callback && node->user_data == user_data) - return node; - node = node->next; + for (i = 0; i < event->array->len; i++) { + listener = (EventListener *) event->array->pdata[i]; + if (listener->callback == callback && listener->user_data == user_data) + return i; } - return NULL; + return -1; } @@ -133,9 +125,13 @@ g_mime_event_block (GMimeEvent *event, GMimeEventCallback callback, gpointer user_data) { EventListener *listener; + int index; + + if ((index = g_mime_event_index_of (event, callback, user_data)) == -1) + return; - if ((listener = g_mime_event_find_listener (event, callback, user_data))) - listener->blocked++; + listener = (EventListener *) event->array->pdata[index]; + listener->blocked++; } @@ -152,9 +148,13 @@ g_mime_event_unblock (GMimeEvent *event, GMimeEventCallback callback, gpointer user_data) { EventListener *listener; + int index; - if ((listener = g_mime_event_find_listener (event, callback, user_data))) - listener->blocked--; + if ((index = g_mime_event_index_of (event, callback, user_data)) == -1) + return; + + listener = (EventListener *) event->array->pdata[index]; + listener->blocked--; } @@ -173,7 +173,7 @@ EventListener *listener; listener = event_listener_new (callback, user_data); - list_append (&event->list, (ListNode *) listener); + g_ptr_array_add (event->array, listener); } @@ -190,11 +190,14 @@ g_mime_event_remove (GMimeEvent *event, GMimeEventCallback callback, gpointer user_data) { EventListener *listener; + int index; - if ((listener = g_mime_event_find_listener (event, callback, user_data))) { - list_unlink ((ListNode *) listener); - event_listener_free (listener); - } + if ((index = g_mime_event_index_of (event, callback, user_data)) == -1) + return; + + listener = (EventListener *) event->array->pdata[index]; + g_ptr_array_remove_index (event->array, index); + event_listener_free (listener); } @@ -209,12 +212,12 @@ void g_mime_event_emit (GMimeEvent *event, gpointer args) { - EventListener *node; + EventListener *listener; + guint i; - node = (EventListener *) event->list.head; - while (node->next) { - if (node->blocked <= 0) - node->callback (event->owner, args, node->user_data); - node = node->next; + for (i = 0; i < event->array->len; i++) { + listener = (EventListener *) event->array->pdata[i]; + if (listener->blocked <= 0) + listener->callback (event->owner, args, listener->user_data); } } diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-events.h gmime-3.0.1/gmime/gmime-events.h --- gmime-2.6.22+dfsg2/gmime/gmime-events.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-events.h 2017-03-16 01:55:56.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -31,7 +31,7 @@ typedef struct _GMimeEvent GMimeEvent; G_GNUC_INTERNAL GMimeEvent *g_mime_event_new (gpointer owner); -G_GNUC_INTERNAL void g_mime_event_destroy (GMimeEvent *event); +G_GNUC_INTERNAL void g_mime_event_free (GMimeEvent *event); G_GNUC_INTERNAL void g_mime_event_add (GMimeEvent *event, GMimeEventCallback callback, gpointer user_data); G_GNUC_INTERNAL void g_mime_event_remove (GMimeEvent *event, GMimeEventCallback callback, gpointer user_data); diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter-basic.c gmime-3.0.1/gmime/gmime-filter-basic.c --- gmime-2.6.22+dfsg2/gmime/gmime-filter-basic.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter-basic.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -245,7 +245,7 @@ { GMimeFilterBasic *basic; - basic = g_object_newv (GMIME_TYPE_FILTER_BASIC, 0, NULL); + basic = g_object_new (GMIME_TYPE_FILTER_BASIC, NULL); if (encode) g_mime_encoding_init_encode (&basic->encoder, encoding); diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter-basic.h gmime-3.0.1/gmime/gmime-filter-basic.h --- gmime-2.6.22+dfsg2/gmime/gmime-filter-basic.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter-basic.h 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter-best.c gmime-3.0.1/gmime/gmime-filter-best.c --- gmime-2.6.22+dfsg2/gmime/gmime-filter-best.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter-best.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -243,13 +243,13 @@ GMimeFilter * g_mime_filter_best_new (GMimeFilterBestFlags flags) { - GMimeFilterBest *new; + GMimeFilterBest *best; - new = g_object_newv (GMIME_TYPE_FILTER_BEST, 0, NULL); - new->flags = flags; - filter_reset ((GMimeFilter *) new); + best = g_object_new (GMIME_TYPE_FILTER_BEST, NULL); + best->flags = flags; + filter_reset ((GMimeFilter *) best); - return (GMimeFilter *) new; + return (GMimeFilter *) best; } diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter-best.h gmime-3.0.1/gmime/gmime-filter-best.h --- gmime-2.6.22+dfsg2/gmime/gmime-filter-best.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter-best.h 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter.c gmime-3.0.1/gmime/gmime-filter.c --- gmime-2.6.22+dfsg2/gmime/gmime-filter.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter.c 2017-03-20 13:44:23.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -143,7 +143,7 @@ * g_mime_filter_copy: * @filter: filter * - * Copies @filter into a new GMimeFilter object. + * Copies @filter into a new #GMimeFilter object. * * Returns: (transfer full): a duplicate of @filter. **/ diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter-charset.c gmime-3.0.1/gmime/gmime-filter-charset.c --- gmime-2.6.22+dfsg2/gmime/gmime-filter-charset.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter-charset.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -243,7 +243,7 @@ inleft--; } else if (errno == EINVAL) { /* - * EINVAL An incomplete multibyte sequence has been encoun + * EINVAL An incomplete multibyte sequence has been encoun- * tered in the input. * * We assume that this can only happen if we've run out of @@ -304,17 +304,17 @@ GMimeFilter * g_mime_filter_charset_new (const char *from_charset, const char *to_charset) { - GMimeFilterCharset *new; + GMimeFilterCharset *charset; iconv_t cd; cd = g_mime_iconv_open (to_charset, from_charset); if (cd == (iconv_t) -1) return NULL; - new = g_object_newv (GMIME_TYPE_FILTER_CHARSET, 0, NULL); - new->from_charset = g_strdup (from_charset); - new->to_charset = g_strdup (to_charset); - new->cd = cd; + charset = g_object_new (GMIME_TYPE_FILTER_CHARSET, NULL); + charset->from_charset = g_strdup (from_charset); + charset->to_charset = g_strdup (to_charset); + charset->cd = cd; - return (GMimeFilter *) new; + return (GMimeFilter *) charset; } diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter-charset.h gmime-3.0.1/gmime/gmime-filter-charset.h --- gmime-2.6.22+dfsg2/gmime/gmime-filter-charset.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter-charset.h 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter-checksum.c gmime-3.0.1/gmime/gmime-filter-checksum.c --- gmime-2.6.22+dfsg2/gmime/gmime-filter-checksum.c 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter-checksum.c 2017-04-08 17:01:10.000000000 +0000 @@ -0,0 +1,192 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2017 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gmime-filter-checksum.h" + + +/** + * SECTION: gmime-filter-checksum + * @title: GMimeFilterChecksum + * @short_description: Calculate a checksum + * @see_also: #GMimeFilter + * + * Calculate a checksum for a stream. + **/ + +static void g_mime_filter_checksum_class_init (GMimeFilterChecksumClass *klass); +static void g_mime_filter_checksum_init (GMimeFilterChecksum *filter, GMimeFilterChecksumClass *klass); +static void g_mime_filter_checksum_finalize (GObject *object); + +static GMimeFilter *filter_copy (GMimeFilter *filter); +static void filter_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace); +static void filter_complete (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace); +static void filter_reset (GMimeFilter *filter); + + +static GMimeFilterClass *parent_class = NULL; + + +GType +g_mime_filter_checksum_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeFilterChecksumClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_filter_checksum_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeFilterChecksum), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_filter_checksum_init, + }; + + type = g_type_register_static (GMIME_TYPE_FILTER, "GMimeFilterChecksum", &info, 0); + } + + return type; +} + + +static void +g_mime_filter_checksum_class_init (GMimeFilterChecksumClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GMimeFilterClass *filter_class = GMIME_FILTER_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_FILTER); + + object_class->finalize = g_mime_filter_checksum_finalize; + + filter_class->copy = filter_copy; + filter_class->filter = filter_filter; + filter_class->complete = filter_complete; + filter_class->reset = filter_reset; +} + +static void +g_mime_filter_checksum_init (GMimeFilterChecksum *filter, GMimeFilterChecksumClass *klass) +{ + filter->checksum = NULL; +} + +static void +g_mime_filter_checksum_finalize (GObject *object) +{ + GMimeFilterChecksum *filter = (GMimeFilterChecksum *) object; + + if (filter->checksum) + g_checksum_free (filter->checksum); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +static GMimeFilter * +filter_copy (GMimeFilter *filter) +{ + GChecksum *checksum = ((GMimeFilterChecksum *) filter)->checksum; + GMimeFilterChecksum *copy; + + copy = g_object_new (GMIME_TYPE_FILTER_CHECKSUM, NULL); + copy->checksum = checksum ? g_checksum_copy (checksum) : NULL; + + return (GMimeFilter *) copy; +} + + +static void +filter_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace) +{ + GChecksum *checksum = ((GMimeFilterChecksum *) filter)->checksum; + + g_checksum_update (checksum, (unsigned char *) in, len); + + *out = in; + *outlen = len; + *outprespace = prespace; +} + +static void +filter_complete (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace) +{ + filter_filter (filter, in, len, prespace, out, outlen, outprespace); +} + +static void +filter_reset (GMimeFilter *filter) +{ + GChecksum *checksum = ((GMimeFilterChecksum *) filter)->checksum; + + g_checksum_reset (checksum); +} + + +/** + * g_mime_filter_checksum_new: + * @type: the type of checksum + * + * Creates a new checksum filter. + * + * Returns: a new #GMimeFilterChecksum filter. + **/ +GMimeFilter * +g_mime_filter_checksum_new (GChecksumType type) +{ + GMimeFilterChecksum *checksum; + + checksum = g_object_new (GMIME_TYPE_FILTER_CHECKSUM, NULL); + checksum->checksum = g_checksum_new (type); + + return (GMimeFilter *) checksum; +} + + +/** + * g_mime_filter_checksum_get_digest: + * @checksum: checksum filter object + * @digest: the digest buffer + * @len: the length of the digest buffer + * + * Outputs the checksum digest into @digest. + * + * Returns: the number of bytes used of the @digest buffer. + **/ +size_t +g_mime_filter_checksum_get_digest (GMimeFilterChecksum *checksum, unsigned char *digest, size_t len) +{ + g_return_val_if_fail (GMIME_IS_FILTER_CHECKSUM (checksum), 0); + + g_checksum_get_digest (checksum->checksum, digest, &len); + + return len; +} diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter-checksum.h gmime-3.0.1/gmime/gmime-filter-checksum.h --- gmime-2.6.22+dfsg2/gmime/gmime-filter-checksum.h 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter-checksum.h 2017-03-28 23:46:26.000000000 +0000 @@ -0,0 +1,66 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2017 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_FILTER_MD5_H__ +#define __GMIME_FILTER_MD5_H__ + +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_FILTER_CHECKSUM (g_mime_filter_checksum_get_type ()) +#define GMIME_FILTER_CHECKSUM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_FILTER_CHECKSUM, GMimeFilterChecksum)) +#define GMIME_FILTER_CHECKSUM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_FILTER_CHECKSUM, GMimeFilterChecksumClass)) +#define GMIME_IS_FILTER_CHECKSUM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_FILTER_CHECKSUM)) +#define GMIME_IS_FILTER_CHECKSUM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_FILTER_CHECKSUM)) +#define GMIME_FILTER_CHECKSUM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_FILTER_CHECKSUM, GMimeFilterChecksumClass)) + +typedef struct _GMimeFilterChecksum GMimeFilterChecksum; +typedef struct _GMimeFilterChecksumClass GMimeFilterChecksumClass; + +/** + * GMimeFilterChecksum: + * @parent_object: parent #GMimeFilter + * @checksum: The checksum context + * + * A filter for calculating the checksum of a stream. + **/ +struct _GMimeFilterChecksum { + GMimeFilter parent_object; + + GChecksum *checksum; +}; + +struct _GMimeFilterChecksumClass { + GMimeFilterClass parent_class; + +}; + + +GType g_mime_filter_checksum_get_type (void); + +GMimeFilter *g_mime_filter_checksum_new (GChecksumType type); + +size_t g_mime_filter_checksum_get_digest (GMimeFilterChecksum *checksum, unsigned char *digest, size_t len); + +G_END_DECLS + +#endif /* __GMIME_FILTER_CHECKSUM_H__ */ diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter-crlf.c gmime-3.0.1/gmime/gmime-filter-crlf.c --- gmime-2.6.22+dfsg2/gmime/gmime-filter-crlf.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter-crlf.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,240 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free - * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "gmime-filter-crlf.h" - - -/** - * SECTION: gmime-filter-crlf - * @title: GMimeFilterCRLF - * @short_description: Convert line-endings from LF to CRLF or vise versa - * - * A #GMimeFilter for converting between DOS and UNIX line-endings. - **/ - - -static void g_mime_filter_crlf_class_init (GMimeFilterCRLFClass *klass); -static void g_mime_filter_crlf_init (GMimeFilterCRLF *filter, GMimeFilterCRLFClass *klass); -static void g_mime_filter_crlf_finalize (GObject *object); - -static GMimeFilter *filter_copy (GMimeFilter *filter); -static void filter_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace, - char **out, size_t *outlen, size_t *outprespace); -static void filter_complete (GMimeFilter *filter, char *in, size_t len, size_t prespace, - char **out, size_t *outlen, size_t *outprespace); -static void filter_reset (GMimeFilter *filter); - - -static GMimeFilterClass *parent_class = NULL; - - -GType -g_mime_filter_crlf_get_type (void) -{ - static GType type = 0; - - if (!type) { - static const GTypeInfo info = { - sizeof (GMimeFilterCRLFClass), - NULL, /* base_class_init */ - NULL, /* base_class_finalize */ - (GClassInitFunc) g_mime_filter_crlf_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (GMimeFilterCRLF), - 0, /* n_preallocs */ - (GInstanceInitFunc) g_mime_filter_crlf_init, - }; - - type = g_type_register_static (GMIME_TYPE_FILTER, "GMimeFilterCRLF", &info, 0); - } - - return type; -} - - -static void -g_mime_filter_crlf_class_init (GMimeFilterCRLFClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - GMimeFilterClass *filter_class = GMIME_FILTER_CLASS (klass); - - parent_class = g_type_class_ref (GMIME_TYPE_FILTER); - - object_class->finalize = g_mime_filter_crlf_finalize; - - filter_class->copy = filter_copy; - filter_class->filter = filter_filter; - filter_class->complete = filter_complete; - filter_class->reset = filter_reset; -} - -static void -g_mime_filter_crlf_init (GMimeFilterCRLF *filter, GMimeFilterCRLFClass *klass) -{ - filter->saw_cr = FALSE; - filter->saw_lf = FALSE; - filter->saw_dot = FALSE; -} - -static void -g_mime_filter_crlf_finalize (GObject *object) -{ - G_OBJECT_CLASS (parent_class)->finalize (object); -} - - -static GMimeFilter * -filter_copy (GMimeFilter *filter) -{ - GMimeFilterCRLF *crlf = (GMimeFilterCRLF *) filter; - - return g_mime_filter_crlf_new (crlf->encode, crlf->dots); -} - -static void -filter_filter (GMimeFilter *filter, char *inbuf, size_t inlen, size_t prespace, - char **outbuf, size_t *outlen, size_t *outprespace) -{ - GMimeFilterCRLF *crlf = (GMimeFilterCRLF *) filter; - register const char *inptr = inbuf; - const char *inend = inbuf + inlen; - char *outptr; - - if (crlf->encode) { - g_mime_filter_set_size (filter, 3 * inlen, FALSE); - - outptr = filter->outbuf; - while (inptr < inend) { - if (*inptr == '\r') { - crlf->saw_cr = TRUE; - } else if (*inptr == '\n') { - crlf->saw_lf = TRUE; - if (!crlf->saw_cr) - *outptr++ = '\r'; - crlf->saw_cr = FALSE; - } else { - if (crlf->dots && *inptr == '.' && crlf->saw_lf) - *outptr++ = '.'; - - crlf->saw_cr = FALSE; - crlf->saw_lf = FALSE; - } - - *outptr++ = *inptr++; - } - } else { - g_mime_filter_set_size (filter, inlen + 1, FALSE); - - outptr = filter->outbuf; - while (inptr < inend) { - if (*inptr == '\r') { - crlf->saw_dot = FALSE; - crlf->saw_cr = TRUE; - } else { - if (crlf->saw_cr) { - crlf->saw_cr = FALSE; - - if (*inptr == '\n') { - crlf->saw_lf = TRUE; - *outptr++ = *inptr++; - continue; - } else - *outptr++ = '\r'; - } - - if (!(crlf->dots && crlf->saw_dot && *inptr == '.')) - *outptr++ = *inptr; - } - - if (crlf->dots && *inptr == '.') { - if (crlf->saw_lf) { - crlf->saw_dot = TRUE; - } else if (crlf->saw_dot) { - crlf->saw_dot = FALSE; - } - } - - crlf->saw_lf = FALSE; - - inptr++; - } - } - - *outlen = outptr - filter->outbuf; - *outprespace = filter->outpre; - *outbuf = filter->outbuf; -} - -static void -filter_complete (GMimeFilter *filter, char *inbuf, size_t inlen, size_t prespace, - char **outbuf, size_t *outlen, size_t *outprespace) -{ - if (inbuf && inlen) - filter_filter (filter, inbuf, inlen, prespace, outbuf, outlen, outprespace); -} - -static void -filter_reset (GMimeFilter *filter) -{ - GMimeFilterCRLF *crlf = (GMimeFilterCRLF *) filter; - - crlf->saw_cr = FALSE; - crlf->saw_lf = TRUE; - crlf->saw_dot = FALSE; -} - - -/** - * g_mime_filter_crlf_new: - * @encode: %TRUE if the filter should encode or %FALSE otherwise - * @dots: encode/decode dots (as for SMTP) - * - * Creates a new #GMimeFilterCRLF filter. - * - * If @encode is %TRUE, then lone line-feeds ('\n') will be 'encoded' - * into the canonical CRLF end-of-line sequence ("\r\n") otherwise - * CRLF sequences will be 'decoded' into the UNIX line-ending form - * ('\n'). - * - * The @dots parameter tells the filter whether or not it should - * encode or decode lines beginning with a dot ('.'). If both @encode - * and @dots are %TRUE, then a '.' at the beginning of a line will be - * 'encoded' into "..". If @encode is %FALSE, then ".." at the - * beginning of a line will be decoded into a single '.'. - * - * Returns: a new #GMimeFilterCRLF filter. - **/ -GMimeFilter * -g_mime_filter_crlf_new (gboolean encode, gboolean dots) -{ - GMimeFilterCRLF *new; - - new = g_object_newv (GMIME_TYPE_FILTER_CRLF, 0, NULL); - new->encode = encode; - new->dots = dots; - - return (GMimeFilter *) new; -} diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter-crlf.h gmime-3.0.1/gmime/gmime-filter-crlf.h --- gmime-2.6.22+dfsg2/gmime/gmime-filter-crlf.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter-crlf.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,74 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free - * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - - -#ifndef __GMIME_FILTER_CRLF_H__ -#define __GMIME_FILTER_CRLF_H__ - -#include - -G_BEGIN_DECLS - -#define GMIME_TYPE_FILTER_CRLF (g_mime_filter_crlf_get_type ()) -#define GMIME_FILTER_CRLF(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_FILTER_CRLF, GMimeFilterCRLF)) -#define GMIME_FILTER_CRLF_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_FILTER_CRLF, GMimeFilterCRLFClass)) -#define GMIME_IS_FILTER_CRLF(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_FILTER_CRLF)) -#define GMIME_IS_FILTER_CRLF_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_FILTER_CRLF)) -#define GMIME_FILTER_CRLF_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_FILTER_CRLF, GMimeFilterCRLFClass)) - -typedef struct _GMimeFilterCRLF GMimeFilterCRLF; -typedef struct _GMimeFilterCRLFClass GMimeFilterCRLFClass; - -/** - * GMimeFilterCRLF: - * @parent_object: parent #GMimeFilter - * @encode: encoding vs decoding line endings/dots - * @dots: %TRUE if dot-stuffing should be performed or %FALSE otherwise - * @saw_cr: %TRUE if the previous char was a CR - * @saw_lf: %TRUE if the previous char was a LF - * @saw_dot: %TRUE if the previous char was a period - * - * A filter to convert between line-ending formats and encode/decode - * lines beginning with a '.'. - **/ -struct _GMimeFilterCRLF { - GMimeFilter parent_object; - - gboolean encode; - gboolean dots; - - gboolean saw_cr; - gboolean saw_lf; - gboolean saw_dot; -}; - -struct _GMimeFilterCRLFClass { - GMimeFilterClass parent_class; - -}; - - -GType g_mime_filter_crlf_get_type (void); - -GMimeFilter *g_mime_filter_crlf_new (gboolean encode, gboolean dots); - -G_END_DECLS - -#endif /* __GMIME_FILTER_CRLF_H__ */ diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter-dos2unix.c gmime-3.0.1/gmime/gmime-filter-dos2unix.c --- gmime-2.6.22+dfsg2/gmime/gmime-filter-dos2unix.c 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter-dos2unix.c 2017-04-08 17:01:10.000000000 +0000 @@ -0,0 +1,188 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2017 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gmime-filter-dos2unix.h" + + +/** + * SECTION: gmime-filter-dos2unix + * @title: GMimeFilterDos2Unix + * @short_description: Convert line-endings from Windows/DOS (CRLF) to UNIX (LF). + * + * A #GMimeFilter for converting from DOS to UNIX line-endings. + **/ + + +static void g_mime_filter_dos2unix_class_init (GMimeFilterDos2UnixClass *klass); +static void g_mime_filter_dos2unix_init (GMimeFilterDos2Unix *filter, GMimeFilterDos2UnixClass *klass); +static void g_mime_filter_dos2unix_finalize (GObject *object); + +static GMimeFilter *filter_copy (GMimeFilter *filter); +static void filter_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace); +static void filter_complete (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace); +static void filter_reset (GMimeFilter *filter); + + +static GMimeFilterClass *parent_class = NULL; + + +GType +g_mime_filter_dos2unix_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeFilterDos2UnixClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_filter_dos2unix_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeFilterDos2Unix), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_filter_dos2unix_init, + }; + + type = g_type_register_static (GMIME_TYPE_FILTER, "GMimeFilterDos2Unix", &info, 0); + } + + return type; +} + + +static void +g_mime_filter_dos2unix_class_init (GMimeFilterDos2UnixClass *klass) +{ + GMimeFilterClass *filter_class = GMIME_FILTER_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_FILTER); + + filter_class->copy = filter_copy; + filter_class->filter = filter_filter; + filter_class->complete = filter_complete; + filter_class->reset = filter_reset; +} + +static void +g_mime_filter_dos2unix_init (GMimeFilterDos2Unix *filter, GMimeFilterDos2UnixClass *klass) +{ + filter->ensure_newline = FALSE; + filter->pc = '\0'; +} + + +static GMimeFilter * +filter_copy (GMimeFilter *filter) +{ + GMimeFilterDos2Unix *dos2unix = (GMimeFilterDos2Unix *) filter; + + return g_mime_filter_dos2unix_new (dos2unix->ensure_newline); +} + +static void +convert (GMimeFilter *filter, char *inbuf, size_t inlen, size_t prespace, + char **outbuf, size_t *outlen, size_t *outprespace, gboolean flush) +{ + GMimeFilterDos2Unix *dos2unix = (GMimeFilterDos2Unix *) filter; + register const char *inptr = inbuf; + const char *inend = inbuf + inlen; + size_t expected = inlen; + char *outptr; + + if (flush && dos2unix->ensure_newline) + expected++; + + if (dos2unix->pc == '\r') + expected++; + + g_mime_filter_set_size (filter, expected, FALSE); + + outptr = filter->outbuf; + while (inptr < inend) { + if (*inptr == '\n') { + *outptr++ = *inptr; + } else { + if (dos2unix->pc == '\r') + *outptr++ = dos2unix->pc; + + if (*inptr != '\r') + *outptr++ = *inptr; + } + + dos2unix->pc = *inptr++; + } + + if (flush && dos2unix->ensure_newline && dos2unix->pc != '\n') + dos2unix->pc = *outptr++ = '\n'; + + *outlen = outptr - filter->outbuf; + *outprespace = filter->outpre; + *outbuf = filter->outbuf; +} + +static void +filter_filter (GMimeFilter *filter, char *inbuf, size_t inlen, size_t prespace, + char **outbuf, size_t *outlen, size_t *outprespace) +{ + convert (filter, inbuf, inlen, prespace, outbuf, outlen, outprespace, FALSE); +} + +static void +filter_complete (GMimeFilter *filter, char *inbuf, size_t inlen, size_t prespace, + char **outbuf, size_t *outlen, size_t *outprespace) +{ + convert (filter, inbuf, inlen, prespace, outbuf, outlen, outprespace, TRUE); +} + +static void +filter_reset (GMimeFilter *filter) +{ + GMimeFilterDos2Unix *dos2unix = (GMimeFilterDos2Unix *) filter; + + dos2unix->pc = '\0'; +} + + +/** + * g_mime_filter_dos2unix_new: + * @ensure_newline: %TRUE if the filter should ensure that the stream ends in a new line + * + * Creates a new #GMimeFilterDos2Unix filter. + * + * Returns: a new #GMimeFilterDos2Unix filter. + **/ +GMimeFilter * +g_mime_filter_dos2unix_new (gboolean ensure_newline) +{ + GMimeFilterDos2Unix *dos2unix; + + dos2unix = g_object_new (GMIME_TYPE_FILTER_DOS2UNIX, NULL); + dos2unix->ensure_newline = ensure_newline; + + return (GMimeFilter *) dos2unix; +} diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter-dos2unix.h gmime-3.0.1/gmime/gmime-filter-dos2unix.h --- gmime-2.6.22+dfsg2/gmime/gmime-filter-dos2unix.h 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter-dos2unix.h 2017-03-20 13:44:23.000000000 +0000 @@ -0,0 +1,66 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2017 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_FILTER_DOS2UNIX_H__ +#define __GMIME_FILTER_DOS2UNIX_H__ + +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_FILTER_DOS2UNIX (g_mime_filter_dos2unix_get_type ()) +#define GMIME_FILTER_DOS2UNIX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_FILTER_DOS2UNIX, GMimeFilterDos2Unix)) +#define GMIME_FILTER_DOS2UNIX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_FILTER_DOS2UNIX, GMimeFilterDos2UnixClass)) +#define GMIME_IS_FILTER_DOS2UNIX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_FILTER_DOS2UNIX)) +#define GMIME_IS_FILTER_DOS2UNIX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_FILTER_DOS2UNIX)) +#define GMIME_FILTER_DOS2UNIX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_FILTER_DOS2UNIX, GMimeFilterDos2UnixClass)) + +typedef struct _GMimeFilterDos2Unix GMimeFilterDos2Unix; +typedef struct _GMimeFilterDos2UnixClass GMimeFilterDos2UnixClass; + +/** + * GMimeFilterDos2Unix: + * @parent_object: parent #GMimeFilter + * @ensure_newline: %TRUE if the filter should ensure that the stream ends with a new line + * @pc: the previous character encountered + * + * A filter to convert a stream from Windows/DOS line endings to Unix line endings. + **/ +struct _GMimeFilterDos2Unix { + GMimeFilter parent_object; + + gboolean ensure_newline; + char pc; +}; + +struct _GMimeFilterDos2UnixClass { + GMimeFilterClass parent_class; + +}; + + +GType g_mime_filter_dos2unix_get_type (void); + +GMimeFilter *g_mime_filter_dos2unix_new (gboolean ensure_newline); + +G_END_DECLS + +#endif /* __GMIME_FILTER_DOS2UNIX_H__ */ diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter-enriched.c gmime-3.0.1/gmime/gmime-filter-enriched.c --- gmime-2.6.22+dfsg2/gmime/gmime-filter-enriched.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter-enriched.c 2017-04-23 16:04:05.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -99,10 +99,6 @@ { "/param", " -->", FALSE, NULL }, }; -#define NUM_ENRICHED_TAGS (sizeof (enriched_tags) / sizeof (enriched_tags[0])) - -static GHashTable *enriched_hash = NULL; - static void g_mime_filter_enriched_class_init (GMimeFilterEnrichedClass *klass); static void g_mime_filter_enriched_init (GMimeFilterEnriched *filter, GMimeFilterEnrichedClass *klass); @@ -158,13 +154,6 @@ filter_class->reset = filter_reset; filter_class->filter = filter_filter; filter_class->complete = filter_complete; - - if (!enriched_hash) { - enriched_hash = g_hash_table_new (g_mime_strcase_hash, g_mime_strcase_equal); - for (i = 0; i < NUM_ENRICHED_TAGS; i++) - g_hash_table_insert (enriched_hash, enriched_tags[i].enriched, - enriched_tags[i].html); - } } static void @@ -195,7 +184,7 @@ { int i; - for (i = 0; i < NUM_ENRICHED_TAGS; i++) + for (i = 0; i < G_N_ELEMENTS (enriched_tags); i++) if (!g_ascii_strcasecmp (tag, enriched_tags[i].enriched)) return enriched_tags[i].needs_param; @@ -290,7 +279,7 @@ { guint i; - for (i = 0; i < NUM_ENRICHED_TAGS; i++) { + for (i = 0; i < G_N_ELEMENTS (enriched_tags); i++) { if (!g_ascii_strcasecmp (enriched, enriched_tags[i].enriched)) return enriched_tags[i].parse_param (inptr, inlen); } @@ -447,19 +436,25 @@ goto backup; } } else { - const char *html_tag; + const char *fmt, *html_tag = NULL; char *enriched_tag; size_t len; + guint i; len = inptr - tag; enriched_tag = g_alloca (len + 1); memcpy (enriched_tag, tag, len); enriched_tag[len] = '\0'; - html_tag = g_hash_table_lookup (enriched_hash, enriched_tag); + for (i = 0; i < G_N_ELEMENTS (enriched_tags); i++) { + if (!g_ascii_strcasecmp (enriched_tag, enriched_tags[i].enriched)) { + html_tag = enriched_tags[i].html; + break; + } + } - if (html_tag) { - if (html_tag_needs_param (html_tag)) { + if (i < G_N_ELEMENTS (enriched_tags)) { + if ((fmt = strstr (html_tag, "%s")) != NULL) { const char *start; char *param; @@ -504,7 +499,15 @@ len += strlen (html_tag); if ((outptr + len) < outend) { - outptr += g_snprintf (outptr, len, html_tag, param); + size_t n = (size_t) (fmt - html_tag); + + memcpy (outptr, html_tag, n); + outptr += n; + fmt += 2; + + outptr = g_stpcpy (outptr, param); + outptr = g_stpcpy (outptr, fmt); + g_free (param); } else { g_free (param); @@ -602,10 +605,10 @@ GMimeFilter * g_mime_filter_enriched_new (guint32 flags) { - GMimeFilterEnriched *new; + GMimeFilterEnriched *enriched; - new = g_object_newv (GMIME_TYPE_FILTER_ENRICHED, 0, NULL); - new->flags = flags; + enriched = g_object_new (GMIME_TYPE_FILTER_ENRICHED, NULL); + enriched->flags = flags; - return (GMimeFilter *) new; + return (GMimeFilter *) enriched; } diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter-enriched.h gmime-3.0.1/gmime/gmime-filter-enriched.h --- gmime-2.6.22+dfsg2/gmime/gmime-filter-enriched.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter-enriched.h 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter-from.c gmime-3.0.1/gmime/gmime-filter-from.c --- gmime-2.6.22+dfsg2/gmime/gmime-filter-from.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter-from.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -250,19 +250,19 @@ GMimeFilter * g_mime_filter_from_new (GMimeFilterFromMode mode) { - GMimeFilterFrom *new; + GMimeFilterFrom *from; - new = g_object_newv (GMIME_TYPE_FILTER_FROM, 0, NULL); - new->midline = FALSE; + from = g_object_new (GMIME_TYPE_FILTER_FROM, NULL); + from->midline = FALSE; switch (mode) { case GMIME_FILTER_FROM_MODE_ARMOR: - new->mode = mode; + from->mode = mode; break; case GMIME_FILTER_FROM_MODE_ESCAPE: default: - new->mode = GMIME_FILTER_FROM_MODE_ESCAPE; + from->mode = GMIME_FILTER_FROM_MODE_ESCAPE; break; } - return (GMimeFilter *) new; + return (GMimeFilter *) from; } diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter-from.h gmime-3.0.1/gmime/gmime-filter-from.h --- gmime-2.6.22+dfsg2/gmime/gmime-filter-from.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter-from.h 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter-gzip.c gmime-3.0.1/gmime/gmime-filter-gzip.c --- gmime-2.6.22+dfsg2/gmime/gmime-filter-gzip.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter-gzip.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -503,22 +503,22 @@ GMimeFilter * g_mime_filter_gzip_new (GMimeFilterGZipMode mode, int level) { - GMimeFilterGZip *new; + GMimeFilterGZip *gzip; int retval; - new = g_object_newv (GMIME_TYPE_FILTER_GZIP, 0, NULL); - new->mode = mode; - new->level = level; + gzip = g_object_new (GMIME_TYPE_FILTER_GZIP, NULL); + gzip->mode = mode; + gzip->level = level; if (mode == GMIME_FILTER_GZIP_MODE_ZIP) - retval = deflateInit2 (new->priv->stream, level, Z_DEFLATED, -MAX_WBITS, MAX_MEM_LEVEL, Z_DEFAULT_STRATEGY); + retval = deflateInit2 (gzip->priv->stream, level, Z_DEFLATED, -MAX_WBITS, MAX_MEM_LEVEL, Z_DEFAULT_STRATEGY); else - retval = inflateInit2 (new->priv->stream, -MAX_WBITS); + retval = inflateInit2 (gzip->priv->stream, -MAX_WBITS); if (retval != Z_OK) { - g_object_unref (new); + g_object_unref (gzip); return NULL; } - return (GMimeFilter *) new; + return (GMimeFilter *) gzip; } diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter-gzip.h gmime-3.0.1/gmime/gmime-filter-gzip.h --- gmime-2.6.22+dfsg2/gmime/gmime-filter-gzip.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter-gzip.h 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter.h gmime-3.0.1/gmime/gmime-filter.h --- gmime-2.6.22+dfsg2/gmime/gmime-filter.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter.h 2017-03-11 14:35:05.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -42,16 +42,6 @@ * GMimeFilter: * @parent_object: parent #GObject * @priv: private state data - * @outreal: (array) (element-type guint8): real malloc'd buffer - * @outbuf: (array length=outsize) (element-type guint8): first - * writable position allowed (outreal + outpre) - * @outptr: current writale position - * @outsize: current bytes in @outbuf - * @outpre: current prespace of @outbuf - * @backbuf: (array length=backsize) (element-type guint8): backup - * buffer - * @backsize: backup buffer size - * @backlen: number of bytes backed-up in @backbuf * * Base class for filters used by #GMimeStreamFilter. **/ @@ -61,15 +51,15 @@ struct _GMimeFilterPrivate *priv; /* */ - char *outreal; /* real malloc'd buffer */ - char *outbuf; /* first 'writable' position allowed (outreal + outpre) */ - char *outptr; - size_t outsize; - size_t outpre; /* prespace of this buffer */ + char *outreal; /* real malloc'd buffer */ + char *outbuf; /* first 'writable' position allowed (@outreal + @outpre) */ + char *outptr; /* current writable position */ + size_t outsize; /* current bytes in @outbuf */ + size_t outpre; /* current prespace of @outbuf */ - char *backbuf; - size_t backsize; - size_t backlen; /* significant data there */ + char *backbuf; /* backup buffer */ + size_t backsize; /* backup buffer size */ + size_t backlen; /* number of bytes backed-up in @backbuf */ }; struct _GMimeFilterClass { diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter-html.c gmime-3.0.1/gmime/gmime-filter-html.c --- gmime-2.6.22+dfsg2/gmime/gmime-filter-html.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter-html.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,7 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast + * Copyright (C) 2016 Gaute Hope * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -140,6 +141,7 @@ filter->colour = 0; filter->column = 0; filter->pre_open = FALSE; + filter->citation_depth = 0; } static void @@ -183,17 +185,18 @@ citation_depth (const char *in, const char *inend) { register const char *inptr = in; - int depth = 1; + int depth = 0; - if (*inptr++ != '>') + if (in >= inend) return 0; /* check that it isn't an escaped From line */ - if (!strncmp (inptr, "From", 4)) + if (!strncmp (inptr, ">From", 5)) return 0; while (inptr < inend && *inptr != '\n') { - if (*inptr == ' ') + /* remove an arbitrary number of spaces between '>' and next '>' */ + while (inptr < inend && *inptr == ' ') inptr++; if (inptr >= inend || *inptr++ != '>') @@ -205,6 +208,38 @@ return depth; } +static char * +citation_cut (char *in, const char *inend) +{ + register char *inptr = in; + register char *start; + + /* check that it isn't an escaped From line */ + if (!strncmp (inptr, ">From", 5)) + return inptr; + + while (inptr < inend && *inptr != '\n') { + /* remove an arbitrary number of spaces between '>' and next '>' */ + start = inptr; + + while (inptr < inend && *inptr == ' ') + inptr++; + + if (inptr >= inend || *inptr != '>') { + if (start < inend && *start == ' ') + start++; + + /* not followed by '>', revert. */ + inptr = start; + break; + } + + inptr++; + } + + return inptr; +} + static inline gunichar html_utf8_getc (const unsigned char **in, const unsigned char *inend) { @@ -351,16 +386,46 @@ break; html->column = 0; - depth = 0; + depth = citation_depth (start, inend); - if (html->flags & GMIME_FILTER_HTML_MARK_CITATION) { - if ((depth = citation_depth (start, inend)) > 0) { + if (html->flags & GMIME_FILTER_HTML_BLOCKQUOTE_CITATION) { + if (html->citation_depth < depth) { + while (html->citation_depth < depth) { + char tag[33]; + int ldepth; + + html->citation_depth++; + + ldepth = MIN (html->citation_depth, 999); + + g_snprintf (tag, 31, "
", ldepth); + + outptr = check_size (filter, outptr, &outend, 31); + outptr = g_stpcpy (outptr, tag); + } + + start = citation_cut (start, inptr); + } else if (html->citation_depth > depth) { + /* close quotes */ + while (html->citation_depth > depth) { + outptr = check_size (filter, outptr, &outend, 14); + outptr = g_stpcpy (outptr, "
"); + html->citation_depth--; + } + + start = citation_cut (start, inptr); + } else if (depth > 0) { + start = citation_cut (start, inptr); + } else if (start < inptr && *start == '>') { + /* >From line */ + start++; + } + } else if (html->flags & GMIME_FILTER_HTML_MARK_CITATION) { + if (depth > 0) { char font[25]; /* FIXME: we could easily support multiple colour depths here */ - g_snprintf (font, 25, "", (html->colour & 0xffffff)); - outptr = check_size (filter, outptr, &outend, 25); outptr = g_stpcpy (outptr, font); } else if (*start == '>') { @@ -420,7 +485,8 @@ outptr = writeln (filter, start, inptr, outptr, &outend); } - if ((html->flags & GMIME_FILTER_HTML_MARK_CITATION) && depth > 0) { + if (!(html->flags & GMIME_FILTER_HTML_BLOCKQUOTE_CITATION) && + (html->flags & GMIME_FILTER_HTML_MARK_CITATION) && depth > 0) { outptr = check_size (filter, outptr, &outend, 8); outptr = g_stpcpy (outptr, ""); } @@ -442,6 +508,15 @@ outptr = check_size (filter, outptr, &outend, 10); outptr = g_stpcpy (outptr, "
"); } + + if ((html->flags & GMIME_FILTER_HTML_BLOCKQUOTE_CITATION) && html->citation_depth > 0) { + /* close open blockquotes */ + while (html->citation_depth > 0) { + outptr = check_size (filter, outptr, &outend, 14); + outptr = g_stpcpy (outptr, ""); + html->citation_depth--; + } + } } else if (start < inend) { /* backup */ g_mime_filter_backup (filter, start, (unsigned) (inend - start)); @@ -459,7 +534,7 @@ html_convert (filter, in, len, prespace, out, outlen, outprespace, FALSE); } -static void +static void filter_complete (GMimeFilter *filter, char *in, size_t len, size_t prespace, char **out, size_t *outlen, size_t *outprespace) { @@ -473,6 +548,7 @@ html->column = 0; html->pre_open = FALSE; + html->citation_depth = 0; } @@ -492,7 +568,7 @@ GMimeFilterHTML *filter; guint i; - filter = g_object_newv (GMIME_TYPE_FILTER_HTML, 0, NULL); + filter = g_object_new (GMIME_TYPE_FILTER_HTML, NULL); filter->flags = flags; filter->colour = colour; diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter-html.h gmime-3.0.1/gmime/gmime-filter-html.h --- gmime-2.6.22+dfsg2/gmime/gmime-filter-html.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter-html.h 2017-03-13 22:50:07.000000000 +0000 @@ -1,6 +1,7 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast + * Copyright (C) 2016 Gaute Hope * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -40,9 +41,9 @@ /** * GMIME_FILTER_HTML_PRE: * - * Wrap stream in <pre> tags. + * Wrap stream in <pre> and </pre> tags. **/ -#define GMIME_FILTER_HTML_PRE (1 << 0) +#define GMIME_FILTER_HTML_PRE (1 << 0) /** @@ -50,7 +51,7 @@ * * Convert new-lines ('\n') into <br> tags. **/ -#define GMIME_FILTER_HTML_CONVERT_NL (1 << 1) +#define GMIME_FILTER_HTML_CONVERT_NL (1 << 1) /** @@ -59,7 +60,7 @@ * Preserve whitespace by converting spaces into their appropriate * html entities. **/ -#define GMIME_FILTER_HTML_CONVERT_SPACES (1 << 2) +#define GMIME_FILTER_HTML_CONVERT_SPACES (1 << 2) /** @@ -67,7 +68,7 @@ * * Wrap detected URLs in <a href=...> tags. **/ -#define GMIME_FILTER_HTML_CONVERT_URLS (1 << 3) +#define GMIME_FILTER_HTML_CONVERT_URLS (1 << 3) /** @@ -75,7 +76,7 @@ * * Change the colour of citation text. **/ -#define GMIME_FILTER_HTML_MARK_CITATION (1 << 4) +#define GMIME_FILTER_HTML_MARK_CITATION (1 << 4) /** @@ -83,7 +84,7 @@ * * Wrap email addresses in "mailto:" href tags. **/ -#define GMIME_FILTER_HTML_CONVERT_ADDRESSES (1 << 5) +#define GMIME_FILTER_HTML_CONVERT_ADDRESSES (1 << 5) /** @@ -91,7 +92,7 @@ * * Converts 8bit characters to '?'. **/ -#define GMIME_FILTER_HTML_ESCAPE_8BIT (1 << 6) +#define GMIME_FILTER_HTML_ESCAPE_8BIT (1 << 6) /** @@ -99,7 +100,14 @@ * * Cites text by prepending "> " to each cited line. **/ -#define GMIME_FILTER_HTML_CITE (1 << 7) +#define GMIME_FILTER_HTML_CITE (1 << 7) + +/** + * GMIME_FILTER_HTML_BLOCKQUOTE_CITATION: + * + * Enclose citation text in blockquotes. + **/ +#define GMIME_FILTER_HTML_BLOCKQUOTE_CITATION (1 << 8) /** @@ -110,6 +118,7 @@ * @colour: cite colour * @column: current column * @pre_open: currently inside of a 'pre' tag. + * @citation_depth: current citation depth level. * * A filter for converting text/plain into text/html. **/ @@ -123,6 +132,8 @@ guint32 column : 31; guint32 pre_open : 1; + + guint32 citation_depth; }; struct _GMimeFilterHTMLClass { diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter-md5.c gmime-3.0.1/gmime/gmime-filter-md5.c --- gmime-2.6.22+dfsg2/gmime/gmime-filter-md5.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter-md5.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,182 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free - * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "md5-utils.h" - -#include "gmime-filter-md5.h" - - -/** - * SECTION: gmime-filter-md5 - * @title: GMimeFilterMd5 - * @short_description: Calculate an md5sum - * @see_also: #GMimeFilter - * - * Calculate an md5sum for a stream. - **/ - - -struct _GMimeFilterMd5Private { - MD5Context md5; -}; - -static void g_mime_filter_md5_class_init (GMimeFilterMd5Class *klass); -static void g_mime_filter_md5_init (GMimeFilterMd5 *filter, GMimeFilterMd5Class *klass); -static void g_mime_filter_md5_finalize (GObject *object); - -static GMimeFilter *filter_copy (GMimeFilter *filter); -static void filter_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace, - char **out, size_t *outlen, size_t *outprespace); -static void filter_complete (GMimeFilter *filter, char *in, size_t len, size_t prespace, - char **out, size_t *outlen, size_t *outprespace); -static void filter_reset (GMimeFilter *filter); - - -static GMimeFilterClass *parent_class = NULL; - - -GType -g_mime_filter_md5_get_type (void) -{ - static GType type = 0; - - if (!type) { - static const GTypeInfo info = { - sizeof (GMimeFilterMd5Class), - NULL, /* base_class_init */ - NULL, /* base_class_finalize */ - (GClassInitFunc) g_mime_filter_md5_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (GMimeFilterMd5), - 0, /* n_preallocs */ - (GInstanceInitFunc) g_mime_filter_md5_init, - }; - - type = g_type_register_static (GMIME_TYPE_FILTER, "GMimeFilterMd5", &info, 0); - } - - return type; -} - - -static void -g_mime_filter_md5_class_init (GMimeFilterMd5Class *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - GMimeFilterClass *filter_class = GMIME_FILTER_CLASS (klass); - - parent_class = g_type_class_ref (GMIME_TYPE_FILTER); - - object_class->finalize = g_mime_filter_md5_finalize; - - filter_class->copy = filter_copy; - filter_class->filter = filter_filter; - filter_class->complete = filter_complete; - filter_class->reset = filter_reset; -} - -static void -g_mime_filter_md5_init (GMimeFilterMd5 *filter, GMimeFilterMd5Class *klass) -{ - filter->priv = g_new (struct _GMimeFilterMd5Private, 1); - md5_init (&filter->priv->md5); -} - -static void -g_mime_filter_md5_finalize (GObject *object) -{ - GMimeFilterMd5 *filter = (GMimeFilterMd5 *) object; - - g_free (filter->priv); - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - - -static GMimeFilter * -filter_copy (GMimeFilter *filter) -{ - return g_mime_filter_md5_new (); -} - - -static void -filter_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace, - char **out, size_t *outlen, size_t *outprespace) -{ - GMimeFilterMd5 *md5 = (GMimeFilterMd5 *) filter; - - md5_update (&md5->priv->md5, (unsigned char *) in, len); - - *out = in; - *outlen = len; - *outprespace = prespace; -} - -static void -filter_complete (GMimeFilter *filter, char *in, size_t len, size_t prespace, - char **out, size_t *outlen, size_t *outprespace) -{ - filter_filter (filter, in, len, prespace, out, outlen, outprespace); -} - -static void -filter_reset (GMimeFilter *filter) -{ - GMimeFilterMd5 *md5 = (GMimeFilterMd5 *) filter; - - md5_init (&md5->priv->md5); -} - - -/** - * g_mime_filter_md5_new: - * - * Creates a new Md5 filter. - * - * Returns: a new Md5 filter. - **/ -GMimeFilter * -g_mime_filter_md5_new (void) -{ - return g_object_newv (GMIME_TYPE_FILTER_MD5, 0, NULL); -} - - -/** - * g_mime_filter_md5_get_digest: - * @md5: md5 filter object - * @digest: output buffer of at least 16 bytes - * - * Outputs the md5 digest into @digest. - **/ -void -g_mime_filter_md5_get_digest (GMimeFilterMd5 *md5, unsigned char digest[16]) -{ - g_return_if_fail (GMIME_IS_FILTER_MD5 (md5)); - - md5_final (&md5->priv->md5, digest); -} diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter-md5.h gmime-3.0.1/gmime/gmime-filter-md5.h --- gmime-2.6.22+dfsg2/gmime/gmime-filter-md5.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter-md5.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,66 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free - * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - - -#ifndef __GMIME_FILTER_MD5_H__ -#define __GMIME_FILTER_MD5_H__ - -#include - -G_BEGIN_DECLS - -#define GMIME_TYPE_FILTER_MD5 (g_mime_filter_md5_get_type ()) -#define GMIME_FILTER_MD5(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_FILTER_MD5, GMimeFilterMd5)) -#define GMIME_FILTER_MD5_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_FILTER_MD5, GMimeFilterMd5Class)) -#define GMIME_IS_FILTER_MD5(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_FILTER_MD5)) -#define GMIME_IS_FILTER_MD5_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_FILTER_MD5)) -#define GMIME_FILTER_MD5_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_FILTER_MD5, GMimeFilterMd5Class)) - -typedef struct _GMimeFilterMd5 GMimeFilterMd5; -typedef struct _GMimeFilterMd5Class GMimeFilterMd5Class; - -/** - * GMimeFilterMd5: - * @parent_object: parent #GMimeFilter - * @priv: private state data - * - * A filter for calculating the MD5 checksum of a stream. - **/ -struct _GMimeFilterMd5 { - GMimeFilter parent_object; - - struct _GMimeFilterMd5Private *priv; -}; - -struct _GMimeFilterMd5Class { - GMimeFilterClass parent_class; - -}; - - -GType g_mime_filter_md5_get_type (void); - -GMimeFilter *g_mime_filter_md5_new (void); - -void g_mime_filter_md5_get_digest (GMimeFilterMd5 *md5, unsigned char digest[16]); - -G_END_DECLS - -#endif /* __GMIME_FILTER_MD5_H__ */ diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter-smtp-data.c gmime-3.0.1/gmime/gmime-filter-smtp-data.c --- gmime-2.6.22+dfsg2/gmime/gmime-filter-smtp-data.c 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter-smtp-data.c 2017-04-08 17:01:10.000000000 +0000 @@ -0,0 +1,167 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2017 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gmime-filter-smtp-data.h" + + +/** + * SECTION: gmime-filter-smtp-data + * @title: GMimeFilterSmtpData + * @short_description: Byte-stuffs outgoing SMTP DATA. + * + * A #GMimeFilter for byte-stuffing outgoing SMTP DATA. + **/ + + +static void g_mime_filter_smtp_data_class_init (GMimeFilterSmtpDataClass *klass); +static void g_mime_filter_smtp_data_init (GMimeFilterSmtpData *filter, GMimeFilterSmtpDataClass *klass); +static void g_mime_filter_smtp_data_finalize (GObject *object); + +static GMimeFilter *filter_copy (GMimeFilter *filter); +static void filter_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace); +static void filter_reset (GMimeFilter *filter); + + +static GMimeFilterClass *parent_class = NULL; + + +GType +g_mime_filter_smtp_data_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeFilterSmtpDataClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_filter_smtp_data_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeFilterSmtpData), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_filter_smtp_data_init, + }; + + type = g_type_register_static (GMIME_TYPE_FILTER, "GMimeFilterSmtpData", &info, 0); + } + + return type; +} + + +static void +g_mime_filter_smtp_data_class_init (GMimeFilterSmtpDataClass *klass) +{ + GMimeFilterClass *filter_class = GMIME_FILTER_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_FILTER); + + filter_class->copy = filter_copy; + filter_class->filter = filter_filter; + filter_class->complete = filter_filter; + filter_class->reset = filter_reset; +} + +static void +g_mime_filter_smtp_data_init (GMimeFilterSmtpData *filter, GMimeFilterSmtpDataClass *klass) +{ + filter->bol = TRUE; +} + + +static GMimeFilter * +filter_copy (GMimeFilter *filter) +{ + GMimeFilterSmtpData *smtp_data = (GMimeFilterSmtpData *) filter; + + return g_mime_filter_smtp_data_new (); +} + +static void +filter_filter (GMimeFilter *filter, char *inbuf, size_t inlen, size_t prespace, + char **outbuf, size_t *outlen, size_t *outprespace) +{ + GMimeFilterSmtpData *smtp = (GMimeFilterSmtpData *) filter; + register const char *inptr = inbuf; + const char *inend = inbuf + inlen; + gboolean escape = smtp->bol; + int ndots = 0; + char *outptr; + + while (inptr < inend) { + if (*inptr == '.' && escape) { + escape = FALSE; + ndots++; + } else { + escape = *inptr == '\n'; + } + + inptr++; + } + + g_mime_filter_set_size (filter, inlen + ndots, FALSE); + + outptr = filter->outbuf; + inptr = inbuf; + + while (inptr < inend) { + if (*inptr == '.' && smtp->bol) { + smtp->bol = FALSE; + *outptr++ = '.'; + } else { + smtp->bol = *inptr == '\n'; + } + + *outptr++ = *inptr++; + } + + *outlen = outptr - filter->outbuf; + *outprespace = filter->outpre; + *outbuf = filter->outbuf; +} + +static void +filter_reset (GMimeFilter *filter) +{ + GMimeFilterSmtpData *smtp = (GMimeFilterSmtpData *) filter; + + smtp->bol = TRUE; +} + + +/** + * g_mime_filter_smtp_data_new: + * + * Creates a new #GMimeFilterSmtpData filter. + * + * Returns: a new #GMimeFilterSmtpData filter. + **/ +GMimeFilter * +g_mime_filter_smtp_data_new (void) +{ + return g_object_new (GMIME_TYPE_FILTER_SMTP_DATA, NULL); +} diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter-smtp-data.h gmime-3.0.1/gmime/gmime-filter-smtp-data.h --- gmime-2.6.22+dfsg2/gmime/gmime-filter-smtp-data.h 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter-smtp-data.h 2017-03-28 23:46:26.000000000 +0000 @@ -0,0 +1,64 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2017 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_FILTER_SMTP_DATA_H__ +#define __GMIME_FILTER_SMTP_DATA_H__ + +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_FILTER_SMTP_DATA (g_mime_filter_smtp_data_get_type ()) +#define GMIME_FILTER_SMTP_DATA(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_FILTER_SMTP_DATA, GMimeFilterSmtpData)) +#define GMIME_FILTER_SMTP_DATA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_FILTER_SMTP_DATA, GMimeFilterSmtpDataClass)) +#define GMIME_IS_FILTER_SMTP_DATA(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_FILTER_SMTP_DATA)) +#define GMIME_IS_FILTER_SMTP_DATA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_FILTER_SMTP_DATA)) +#define GMIME_FILTER_SMTP_DATA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_FILTER_SMTP_DATA, GMimeFilterSmtpDataClass)) + +typedef struct _GMimeFilterSmtpData GMimeFilterSmtpData; +typedef struct _GMimeFilterSmtpDataClass GMimeFilterSmtpDataClass; + +/** + * GMimeFilterSmtpData: + * @parent_object: parent #GMimeFilter + * @bol: beginning-of-line state. + * + * A filter to byte-stuff SMTP DATA. + **/ +struct _GMimeFilterSmtpData { + GMimeFilter parent_object; + + gboolean bol; +}; + +struct _GMimeFilterSmtpDataClass { + GMimeFilterClass parent_class; + +}; + + +GType g_mime_filter_smtp_data_get_type (void); + +GMimeFilter *g_mime_filter_smtp_data_new (void); + +G_END_DECLS + +#endif /* __GMIME_FILTER_SMTP_DATA_H__ */ diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter-strip.c gmime-3.0.1/gmime/gmime-filter-strip.c --- gmime-2.6.22+dfsg2/gmime/gmime-filter-strip.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter-strip.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -27,6 +27,8 @@ #include #include "gmime-filter-strip.h" +#include "gmime-table-private.h" +#include "packed.h" /** @@ -99,12 +101,16 @@ static void g_mime_filter_strip_init (GMimeFilterStrip *filter, GMimeFilterStripClass *klass) { - /* no-op */ + filter->lwsp = packed_byte_array_new (); } static void g_mime_filter_strip_finalize (GObject *object) { + GMimeFilterStrip *filter = (GMimeFilterStrip *) object; + + packed_byte_array_free (filter->lwsp); + G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -116,56 +122,83 @@ } static void -filter_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace, - char **out, size_t *outlen, size_t *outprespace) +convert (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace, gboolean flush) { - register unsigned char *inptr, *last; - unsigned char *inend, *start; - char *outptr; - - g_mime_filter_set_size (filter, len, FALSE); + GMimeFilterStrip *strip = (GMimeFilterStrip *) filter; + PackedByteArray *lwsp = (PackedByteArray *) strip->lwsp; + register char *inptr, *outptr; + char *inend, *outbuf; + + if (len == 0) { + if (flush) + packed_byte_array_clear (lwsp); + + *outprespace = prespace; + *outlen = len; + *out = in; + + return; + } - last = inptr = (unsigned char *) in; - inend = (unsigned char *) in + len; + g_mime_filter_set_size (filter, len + lwsp->len, FALSE); + outptr = outbuf = filter->outbuf; + inend = in + len; + inptr = in; - outptr = filter->outbuf; + if (flush) + packed_byte_array_clear (strip->lwsp); while (inptr < inend) { - start = inptr; - while (inptr < inend && *inptr != '\n') { - if (*inptr != ' ' && *inptr != '\t') - last = inptr + 1; - inptr++; + if (is_blank (*inptr)) { + packed_byte_array_add (lwsp, *inptr); + } else if (*inptr == '\r') { + packed_byte_array_clear (lwsp); + *outptr++ = *inptr; + } else if (*inptr == '\n') { + packed_byte_array_clear (lwsp); + *outptr++ = *inptr; + } else { + if (lwsp->len > 0) { + packed_byte_array_copy_to (lwsp, outptr); + outptr += lwsp->len; + packed_byte_array_clear (lwsp); + } + + *outptr++ = *inptr; } - memcpy (outptr, start, last - start); - outptr += (last - start); - if (inptr < inend) { - /* write the newline */ - *outptr++ = (char) *inptr++; - last = inptr; - } + inptr++; } - g_mime_filter_backup (filter, (char *) last, inptr - last); + if (flush) + packed_byte_array_clear (lwsp); - *out = filter->outbuf; - *outlen = outptr - filter->outbuf; *outprespace = filter->outpre; + *outlen = (outptr - filter->outbuf); + *out = filter->outbuf; +} + +static void +filter_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace) +{ + convert (filter, in, len, prespace, out, outlen, outprespace, FALSE); } static void filter_complete (GMimeFilter *filter, char *in, size_t len, size_t prespace, char **out, size_t *outlen, size_t *outprespace) { - if (len) - filter_filter (filter, in, len, prespace, out, outlen, outprespace); + convert (filter, in, len, prespace, out, outlen, outprespace, TRUE); } static void filter_reset (GMimeFilter *filter) { - /* no-op */ + GMimeFilterStrip *strip = (GMimeFilterStrip *) filter; + + packed_byte_array_clear (strip->lwsp); } @@ -180,5 +213,5 @@ GMimeFilter * g_mime_filter_strip_new (void) { - return g_object_newv (GMIME_TYPE_FILTER_STRIP, 0, NULL); + return g_object_new (GMIME_TYPE_FILTER_STRIP, NULL); } diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter-strip.h gmime-3.0.1/gmime/gmime-filter-strip.h --- gmime-2.6.22+dfsg2/gmime/gmime-filter-strip.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter-strip.h 2017-03-28 23:46:26.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -45,6 +45,8 @@ struct _GMimeFilterStrip { GMimeFilter parent_object; + /* < private > */ + void *lwsp; }; struct _GMimeFilterStripClass { diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter-unix2dos.c gmime-3.0.1/gmime/gmime-filter-unix2dos.c --- gmime-2.6.22+dfsg2/gmime/gmime-filter-unix2dos.c 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter-unix2dos.c 2017-04-08 17:01:10.000000000 +0000 @@ -0,0 +1,188 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2017 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gmime-filter-unix2dos.h" + + +/** + * SECTION: gmime-filter-unix2dos + * @title: GMimeFilterUnix2Dos + * @short_description: Convert line-endings from UNIX (LF) to Windows/DOS (CRLF). + * + * A #GMimeFilter for converting from UNIX to DOS line-endings. + **/ + + +static void g_mime_filter_unix2dos_class_init (GMimeFilterUnix2DosClass *klass); +static void g_mime_filter_unix2dos_init (GMimeFilterUnix2Dos *filter, GMimeFilterUnix2DosClass *klass); +static void g_mime_filter_unix2dos_finalize (GObject *object); + +static GMimeFilter *filter_copy (GMimeFilter *filter); +static void filter_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace); +static void filter_complete (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace); +static void filter_reset (GMimeFilter *filter); + + +static GMimeFilterClass *parent_class = NULL; + + +GType +g_mime_filter_unix2dos_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeFilterUnix2DosClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_filter_unix2dos_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeFilterUnix2Dos), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_filter_unix2dos_init, + }; + + type = g_type_register_static (GMIME_TYPE_FILTER, "GMimeFilterUnix2Dos", &info, 0); + } + + return type; +} + + +static void +g_mime_filter_unix2dos_class_init (GMimeFilterUnix2DosClass *klass) +{ + GMimeFilterClass *filter_class = GMIME_FILTER_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_FILTER); + + filter_class->copy = filter_copy; + filter_class->filter = filter_filter; + filter_class->complete = filter_complete; + filter_class->reset = filter_reset; +} + +static void +g_mime_filter_unix2dos_init (GMimeFilterUnix2Dos *filter, GMimeFilterUnix2DosClass *klass) +{ + filter->ensure_newline = FALSE; + filter->pc = '\0'; +} + + +static GMimeFilter * +filter_copy (GMimeFilter *filter) +{ + GMimeFilterUnix2Dos *unix2dos = (GMimeFilterUnix2Dos *) filter; + + return g_mime_filter_unix2dos_new (unix2dos->ensure_newline); +} + +static void +convert (GMimeFilter *filter, char *inbuf, size_t inlen, size_t prespace, + char **outbuf, size_t *outlen, size_t *outprespace, gboolean flush) +{ + GMimeFilterUnix2Dos *unix2dos = (GMimeFilterUnix2Dos *) filter; + register const char *inptr = inbuf; + const char *inend = inbuf + inlen; + size_t expected = inlen * 2; + char *outptr; + + if (flush && unix2dos->ensure_newline) + expected += 2; + + g_mime_filter_set_size (filter, expected, FALSE); + + outptr = filter->outbuf; + while (inptr < inend) { + if (*inptr == '\r') { + *outptr++ = *inptr; + } else if (*inptr == '\n') { + if (unix2dos->pc != '\r') + *outptr++ = '\r'; + *outptr++ = *inptr; + } else { + *outptr++ = *inptr; + } + + unix2dos->pc = *inptr++; + } + + if (flush && unix2dos->ensure_newline && unix2dos->pc != '\n') { + if (unix2dos->pc != '\r') + *outptr++ = '\r'; + *outptr++ = '\n'; + } + + *outlen = outptr - filter->outbuf; + *outprespace = filter->outpre; + *outbuf = filter->outbuf; +} + +static void +filter_filter (GMimeFilter *filter, char *inbuf, size_t inlen, size_t prespace, + char **outbuf, size_t *outlen, size_t *outprespace) +{ + convert (filter, inbuf, inlen, prespace, outbuf, outlen, outprespace, FALSE); +} + +static void +filter_complete (GMimeFilter *filter, char *inbuf, size_t inlen, size_t prespace, + char **outbuf, size_t *outlen, size_t *outprespace) +{ + convert (filter, inbuf, inlen, prespace, outbuf, outlen, outprespace, TRUE); +} + +static void +filter_reset (GMimeFilter *filter) +{ + GMimeFilterUnix2Dos *unix2dos = (GMimeFilterUnix2Dos *) filter; + + unix2dos->pc = '\0'; +} + + +/** + * g_mime_filter_unix2dos_new: + * @ensure_newline: %TRUE if the filter should ensure that the stream ends in a new line + * + * Creates a new #GMimeFilterUnix2Dos filter. + * + * Returns: a new #GMimeFilterUnix2Dos filter. + **/ +GMimeFilter * +g_mime_filter_unix2dos_new (gboolean ensure_newline) +{ + GMimeFilterUnix2Dos *unix2dos; + + unix2dos = g_object_new (GMIME_TYPE_FILTER_UNIX2DOS, NULL); + unix2dos->ensure_newline = ensure_newline; + + return (GMimeFilter *) unix2dos; +} diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter-unix2dos.h gmime-3.0.1/gmime/gmime-filter-unix2dos.h --- gmime-2.6.22+dfsg2/gmime/gmime-filter-unix2dos.h 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter-unix2dos.h 2017-03-20 13:44:23.000000000 +0000 @@ -0,0 +1,66 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2017 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_FILTER_UNIX2DOS_H__ +#define __GMIME_FILTER_UNIX2DOS_H__ + +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_FILTER_UNIX2DOS (g_mime_filter_unix2dos_get_type ()) +#define GMIME_FILTER_UNIX2DOS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_FILTER_UNIX2DOS, GMimeFilterUnix2Dos)) +#define GMIME_FILTER_UNIX2DOS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_FILTER_UNIX2DOS, GMimeFilterUnix2DosClass)) +#define GMIME_IS_FILTER_UNIX2DOS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_FILTER_UNIX2DOS)) +#define GMIME_IS_FILTER_UNIX2DOS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_FILTER_UNIX2DOS)) +#define GMIME_FILTER_UNIX2DOS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_FILTER_UNIX2DOS, GMimeFilterUnix2DosClass)) + +typedef struct _GMimeFilterUnix2Dos GMimeFilterUnix2Dos; +typedef struct _GMimeFilterUnix2DosClass GMimeFilterUnix2DosClass; + +/** + * GMimeFilterUnix2Dos: + * @parent_object: parent #GMimeFilter + * @ensure_newline: %TRUE if the filter should ensure that the stream ends with a new line + * @pc: the previous character encountered + * + * A filter to convert a stream from Windows/DOS line endings to Unix line endings. + **/ +struct _GMimeFilterUnix2Dos { + GMimeFilter parent_object; + + gboolean ensure_newline; + char pc; +}; + +struct _GMimeFilterUnix2DosClass { + GMimeFilterClass parent_class; + +}; + + +GType g_mime_filter_unix2dos_get_type (void); + +GMimeFilter *g_mime_filter_unix2dos_new (gboolean ensure_newline); + +G_END_DECLS + +#endif /* __GMIME_FILTER_UNIX2DOS_H__ */ diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter-windows.c gmime-3.0.1/gmime/gmime-filter-windows.c --- gmime-2.6.22+dfsg2/gmime/gmime-filter-windows.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter-windows.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -185,7 +185,7 @@ g_return_val_if_fail (claimed_charset != NULL, NULL); - new = g_object_newv (GMIME_TYPE_FILTER_WINDOWS, 0, NULL); + new = g_object_new (GMIME_TYPE_FILTER_WINDOWS, NULL); new->claimed_charset = g_strdup (claimed_charset); return (GMimeFilter *) new; diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter-windows.h gmime-3.0.1/gmime/gmime-filter-windows.h --- gmime-2.6.22+dfsg2/gmime/gmime-filter-windows.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter-windows.h 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter-yenc.c gmime-3.0.1/gmime/gmime-filter-yenc.c --- gmime-2.6.22+dfsg2/gmime/gmime-filter-yenc.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter-yenc.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -282,7 +282,7 @@ { GMimeFilterYenc *new; - new = g_object_newv (GMIME_TYPE_FILTER_YENC, 0, NULL); + new = g_object_new (GMIME_TYPE_FILTER_YENC, NULL); new->encode = encode; if (encode) diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-filter-yenc.h gmime-3.0.1/gmime/gmime-filter-yenc.h --- gmime-2.6.22+dfsg2/gmime/gmime-filter-yenc.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-filter-yenc.h 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-format-options.c gmime-3.0.1/gmime/gmime-format-options.c --- gmime-2.6.22+dfsg2/gmime/gmime-format-options.c 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-format-options.c 2017-04-08 17:01:10.000000000 +0000 @@ -0,0 +1,487 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2017 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "gmime-format-options.h" +#include "gmime-filter-dos2unix.h" +#include "gmime-filter-unix2dos.h" + + +/** + * SECTION: gmime-format-options + * @title: GMimeFormatOptions + * @short_description: Format options + * @see_also: + * + * A #GMimeFormatOptions is used by GMime to determine how to serialize various objects and headers. + **/ + + +struct _GMimeFormatOptions { + GMimeParamEncodingMethod method; + GMimeNewLineFormat newline; + gboolean mixed_charsets; + gboolean international; + GPtrArray *hidden; + guint maxline; +}; + +static GMimeFormatOptions *default_options = NULL; + +G_DEFINE_BOXED_TYPE (GMimeFormatOptions, g_mime_format_options, g_mime_format_options_clone, g_mime_format_options_free); + +void +g_mime_format_options_init (void) +{ + if (default_options == NULL) + default_options = g_mime_format_options_new (); +} + +void +g_mime_format_options_shutdown (void) +{ + guint i; + + if (default_options == NULL) + return; + + for (i = 0; i < default_options->hidden->len; i++) + g_free (default_options->hidden->pdata[i]); + + g_ptr_array_free (default_options->hidden, TRUE); + g_slice_free (GMimeFormatOptions, default_options); + default_options = NULL; +} + + +/** + * g_mime_format_options_get_default: + * + * Gets the default format options. + * + * Returns: the default format options. + **/ +GMimeFormatOptions * +g_mime_format_options_get_default (void) +{ + return default_options; +} + + +/** + * g_mime_format_options_new: + * + * Creates a new set of #GMimeFormatOptions. + * + * Returns: a newly allocated set of #GMimeFormatOptions with the default values. + **/ +GMimeFormatOptions * +g_mime_format_options_new (void) +{ + GMimeFormatOptions *options; + + options = g_slice_new (GMimeFormatOptions); + options->method = GMIME_PARAM_ENCODING_METHOD_RFC2231; + options->newline = GMIME_NEWLINE_FORMAT_UNIX; + options->hidden = g_ptr_array_new (); + options->mixed_charsets = TRUE; + options->international = FALSE; + options->maxline = 78; + + return options; +} + + +/** + * _g_mime_format_options_clone: + * @options: (nullable): a #GMimeFormatOptions or %NULL + * @hidden: %TRUE if the hidden headers should also be cloned + * + * Clones a #GMimeFormatOptions. + * + * Returns: (transfer full): a newly allocated #GMimeFormatOptions. + **/ +GMimeFormatOptions * +_g_mime_format_options_clone (GMimeFormatOptions *options, gboolean hidden) +{ + GMimeFormatOptions *clone; + guint i; + + if (options == NULL) + options = default_options; + + clone = g_slice_new (GMimeFormatOptions); + clone->method = options->method; + clone->newline = options->newline; + clone->mixed_charsets = options->mixed_charsets; + clone->international = options->international; + clone->maxline = options->newline; + + clone->hidden = g_ptr_array_new (); + + if (hidden) { + for (i = 0; i < options->hidden->len; i++) + g_ptr_array_add (clone->hidden, g_strdup (options->hidden->pdata[i])); + } + + return clone; +} + + +/** + * g_mime_format_options_clone: + * @options: (nullable): a #GMimeFormatOptions or %NULL + * + * Clones a #GMimeFormatOptions. + * + * Returns: (transfer full): a newly allocated #GMimeFormatOptions. + **/ +GMimeFormatOptions * +g_mime_format_options_clone (GMimeFormatOptions *options) +{ + return _g_mime_format_options_clone (options, TRUE); +} + + +/** + * g_mime_format_options_free: + * @options: a #GMimeFormatOptions + * + * Frees a set of #GMimeFormatOptions. + **/ +void +g_mime_format_options_free (GMimeFormatOptions *options) +{ + guint i; + + g_return_if_fail (options != NULL); + + if (options != default_options) { + for (i = 0; i < options->hidden->len; i++) + g_free (options->hidden->pdata[i]); + g_ptr_array_free (options->hidden, TRUE); + + g_slice_free (GMimeFormatOptions, options); + } +} + + +/** + * g_mime_format_options_get_param_encoding_method: + * @options: (nullable): a #GMimeFormatOptions or %NULL + * + * Gets the parameter encoding method to use for #GMimeParam parameters that do not + * already have an encoding method specified. + * + * Returns: the encoding method that is currently set. + **/ +GMimeParamEncodingMethod +g_mime_format_options_get_param_encoding_method (GMimeFormatOptions *options) +{ + return options ? options->method : default_options->method; +} + + +/** + * g_mime_format_options_set_param_encoding_method: + * @options: a #GMimeFormatOptions + * @method: a #GMimeParamEncodingMethod + * + * Sets the parameter encoding method to use when encoding parameters which + * do not have an encoding method specified. + * + * Note: #GMIME_PARAM_ENCODING_METHOD_DEFAULT is not allowed. + **/ +void +g_mime_format_options_set_param_encoding_method (GMimeFormatOptions *options, GMimeParamEncodingMethod method) +{ + g_return_if_fail (options != NULL); + g_return_if_fail (method == GMIME_PARAM_ENCODING_METHOD_RFC2231 || method == GMIME_PARAM_ENCODING_METHOD_RFC2047); + + options->method = method; +} + + +/** + * g_mime_format_options_get_newline_format: + * @options: (nullable): a #GMimeFormatOptions or %NULL + * + * Gets the new-line format to use when writing out messages and headers. + * + * Returns: the new-line format that is currently set. + **/ +GMimeNewLineFormat +g_mime_format_options_get_newline_format (GMimeFormatOptions *options) +{ + return options ? options->newline : default_options->newline; +} + + +/** + * g_mime_format_options_set_newline_format: + * @options: a #GMimeFormatOptions + * @newline: a #GMimeNewLineFormat + * + * Sets the new-line format that should be used when writing headers and messages. + **/ +void +g_mime_format_options_set_newline_format (GMimeFormatOptions *options, GMimeNewLineFormat newline) +{ + g_return_if_fail (options != NULL); + g_return_if_fail (newline == GMIME_NEWLINE_FORMAT_UNIX || newline == GMIME_NEWLINE_FORMAT_DOS); + + options->newline = newline; +} + + +/** + * g_mime_format_options_get_newline: + * @options: (nullable): a #GMimeFormatOptions or %NULL + * + * Gets a string representing the currently set new-line format. + * + * Returns: a new-line character sequence. + **/ +const char * +g_mime_format_options_get_newline (GMimeFormatOptions *options) +{ + if (options == NULL) + options = default_options; + + if (options->newline == GMIME_NEWLINE_FORMAT_DOS) + return "\r\n"; + + return "\n"; +} + + +/** + * g_mime_format_options_create_newline_filter: + * @options: (nullable): a #GMimeFormatOptions or %NULL + * @ensure_newline: %TRUE if the output must *always* end with a new line + * + * Creates a #GMimeFilter suitable for converting line-endings to the + * currently set new-line format. + * + * Returns: (transfer full): a #GMimeFilter to convert to the specified new-line format. + **/ +GMimeFilter * +g_mime_format_options_create_newline_filter (GMimeFormatOptions *options, gboolean ensure_newline) +{ + if (options == NULL) + options = default_options; + + if (options->newline == GMIME_NEWLINE_FORMAT_DOS) + return g_mime_filter_unix2dos_new (ensure_newline); + + return g_mime_filter_dos2unix_new (ensure_newline); +} + + +#ifdef NOT_YET_IMPLEMENTED +/** + * g_mime_format_options_get_allow_mixed_charsets: + * @options: (nullable): a #GMimeFormatOptions or %NULL + * + * Gets whether or not headers are allowed to be encoded using mixed charsets. + * + * Returns: %TRUE if each header value is allowed to be encoded with mixed charsets or %FALSE otherwise. + **/ +gboolean +g_mime_format_options_get_allow_mixed_charsets (GMimeFormatOptions *options) +{ + if (options == NULL) + options = default_options; + + return options->mixed_charsets; +} + + +/** + * g_mime_format_options_set_allow_mixed_charsets: + * @options: a #GMimeFormatOptions + * @allow: %TRUE if each header value should be allowed to be encoded with mixed charsets + * + * Sets whether or not header values should be allowed to be encoded with mixed charsets. + **/ +void +g_mime_format_options_set_allow_mixed_charsets (GMimeFormatOptions *options, gboolean allow) +{ + g_return_if_fail (options != NULL); + + options->mixed_charsets = allow; +} + + +/** + * g_mime_format_options_get_allow_international: + * @options: (nullable): a #GMimeFormatOptions or %NULL + * + * Gets whether or not international encoding is allowed. + * + * Returns: %TRUE if international encoding is allowed or %FALSE otherwise. + **/ +gboolean +g_mime_format_options_get_allow_international (GMimeFormatOptions *options) +{ + return options ? options->international : default_options->international; +} + + +/** + * g_mime_format_options_set_allow_international: + * @options: a #GMimeFormatOptions + * @allow: %TRUE if international encoding is allowed + * + * Sets whether or not international encoding is allowed. + **/ +void +g_mime_format_options_set_allow_international (GMimeFormatOptions *options, gboolean allow) +{ + g_return_if_fail (options != NULL); + + options->international = allow; +} + + +/** + * g_mime_format_options_get_max_line: + * @options: (nullable): a #GMimeFormatOptions or %NULL + * + * Gets the max line length to use with encoders. + * + * Returns: the max line length to use with encoders. + **/ +guint +g_mime_format_options_get_max_line (GMimeFormatOptions *options) +{ + return options ? options->maxline : default_options->maxline; +} + + +/** + * g_mime_format_options_set_max_line: + * @options: a #GMimeFormatOptions + * @maxline: the max line length + * + * Sets the max line length to use for encoders. + **/ +void +g_mime_format_options_set_max_line (GMimeFormatOptions *options, guint maxline) +{ + g_return_if_fail (options != NULL); + + options->maxline = maxline; +} +#endif + +/** + * g_mime_format_options_is_hidden_header: + * @options: (nullable): a #GMimeFormatOptions or %NULL + * @header: the name of a header + * + * Gets whether or not the specified header should be hidden. + * + * Returns: %TRUE if the header should be hidden or %FALSE otherwise. + **/ +gboolean +g_mime_format_options_is_hidden_header (GMimeFormatOptions *options, const char *header) +{ + guint i; + + g_return_val_if_fail (header != NULL, FALSE); + + if (options == NULL) + options = default_options; + + for (i = 0; i < options->hidden->len; i++) { + if (!g_ascii_strcasecmp (options->hidden->pdata[i], header)) + return TRUE; + } + + return FALSE; +} + + +/** + * g_mime_format_options_add_hidden_header: + * @options: a #GMimeFormatOptions + * @header: a header name + * + * Adds the given header to the list of headers that should be hidden. + **/ +void +g_mime_format_options_add_hidden_header (GMimeFormatOptions *options, const char *header) +{ + g_return_if_fail (options != NULL); + g_return_if_fail (header != NULL); + + g_ptr_array_add (options->hidden, g_strdup (header)); +} + + +/** + * g_mime_format_options_remove_hidden_header: + * @options: a #GMimeFormatOptions + * @header: a header name + * + * Removes the given header from the list of headers that should be hidden. + **/ +void +g_mime_format_options_remove_hidden_header (GMimeFormatOptions *options, const char *header) +{ + guint i; + + g_return_if_fail (options != NULL); + g_return_if_fail (header != NULL); + + for (i = options->hidden->len; i > 0; i--) { + if (!g_ascii_strcasecmp (options->hidden->pdata[i - 1], header)) { + g_free (options->hidden->pdata[i - 1]); + g_ptr_array_remove_index (options->hidden, i - 1); + } + } +} + + +/** + * g_mime_format_options_clear_hidden_headers: + * @options: a #GMimeFormatOptions + * + * Clears the list of headers that should be hidden. + **/ +void +g_mime_format_options_clear_hidden_headers (GMimeFormatOptions *options) +{ + guint i; + + g_return_if_fail (options != NULL); + + for (i = 0; i < options->hidden->len; i++) + g_free (options->hidden->pdata[i]); + + g_ptr_array_set_size (options->hidden, 0); +} diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-format-options.h gmime-3.0.1/gmime/gmime-format-options.h --- gmime-2.6.22+dfsg2/gmime/gmime-format-options.h 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-format-options.h 2017-04-08 17:01:10.000000000 +0000 @@ -0,0 +1,108 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2017 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_FORMAT_OPTIONS_H__ +#define __GMIME_FORMAT_OPTIONS_H__ + +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_FORMAT_OPTIONS (gmime_format_options_get_type ()) + +/** + * GMimeNewLineFormat: + * @GMIME_NEWLINE_FORMAT_UNIX: The Unix New-Line format ("\n"). + * @GMIME_NEWLINE_FORMAT_DOS: The DOS New-Line format ("\r\n"). + * + * There are two commonly used line-endings used by modern Operating Systems. + * Unix-based systems such as Linux and Mac OS use a single character ('\n' aka LF) + * to represent the end of line where-as Windows (or DOS) uses a sequence of two + * characters ("\r\n" aka CRLF). Most text-based network protocols such as SMTP, + * POP3, and IMAP use the CRLF sequence as well. + **/ +typedef enum { + GMIME_NEWLINE_FORMAT_UNIX, + GMIME_NEWLINE_FORMAT_DOS +} GMimeNewLineFormat; + + +/** + * GMimeParamEncodingMethod: + * @GMIME_PARAM_ENCODING_METHOD_DEFAULT: Use the default encoding method set on the #GMimeFormatOptions. + * @GMIME_PARAM_ENCODING_METHOD_RFC2231: Use the encoding method described in rfc2231. + * @GMIME_PARAM_ENCODING_METHOD_RFC2047: Use the encoding method described in rfc2047. + * + * The MIME specifications specify that the proper method for encoding Content-Type and + * Content-Disposition parameter values is the method described in + * rfc2231. However, it is common for + * some older email clients to improperly encode using the method described in + * rfc2047 instead. + **/ +typedef enum { + GMIME_PARAM_ENCODING_METHOD_DEFAULT = 0, + GMIME_PARAM_ENCODING_METHOD_RFC2231 = 1, + GMIME_PARAM_ENCODING_METHOD_RFC2047 = 2 +} GMimeParamEncodingMethod; + + +/** + * GMimeFormatOptions: + * + * Format options for serializing various GMime objects. + **/ +typedef struct _GMimeFormatOptions GMimeFormatOptions; + +GType g_mime_format_options_get_type (void); + +GMimeFormatOptions *g_mime_format_options_get_default (void); + +GMimeFormatOptions *g_mime_format_options_new (void); +void g_mime_format_options_free (GMimeFormatOptions *options); + +GMimeFormatOptions *g_mime_format_options_clone (GMimeFormatOptions *options); + +GMimeParamEncodingMethod g_mime_format_options_get_param_encoding_method (GMimeFormatOptions *options); +void g_mime_format_options_set_param_encoding_method (GMimeFormatOptions *options, GMimeParamEncodingMethod method); + +GMimeNewLineFormat g_mime_format_options_get_newline_format (GMimeFormatOptions *options); +void g_mime_format_options_set_newline_format (GMimeFormatOptions *options, GMimeNewLineFormat newline); + +const char *g_mime_format_options_get_newline (GMimeFormatOptions *options); +GMimeFilter *g_mime_format_options_create_newline_filter (GMimeFormatOptions *options, gboolean ensure_newline); + +/*gboolean g_mime_format_options_get_allow_mixed_charsets (GMimeFormatOptions *options);*/ +/*void g_mime_format_options_set_allow_mixed_charsets (GMimeFormatOptions *options, gboolean allow);*/ + +/*gboolean g_mime_format_options_get_allow_international (GMimeFormatOptions *options);*/ +/*void g_mime_format_options_set_allow_international (GMimeFormatOptions *options, gboolean allow);*/ + +/*gboolean g_mime_format_options_get_max_line (GMimeFormatOptions *options);*/ +/*void g_mime_format_options_set_max_line (GMimeFormatOptions *options, gboolean maxline);*/ + +gboolean g_mime_format_options_is_hidden_header (GMimeFormatOptions *options, const char *header); +void g_mime_format_options_add_hidden_header (GMimeFormatOptions *options, const char *header); +void g_mime_format_options_remove_hidden_header (GMimeFormatOptions *options, const char *header); +void g_mime_format_options_clear_hidden_headers (GMimeFormatOptions *options); + +G_END_DECLS + +#endif /* __GMIME_FORMAT_OPTIONS_H__ */ diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-gpg-context.c gmime-3.0.1/gmime/gmime-gpg-context.c --- gmime-2.6.22+dfsg2/gmime/gmime-gpg-context.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-gpg-context.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -23,39 +23,19 @@ #include #endif -#ifdef __APPLE__ -#undef HAVE_POLL_H -#undef HAVE_POLL -typedef unsigned int nfds_t; -#endif - #include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef HAVE_POLL_H -#include -#endif #include "gmime-gpg-context.h" -#ifdef ENABLE_CRYPTOGRAPHY +#ifdef ENABLE_CRYPTO #include "gmime-filter-charset.h" #include "gmime-stream-filter.h" -#include "gmime-stream-pipe.h" +#include "gmime-gpgme-utils.h" #include "gmime-stream-mem.h" #include "gmime-stream-fs.h" #include "gmime-charset.h" -#endif /* ENABLE_CRYPTOGRAPHY */ +#endif /* ENABLE_CRYPTO */ #include "gmime-error.h" #ifdef ENABLE_DEBUG @@ -78,48 +58,52 @@ **/ +/** + * GMimeGpgContext: + * + * A GnuPG crypto context. + **/ +struct _GMimeGpgContext { + GMimeCryptoContext parent_object; + +#ifdef ENABLE_CRYPTO + gpgme_ctx_t ctx; +#endif +}; + +struct _GMimeGpgContextClass { + GMimeCryptoContextClass parent_class; + +}; + + static void g_mime_gpg_context_class_init (GMimeGpgContextClass *klass); static void g_mime_gpg_context_init (GMimeGpgContext *ctx, GMimeGpgContextClass *klass); static void g_mime_gpg_context_finalize (GObject *object); static GMimeDigestAlgo gpg_digest_id (GMimeCryptoContext *ctx, const char *name); - static const char *gpg_digest_name (GMimeCryptoContext *ctx, GMimeDigestAlgo digest); -static gboolean gpg_get_retrieve_session_key (GMimeCryptoContext *context); - -static int gpg_set_retrieve_session_key (GMimeCryptoContext *ctx, gboolean retrieve_session_key, - GError **err); - -static int gpg_sign (GMimeCryptoContext *ctx, const char *userid, - GMimeDigestAlgo digest, GMimeStream *istream, - GMimeStream *ostream, GError **err); +static int gpg_sign (GMimeCryptoContext *ctx, gboolean detach, const char *userid, + GMimeStream *istream, GMimeStream *ostream, GError **err); static const char *gpg_get_signature_protocol (GMimeCryptoContext *ctx); - static const char *gpg_get_encryption_protocol (GMimeCryptoContext *ctx); - static const char *gpg_get_key_exchange_protocol (GMimeCryptoContext *ctx); -static GMimeSignatureList *gpg_verify (GMimeCryptoContext *ctx, GMimeDigestAlgo digest, +static GMimeSignatureList *gpg_verify (GMimeCryptoContext *ctx, GMimeVerifyFlags flags, GMimeStream *istream, GMimeStream *sigstream, - GError **err); - -static int gpg_encrypt (GMimeCryptoContext *ctx, gboolean sign, const char *userid, - GMimeDigestAlgo digest, GPtrArray *recipients, GMimeStream *istream, - GMimeStream *ostream, GError **err); + GMimeStream *ostream, GError **err); -static GMimeDecryptResult *gpg_decrypt (GMimeCryptoContext *ctx, GMimeStream *istream, - GMimeStream *ostream, GError **err); +static int gpg_encrypt (GMimeCryptoContext *ctx, gboolean sign, const char *userid, GMimeEncryptFlags flags, + GPtrArray *recipients, GMimeStream *istream, GMimeStream *ostream, GError **err); -static GMimeDecryptResult *gpg_decrypt_session (GMimeCryptoContext *ctx, const char *session_key, - GMimeStream *istream, GMimeStream *ostream, - GError **err); +static GMimeDecryptResult *gpg_decrypt (GMimeCryptoContext *ctx, GMimeDecryptFlags flags, const char *session_key, + GMimeStream *istream, GMimeStream *ostream, GError **err); -static int gpg_import_keys (GMimeCryptoContext *ctx, GMimeStream *istream, - GError **err); +static int gpg_import_keys (GMimeCryptoContext *ctx, GMimeStream *istream, GError **err); -static int gpg_export_keys (GMimeCryptoContext *ctx, GPtrArray *keys, +static int gpg_export_keys (GMimeCryptoContext *ctx, const char *keys[], GMimeStream *ostream, GError **err); @@ -167,32 +151,30 @@ crypto_class->verify = gpg_verify; crypto_class->encrypt = gpg_encrypt; crypto_class->decrypt = gpg_decrypt; - crypto_class->decrypt_session = gpg_decrypt_session; crypto_class->import_keys = gpg_import_keys; crypto_class->export_keys = gpg_export_keys; crypto_class->get_signature_protocol = gpg_get_signature_protocol; crypto_class->get_encryption_protocol = gpg_get_encryption_protocol; crypto_class->get_key_exchange_protocol = gpg_get_key_exchange_protocol; - crypto_class->get_retrieve_session_key = gpg_get_retrieve_session_key; - crypto_class->set_retrieve_session_key = gpg_set_retrieve_session_key; } static void -g_mime_gpg_context_init (GMimeGpgContext *ctx, GMimeGpgContextClass *klass) +g_mime_gpg_context_init (GMimeGpgContext *gpg, GMimeGpgContextClass *klass) { - ctx->retrieve_session_key = FALSE; - ctx->auto_key_retrieve = FALSE; - ctx->always_trust = FALSE; - ctx->use_agent = FALSE; - ctx->path = NULL; +#ifdef ENABLE_CRYPTO + gpg->ctx = NULL; +#endif } static void g_mime_gpg_context_finalize (GObject *object) { - GMimeGpgContext *ctx = (GMimeGpgContext *) object; + GMimeGpgContext *gpg = (GMimeGpgContext *) object; - g_free (ctx->path); +#ifdef ENABLE_CRYPTO + if (gpg->ctx) + gpgme_release (gpg->ctx); +#endif G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -203,7 +185,7 @@ if (name == NULL) return GMIME_DIGEST_ALGO_DEFAULT; - if (!g_ascii_strcasecmp (name, "pgp-")) + if (!g_ascii_strncasecmp (name, "pgp-", 4)) name += 4; if (!g_ascii_strcasecmp (name, "md2")) @@ -281,2232 +263,157 @@ return "application/pgp-keys"; } -#ifdef ENABLE_CRYPTOGRAPHY -enum _GpgCtxMode { - GPG_CTX_MODE_SIGN, - GPG_CTX_MODE_VERIFY, - GPG_CTX_MODE_ENCRYPT, - GPG_CTX_MODE_SIGN_ENCRYPT, - GPG_CTX_MODE_DECRYPT, - GPG_CTX_MODE_IMPORT, - GPG_CTX_MODE_EXPORT, -}; - -struct _GpgCtx { - enum _GpgCtxMode mode; - GHashTable *userid_hint; - GMimeGpgContext *ctx; - pid_t pid; - - char *userid; - GPtrArray *recipients; - GMimeCipherAlgo cipher; - GMimeDigestAlgo digest; - - int stdin_fd; - int stdout_fd; - int stderr_fd; - int status_fd; - int secret_fd; /* used for exactly one of: - * (a) sending a password to gpg when signing or encrypting - * (b) sending a detatched signature to gpg when verifying - */ - - /* status-fd buffer */ - char *statusbuf; - char *statusptr; - guint statusleft; - - char *need_id; - - GMimeStream *sigstream; - GMimeStream *istream; - GMimeStream *ostream; - - GByteArray *diag; - GMimeStream *diagnostics; - - GMimeCertificateList *encrypted_to; /* full list of encrypted-to recipients */ - GMimeSignatureList *signatures; - GMimeSignature *signature; - char *session_key; - - int exit_status; - - unsigned int utf8:1; - unsigned int exited:1; - unsigned int complete:1; - unsigned int seen_eof1:1; - unsigned int seen_eof2:1; - unsigned int flushed:1; /* flushed the diagnostics stream (aka stderr) */ - unsigned int always_trust:1; - unsigned int use_agent:1; - unsigned int armor:1; - unsigned int need_passwd:1; - unsigned int bad_passwds:2; - unsigned int decrypt_okay:1; - unsigned int override_session_key:1; - - unsigned int padding:18; -}; - -static struct _GpgCtx * -gpg_ctx_new (GMimeGpgContext *ctx) -{ - struct _GpgCtx *gpg; - const char *charset; - GMimeStream *stream; - - gpg = g_slice_new (struct _GpgCtx); - gpg->mode = GPG_CTX_MODE_SIGN; - gpg->ctx = ctx; - gpg->userid_hint = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); - gpg->decrypt_okay = FALSE; - gpg->complete = FALSE; - gpg->seen_eof1 = TRUE; - gpg->seen_eof2 = FALSE; - gpg->pid = (pid_t) -1; - gpg->exit_status = 0; - gpg->flushed = FALSE; - gpg->exited = FALSE; - - gpg->userid = NULL; - gpg->recipients = NULL; - gpg->cipher = GMIME_CIPHER_ALGO_DEFAULT; - gpg->digest = GMIME_DIGEST_ALGO_DEFAULT; - gpg->override_session_key = FALSE; - gpg->always_trust = FALSE; - gpg->use_agent = FALSE; - gpg->armor = FALSE; - - gpg->stdin_fd = -1; - gpg->stdout_fd = -1; - gpg->stderr_fd = -1; - gpg->status_fd = -1; - gpg->secret_fd = -1; - - gpg->statusbuf = g_malloc (128); - gpg->statusptr = gpg->statusbuf; - gpg->statusleft = 128; - - gpg->bad_passwds = 0; - gpg->need_passwd = FALSE; - gpg->need_id = NULL; - - gpg->encrypted_to = NULL; - gpg->session_key = NULL; - gpg->signatures = NULL; - gpg->signature = NULL; - - gpg->sigstream = NULL; - gpg->istream = NULL; - gpg->ostream = NULL; - - stream = g_mime_stream_mem_new (); - gpg->diag = GMIME_STREAM_MEM (stream)->buffer; - charset = g_mime_charset_iconv_name (g_mime_locale_charset ()); - if (g_ascii_strcasecmp (charset, "UTF-8") != 0) { - GMimeStream *fstream; - GMimeFilter *filter; - - fstream = g_mime_stream_filter_new (stream); - filter = g_mime_filter_charset_new (charset, "UTF-8"); - g_mime_stream_filter_add ((GMimeStreamFilter *) fstream, filter); - g_object_unref (stream); - g_object_unref (filter); - - gpg->diagnostics = fstream; - - gpg->utf8 = FALSE; - } else { - /* system charset is UTF-8, shouldn't need any conversion */ - gpg->diagnostics = stream; - - gpg->utf8 = TRUE; - } - - return gpg; -} - -static void -gpg_ctx_set_mode (struct _GpgCtx *gpg, enum _GpgCtxMode mode) -{ - gpg->mode = mode; - - switch (gpg->mode) { - case GPG_CTX_MODE_SIGN_ENCRYPT: - case GPG_CTX_MODE_DECRYPT: - case GPG_CTX_MODE_SIGN: - gpg->need_passwd = TRUE; - break; - default: - gpg->need_passwd = FALSE; - break; - } -} - -static void -gpg_ctx_set_digest (struct _GpgCtx *gpg, GMimeDigestAlgo digest) -{ - gpg->digest = digest; -} - -static void -gpg_ctx_set_always_trust (struct _GpgCtx *gpg, gboolean trust) -{ - gpg->always_trust = trust; -} - -static void -gpg_ctx_set_use_agent (struct _GpgCtx *gpg, gboolean use_agent) -{ - gpg->use_agent = use_agent; -} - -static void -gpg_ctx_set_userid (struct _GpgCtx *gpg, const char *userid) -{ - g_free (gpg->userid); - gpg->userid = g_strdup (userid); -} - -static void -gpg_ctx_add_recipient (struct _GpgCtx *gpg, const char *keyid) -{ - if (gpg->mode != GPG_CTX_MODE_ENCRYPT && - gpg->mode != GPG_CTX_MODE_SIGN_ENCRYPT && - gpg->mode != GPG_CTX_MODE_EXPORT) - return; - - if (!gpg->recipients) - gpg->recipients = g_ptr_array_new (); - - g_ptr_array_add (gpg->recipients, g_strdup (keyid)); -} - -static void -gpg_ctx_set_armor (struct _GpgCtx *gpg, gboolean armor) -{ - gpg->armor = armor; -} - -static void -gpg_ctx_set_istream (struct _GpgCtx *gpg, GMimeStream *istream) -{ - g_object_ref (istream); - if (gpg->istream) - g_object_unref (gpg->istream); - gpg->istream = istream; -} - -static void -gpg_ctx_set_ostream (struct _GpgCtx *gpg, GMimeStream *ostream) -{ - g_object_ref (ostream); - if (gpg->ostream) - g_object_unref (gpg->ostream); - gpg->ostream = ostream; - gpg->seen_eof1 = FALSE; -} - +#ifdef ENABLE_CRYPTO static void -gpg_ctx_set_sigstream (struct _GpgCtx *gpg, GMimeStream *sigstream) -{ - g_object_ref (sigstream); - if (gpg->sigstream) - g_object_unref (gpg->sigstream); - gpg->sigstream = sigstream; -} - -static const char * -gpg_ctx_get_diagnostics (struct _GpgCtx *gpg) +set_passphrase_callback (GMimeCryptoContext *context) { - if (!gpg->flushed) { - g_mime_stream_flush (gpg->diagnostics); - g_byte_array_append (gpg->diag, (unsigned char *) "", 1); - gpg->flushed = TRUE; - } + GMimeGpgContext *gpg = (GMimeGpgContext *) context; - return (const char *) gpg->diag->data; + if (context->request_passwd) + gpgme_set_passphrase_cb (gpg->ctx, g_mime_gpgme_passphrase_callback, gpg); + else + gpgme_set_passphrase_cb (gpg->ctx, NULL, NULL); } +#endif -static void -gpg_ctx_free (struct _GpgCtx *gpg) +static int +gpg_sign (GMimeCryptoContext *context, gboolean detach, const char *userid, + GMimeStream *istream, GMimeStream *ostream, GError **err) { - guint i; - - g_hash_table_destroy (gpg->userid_hint); - - g_free (gpg->userid); - - if (gpg->recipients) { - for (i = 0; i < gpg->recipients->len; i++) - g_free (gpg->recipients->pdata[i]); +#ifdef ENABLE_CRYPTO + gpgme_sig_mode_t mode = detach ? GPGME_SIG_MODE_DETACH : GPGME_SIG_MODE_CLEAR; + GMimeGpgContext *gpg = (GMimeGpgContext *) context; - g_ptr_array_free (gpg->recipients, TRUE); - } - - if (gpg->stdin_fd != -1) - close (gpg->stdin_fd); - if (gpg->stdout_fd != -1) - close (gpg->stdout_fd); - if (gpg->stderr_fd != -1) - close (gpg->stderr_fd); - if (gpg->status_fd != -1) - close (gpg->status_fd); - if (gpg->secret_fd != -1) - close (gpg->secret_fd); - - g_free (gpg->statusbuf); - - g_free (gpg->need_id); - - if (gpg->sigstream) - g_object_unref (gpg->sigstream); - - if (gpg->istream) - g_object_unref (gpg->istream); - - if (gpg->ostream) - g_object_unref (gpg->ostream); - - g_object_unref (gpg->diagnostics); - - if (gpg->encrypted_to) - g_object_unref (gpg->encrypted_to); - - if (gpg->session_key) { - memset (gpg->session_key, 0, strlen (gpg->session_key)); - g_free (gpg->session_key); - } + set_passphrase_callback (context); - if (gpg->signatures) - g_object_unref (gpg->signatures); + gpgme_set_textmode (gpg->ctx, !detach); - g_slice_free (struct _GpgCtx, gpg); -} - -static const char * -gpg_digest_str (GMimeDigestAlgo digest) -{ - switch (digest) { - case GMIME_DIGEST_ALGO_MD2: - return "--digest-algo=MD2"; - case GMIME_DIGEST_ALGO_MD5: - return "--digest-algo=MD5"; - case GMIME_DIGEST_ALGO_SHA1: - return "--digest-algo=SHA1"; - case GMIME_DIGEST_ALGO_SHA224: - return "--digest-algo=SHA224"; - case GMIME_DIGEST_ALGO_SHA256: - return "--digest-algo=SHA256"; - case GMIME_DIGEST_ALGO_SHA384: - return "--digest-algo=SHA384"; - case GMIME_DIGEST_ALGO_SHA512: - return "--digest-algo=SHA512"; - case GMIME_DIGEST_ALGO_RIPEMD160: - return "--digest-algo=RIPEMD160"; - case GMIME_DIGEST_ALGO_TIGER192: - return "--digest-algo=TIGER192"; - case GMIME_DIGEST_ALGO_MD4: - return "--digest-algo=MD4"; - default: - return NULL; - } -} - -static const char * -filename (const char *path) -{ - const char *slash = strrchr (path, '/'); + return g_mime_gpgme_sign (gpg->ctx, mode, userid, istream, ostream, err); +#else + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, + _("PGP support is not enabled in this build")); - return slash != NULL ? slash + 1 : path; + return -1; +#endif /* ENABLE_CRYPTO */ } -static char ** -gpg_ctx_get_argv (struct _GpgCtx *gpg, const char *path, int status_fd, int secret_fd, char ***strv) +static GMimeSignatureList * +gpg_verify (GMimeCryptoContext *context, GMimeVerifyFlags flags, GMimeStream *istream, GMimeStream *sigstream, + GMimeStream *ostream, GError **err) { - const char *digest_str; - char **argv, *buf; - GPtrArray *args; - int v = 0; - guint i; - - *strv = g_new (char *, 3); - - args = g_ptr_array_new (); - g_ptr_array_add (args, (char *) filename (path)); - - g_ptr_array_add (args, "--verbose"); - g_ptr_array_add (args, "--no-secmem-warning"); - g_ptr_array_add (args, "--no-greeting"); - g_ptr_array_add (args, "--no-tty"); - - if (!gpg->need_passwd) { - /* only use batch mode if we don't intend on using the - interactive --command-fd option to send it the - user's password */ - g_ptr_array_add (args, "--batch"); - } - - g_ptr_array_add (args, "--charset=UTF-8"); - - (*strv)[v++] = buf = g_strdup_printf ("--status-fd=%d", status_fd); - g_ptr_array_add (args, buf); - - if (gpg->need_passwd && !gpg->override_session_key) { - (*strv)[v++] = buf = g_strdup_printf ("--command-fd=%d", secret_fd); - g_ptr_array_add (args, buf); - } - - switch (gpg->mode) { - case GPG_CTX_MODE_SIGN: - if (gpg->use_agent) - g_ptr_array_add (args, "--use-agent"); - - g_ptr_array_add (args, "--sign"); - g_ptr_array_add (args, "--detach"); - if (gpg->armor) - g_ptr_array_add (args, "--armor"); - if ((digest_str = gpg_digest_str (gpg->digest))) - g_ptr_array_add (args, (char *) digest_str); - if (gpg->userid) { - g_ptr_array_add (args, "-u"); - g_ptr_array_add (args, (char *) gpg->userid); - } - g_ptr_array_add (args, "--output"); - g_ptr_array_add (args, "-"); - break; - case GPG_CTX_MODE_VERIFY: - if (!gpg->ctx->auto_key_retrieve) { - g_ptr_array_add (args, "--keyserver-options"); - g_ptr_array_add (args, "no-auto-key-retrieve"); - } - - g_ptr_array_add (args, "--enable-special-filenames"); - g_ptr_array_add (args, "--verify"); - g_ptr_array_add (args, "--"); - - /* signature stream must come first */ - (*strv)[v++] = buf = g_strdup_printf ("-&%d", secret_fd); - g_ptr_array_add (args, buf); - - /* followed by the content stream (in this case, stdin) */ - g_ptr_array_add (args, "-"); - break; - case GPG_CTX_MODE_SIGN_ENCRYPT: - if (gpg->use_agent) - g_ptr_array_add (args, "--use-agent"); - - g_ptr_array_add (args, "--sign"); - - if ((digest_str = gpg_digest_str (gpg->digest))) - g_ptr_array_add (args, (char *) digest_str); - - /* fall thru... */ - case GPG_CTX_MODE_ENCRYPT: - g_ptr_array_add (args, "--encrypt"); - - if (gpg->armor) - g_ptr_array_add (args, "--armor"); - - if (gpg->always_trust) - g_ptr_array_add (args, "--always-trust"); - - if (gpg->userid) { - g_ptr_array_add (args, "-u"); - g_ptr_array_add (args, (char *) gpg->userid); - } - - if (gpg->recipients) { - for (i = 0; i < gpg->recipients->len; i++) { - g_ptr_array_add (args, "-r"); - g_ptr_array_add (args, gpg->recipients->pdata[i]); - } - } - g_ptr_array_add (args, "--output"); - g_ptr_array_add (args, "-"); - break; - case GPG_CTX_MODE_DECRYPT: - if (gpg->use_agent) - g_ptr_array_add (args, "--use-agent"); - - if (gpg->ctx->retrieve_session_key) - g_ptr_array_add (args, "--show-session-key"); - - if (gpg->override_session_key) { - (*strv)[v++] = buf = g_strdup_printf ("--override-session-key-fd=%d", secret_fd); - g_ptr_array_add (args, buf); - } - - g_ptr_array_add (args, "--decrypt"); - g_ptr_array_add (args, "--output"); - g_ptr_array_add (args, "-"); - break; - case GPG_CTX_MODE_IMPORT: - g_ptr_array_add (args, "--import"); - g_ptr_array_add (args, "-"); - break; - case GPG_CTX_MODE_EXPORT: - if (gpg->armor) - g_ptr_array_add (args, "--armor"); - g_ptr_array_add (args, "--export"); - for (i = 0; i < gpg->recipients->len; i++) - g_ptr_array_add (args, gpg->recipients->pdata[i]); - break; - } - -#if d(!)0 - for (i = 0; i < args->len; i++) - printf ("%s ", (char *) args->pdata[i]); - printf ("\n"); -#endif - - g_ptr_array_add (args, NULL); - (*strv)[v] = NULL; +#ifdef ENABLE_CRYPTO + GMimeGpgContext *gpg = (GMimeGpgContext *) context; - argv = (char **) args->pdata; - g_ptr_array_free (args, FALSE); + return g_mime_gpgme_verify (gpg->ctx, flags, istream, sigstream, ostream, err); +#else + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, + _("PGP support is not enabled in this build")); - return argv; + return NULL; +#endif /* ENABLE_CRYPTO */ } static int -gpg_ctx_op_start (struct _GpgCtx *gpg, const char *path) +gpg_encrypt (GMimeCryptoContext *context, gboolean sign, const char *userid, GMimeEncryptFlags flags, + GPtrArray *recipients, GMimeStream *istream, GMimeStream *ostream, GError **err) { - int i, maxfd, errnosave, fds[10]; - char **argv, **strv = NULL; - int flags; - - maxfd = G_N_ELEMENTS (fds); - for (i = 0; i < maxfd; i++) - fds[i] = -1; - - /* don't create the command-fd if we don't need it */ - if (!(gpg->need_passwd || gpg->sigstream || gpg->override_session_key)) - maxfd -= 2; - - for (i = 0; i < maxfd; i += 2) { - if (pipe (fds + i) == -1) - goto exception; - } - - argv = gpg_ctx_get_argv (gpg, path, fds[7], fds[8], &strv); - - if (!(gpg->pid = fork ())) { - /* child process */ - - if ((dup2 (fds[0], STDIN_FILENO) < 0) || - (dup2 (fds[3], STDOUT_FILENO) < 0) || - (dup2 (fds[5], STDERR_FILENO) < 0)) { - _exit (255); - } - - /* Dissociate from gmime's controlling terminal so - * that gpg won't be able to read from it. - */ - setsid (); - - maxfd = sysconf (_SC_OPEN_MAX); - for (i = 3; i < maxfd; i++) { - /* don't close the status-fd or the passwd-fd */ - if (i != fds[7] && i != fds[8]) - fcntl (i, F_SETFD, FD_CLOEXEC); - } - - /* run gpg */ - execvp (gpg->ctx->path, argv); - _exit (255); - } else if (gpg->pid < 0) { - g_strfreev (strv); - g_free (argv); - goto exception; - } - - /* parent process */ - - g_strfreev (strv); - g_free (argv); - - close (fds[0]); - gpg->stdin_fd = fds[1]; - gpg->stdout_fd = fds[2]; - close (fds[3]); - gpg->stderr_fd = fds[4]; - close (fds[5]); - gpg->status_fd = fds[6]; - close (fds[7]); - - if (fds[8] != -1) { - flags = (flags = fcntl (fds[9], F_GETFL)) == -1 ? O_WRONLY : flags; - fcntl (fds[9], F_SETFL, flags | O_NONBLOCK); - gpg->secret_fd = fds[9]; - close (fds[8]); - } - - flags = (flags = fcntl (gpg->stdin_fd, F_GETFL)) == -1 ? O_WRONLY : flags; - fcntl (gpg->stdin_fd, F_SETFL, flags | O_NONBLOCK); - - flags = (flags = fcntl (gpg->stdout_fd, F_GETFL)) == -1 ? O_RDONLY : flags; - fcntl (gpg->stdout_fd, F_SETFL, flags | O_NONBLOCK); +#ifdef ENABLE_CRYPTO + GMimeGpgContext *gpg = (GMimeGpgContext *) context; - flags = (flags = fcntl (gpg->stderr_fd, F_GETFL)) == -1 ? O_RDONLY : flags; - fcntl (gpg->stderr_fd, F_SETFL, flags | O_NONBLOCK); + if (sign) + set_passphrase_callback (context); - flags = (flags = fcntl (gpg->status_fd, F_GETFL)) == -1 ? O_RDONLY : flags; - fcntl (gpg->status_fd, F_SETFL, flags | O_NONBLOCK); - - return 0; - - exception: - - errnosave = errno; - - for (i = 0; i < maxfd; i++) { - if (fds[i] != -1) - close (fds[i]); - } - - errno = errnosave; + return g_mime_gpgme_encrypt (gpg->ctx, sign, userid, flags, recipients, istream, ostream, err); +#else + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, + _("PGP support is not enabled in this build")); return -1; +#endif /* ENABLE_CRYPTO */ } -static char * -next_token (char *in, gboolean secret, char **token) +static GMimeDecryptResult * +gpg_decrypt (GMimeCryptoContext *context, GMimeDecryptFlags flags, const char *session_key, + GMimeStream *istream, GMimeStream *ostream, GError **err) { - char *start, *inptr = in; +#ifdef ENABLE_CRYPTO + GMimeGpgContext *gpg = (GMimeGpgContext *) context; - while (*inptr == ' ') - inptr++; + set_passphrase_callback (context); - if (*inptr == '\0' || *inptr == '\n') { - if (token) - *token = NULL; - return inptr; - } - - start = inptr; - while (*inptr && *inptr != ' ' && *inptr != '\n') - inptr++; - - if (token != NULL) - *token = g_strndup (start, (size_t) (inptr - start)); - - if (secret) - memset (start, '*', (size_t) (inptr - start)); + return g_mime_gpgme_decrypt (gpg->ctx, flags, session_key, istream, ostream, err); +#else + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, + _("PGP support is not enabled in this build")); - return inptr; + return NULL; +#endif /* ENABLE_CRYPTO */ } -/** - * gpg_ctx_add_signature: - * @gpg: GnuPG context - * @status: a #GMimeSignatureStatus - * @info: a string with the signature info - * - * Parses GOODSIG, BADSIG, EXPSIG, EXPKEYSIG, and REVKEYSIG status messages - * into a newly allocated #GMimeSignature and adds it to @gpg's signature list. - **/ -static void -gpg_ctx_add_signature (struct _GpgCtx *gpg, GMimeSignatureStatus status, char *info) +static int +gpg_import_keys (GMimeCryptoContext *context, GMimeStream *istream, GError **err) { - GMimeSignature *sig; +#ifdef ENABLE_CRYPTO + GMimeGpgContext *gpg = (GMimeGpgContext *) context; - if (!gpg->signatures) - gpg->signatures = g_mime_signature_list_new (); + set_passphrase_callback (context); - gpg->signature = sig = g_mime_signature_new (); - g_mime_signature_set_status (sig, status); - g_mime_signature_list_add (gpg->signatures, sig); - g_object_unref (sig); - - /* get the key id of the signer */ - info = next_token (info, FALSE, &sig->cert->keyid); - - /* the rest of the string is the signer's name */ - sig->cert->name = g_strdup (info); -} - -static void -gpg_ctx_parse_signer_info (struct _GpgCtx *gpg, char *status) -{ - GMimeSignature *sig; - char *inend; + return g_mime_gpgme_import (gpg->ctx, istream, err); +#else + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, + _("PGP support is not enabled in this build")); - if (!strncmp (status, "SIG_ID ", 7)) { - /* not sure if this contains anything we care about... */ - } else if (!strncmp (status, "GOODSIG ", 8)) { - gpg_ctx_add_signature (gpg, GMIME_SIGNATURE_STATUS_GOOD, status + 8); - } else if (!strncmp (status, "BADSIG ", 7)) { - gpg_ctx_add_signature (gpg, GMIME_SIGNATURE_STATUS_BAD, status + 7); - } else if (!strncmp (status, "EXPSIG ", 7)) { - gpg_ctx_add_signature (gpg, GMIME_SIGNATURE_STATUS_ERROR, status + 7); - gpg->signature->errors |= GMIME_SIGNATURE_ERROR_EXPSIG; - } else if (!strncmp (status, "EXPKEYSIG ", 10)) { - gpg_ctx_add_signature (gpg, GMIME_SIGNATURE_STATUS_ERROR, status + 10); - gpg->signature->errors |= GMIME_SIGNATURE_ERROR_EXPKEYSIG; - } else if (!strncmp (status, "REVKEYSIG ", 10)) { - gpg_ctx_add_signature (gpg, GMIME_SIGNATURE_STATUS_ERROR, status + 10); - gpg->signature->errors |= GMIME_SIGNATURE_ERROR_REVKEYSIG; - } else if (!strncmp (status, "ERRSIG ", 7)) { - /* Note: NO_PUBKEY often comes after an ERRSIG */ - status += 7; - - if (!gpg->signatures) - gpg->signatures = g_mime_signature_list_new (); - - gpg->signature = sig = g_mime_signature_new (); - g_mime_signature_set_status (sig, GMIME_SIGNATURE_STATUS_ERROR); - g_mime_signature_list_add (gpg->signatures, sig); - g_object_unref (sig); - - /* get the key id of the signer */ - status = next_token (status, FALSE, &sig->cert->keyid); - - /* the second token is the public-key algorithm id */ - sig->cert->pubkey_algo = strtoul (status, &inend, 10); - if (inend == status || *inend != ' ') { - sig->cert->pubkey_algo = 0; - return; - } - - status = inend + 1; - - /* the third token is the digest algorithm id */ - sig->cert->digest_algo = strtoul (status, &inend, 10); - if (inend == status || *inend != ' ') { - sig->cert->digest_algo = 0; - return; - } - - status = inend + 1; - - /* the fourth token is the signature class */ - /*sig->sig_class =*/ strtoul (status, &inend, 10); - if (inend == status || *inend != ' ') { - /*signer->sig_class = 0;*/ - return; - } - - status = inend + 1; - - /* the fifth token is the signature expiration date (or 0 for never) */ - sig->expires = strtoul (status, &inend, 10); - if (inend == status || *inend != ' ') { - sig->expires = 0; - return; - } - - status = inend + 1; - - /* the sixth token is the return code */ - switch (strtol (status, NULL, 10)) { - case 4: sig->errors |= GMIME_SIGNATURE_ERROR_UNSUPP_ALGO; break; - case 9: sig->errors |= GMIME_SIGNATURE_ERROR_NO_PUBKEY; break; - default: break; - } - } else if (!strncmp (status, "NO_PUBKEY ", 10)) { - /* the only token is the keyid, but we've already got it */ - gpg->signature->errors |= GMIME_SIGNATURE_ERROR_NO_PUBKEY; - } else if (!strncmp (status, "VALIDSIG ", 9)) { - sig = gpg->signature; - status += 9; - - /* the first token is the fingerprint */ - status = next_token (status, FALSE, &sig->cert->fingerprint); - - /* the second token is the date the stream was signed YYYY-MM-DD */ - status = next_token (status, FALSE, NULL); - - /* the third token is the signature creation date (or 0 for unknown?) */ - sig->created = strtoul (status, &inend, 10); - if (inend == status || *inend != ' ') { - sig->created = 0; - return; - } - - status = inend + 1; - - /* the fourth token is the signature expiration date (or 0 for never) */ - sig->expires = strtoul (status, &inend, 10); - if (inend == status || *inend != ' ') { - sig->expires = 0; - return; - } - - status = inend + 1; - - /* the fifth token is the signature version */ - /*sig->sig_ver =*/ strtoul (status, &inend, 10); - if (inend == status || *inend != ' ') { - /*signer->sig_ver = 0;*/ - return; - } - - status = inend + 1; - - /* the sixth token is a reserved numeric value (ignore for now) */ - status = next_token (status, FALSE, NULL); - - /* the seventh token is the public-key algorithm id */ - sig->cert->pubkey_algo = strtoul (status, &inend, 10); - if (inend == status || *inend != ' ') { - sig->cert->pubkey_algo = 0; - return; - } - - status = inend + 1; - - /* the eighth token is the digest algorithm id */ - sig->cert->digest_algo = strtoul (status, &inend, 10); - if (inend == status || *inend != ' ') { - sig->cert->digest_algo = 0; - return; - } - - status = inend + 1; - - /* the nineth token is the signature class */ - /*sig->sig_class =*/ strtoul (status, &inend, 10); - if (inend == status || *inend != ' ') { - /*sig->sig_class = 0;*/ - return; - } - - status = inend + 1; - - /* the rest is the primary key fingerprint */ - } else if (!strncmp (status, "TRUST_", 6)) { - status += 6; - - sig = gpg->signature; - if (!strncmp (status, "NEVER", 5)) { - sig->cert->trust = GMIME_CERTIFICATE_TRUST_NEVER; - } else if (!strncmp (status, "MARGINAL", 8)) { - sig->cert->trust = GMIME_CERTIFICATE_TRUST_MARGINAL; - } else if (!strncmp (status, "FULLY", 5)) { - sig->cert->trust = GMIME_CERTIFICATE_TRUST_FULLY; - } else if (!strncmp (status, "ULTIMATE", 8)) { - sig->cert->trust = GMIME_CERTIFICATE_TRUST_ULTIMATE; - } else if (!strncmp (status, "UNDEFINED", 9)) { - sig->cert->trust = GMIME_CERTIFICATE_TRUST_UNDEFINED; - } - } + return -1; +#endif /* ENABLE_CRYPTO */ } -/* write the session_key to the secret file descriptor and close - it. Returns 0 on success. */ static int -gpg_ctx_write_session_key (struct _GpgCtx *gpg, const char *session_key) +gpg_export_keys (GMimeCryptoContext *context, const char *keys[], GMimeStream *ostream, GError **err) { - size_t len = strlen (session_key); - ssize_t w, nwritten = 0; +#ifdef ENABLE_CRYPTO + GMimeGpgContext *gpg = (GMimeGpgContext *) context; - do { - do { - w = write (gpg->secret_fd, session_key + nwritten, len - nwritten); - } while (w == -1 && (errno == EINTR || errno == EAGAIN)); - - if (w > 0) - nwritten += w; - } while (nwritten < len && w != -1); + set_passphrase_callback (context); - close (gpg->secret_fd); - gpg->secret_fd = -1; + return g_mime_gpgme_export (gpg->ctx, keys, ostream, err); +#else + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, + _("PGP support is not enabled in this build")); - return (w == -1); + return -1; +#endif /* ENABLE_CRYPTO */ } -static int -gpg_ctx_parse_status (struct _GpgCtx *gpg, GError **err) + +/** + * g_mime_gpg_context_new: + * + * Creates a new gpg crypto context object. + * + * Returns: (transfer full): a new gpg crypto context object. + **/ +GMimeCryptoContext * +g_mime_gpg_context_new (void) { - size_t nread, nwritten; - register char *inptr; - char *status, *tmp; - int len; - - parse: - - g_clear_error (err); - - inptr = gpg->statusbuf; - while (inptr < gpg->statusptr && *inptr != '\n') - inptr++; - - if (*inptr != '\n') { - /* we don't have enough data buffered to parse this status line */ - return 0; - } +#ifdef ENABLE_CRYPTO + GMimeGpgContext *gpg; + gpgme_ctx_t ctx; - *inptr++ = '\0'; - status = gpg->statusbuf; - - d(printf ("status: %s\n", status)); + /* make sure GpgMe supports the OpenPGP protocols */ + if (gpgme_engine_check_version (GPGME_PROTOCOL_OpenPGP) != GPG_ERR_NO_ERROR) + return NULL; - if (strncmp (status, "[GNUPG:] ", 9) != 0) { - if (!gpg->utf8) - tmp = g_locale_to_utf8 (status, -1, &nread, &nwritten, NULL); - else - tmp = status; - - g_set_error (err, GMIME_ERROR, GMIME_ERROR_PARSE_ERROR, - _("Unexpected GnuPG status message encountered:\n\n%s"), - tmp); - - if (!gpg->utf8) - g_free (tmp); - - return -1; - } + /* create the GpgMe context */ + if (gpgme_new (&ctx) != GPG_ERR_NO_ERROR) + return NULL; - status += 9; + gpg = g_object_new (GMIME_TYPE_GPG_CONTEXT, NULL); + gpgme_set_protocol (ctx, GPGME_PROTOCOL_OpenPGP); + gpgme_set_armor (ctx, TRUE); + gpg->ctx = ctx; - if (!strncmp (status, "USERID_HINT ", 12)) { - size_t nread, nwritten; - char *hint, *user; - - status += 12; - - status = next_token (status, FALSE, &hint); - if (!hint) { - g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_PARSE_ERROR, - _("Failed to parse gpg userid hint.")); - return -1; - } - - if (g_hash_table_lookup (gpg->userid_hint, hint)) { - /* we already have this userid hint... */ - g_free (hint); - goto recycle; - } - - if (gpg->utf8 || !(user = g_locale_to_utf8 (status, -1, &nread, &nwritten, NULL))) - user = g_strdup (status); - - g_strstrip (user); - - g_hash_table_insert (gpg->userid_hint, hint, user); - } else if (!strncmp (status, "NEED_PASSPHRASE ", 16)) { - char *userid; - - status += 16; - - status = next_token (status, FALSE, &userid); - if (!userid) { - g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_PARSE_ERROR, - _("Failed to parse gpg passphrase request.")); - return -1; - } - - g_free (gpg->need_id); - gpg->need_id = userid; - } else if (!strncmp (status, "NEED_PASSPHRASE_PIN ", 20)) { - char *userid; - - status += 20; - - status = next_token (status, FALSE, &userid); - if (!userid) { - g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_PARSE_ERROR, - _("Failed to parse gpg passphrase request.")); - return -1; - } - - g_free (gpg->need_id); - gpg->need_id = userid; - } else if (!strncmp (status, "GET_HIDDEN ", 11)) { - GMimeStream *filtered_stream, *passwd; - GMimeCryptoContext *ctx; - GMimeFilter *filter; - const char *charset; - char *prompt = NULL; - const char *name; - gboolean ok; - - status += 11; - - ctx = (GMimeCryptoContext *) gpg->ctx; - if (!ctx->request_passwd) { - /* can't ask for a passwd w/o a way to request it from the user... */ - g_set_error_literal (err, GMIME_ERROR, ECANCELED, _("Canceled.")); - return -1; - } - - if (!(name = g_hash_table_lookup (gpg->userid_hint, gpg->need_id))) - name = gpg->userid; - - if (!strncmp (status, "passphrase.pin.ask", 18)) { - prompt = g_strdup_printf (_("You need a PIN to unlock the key for your\n" - "SmartCard: \"%s\""), name); - } else if (!strncmp (status, "passphrase.enter", 16)) { - prompt = g_strdup_printf (_("You need a passphrase to unlock the key for\n" - "user: \"%s\""), name); - } else { - next_token (status, FALSE, &prompt); - g_set_error (err, GMIME_ERROR, GMIME_ERROR_GENERAL, - _("Unexpected request from GnuPG for `%s'"), prompt); - g_free (prompt); - return -1; - } - - /* create a stream for the application to write the passwd to */ - passwd = g_mime_stream_pipe_new (gpg->secret_fd); - g_mime_stream_pipe_set_owner ((GMimeStreamPipe *) passwd, FALSE); - - if (!gpg->utf8) { - /* we'll need to transcode the UTF-8 password that the application - * will write to our stream into the locale charset used by gpg */ - filtered_stream = g_mime_stream_filter_new (passwd); - g_object_unref (passwd); - - charset = g_mime_locale_charset (); - filter = g_mime_filter_charset_new ("UTF-8", charset); - - g_mime_stream_filter_add ((GMimeStreamFilter *) filtered_stream, filter); - g_object_unref (filter); - - passwd = filtered_stream; - } - - if ((ok = ctx->request_passwd (ctx, name, prompt, gpg->bad_passwds > 0, passwd, err))) { - if (g_mime_stream_flush (passwd) == -1) - ok = FALSE; - } - - g_object_unref (passwd); - g_free (prompt); - - if (!ok) - return -1; - } else if (!strncmp (status, "GOOD_PASSPHRASE", 15)) { - gpg->bad_passwds = 0; - } else if (!strncmp (status, "BAD_PASSPHRASE", 14)) { - gpg->bad_passwds++; - - if (gpg->bad_passwds == 3) { - g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_BAD_PASSWORD, - _("Failed to unlock secret key: 3 bad passphrases given.")); - return -1; - } - } else if (!strncmp (status, "UNEXPECTED ", 11)) { - /* this is an error */ - if (!gpg->utf8) - tmp = g_locale_to_utf8 (status + 11, -1, &nread, &nwritten, NULL); - else - tmp = status + 11; - - g_set_error (err, GMIME_ERROR, GMIME_ERROR_GENERAL, - _("Unexpected response from GnuPG: %s"), - tmp); - - if (!gpg->utf8) - g_free (tmp); - - return -1; - } else if (!strncmp (status, "NODATA", 6)) { - /* this is an error */ - const char *diagnostics; - - diagnostics = gpg_ctx_get_diagnostics (gpg); - if (diagnostics && *diagnostics) - g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_GENERAL, diagnostics); - else - g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_GENERAL, _("No data provided")); - - return -1; - } else { - GMimeCertificate *cert; - char *inend; - - switch (gpg->mode) { - case GPG_CTX_MODE_SIGN: - if (strncmp (status, "SIG_CREATED ", 12) != 0) - break; - - status += 12; - - /* skip the next single-char token ("D" for detached) */ - status = next_token (status, FALSE, NULL); - - /* skip the public-key algorithm id token */ - status = next_token (status, FALSE, NULL); - - /* this token is the digest algorithm used */ - gpg->digest = strtoul (status, NULL, 10); - break; - case GPG_CTX_MODE_VERIFY: - gpg_ctx_parse_signer_info (gpg, status); - break; - case GPG_CTX_MODE_SIGN_ENCRYPT: - case GPG_CTX_MODE_ENCRYPT: - if (!strncmp (status, "BEGIN_ENCRYPTION", 16)) { - /* nothing to do... but we know to expect data on stdout soon */ - } else if (!strncmp (status, "END_ENCRYPTION", 14)) { - /* nothing to do, but we know the end is near? */ - } else if (!strncmp (status, "NO_RECP", 7)) { - g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_NO_VALID_RECIPIENTS, - _("Failed to encrypt: No valid recipients specified.")); - return -1; - } - break; - case GPG_CTX_MODE_DECRYPT: - if (!strncmp (status, "BEGIN_DECRYPTION", 16)) { - /* nothing to do... but we know to expect data on stdout soon */ - } else if (!strncmp (status, "DECRYPTION_INFO ", 16)) { - /* new feature added in gnupg-2.1.x which gives mdc and cipher algorithms used */ - status += 16; - - /* first token is the mdc algorithm (or 0 if not used) */ - gpg->digest = strtoul (status, &inend, 10); - if (inend == status || *inend != ' ') { - gpg->digest = 0; - break; - } - - status = inend + 1; - - /* second token is the cipher algorithm */ - gpg->cipher = strtoul (status, &inend, 10); - } else if (!strncmp (status, "DECRYPTION_OKAY", 15)) { - /* decryption succeeded */ - gpg->decrypt_okay = TRUE; - } else if (!strncmp (status, "DECRYPTION_FAILED", 17)) { - /* nothing to do... but we know gpg failed to decrypt :-( */ - } else if (!strncmp (status, "END_DECRYPTION", 14)) { - /* nothing to do, but we know we're done */ - } else if (!strncmp (status, "ENC_TO ", 7)) { - /* parse the recipient info */ - if (!gpg->encrypted_to) - gpg->encrypted_to = g_mime_certificate_list_new (); - - cert = g_mime_certificate_new (); - g_mime_certificate_list_add (gpg->encrypted_to, cert); - - status += 7; - - /* first token is the recipient's keyid */ - status = next_token (status, FALSE, &cert->keyid); - - /* second token is the recipient's pubkey algo */ - cert->pubkey_algo = strtoul (status, &inend, 10); - if (inend == status || *inend != ' ') { - cert->pubkey_algo = 0; - g_object_unref (cert); - break; - } - - g_object_unref (cert); - status = inend + 1; - - /* third token is a dummy value which is always '0' */ - } else if (!strncmp (status, "GOODMDC", 7)) { - /* nothing to do... we'll grab the MDC used in DECRYPTION_INFO */ - } else if (!strncmp (status, "BADMDC", 6)) { - /* nothing to do, this will only be sent after DECRYPTION_FAILED */ - } else if (!strncmp (status, "SESSION_KEY", 11)) { - if (gpg->session_key) { - memset (gpg->session_key, 0, strlen (gpg->session_key)); - g_free (gpg->session_key); - } - - status += 11; - - status = next_token (status, TRUE, &gpg->session_key); - } else { - gpg_ctx_parse_signer_info (gpg, status); - } - break; - case GPG_CTX_MODE_IMPORT: - /* no-op */ - break; - case GPG_CTX_MODE_EXPORT: - /* no-op */ - break; - } - } - - recycle: - - /* recycle our statusbuf by moving inptr to the beginning of statusbuf */ - len = gpg->statusptr - inptr; - memmove (gpg->statusbuf, inptr, len); - - len = inptr - gpg->statusbuf; - gpg->statusleft += len; - gpg->statusptr -= len; - - /* if we have more data, try parsing the next line? */ - if (gpg->statusptr > gpg->statusbuf) - goto parse; - - return 0; -} - -#ifdef ALLOC_NEAREST_POW2 -static inline size_t -nearest_pow (size_t num) -{ - size_t n; - - if (num == 0) - return 0; - - n = num - 1; -#if defined (__GNUC__) && defined (__i386__) - __asm__("bsrl %1,%0\n\t" - "jnz 1f\n\t" - "movl $-1,%0\n" - "1:" : "=r" (n) : "rm" (n)); - n = (1 << (n + 1)); + return (GMimeCryptoContext *) gpg; #else - n |= n >> 1; - n |= n >> 2; - n |= n >> 4; - n |= n >> 8; - n |= n >> 16; - n++; -#endif - - return n; -} - -#define next_alloc_size(n) nearest_pow (n) -#else -static inline size_t -next_alloc_size (size_t n) -{ - return (n + 63) & ~63; -} -#endif - -#define status_backup(gpg, start, len) G_STMT_START { \ - if (gpg->statusleft <= len) { \ - size_t slen, soff; \ - \ - soff = gpg->statusptr - gpg->statusbuf; \ - slen = next_alloc_size (soff + len + 1); \ - \ - gpg->statusbuf = g_realloc (gpg->statusbuf, slen); \ - gpg->statusptr = gpg->statusbuf + soff; \ - gpg->statusleft = (slen - 1) - soff; \ - } \ - \ - memcpy (gpg->statusptr, start, len); \ - gpg->statusptr += len; \ - gpg->statusleft -= len; \ -} G_STMT_END - -enum { - GPG_STDIN_FD, - GPG_STDOUT_FD, - GPG_STDERR_FD, - GPG_STATUS_FD, - GPG_VERIFY_FD, - GPG_N_FDS -}; - -#ifndef HAVE_POLL -struct pollfd { - int fd; - short events; - short revents; -}; - -#define POLLIN (1 << 0) -#define POLLPRI (1 << 1) -#define POLLOUT (1 << 2) -#define POLLERR (1 << 3) -#define POLLHUP (1 << 4) -#define POLLNVAL (1 << 5) - -#ifdef HAVE_SELECT -static int -poll (struct pollfd *pfds, nfds_t nfds, int timeout) -{ - fd_set rset, wset, xset; - struct timeval tv; - int maxfd = 0; - int ready; - nfds_t i; - - if (nfds == 0) - return 0; - - /* initialize our select() timeout */ - tv.tv_sec = timeout / 1000; - tv.tv_usec = (timeout % 1000) * 1000; - - /* initialize our select() fd sets */ - FD_ZERO (&rset); - FD_ZERO (&wset); - FD_ZERO (&xset); - - for (i = 0; i < nfds; i++) { - pfds[i].revents = 0; - if (pfds[i].fd < 0) - continue; - - if (pfds[i].events & POLLIN) - FD_SET (pfds[i].fd, &rset); - if (pfds[i].events & POLLOUT) - FD_SET (pfds[i].fd, &wset); - if (pfds[i].events != 0) - FD_SET (pfds[i].fd, &xset); - if (pfds[i].fd > maxfd) - maxfd = pfds[i].fd; - } - - /* poll our fds... */ - if ((ready = select (maxfd + 1, &rset, &wset, &xset, timeout != -1 ? &tv : NULL)) > 0) { - ready = 0; - - for (i = 0; i < nfds; i++) { - if (pfds[i].fd < 0) - continue; - - if (FD_ISSET (pfds[i].fd, &rset)) - pfds[i].revents |= POLLIN; - if (FD_ISSET (pfds[i].fd, &wset)) - pfds[i].revents |= POLLOUT; - if (FD_ISSET (pfds[i].fd, &xset)) - pfds[i].revents |= POLLERR | POLLHUP; - - if (pfds[i].revents != 0) - ready++; - } - } - - return ready; -} -#else -static int -poll (struct pollfd *pfds, nfds_t nfds, int timeout) -{ - errno = EIO; - return -1; -} -#endif /* HAVE_SELECT */ -#endif /* ! HAVE_POLL */ - -static int -gpg_ctx_op_step (struct _GpgCtx *gpg, GError **err) -{ - const char *diagnostics, *mode; - struct pollfd pfds[GPG_N_FDS]; - int ready, save; - nfds_t n; - - for (n = 0; n < GPG_N_FDS; n++) { - pfds[n].events = 0; - pfds[n].fd = -1; - } - - if (!gpg->seen_eof1) { - pfds[GPG_STDOUT_FD].fd = gpg->stdout_fd; - pfds[GPG_STDOUT_FD].events = POLLIN; - } - - if (!gpg->seen_eof2) { - pfds[GPG_STDERR_FD].fd = gpg->stderr_fd; - pfds[GPG_STDERR_FD].events = POLLIN; - } - - if (!gpg->complete) { - pfds[GPG_STATUS_FD].fd = gpg->status_fd; - pfds[GPG_STATUS_FD].events = POLLIN; - } - - pfds[GPG_STDIN_FD].fd = gpg->stdin_fd; - pfds[GPG_STDIN_FD].events = POLLOUT; - - if (gpg->mode == GPG_CTX_MODE_VERIFY) { - pfds[GPG_VERIFY_FD].fd = gpg->secret_fd; - pfds[GPG_VERIFY_FD].events = POLLOUT; - } - - do { - for (n = 0; n < GPG_N_FDS; n++) - pfds[n].revents = 0; - ready = poll (pfds, GPG_N_FDS, 10 * 1000); - } while (ready == -1 && errno == EINTR); - - if (ready == -1) { - d(printf ("poll() failed: %s\n", g_strerror (errno))); - goto exception; - } else if (ready == 0) { - /* timed out */ - return 0; - } - - /* Test each and every file descriptor to see if it's 'ready', - and if so - do what we can with it and then drop through to - the next file descriptor and so on until we've done what we - can to all of them. If one fails along the way, return - -1. */ - - if (pfds[GPG_STATUS_FD].revents & (POLLIN | POLLHUP)) { - /* read the status message and decide what to do... */ - char buffer[4096]; - ssize_t nread; - - d(printf ("reading gpg's status-fd...\n")); - - do { - nread = read (gpg->status_fd, buffer, sizeof (buffer)); - } while (nread == -1 && (errno == EINTR || errno == EAGAIN)); - - if (nread == -1) - goto exception; - - if (nread > 0) { - status_backup (gpg, buffer, (size_t) nread); - if (gpg_ctx_parse_status (gpg, err) == -1) - return -1; - } else { - gpg->complete = TRUE; - } - } - - if ((pfds[GPG_STDOUT_FD].revents & (POLLIN | POLLHUP)) && gpg->ostream) { - char buffer[4096]; - ssize_t nread; - - d(printf ("reading gpg's stdout...\n")); - - do { - nread = read (gpg->stdout_fd, buffer, sizeof (buffer)); - } while (nread == -1 && (errno == EINTR || errno == EAGAIN)); - - if (nread == -1) - goto exception; - - if (nread > 0) { - if (g_mime_stream_write (gpg->ostream, buffer, (size_t) nread) == -1) - goto exception; - } else { - gpg->seen_eof1 = TRUE; - } - } - - if (pfds[GPG_STDERR_FD].revents & (POLLIN | POLLHUP)) { - char buffer[4096]; - ssize_t nread; - - d(printf ("reading gpg's stderr...\n")); - - do { - nread = read (gpg->stderr_fd, buffer, sizeof (buffer)); - } while (nread == -1 && (errno == EINTR || errno == EAGAIN)); - - if (nread == -1) - goto exception; - - if (nread > 0) { - g_mime_stream_write (gpg->diagnostics, buffer, nread); - } else { - gpg->seen_eof2 = TRUE; - } - } - - if ((pfds[GPG_VERIFY_FD].revents & (POLLOUT | POLLHUP))) { - char buffer[4096]; - ssize_t nread; - - d(printf ("streaming digital signature to gpg...\n")); - - /* write our signature stream to gpg's special fd */ - nread = g_mime_stream_read (gpg->sigstream, buffer, sizeof (buffer)); - if (nread > 0) { - ssize_t w, nwritten = 0; - - do { - do { - w = write (gpg->secret_fd, buffer + nwritten, nread - nwritten); - } while (w == -1 && (errno == EINTR || errno == EAGAIN)); - - if (w > 0) - nwritten += w; - } while (nwritten < nread && w != -1); - - if (w == -1) - goto exception; - } - - if (g_mime_stream_eos (gpg->sigstream)) { - close (gpg->secret_fd); - gpg->secret_fd = -1; - } - } - - if ((pfds[GPG_STDIN_FD].revents & (POLLOUT | POLLHUP)) && gpg->istream) { - char buffer[4096]; - ssize_t nread; - - d(printf ("writing to gpg's stdin...\n")); - - /* write our stream to gpg's stdin */ - nread = g_mime_stream_read (gpg->istream, buffer, sizeof (buffer)); - if (nread > 0) { - ssize_t w, nwritten = 0; - - do { - do { - w = write (gpg->stdin_fd, buffer + nwritten, nread - nwritten); - } while (w == -1 && (errno == EINTR || errno == EAGAIN)); - - if (w > 0) - nwritten += w; - } while (nwritten < nread && w != -1); - - if (w == -1) - goto exception; - } - - if (g_mime_stream_eos (gpg->istream)) { - close (gpg->stdin_fd); - gpg->stdin_fd = -1; - } - } - - return 0; - - exception: - - switch (gpg->mode) { - case GPG_CTX_MODE_SIGN: - mode = "sign"; - break; - case GPG_CTX_MODE_VERIFY: - mode = "verify"; - break; - case GPG_CTX_MODE_SIGN_ENCRYPT: - case GPG_CTX_MODE_ENCRYPT: - mode = "encrypt"; - break; - case GPG_CTX_MODE_DECRYPT: - mode = "decrypt"; - break; - case GPG_CTX_MODE_IMPORT: - mode = "import keys"; - break; - case GPG_CTX_MODE_EXPORT: - mode = "export keys"; - break; - default: - g_assert_not_reached (); - mode = NULL; - break; - } - - save = errno; - diagnostics = gpg_ctx_get_diagnostics (gpg); - errno = save; - - if (diagnostics && *diagnostics) { - g_set_error (err, GMIME_ERROR, errno, - _("Failed to %s via GnuPG: %s\n\n%s"), - mode, g_strerror (errno), - diagnostics); - } else { - g_set_error (err, GMIME_ERROR, errno, - _("Failed to %s via GnuPG: %s\n"), - mode, g_strerror (errno)); - } - - return -1; -} - -static gboolean -gpg_ctx_op_complete (struct _GpgCtx *gpg) -{ - return gpg->complete && gpg->seen_eof1 && gpg->seen_eof2; -} - -#if 0 -static gboolean -gpg_ctx_op_exited (struct _GpgCtx *gpg) -{ - int status; - - if (waitpid (gpg->pid, &status, WNOHANG) == gpg->pid) { - gpg->exit_status = status; - gpg->exited = TRUE; - return TRUE; - } - - return FALSE; -} -#endif - -static void -gpg_ctx_op_cancel (struct _GpgCtx *gpg) -{ - int status; - - if (gpg->exited) - return; - - kill (gpg->pid, SIGTERM); - sleep (1); - if (waitpid (gpg->pid, &status, WNOHANG) == 0) { - /* no more mr nice guy... */ - kill (gpg->pid, SIGKILL); - sleep (1); - waitpid (gpg->pid, &status, WNOHANG); - } -} - -static int -gpg_ctx_op_wait (struct _GpgCtx *gpg) -{ - int errnosave, status; - sigset_t mask, omask; - pid_t retval; - - if (!gpg->exited) { - sigemptyset (&mask); - sigaddset (&mask, SIGALRM); - sigprocmask (SIG_BLOCK, &mask, &omask); - - alarm (1); - retval = waitpid (gpg->pid, &status, 0); - errnosave = errno; - alarm (0); - - sigprocmask (SIG_SETMASK, &omask, NULL); - errno = errnosave; - - if (retval == (pid_t) -1 && errno == EINTR) { - /* gpg is hanging... */ - kill (gpg->pid, SIGTERM); - sleep (1); - - retval = waitpid (gpg->pid, &status, WNOHANG); - if (retval == (pid_t) 0) { - /* still hanging... */ - kill (gpg->pid, SIGKILL); - sleep (1); - retval = waitpid (gpg->pid, &status, WNOHANG); - } - } - } else { - status = gpg->exit_status; - retval = gpg->pid; - } - - if (retval != (pid_t) -1 && WIFEXITED (status)) - return WEXITSTATUS (status); - else - return -1; -} -#endif /* ENABLE_CRYPTOGRAPHY */ - -static int -gpg_sign (GMimeCryptoContext *context, const char *userid, GMimeDigestAlgo digest, - GMimeStream *istream, GMimeStream *ostream, GError **err) -{ -#ifdef ENABLE_CRYPTOGRAPHY - GMimeGpgContext *ctx = (GMimeGpgContext *) context; - struct _GpgCtx *gpg; - - gpg = gpg_ctx_new (ctx); - gpg_ctx_set_mode (gpg, GPG_CTX_MODE_SIGN); - gpg_ctx_set_use_agent (gpg, ctx->use_agent); - gpg_ctx_set_digest (gpg, digest); - gpg_ctx_set_armor (gpg, TRUE); - gpg_ctx_set_userid (gpg, userid); - gpg_ctx_set_istream (gpg, istream); - gpg_ctx_set_ostream (gpg, ostream); - - if (gpg_ctx_op_start (gpg, ctx->path) == -1) { - g_set_error (err, GMIME_ERROR, errno, - _("Failed to execute gpg: %s"), - errno ? g_strerror (errno) : _("Unknown")); - gpg_ctx_free (gpg); - - return -1; - } - - while (!gpg_ctx_op_complete (gpg)) { - if (gpg_ctx_op_step (gpg, err) == -1) { - gpg_ctx_op_cancel (gpg); - gpg_ctx_free (gpg); - - return -1; - } - } - - if (gpg_ctx_op_wait (gpg) != 0) { - const char *diagnostics; - int save; - - save = errno; - diagnostics = gpg_ctx_get_diagnostics (gpg); - errno = save; - - g_set_error_literal (err, GMIME_ERROR, errno, diagnostics); - gpg_ctx_free (gpg); - - return -1; - } - - /* save the digest used */ - digest = gpg->digest; - - gpg_ctx_free (gpg); - - return digest; -#else - g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, _("PGP support is not enabled in this build")); - - return -1; -#endif /* ENABLE_CRYPTOGRAPHY */ -} - - -static GMimeSignatureList * -gpg_verify (GMimeCryptoContext *context, GMimeDigestAlgo digest, - GMimeStream *istream, GMimeStream *sigstream, - GError **err) -{ -#ifdef ENABLE_CRYPTOGRAPHY - GMimeGpgContext *ctx = (GMimeGpgContext *) context; - GMimeSignatureList *signatures; - struct _GpgCtx *gpg; - - gpg = gpg_ctx_new (ctx); - gpg_ctx_set_mode (gpg, GPG_CTX_MODE_VERIFY); - gpg_ctx_set_sigstream (gpg, sigstream); - gpg_ctx_set_istream (gpg, istream); - gpg_ctx_set_digest (gpg, digest); - - if (gpg_ctx_op_start (gpg, ctx->path) == -1) { - g_set_error (err, GMIME_ERROR, errno, - _("Failed to execute gpg: %s"), - errno ? g_strerror (errno) : _("Unknown")); - gpg_ctx_free (gpg); - - return NULL; - } - - while (!gpg_ctx_op_complete (gpg)) { - if (gpg_ctx_op_step (gpg, err) == -1) { - gpg_ctx_op_cancel (gpg); - gpg_ctx_free (gpg); - return NULL; - } - } - - /* Only set the GError if we got no signature information from gpg */ - if (gpg_ctx_op_wait (gpg) != 0 && !gpg->signatures) { - const char *diagnostics; - int save; - - save = errno; - diagnostics = gpg_ctx_get_diagnostics (gpg); - errno = save; - - g_set_error_literal (err, GMIME_ERROR, errno, diagnostics); - gpg_ctx_free (gpg); - - return NULL; - } - - signatures = gpg->signatures; - gpg->signatures = NULL; - gpg_ctx_free (gpg); - - return signatures; -#else - g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, _("PGP support is not enabled in this build")); - return NULL; -#endif /* ENABLE_CRYPTOGRAPHY */ -} - - -static int -gpg_encrypt (GMimeCryptoContext *context, gboolean sign, const char *userid, - GMimeDigestAlgo digest, GPtrArray *recipients, GMimeStream *istream, - GMimeStream *ostream, GError **err) -{ -#ifdef ENABLE_CRYPTOGRAPHY - GMimeGpgContext *ctx = (GMimeGpgContext *) context; - struct _GpgCtx *gpg; - guint i; - - gpg = gpg_ctx_new (ctx); - if (sign) { - gpg_ctx_set_mode (gpg, GPG_CTX_MODE_SIGN_ENCRYPT); - gpg_ctx_set_use_agent (gpg, ctx->use_agent); - } else { - gpg_ctx_set_mode (gpg, GPG_CTX_MODE_ENCRYPT); - } - - gpg_ctx_set_always_trust (gpg, ctx->always_trust); - gpg_ctx_set_digest (gpg, digest); - gpg_ctx_set_armor (gpg, TRUE); - gpg_ctx_set_userid (gpg, userid); - gpg_ctx_set_istream (gpg, istream); - gpg_ctx_set_ostream (gpg, ostream); - - for (i = 0; i < recipients->len; i++) - gpg_ctx_add_recipient (gpg, recipients->pdata[i]); - - if (gpg_ctx_op_start (gpg, ctx->path) == -1) { - g_set_error (err, GMIME_ERROR, errno, - _("Failed to execute gpg: %s"), - errno ? g_strerror (errno) : _("Unknown")); - gpg_ctx_free (gpg); - - return -1; - } - - while (!gpg_ctx_op_complete (gpg)) { - if (gpg_ctx_op_step (gpg, err) == -1) { - gpg_ctx_op_cancel (gpg); - gpg_ctx_free (gpg); - - return -1; - } - } - - if (gpg_ctx_op_wait (gpg) != 0) { - const char *diagnostics; - int save; - - save = errno; - diagnostics = gpg_ctx_get_diagnostics (gpg); - errno = save; - - g_set_error_literal (err, GMIME_ERROR, errno, diagnostics); - gpg_ctx_free (gpg); - - return -1; - } - - gpg_ctx_free (gpg); - - return 0; -#else - g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, _("PGP support is not enabled in this build")); - - return -1; -#endif /* ENABLE_CRYPTOGRAPHY */ -} - - -static GMimeDecryptResult * -gpg_decrypt (GMimeCryptoContext *context, GMimeStream *istream, - GMimeStream *ostream, GError **err) -{ - return gpg_decrypt_session (context, NULL, istream, ostream, err); -} - -static GMimeDecryptResult * -gpg_decrypt_session (GMimeCryptoContext *context, const char *session_key, - GMimeStream *istream, GMimeStream *ostream, - GError **err) -{ -#ifdef ENABLE_CRYPTOGRAPHY - GMimeGpgContext *ctx = (GMimeGpgContext *) context; - GMimeDecryptResult *result; - const char *diagnostics; - struct _GpgCtx *gpg; - int save; - - gpg = gpg_ctx_new (ctx); - gpg_ctx_set_mode (gpg, GPG_CTX_MODE_DECRYPT); - gpg_ctx_set_use_agent (gpg, ctx->use_agent); - gpg_ctx_set_istream (gpg, istream); - gpg_ctx_set_ostream (gpg, ostream); - - if (session_key) - gpg->override_session_key = TRUE; - - if (gpg_ctx_op_start (gpg, ctx->path) == -1) { - g_set_error (err, GMIME_ERROR, errno, - _("Failed to execute gpg: %s"), - errno ? g_strerror (errno) : _("Unknown")); - gpg_ctx_free (gpg); - - return NULL; - } - - if (session_key && gpg_ctx_write_session_key (gpg, session_key)) { - g_set_error (err, GMIME_ERROR, errno, - _("Failed to pass session key to gpg: %s"), - errno ? g_strerror (errno) : _("Unknown")); - gpg_ctx_free (gpg); - - return NULL; - } - - while (!gpg_ctx_op_complete (gpg)) { - if (gpg_ctx_op_step (gpg, err) == -1) { - gpg_ctx_op_cancel (gpg); - gpg_ctx_free (gpg); - - return NULL; - } - } - - if (gpg_ctx_op_wait (gpg) != 0 && !gpg->decrypt_okay) { - save = errno; - diagnostics = gpg_ctx_get_diagnostics (gpg); - errno = save; - - g_set_error_literal (err, GMIME_ERROR, errno, diagnostics); - gpg_ctx_free (gpg); - - return NULL; - } - - result = g_mime_decrypt_result_new (); - result->recipients = gpg->encrypted_to; - result->signatures = gpg->signatures; - result->session_key = gpg->session_key; - result->cipher = gpg->cipher; - result->mdc = gpg->digest; - gpg->encrypted_to = NULL; - gpg->signatures = NULL; - gpg->session_key = NULL; - - gpg_ctx_free (gpg); - - return result; -#else - g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, _("PGP support is not enabled in this build")); - - return NULL; -#endif /* ENABLE_CRYPTOGRAPHY */ -} - -static int -gpg_import_keys (GMimeCryptoContext *context, GMimeStream *istream, GError **err) -{ -#ifdef ENABLE_CRYPTOGRAPHY - GMimeGpgContext *ctx = (GMimeGpgContext *) context; - struct _GpgCtx *gpg; - - gpg = gpg_ctx_new (ctx); - gpg_ctx_set_mode (gpg, GPG_CTX_MODE_IMPORT); - gpg_ctx_set_istream (gpg, istream); - - if (gpg_ctx_op_start (gpg, ctx->path) == -1) { - g_set_error (err, GMIME_ERROR, errno, - _("Failed to execute gpg: %s"), - errno ? g_strerror (errno) : _("Unknown")); - gpg_ctx_free (gpg); - - return -1; - } - - while (!gpg_ctx_op_complete (gpg)) { - if (gpg_ctx_op_step (gpg, err) == -1) { - gpg_ctx_op_cancel (gpg); - gpg_ctx_free (gpg); - - return -1; - } - } - - if (gpg_ctx_op_wait (gpg) != 0) { - const char *diagnostics; - int save; - - save = errno; - diagnostics = gpg_ctx_get_diagnostics (gpg); - errno = save; - - g_set_error_literal (err, GMIME_ERROR, errno, diagnostics); - gpg_ctx_free (gpg); - - return -1; - } - - gpg_ctx_free (gpg); - - return 0; -#else - g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, _("PGP support is not enabled in this build")); - - return -1; -#endif /* ENABLE_CRYPTOGRAPHY */ -} - -static int -gpg_export_keys (GMimeCryptoContext *context, GPtrArray *keys, GMimeStream *ostream, GError **err) -{ -#ifdef ENABLE_CRYPTOGRAPHY - GMimeGpgContext *ctx = (GMimeGpgContext *) context; - struct _GpgCtx *gpg; - guint i; - - gpg = gpg_ctx_new (ctx); - gpg_ctx_set_mode (gpg, GPG_CTX_MODE_EXPORT); - gpg_ctx_set_armor (gpg, TRUE); - gpg_ctx_set_ostream (gpg, ostream); - - for (i = 0; i < keys->len; i++) { - gpg_ctx_add_recipient (gpg, keys->pdata[i]); - } - - if (gpg_ctx_op_start (gpg, ctx->path) == -1) { - g_set_error (err, GMIME_ERROR, errno, - _("Failed to execute gpg: %s"), - errno ? g_strerror (errno) : _("Unknown")); - gpg_ctx_free (gpg); - - return -1; - } - - while (!gpg_ctx_op_complete (gpg)) { - if (gpg_ctx_op_step (gpg, err) == -1) { - gpg_ctx_op_cancel (gpg); - gpg_ctx_free (gpg); - - return -1; - } - } - - if (gpg_ctx_op_wait (gpg) != 0) { - const char *diagnostics; - int save; - - save = errno; - diagnostics = gpg_ctx_get_diagnostics (gpg); - errno = save; - - g_set_error_literal (err, GMIME_ERROR, errno, diagnostics); - gpg_ctx_free (gpg); - - return -1; - } - - gpg_ctx_free (gpg); - - return 0; -#else - g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, _("PGP support is not enabled in this build")); - - return -1; -#endif /* ENABLE_CRYPTOGRAPHY */ -} - -int -_g_mime_get_gpg_version (const char *path) -{ - const char vheader[] = "gpg (GnuPG) "; - int v, n = 0, version = 0; - const char *inptr; - char buffer[128]; - char *command; - FILE *gpg; - - g_return_val_if_fail (path != NULL, -1); - - command = g_strdup_printf ("%s --version", path); - gpg = popen (command, "r"); - g_free (command); - - if (gpg == NULL) - return -1; - - inptr = fgets (buffer, 128, gpg); - pclose (gpg); - - if (strncmp (inptr, vheader, sizeof (vheader) - 1) != 0) - return -1; - - inptr += sizeof (vheader) - 1; - while (*inptr >= '0' && *inptr <= '9' && n < 4) { - v = 0; - - while (*inptr >= '0' && *inptr <= '9' && (v < 25 || (v == 25 && *inptr < '6'))) { - v = (v * 10) + (*inptr - '0'); - inptr++; - } - - version = (version << 8) + v; - n++; - - if (*inptr != '.') - break; - - inptr++; - } - - if (n == 0) - return -1; - - if (n < 4) - version = version << ((4 - n) * 8); - - return version; -} - -/** - * g_mime_gpg_context_new: - * @request_passwd: a #GMimePasswordRequestFunc - * @path: path to gpg binary or %NULL for the default - * - * Creates a new gpg crypto context object. - * - * Returns: (transfer full): a new gpg crypto context object. - **/ -GMimeCryptoContext * -g_mime_gpg_context_new (GMimePasswordRequestFunc request_passwd, const char *path) -{ -#ifdef ENABLE_CRYPTOGRAPHY - GMimeCryptoContext *crypto; - GMimeGpgContext *ctx; - - ctx = g_object_newv (GMIME_TYPE_GPG_CONTEXT, 0, NULL); - ctx->path = g_strdup (path ? path : "gpg"); - - ctx->version = _g_mime_get_gpg_version (ctx->path); - - crypto = (GMimeCryptoContext *) ctx; - crypto->request_passwd = request_passwd; - - return crypto; -#else - return NULL; -#endif /* ENABLE_CRYPTOGRAPHY */ -} - - -/** - * g_mime_gpg_context_get_auto_key_retrieve: - * @ctx: a #GMimeGpgContext - * - * Gets whether or not gpg should auto-retrieve keys from a keyserver - * when verifying signatures. - * - * Returns: %TRUE if gpg should auto-retrieve keys from a keyserver or - * %FALSE otherwise. - **/ -gboolean -g_mime_gpg_context_get_auto_key_retrieve (GMimeGpgContext *ctx) -{ - g_return_val_if_fail (GMIME_IS_GPG_CONTEXT (ctx), FALSE); - - return ctx->auto_key_retrieve; -} - - -/** - * g_mime_gpg_context_set_auto_key_retrieve: - * @ctx: a #GMimeGpgContext - * @auto_key_retrieve: %TRUE if gpg should auto-retrieve keys from a keys server - * - * Sets whether or not gpg should auto-retrieve keys from a keyserver - * when verifying signatures. - **/ -void -g_mime_gpg_context_set_auto_key_retrieve (GMimeGpgContext *ctx, gboolean auto_key_retrieve) -{ - g_return_if_fail (GMIME_IS_GPG_CONTEXT (ctx)); - - ctx->auto_key_retrieve = auto_key_retrieve; -} - - -/** - * g_mime_gpg_context_get_always_trust: - * @ctx: a #GMimeGpgContext - * - * Gets whther or not gpg should always trust keys when encrypting. - * - * Returns: %TRUE if gpg should always trust keys when encrypting or - * %FALSE otherwise. - **/ -gboolean -g_mime_gpg_context_get_always_trust (GMimeGpgContext *ctx) -{ - g_return_val_if_fail (GMIME_IS_GPG_CONTEXT (ctx), FALSE); - - return ctx->always_trust; -} - - -/** - * g_mime_gpg_context_set_always_trust: - * @ctx: a #GMimeGpgContext - * @always_trust: %TRUE if gpg should always trust keys when encrypting - * - * Sets whether or not gpg should always trust keys when encrypting. - **/ -void -g_mime_gpg_context_set_always_trust (GMimeGpgContext *ctx, gboolean always_trust) -{ - g_return_if_fail (GMIME_IS_GPG_CONTEXT (ctx)); - - ctx->always_trust = always_trust; -} - - -/** - * g_mime_gpg_context_get_use_agent: - * @ctx: a #GMimeGpgContext - * - * Gets whether or not gpg should attempt to use the gpg-agent when - * requesting credentials. - * - * Returns: %TRUE if the gpg-agent should be used when requesting - * credentials or %FALSE otherwise. - **/ -gboolean -g_mime_gpg_context_get_use_agent (GMimeGpgContext *ctx) -{ - g_return_val_if_fail (GMIME_IS_GPG_CONTEXT (ctx), FALSE); - - return ctx->use_agent; -} - - -/** - * g_mime_gpg_context_set_use_agent: - * @ctx: a #GMimeGpgContext - * @use_agent: use agent flag - * - * Sets whether or not gpg should attempt to use the gpg-agent when - * requesting credentials. - **/ -void -g_mime_gpg_context_set_use_agent (GMimeGpgContext *ctx, gboolean use_agent) -{ - g_return_if_fail (GMIME_IS_GPG_CONTEXT (ctx)); - - ctx->use_agent = use_agent; -} - -static gboolean -gpg_get_retrieve_session_key (GMimeCryptoContext *context) -{ - GMimeGpgContext *ctx = (GMimeGpgContext *) context; - - g_return_val_if_fail (GMIME_IS_GPG_CONTEXT (ctx), FALSE); - - return ctx->retrieve_session_key; -} - - -static int -gpg_set_retrieve_session_key (GMimeCryptoContext *context, gboolean retrieve_session_key, - GError **err) -{ - GMimeGpgContext *ctx = (GMimeGpgContext *) context; - - if (!GMIME_IS_GPG_CONTEXT (ctx)) { - g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, - "Not a GMimeGpgContext, can't set retrieve_session_key"); - return -1; - } - - ctx->retrieve_session_key = retrieve_session_key; - - return 0; +#endif /* ENABLE_CRYPTO */ } diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-gpg-context.h gmime-3.0.1/gmime/gmime-gpg-context.h --- gmime-2.6.22+dfsg2/gmime/gmime-gpg-context.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-gpg-context.h 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -37,47 +37,9 @@ typedef struct _GMimeGpgContextClass GMimeGpgContextClass; -/** - * GMimeGpgContext: - * @parent_object: parent #GMimeCryptoContext - * @auto_key_retrieve: %TRUE if gpg should automatically retrieve unknown keys from the web - * @always_trust: %TRUE if keys should always be trusted - * @use_agent: %TRUE if gpg should use the gpg-agent for requesting passphrases - * @path: path to gpg - * @retrieve_session_key: %TRUE if session keys should be retrieved when decrypting - * @version: The GnuPG version. - * - * A GnuPG crypto context. - **/ -struct _GMimeGpgContext { - GMimeCryptoContext parent_object; - gboolean auto_key_retrieve; - gboolean always_trust; - gboolean use_agent; - char *path; - gboolean retrieve_session_key; - int version; -}; - -struct _GMimeGpgContextClass { - GMimeCryptoContextClass parent_class; - -}; - - GType g_mime_gpg_context_get_type (void); - -GMimeCryptoContext *g_mime_gpg_context_new (GMimePasswordRequestFunc request_passwd, const char *path); - -gboolean g_mime_gpg_context_get_auto_key_retrieve (GMimeGpgContext *ctx); -void g_mime_gpg_context_set_auto_key_retrieve (GMimeGpgContext *ctx, gboolean auto_key_retrieve); - -gboolean g_mime_gpg_context_get_always_trust (GMimeGpgContext *ctx); -void g_mime_gpg_context_set_always_trust (GMimeGpgContext *ctx, gboolean always_trust); - -gboolean g_mime_gpg_context_get_use_agent (GMimeGpgContext *ctx); -void g_mime_gpg_context_set_use_agent (GMimeGpgContext *ctx, gboolean use_agent); +GMimeCryptoContext *g_mime_gpg_context_new (void); G_END_DECLS diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-gpgme-utils.c gmime-3.0.1/gmime/gmime-gpgme-utils.c --- gmime-2.6.22+dfsg2/gmime/gmime-gpgme-utils.c 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-gpgme-utils.c 2017-04-08 17:01:10.000000000 +0000 @@ -0,0 +1,628 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2017 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "gmime-gpgme-utils.h" +#include "gmime-stream-pipe.h" +#include "gmime-error.h" + +#ifdef ENABLE_CRYPTO + +#define _(x) x + +static ssize_t +g_mime_gpgme_stream_read (void *stream, void *buffer, size_t size) +{ + return g_mime_stream_read ((GMimeStream *) stream, (char *) buffer, size); +} + +static ssize_t +g_mime_gpgme_stream_write (void *stream, const void *buffer, size_t size) +{ + return g_mime_stream_write ((GMimeStream *) stream, (const char *) buffer, size); +} + +static off_t +g_mime_gpgme_stream_seek (void *stream, off_t offset, int whence) +{ + switch (whence) { + case SEEK_SET: + return (off_t) g_mime_stream_seek ((GMimeStream *) stream, (gint64) offset, GMIME_STREAM_SEEK_SET); + case SEEK_CUR: + return (off_t) g_mime_stream_seek ((GMimeStream *) stream, (gint64) offset, GMIME_STREAM_SEEK_CUR); + case SEEK_END: + return (off_t) g_mime_stream_seek ((GMimeStream *) stream, (gint64) offset, GMIME_STREAM_SEEK_END); + default: + return -1; + } +} + +static void +g_mime_gpgme_stream_free (void *stream) +{ + /* no-op */ +} + +static struct gpgme_data_cbs gpg_stream_funcs = { + g_mime_gpgme_stream_read, + g_mime_gpgme_stream_write, + g_mime_gpgme_stream_seek, + g_mime_gpgme_stream_free +}; + +gpgme_error_t +g_mime_gpgme_passphrase_callback (void *hook, const char *uid_hint, const char *passphrase_info, int prev_was_bad, int fd) +{ + GMimeCryptoContext *context = (GMimeCryptoContext *) hook; + GMimeStream *stream; + gpgme_error_t error; + GError *err = NULL; + gboolean rv; + + stream = g_mime_stream_pipe_new (fd); + g_mime_stream_pipe_set_owner ((GMimeStreamPipe *) stream, FALSE); + rv = context->request_passwd (context, uid_hint, passphrase_info, prev_was_bad, stream, &err); + g_object_unref (stream); + + if (!rv) { + error = GPG_ERR_CANCELED; + g_error_free (err); + } else { + error = GPG_ERR_NO_ERROR; + } + + return error; +} + + +#define KEY_IS_OK(k) (!((k)->expired || (k)->revoked || (k)->disabled || (k)->invalid)) + +/* Note: this function based on code in Balsa written by Albrecht Dreß. */ +static gpgme_key_t +g_mime_gpgme_get_key_by_name (gpgme_ctx_t ctx, const char *name, gboolean secret, GError **err) +{ + time_t now = time (NULL); + gpgme_key_t key = NULL; + gpgme_subkey_t subkey; + gboolean bad = FALSE; + gpgme_error_t error; + int errval = 0; + + if ((error = gpgme_op_keylist_start (ctx, name, secret)) != GPG_ERR_NO_ERROR) { + if (secret) { + g_set_error (err, GMIME_GPGME_ERROR, error, + _("Could not list secret keys for \"%s\": %s"), + name, gpgme_strerror (error)); + } else { + g_set_error (err, GMIME_GPGME_ERROR, error, + _("Could not list keys for \"%s\": %s"), + name, gpgme_strerror (error)); + } + + return NULL; + } + + while ((error = gpgme_op_keylist_next (ctx, &key)) == GPG_ERR_NO_ERROR) { + /* check if this key and the relevant subkey are usable */ + if (KEY_IS_OK (key)) { + subkey = key->subkeys; + + while (subkey && ((secret && !subkey->can_sign) || (!secret && !subkey->can_encrypt))) + subkey = subkey->next; + + if (subkey) { + if (KEY_IS_OK (subkey) && (subkey->expires == 0 || subkey->expires > now)) + break; + + if (subkey->expired) + errval = GPG_ERR_KEY_EXPIRED; + else + errval = GPG_ERR_BAD_KEY; + } + } else { + if (key->expired) + errval = GPG_ERR_KEY_EXPIRED; + else + errval = GPG_ERR_BAD_KEY; + } + + gpgme_key_unref (key); + bad = TRUE; + key = NULL; + } + + gpgme_op_keylist_end (ctx); + + if (error != GPG_ERR_NO_ERROR && error != GPG_ERR_EOF) { + if (secret) { + g_set_error (err, GMIME_GPGME_ERROR, error, + _("Could not list secret keys for \"%s\": %s"), + name, gpgme_strerror (error)); + } else { + g_set_error (err, GMIME_GPGME_ERROR, error, + _("Could not list keys for \"%s\": %s"), + name, gpgme_strerror (error)); + } + + return NULL; + } + + if (!key) { + if (strchr (name, '@')) { + if (bad) { + g_set_error (err, GMIME_GPGME_ERROR, errval, + _("A key for %s is present, but it is expired, disabled, revoked or invalid"), + name); + } else { + g_set_error (err, GMIME_GPGME_ERROR, GPG_ERR_NOT_FOUND, + _("Could not find a key for %s"), name); + } + } else { + if (bad) { + g_set_error (err, GMIME_GPGME_ERROR, errval, + _("A key with id %s is present, but it is expired, disabled, revoked or invalid"), + name); + } else { + g_set_error (err, GMIME_GPGME_ERROR, GPG_ERR_NOT_FOUND, + _("Could not find a key with id %s"), name); + } + } + + return NULL; + } + + return key; +} + +static gboolean +g_mime_gpgme_add_signer (gpgme_ctx_t ctx, const char *signer, GError **err) +{ + gpgme_key_t key = NULL; + gpgme_error_t error; + + if (!(key = g_mime_gpgme_get_key_by_name (ctx, signer, TRUE, err))) + return FALSE; + + error = gpgme_signers_add (ctx, key); + gpgme_key_unref (key); + + if (error != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error,_("Failed to add signer \"%s\": %s"), + signer, gpgme_strerror (error)); + return FALSE; + } + + return TRUE; +} + +int +g_mime_gpgme_sign (gpgme_ctx_t ctx, gpgme_sig_mode_t mode, const char *userid, + GMimeStream *istream, GMimeStream *ostream, GError **err) +{ + gpgme_sign_result_t result; + gpgme_data_t input, output; + gpgme_error_t error; + + if (!g_mime_gpgme_add_signer (ctx, userid, err)) + return -1; + + if ((error = gpgme_data_new_from_cbs (&input, &gpg_stream_funcs, istream)) != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not open input stream: %s"), + gpgme_strerror (error)); + gpgme_signers_clear (ctx); + return -1; + } + + if ((error = gpgme_data_new_from_cbs (&output, &gpg_stream_funcs, ostream)) != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not open output stream: %s"), + gpgme_strerror (error)); + gpgme_data_release (input); + gpgme_signers_clear (ctx); + return -1; + } + + /* sign the input stream */ + error = gpgme_op_sign (ctx, input, output, mode); + gpgme_data_release (output); + gpgme_data_release (input); + gpgme_signers_clear (ctx); + + if (error != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error, _("Signing failed: %s"), gpgme_strerror (error)); + return -1; + } + + /* return the digest algorithm used for signing */ + result = gpgme_op_sign_result (ctx); + + return (GMimeDigestAlgo) result->signatures->hash_algo; +} + +static GMimeSignatureList * +g_mime_gpgme_get_signatures (gpgme_ctx_t ctx, gboolean verify) +{ + GMimeSignatureList *signatures; + GMimeSignature *signature; + gpgme_verify_result_t result; + gpgme_signature_t sig; + gpgme_subkey_t subkey; + gpgme_user_id_t uid; + gpgme_key_t key; + + /* get the signature verification results from GpgMe */ + if (!(result = gpgme_op_verify_result (ctx)) || !result->signatures) + return verify ? g_mime_signature_list_new () : NULL; + + /* create a new signature list to return */ + signatures = g_mime_signature_list_new (); + + sig = result->signatures; + + while (sig != NULL) { + signature = g_mime_signature_new (); + g_mime_signature_list_add (signatures, signature); + g_mime_signature_set_status (signature, (GMimeSignatureStatus) sig->summary); + g_mime_signature_set_expires (signature, sig->exp_timestamp); + g_mime_signature_set_created (signature, sig->timestamp); + + g_mime_certificate_set_pubkey_algo (signature->cert, (GMimePubKeyAlgo) sig->pubkey_algo); + g_mime_certificate_set_digest_algo (signature->cert, (GMimeDigestAlgo) sig->hash_algo); + g_mime_certificate_set_fingerprint (signature->cert, sig->fpr); + + if (gpgme_get_key (ctx, sig->fpr, &key, 0) == GPG_ERR_NO_ERROR && key) { + /* get more signer info from their signing key */ + g_mime_certificate_set_trust (signature->cert, (GMimeTrust) key->owner_trust); + g_mime_certificate_set_issuer_serial (signature->cert, key->issuer_serial); + g_mime_certificate_set_issuer_name (signature->cert, key->issuer_name); + + /* get the keyid, name, and email address */ + uid = key->uids; + while (uid) { + if (uid->name && *uid->name) + g_mime_certificate_set_name (signature->cert, uid->name); + + if (uid->email && *uid->email) + g_mime_certificate_set_email (signature->cert, uid->email); + + if (uid->uid && *uid->uid) + g_mime_certificate_set_key_id (signature->cert, uid->uid); + + if (signature->cert->name && signature->cert->email && signature->cert->keyid) + break; + + uid = uid->next; + } + + /* get the subkey used for signing */ + subkey = key->subkeys; + while (subkey && !subkey->can_sign) + subkey = subkey->next; + + if (subkey) { + g_mime_certificate_set_created (signature->cert, subkey->timestamp); + g_mime_certificate_set_expires (signature->cert, subkey->expires); + } + + gpgme_key_unref (key); + } else { + /* If we don't have the signer's public key, then we can't tell what + * the status is, so set it to ERROR if it hasn't already been + * designated as BAD. */ + g_mime_certificate_set_trust (signature->cert, GMIME_TRUST_UNDEFINED); + } + + sig = sig->next; + } + + return signatures; +} + +GMimeSignatureList * +g_mime_gpgme_verify (gpgme_ctx_t ctx, GMimeVerifyFlags flags, GMimeStream *istream, GMimeStream *sigstream, + GMimeStream *ostream, GError **err) +{ + gpgme_data_t sig, signed_text, plain; + gpgme_error_t error; + + if (sigstream != NULL) { + /* if @sigstream is non-NULL, then it is a detached signature */ + if ((error = gpgme_data_new_from_cbs (&signed_text, &gpg_stream_funcs, istream)) != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not open input stream: %s"), + gpgme_strerror (error)); + return NULL; + } + + if ((error = gpgme_data_new_from_cbs (&sig, &gpg_stream_funcs, sigstream)) != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not open signature stream: %s"), + gpgme_strerror (error)); + gpgme_data_release (signed_text); + return NULL; + } + + plain = NULL; + } else if (ostream != NULL) { + /* if @ostream is non-NULL, then we are expected to write the extracted plaintext to it */ + if ((error = gpgme_data_new_from_cbs (&sig, &gpg_stream_funcs, istream)) != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not open input stream: %s"), + gpgme_strerror (error)); + return NULL; + } + + if ((error = gpgme_data_new_from_cbs (&plain, &gpg_stream_funcs, ostream)) != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not open output stream: %s"), + gpgme_strerror (error)); + gpgme_data_release (sig); + return NULL; + } + + signed_text = NULL; + } else { + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_GENERAL, _("Missing signature stream or output stream")); + return NULL; + } + + error = gpgme_op_verify (ctx, sig, signed_text, plain); + if (signed_text) + gpgme_data_release (signed_text); + if (plain) + gpgme_data_release (plain); + gpgme_data_release (sig); + + if (error != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not verify signature: %s"), + gpgme_strerror (error)); + return NULL; + } + + /* get/return the signatures */ + return g_mime_gpgme_get_signatures (ctx, TRUE); +} + +static void +g_mime_gpgme_keylist_free (gpgme_key_t *keys) +{ + gpgme_key_t *key = keys; + + while (*key != NULL) { + gpgme_key_unref (*key); + key++; + } + + g_free (keys); +} + +int +g_mime_gpgme_encrypt (gpgme_ctx_t ctx, gboolean sign, const char *userid, + GMimeEncryptFlags flags, GPtrArray *recipients, + GMimeStream *istream, GMimeStream *ostream, + GError **err) +{ + gpgme_encrypt_flags_t encrypt_flags = (gpgme_encrypt_flags_t) flags; + gpgme_data_t input, output; + gpgme_error_t error; + gpgme_key_t *rcpts; + gpgme_key_t key; + guint i; + + /* create an array of recipient keys for GpgMe */ + rcpts = g_new0 (gpgme_key_t, recipients->len + 1); + for (i = 0; i < recipients->len; i++) { + if (!(key = g_mime_gpgme_get_key_by_name (ctx, recipients->pdata[i], FALSE, err))) { + g_mime_gpgme_keylist_free (rcpts); + return -1; + } + + rcpts[i] = key; + } + + if ((error = gpgme_data_new_from_cbs (&input, &gpg_stream_funcs, istream)) != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not open input stream: %s"), + gpgme_strerror (error)); + g_mime_gpgme_keylist_free (rcpts); + return -1; + } + + if ((error = gpgme_data_new_from_cbs (&output, &gpg_stream_funcs, ostream)) != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not open output stream: %s"), + gpgme_strerror (error)); + g_mime_gpgme_keylist_free (rcpts); + gpgme_data_release (input); + return -1; + } + + /* encrypt the input stream */ + if (sign) { + if (!g_mime_gpgme_add_signer (ctx, userid, err)) { + g_mime_gpgme_keylist_free (rcpts); + gpgme_data_release (output); + gpgme_data_release (input); + return -1; + } + + error = gpgme_op_encrypt_sign (ctx, rcpts, encrypt_flags, input, output); + + gpgme_signers_clear (ctx); + } else { + error = gpgme_op_encrypt (ctx, rcpts, encrypt_flags, input, output); + } + + g_mime_gpgme_keylist_free (rcpts); + gpgme_data_release (output); + gpgme_data_release (input); + + if (error != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error, _("Encryption failed: %s"), gpgme_strerror (error)); + return -1; + } + + return 0; +} + +static GMimeDecryptResult * +g_mime_gpgme_get_decrypt_result (gpgme_ctx_t ctx) +{ + GMimeDecryptResult *result; + gpgme_decrypt_result_t res; + gpgme_recipient_t recipient; + GMimeCertificate *cert; + + result = g_mime_decrypt_result_new (); + result->recipients = g_mime_certificate_list_new (); + result->signatures = g_mime_gpgme_get_signatures (ctx, FALSE); + + // TODO: ciper, mdc + + if (!(res = gpgme_op_decrypt_result (ctx)) || !res->recipients) + return result; + +#if GPGME_VERSION_NUMBER >= 0x010800 + if (res->session_key) + result->session_key = g_strdup (res->session_key); +#endif + + recipient = res->recipients; + while (recipient != NULL) { + cert = g_mime_certificate_new (); + g_mime_certificate_list_add (result->recipients, cert); + + g_mime_certificate_set_pubkey_algo (cert, (GMimePubKeyAlgo) recipient->pubkey_algo); + g_mime_certificate_set_key_id (cert, recipient->keyid); + + recipient = recipient->next; + } + + return result; +} + +GMimeDecryptResult * +g_mime_gpgme_decrypt (gpgme_ctx_t ctx, GMimeDecryptFlags flags, const char *session_key, + GMimeStream *istream, GMimeStream *ostream, GError **err) +{ + GMimeDecryptResult *result; + gpgme_decrypt_result_t res; + gpgme_data_t input, output; + gpgme_error_t error; + + if ((error = gpgme_data_new_from_cbs (&input, &gpg_stream_funcs, istream)) != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not open input stream: %s"), + gpgme_strerror (error)); + return NULL; + } + + if ((error = gpgme_data_new_from_cbs (&output, &gpg_stream_funcs, ostream)) != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not open output stream: %s"), + gpgme_strerror (error)); + gpgme_data_release (input); + return NULL; + } + +#if GPGME_VERSION_NUMBER >= 0x010800 + if (flags & GMIME_DECRYPT_EXPORT_SESSION_KEY) + gpgme_set_ctx_flag (ctx, "export-session-key", "1"); + + if (session_key) + gpgme_set_ctx_flag (ctx, "override-session-key", session_key); +#endif + + /* decrypt the input stream */ + if (gpgme_get_protocol (ctx) == GPGME_PROTOCOL_OpenPGP) + error = gpgme_op_decrypt_verify (ctx, input, output); + else + error = gpgme_op_decrypt (ctx, input, output); + +#if GPGME_VERSION_NUMBER >= 0x010800 + if (flags & GMIME_DECRYPT_EXPORT_SESSION_KEY) + gpgme_set_ctx_flag (ctx, "export-session-key", "0"); + + if (session_key) + gpgme_set_ctx_flag (ctx, "override-session-key", NULL); +#endif + + gpgme_data_release (output); + gpgme_data_release (input); + + if (error != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error, _("Decryption failed: %s"), gpgme_strerror (error)); + return NULL; + } + + return g_mime_gpgme_get_decrypt_result (ctx); +} + +int +g_mime_gpgme_import (gpgme_ctx_t ctx, GMimeStream *istream, GError **err) +{ + gpgme_import_result_t result; + gpgme_data_t keydata; + gpgme_error_t error; + + if ((error = gpgme_data_new_from_cbs (&keydata, &gpg_stream_funcs, istream)) != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not open input stream: %s"), + gpgme_strerror (error)); + return -1; + } + + /* import the key(s) */ + error = gpgme_op_import (ctx, keydata); + gpgme_data_release (keydata); + + if (error != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not import key data: %s"), + gpgme_strerror (error)); + return -1; + } + + result = gpgme_op_import_result (ctx); + + return result->imported; +} + +int +g_mime_gpgme_export (gpgme_ctx_t ctx, const char *keys[], GMimeStream *ostream, GError **err) +{ + gpgme_data_t keydata; + gpgme_error_t error; + guint i; + + if ((error = gpgme_data_new_from_cbs (&keydata, &gpg_stream_funcs, ostream)) != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not open output stream: %s"), + gpgme_strerror (error)); + return -1; + } + + /* export the key(s) */ + error = gpgme_op_export_ext (ctx, keys, 0, keydata); + gpgme_data_release (keydata); + + if (error != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not export key data: %s"), + gpgme_strerror (error)); + return -1; + } + + return 0; +} + +#endif /* ENABLE_CRYPTO */ diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-gpgme-utils.h gmime-3.0.1/gmime/gmime-gpgme-utils.h --- gmime-2.6.22+dfsg2/gmime/gmime-gpgme-utils.h 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-gpgme-utils.h 2017-03-13 22:50:07.000000000 +0000 @@ -0,0 +1,59 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2017 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_GPGME_UTILS_H__ +#define __GMIME_GPGME_UTILS_H__ + +#ifdef ENABLE_CRYPTO + +#include +#include +#include + +G_BEGIN_DECLS + +G_GNUC_INTERNAL gpgme_error_t g_mime_gpgme_passphrase_callback (void *hook, const char *uid_hint, + const char *passphrase_info, + int prev_was_bad, int fd); + +G_GNUC_INTERNAL int g_mime_gpgme_sign (gpgme_ctx_t ctx, gpgme_sig_mode_t mode, const char *userid, + GMimeStream *istream, GMimeStream *ostream, GError **err); + +G_GNUC_INTERNAL GMimeSignatureList *g_mime_gpgme_verify (gpgme_ctx_t ctx, GMimeVerifyFlags flags, GMimeStream *istream, + GMimeStream *sigstream, GMimeStream *ostream, GError **err); + +G_GNUC_INTERNAL int g_mime_gpgme_encrypt (gpgme_ctx_t ctx, gboolean sign, const char *userid, + GMimeEncryptFlags flags, GPtrArray *recipients, + GMimeStream *istream, GMimeStream *ostream, + GError **err); + +G_GNUC_INTERNAL GMimeDecryptResult *g_mime_gpgme_decrypt (gpgme_ctx_t ctx, GMimeDecryptFlags flags, const char *session_key, + GMimeStream *istream, GMimeStream *ostream, GError **err); + +G_GNUC_INTERNAL int g_mime_gpgme_import (gpgme_ctx_t ctx, GMimeStream *istream, GError **err); + +G_GNUC_INTERNAL int g_mime_gpgme_export (gpgme_ctx_t ctx, const char *keys[], GMimeStream *ostream, GError **err); + +G_END_DECLS + +#endif /* ENABLE_CRYPTO */ + +#endif /* __GMIME_GPGME_UTILS_H__ */ diff -Nru gmime-2.6.22+dfsg2/gmime/gmime.h gmime-3.0.1/gmime/gmime.h --- gmime-2.6.22+dfsg2/gmime/gmime.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime.h 2017-03-28 23:46:26.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -34,7 +34,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -43,8 +45,11 @@ #include #include #include +#include +#include #include #include +#include #include #include #include @@ -60,13 +65,15 @@ #include #include #include -#include +#include +#include #include #include #include #include -#include +#include #include +#include #include #include #include @@ -114,27 +121,7 @@ gboolean g_mime_check_version (guint major, guint minor, guint micro); - -/** - * GMIME_ENABLE_RFC2047_WORKAROUNDS: - * - * Initialization flag to enable workarounds for badly formed rfc2047 - * encoded-words. - **/ -#define GMIME_ENABLE_RFC2047_WORKAROUNDS (1 << 0) - -/** - * GMIME_ENABLE_USE_ONLY_USER_CHARSETS: - * - * Initialization flag that hints to the rfc2047 encoder to use only - * the configured user-charsets (set via g_mime_set_user_charsets()) - * instead of trying to first use iso-8859-1. - * - * Since: 2.6.16 - **/ -#define GMIME_ENABLE_USE_ONLY_USER_CHARSETS (1 << 1) - -void g_mime_init (guint32 flags); +void g_mime_init (void); void g_mime_shutdown (void); G_END_DECLS diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-header.c gmime-3.0.1/gmime/gmime-header.c --- gmime-2.6.22+dfsg2/gmime/gmime-header.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-header.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -26,18 +26,22 @@ #include #include +#include "gmime-stream-filter.h" +#include "gmime-table-private.h" +#include "gmime-parse-utils.h" #include "gmime-stream-mem.h" +#include "internet-address.h" +#include "gmime-references.h" +#include "gmime-internal.h" #include "gmime-common.h" #include "gmime-header.h" #include "gmime-events.h" #include "gmime-utils.h" -#include "list.h" - /** * SECTION: gmime-header - * @title: GMimeHeader + * @title: GMimeHeaderList * @short_description: Message and MIME part headers * @see_also: #GMimeObject * @@ -46,43 +50,110 @@ **/ -/** - * GMimeHeader: - * @next: pointer to the next header - * @prev: pointer to the previous header - * @offset: file/stream offset - * @name: header name - * @value: header value - * - * A message/rfc822 header. - **/ - -struct _GMimeHeader { - GMimeHeader *next; - GMimeHeader *prev; - /*gint64 offset;*/ - char *name; - char *value; +static struct { + const char *name; + GMimeHeaderRawValueFormatter formatter; +} formatters[] = { + { "Received", g_mime_header_format_received }, + { "Sender", g_mime_header_format_addrlist }, + { "From", g_mime_header_format_addrlist }, + { "Reply-To", g_mime_header_format_addrlist }, + { "To", g_mime_header_format_addrlist }, + { "Cc", g_mime_header_format_addrlist }, + { "Bcc", g_mime_header_format_addrlist }, + { "Message-Id", g_mime_header_format_message_id }, + { "In-Reply-To", g_mime_header_format_references }, + { "References", g_mime_header_format_references }, + { "Resent-Sender", g_mime_header_format_addrlist }, + { "Resent-From", g_mime_header_format_addrlist }, + { "Resent-Reply-To", g_mime_header_format_addrlist }, + { "Resent-To", g_mime_header_format_addrlist }, + { "Resent-Cc", g_mime_header_format_addrlist }, + { "Resent-Bcc", g_mime_header_format_addrlist }, + { "Resent-Message-Id", g_mime_header_format_message_id }, + { "Content-Type", g_mime_header_format_content_type }, + { "Content-Disposition", g_mime_header_format_content_disposition }, + { "Content-Id", g_mime_header_format_message_id }, + { "Disposition-Notification-To", g_mime_header_format_addrlist }, }; -struct _GMimeHeaderList { - GMimeStream *stream; - GHashTable *writers; - GMimeEvent *changed; - GHashTable *hash; - guint32 version; - List list; -}; +static void g_mime_header_class_init (GMimeHeaderClass *klass); +static void g_mime_header_init (GMimeHeader *header, GMimeHeaderClass *klass); +static void g_mime_header_finalize (GObject *object); + +static GObjectClass *parent_class = NULL; + + +GType +g_mime_header_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeHeaderClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_header_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeHeader), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_header_init, + }; + + type = g_type_register_static (G_TYPE_OBJECT, "GMimeHeader", &info, 0); + } + + return type; +} + +static void +g_mime_header_class_init (GMimeHeaderClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_ref (G_TYPE_OBJECT); + + object_class->finalize = g_mime_header_finalize; +} + +static void +g_mime_header_init (GMimeHeader *header, GMimeHeaderClass *klass) +{ + header->changed = g_mime_event_new (header); + header->formatter = NULL; + header->options = NULL; + header->raw_value = NULL; + header->raw_name = NULL; + header->value = NULL; + header->name = NULL; + header->offset = -1; +} -static GMimeHeader *g_mime_header_new (const char *name, const char *value, gint64 offset); -static void g_mime_header_free (GMimeHeader *header); +static void +g_mime_header_finalize (GObject *object) +{ + GMimeHeader *header = (GMimeHeader *) object; + + g_mime_event_free (header->changed); + g_free (header->raw_value); + g_free (header->raw_name); + g_free (header->value); + g_free (header->name); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} /** * g_mime_header_new: + * @options: (nullable): a #GMimeParserOptions or %NULL * @name: header name * @value: header value + * @raw_value: raw header value + * @charset: a charset * @offset: file/stream offset for the start of the header (or %-1 if unknown) * * Creates a new #GMimeHeader. @@ -90,519 +161,951 @@ * Returns: a new #GMimeHeader with the specified values. **/ static GMimeHeader * -g_mime_header_new (const char *name, const char *value, gint64 offset) +g_mime_header_new (GMimeParserOptions *options, const char *name, const char *value, + const char *raw_name, const char *raw_value, const char *charset, + gint64 offset) { + GMimeHeaderRawValueFormatter formatter; GMimeHeader *header; + guint i; - header = g_slice_new (GMimeHeader); + header = g_object_new (GMIME_TYPE_HEADER, NULL); + header->raw_value = raw_value ? g_strdup (raw_value) : NULL; + header->value = value ? g_strdup (value) : NULL; + header->raw_name = g_strdup (raw_name); header->name = g_strdup (name); - header->value = g_strdup (value); - /*header->offset = offset;*/ - header->next = NULL; - header->prev = NULL; + header->options = options; + header->offset = offset; + + formatter = g_mime_header_format_default; + for (i = 0; i < G_N_ELEMENTS (formatters); i++) { + if (!g_ascii_strcasecmp (formatters[i].name, name)) { + formatter = header->formatter = formatters[i].formatter; + break; + } + } + + if (!raw_value && value) + header->raw_value = formatter (header, NULL, header->value, charset); return header; } /** - * g_mime_header_free: + * g_mime_header_get_name: * @header: a #GMimeHeader * - * Frees a single #GMimeHeader node. + * Gets the header's name. + * + * Returns: the header name or %NULL if invalid. **/ -static void -g_mime_header_free (GMimeHeader *header) +const char * +g_mime_header_get_name (GMimeHeader *header) { - g_free (header->name); - g_free (header->value); + g_return_val_if_fail (GMIME_IS_HEADER (header), NULL); - g_slice_free (GMimeHeader, header); + return header->name; } -/** - * g_mime_header_iter_new: - * - * Dynamically allocates a #GMimeHeaderIter on the heap. This is - * intended for use in language bindings but may also be useful in - * applications as well. You must free this iter with - * g_mime_header_iter_free(). - * - * Returns: a newly-allocated #GMimeHeaderIter. - **/ -GMimeHeaderIter * -g_mime_header_iter_new (void) +static char * +unfold (const char *value) { - GMimeHeaderIter *iter; + register const char *inptr = value; + const char *start, *inend; + char *str, *outptr; - iter = g_slice_new (GMimeHeaderIter); - iter->hdrlist = NULL; - iter->cursor = NULL; - iter->version = 0; + while (is_lwsp (*inptr)) + inptr++; - return iter; + inend = start = inptr; + while (*inptr) { + if (!is_lwsp (*inptr++)) + inend = inptr; + } + + outptr = str = g_malloc ((size_t) (inend - start) + 1); + inptr = start; + + while (inptr < inend) { + if (*inptr != '\r' && *inptr != '\n') + *outptr++ = *inptr; + inptr++; + } + + *outptr = '\0'; + + return str; } /** - * g_mime_header_iter_copy: - * @iter: a #GMimeHeaderIter + * g_mime_header_get_value: + * @header: a #GMimeHeader + * + * Gets the header's value. * - * Creates a dynamically allocated header iterator as a copy of - * @iter. You must free this iter with g_mime_header_iter_free(). + * Returns: the header's raw, unprocessed value or %NULL if invalid. * - * Returns: a newly-allocated copy of @iter. + * Note: The returned value should be decoded with a function such as + * g_mime_utils_header_decode_text() before displaying to the user. **/ -GMimeHeaderIter * -g_mime_header_iter_copy (GMimeHeaderIter *iter) +const char * +g_mime_header_get_value (GMimeHeader *header) { - GMimeHeaderIter *copy; + char *buf; - g_return_val_if_fail (iter != NULL, NULL); + g_return_val_if_fail (GMIME_IS_HEADER (header), NULL); - copy = g_mime_header_iter_new (); - memcpy (copy, iter, sizeof (GMimeHeaderIter)); + if (!header->value && header->raw_value) { + buf = unfold (header->raw_value); + header->value = g_mime_utils_header_decode_text (header->options, buf); + g_free (buf); + } - return copy; + return header->value; } /** - * g_mime_header_iter_copy_to: - * @src: a #GMimeHeaderIter - * @dest: a #GMimeHeaderIter + * g_mime_header_set_value: + * @header: a #GMimeHeader + * @options: (nullable): a #GMimeFormatOptions or %NULL + * @value: the new header value + * @charset: a charset * - * Copies @src to @dest. + * Sets the header's value. **/ void -g_mime_header_iter_copy_to (GMimeHeaderIter *src, GMimeHeaderIter *dest) +g_mime_header_set_value (GMimeHeader *header, GMimeFormatOptions *options, const char *value, const char *charset) { - g_return_if_fail (dest != NULL); - g_return_if_fail (src != NULL); + GMimeHeaderRawValueFormatter formatter; + char *buf; + + g_return_if_fail (GMIME_IS_HEADER (header)); + g_return_if_fail (value != NULL); + + formatter = header->formatter ? header->formatter : g_mime_header_format_default; + buf = g_mime_strdup_trim (value); + g_free (header->raw_value); + g_free (header->value); + + header->raw_value = formatter (header, options, buf, charset); + header->value = buf; - memcpy (dest, src, sizeof (GMimeHeaderIter)); + g_mime_event_emit (header->changed, NULL); } /** - * g_mime_header_iter_free: - * @iter: a #GMimeHeaderIter + * g_mime_header_get_raw_name: + * @header: a #GMimeHeader + * + * Gets the header's raw name. The raw header name is the complete string up to + * (but not including) the ':' separating the header's name from its value. This + * string may be different from the value returned by g_mime_header_get_name() + * if the parsed message's header contained trailing whitespace after the header + * name, such as: "Subject : this is the subject\r\n". * - * Frees a dynamically-allocated #GMimeHeaderIter as created by - * g_mime_header_iter_new() or g_mime_header_iter_copy(). + * Returns: the raw header name. **/ -void -g_mime_header_iter_free (GMimeHeaderIter *iter) +const char * +g_mime_header_get_raw_name (GMimeHeader *header) { - g_return_if_fail (iter != NULL); + g_return_val_if_fail (GMIME_IS_HEADER (header), NULL); - g_slice_free (GMimeHeaderIter, iter); + return header->raw_name; } /** - * g_mime_header_iter_equal: - * @iter1: a #GMimeHeaderIter - * @iter2: a #GMimeHeaderIter + * g_mime_header_get_raw_value: + * @header: a #GMimeHeader * - * Check that @iter1 and @iter2 reference the same header. + * Gets the header's raw (folded) value. * - * Returns: %TRUE if @iter1 and @iter2 refer to the same header or - * %FALSE otherwise. + * Returns: the header value or %NULL if invalid. **/ -gboolean -g_mime_header_iter_equal (GMimeHeaderIter *iter1, GMimeHeaderIter *iter2) +const char * +g_mime_header_get_raw_value (GMimeHeader *header) +{ + g_return_val_if_fail (GMIME_IS_HEADER (header), NULL); + + return header->raw_value; +} + + +void +_g_mime_header_set_raw_value (GMimeHeader *header, const char *raw_value) { - g_return_val_if_fail (iter1 != NULL, FALSE); - g_return_val_if_fail (iter2 != NULL, FALSE); + char *buf = g_strdup (raw_value); - return iter1->hdrlist == iter2->hdrlist && - iter1->version == iter2->version && - iter1->cursor == iter2->cursor; + g_free (header->raw_value); + g_free (header->value); + + header->raw_value = buf; + header->value = NULL; } /** - * g_mime_header_iter_is_valid: - * @iter: a #GMimeHeaderIter - * - * Checks if a #GMimeHeaderIter is valid. An iterator may become - * invalid if the #GMimeHeaderList that the iterator refers to - * changes. + * g_mime_header_set_raw_value: + * @header: a #GMimeHeader + * @raw_value: the raw value * - * Returns: %TRUE if @iter is still valid or %FALSE otherwise. + * Sets the header's raw value. **/ -gboolean -g_mime_header_iter_is_valid (GMimeHeaderIter *iter) +void +g_mime_header_set_raw_value (GMimeHeader *header, const char *raw_value) { - g_return_val_if_fail (iter != NULL, FALSE); + char *buf; - if (!iter->hdrlist || iter->version != iter->hdrlist->version) - return FALSE; + g_return_if_fail (GMIME_IS_HEADER (header)); + g_return_if_fail (raw_value != NULL); - if (!iter->cursor || !iter->cursor->next) - return FALSE; + buf = g_strdup (raw_value); + g_free (header->raw_value); + g_free (header->value); - return TRUE; + header->raw_value = buf; + header->value = NULL; + + g_mime_event_emit (header->changed, NULL); } /** - * g_mime_header_iter_first: - * @iter: a #GMimeHeaderIter + * g_mime_header_get_offset: + * @header: a #GMimeHeader * - * Updates @iter to point to the first header. + * Gets the header's stream offset if known. * - * Returns: %TRUE on success or %FALSE otherwise. + * Returns: the header offset or %-1 if unknown. **/ -gboolean -g_mime_header_iter_first (GMimeHeaderIter *iter) +gint64 +g_mime_header_get_offset (GMimeHeader *header) { - GMimeHeader *first; - - g_return_val_if_fail (iter != NULL, FALSE); - - /* make sure we can actually do as requested */ - if (!iter->hdrlist || list_is_empty (&iter->hdrlist->list)) - return FALSE; - - first = (GMimeHeader *) iter->hdrlist->list.head; - - iter->version = iter->hdrlist->version; - iter->cursor = first; + g_return_val_if_fail (GMIME_IS_HEADER (header), -1); - return TRUE; + return header->offset; +} + + +void +_g_mime_header_set_offset (GMimeHeader *header, gint64 offset) +{ + header->offset = offset; } /** - * g_mime_header_iter_last: - * @iter: a #GMimeHeaderIter + * g_mime_header_write_to_stream: + * @header: a #GMimeHeader + * @options: (nullable): a #GMimeFormatOptions or %NULL + * @stream: a #GMimeStream * - * Updates @iter to point to the last header. + * Write the header to the specified stream. * - * Returns: %TRUE on success or %FALSE otherwise. + * Returns: the number of bytes written, or %-1 on fail. **/ -gboolean -g_mime_header_iter_last (GMimeHeaderIter *iter) +ssize_t +g_mime_header_write_to_stream (GMimeHeader *header, GMimeFormatOptions *options, GMimeStream *stream) { - GMimeHeader *last; + ssize_t nwritten, total = 0; + char *val; - g_return_val_if_fail (iter != NULL, FALSE); + g_return_val_if_fail (GMIME_IS_HEADER (header), -1); + g_return_val_if_fail (GMIME_IS_STREAM (stream), -1); - /* make sure we can actually do as requested */ - if (!iter->hdrlist || list_is_empty (&iter->hdrlist->list)) - return FALSE; + if (!header->raw_value) + return 0; + + val = g_strdup_printf ("%s:%s", header->raw_name, header->raw_value); + nwritten = g_mime_stream_write_string (stream, val); + g_free (val); - last = (GMimeHeader *) iter->hdrlist->list.tailpred; + if (nwritten == -1) + return -1; - iter->version = iter->hdrlist->version; - iter->cursor = last; + total += nwritten; - return TRUE; + return total; } /** - * g_mime_header_iter_next: - * @iter: a #GMimeHeaderIter + * g_mime_header_format_content_disposition: + * @header: a #GMimeHeader + * @options: (nullable): a #GMimeFormatOptions or %NULL + * @value: a Content-Disposition header value + * @charset: a charset (note: unused) * - * Advances to the next header. + * Parses the @value and then re-formats it to conform to the formatting options, + * folding the value if necessary. * - * Returns: %TRUE on success or %FALSE otherwise. + * Returns: a newly allocated string containing the reformatted value. **/ -gboolean -g_mime_header_iter_next (GMimeHeaderIter *iter) +char * +g_mime_header_format_content_disposition (GMimeHeader *header, GMimeFormatOptions *options, const char *value, const char *charset) { - GMimeHeader *next; + GMimeContentDisposition *disposition; + GString *str; + guint n; - g_return_val_if_fail (iter != NULL, FALSE); + str = g_string_new (header->raw_name); + g_string_append_c (str, ':'); + n = str->len; - /* make sure current cursor is valid */ - if (!g_mime_header_iter_is_valid (iter)) - return FALSE; + g_string_append_c (str, ' '); - /* make sure next item is valid */ - next = iter->cursor->next; - if (!next->next) - return FALSE; + disposition = g_mime_content_disposition_parse (header->options, value); + g_string_append (str, disposition->disposition); - iter->cursor = next; + g_mime_param_list_encode (disposition->params, options, TRUE, str); + g_object_unref (disposition); - return TRUE; + memmove (str->str, str->str + n, (str->len - n) + 1); + + return g_string_free (str, FALSE); } /** - * g_mime_header_iter_prev: - * @iter: a #GMimeHeaderIter + * g_mime_header_format_content_type: + * @header: a #GMimeHeader + * @options: (nullable): a #GMimeFormatOptions or %NULL + * @value: a Content-Type header value + * @charset: a charset (note: unused) * - * Advances to the previous header. + * Parses the @value and then re-formats it to conform to the formatting options, + * folding the value if necessary. * - * Returns: %TRUE on success or %FALSE otherwise. + * Returns: a newly allocated string containing the reformatted value. **/ -gboolean -g_mime_header_iter_prev (GMimeHeaderIter *iter) +char * +g_mime_header_format_content_type (GMimeHeader *header, GMimeFormatOptions *options, const char *value, const char *charset) { - GMimeHeader *prev; + GMimeContentType *content_type; + GString *str; + guint n; - g_return_val_if_fail (iter != NULL, FALSE); + str = g_string_new (header->raw_name); + g_string_append_c (str, ':'); + n = str->len; - /* make sure current cursor is valid */ - if (!g_mime_header_iter_is_valid (iter)) - return FALSE; + content_type = g_mime_content_type_parse (header->options, value); - /* make sure prev item is valid */ - prev = iter->cursor->prev; - if (!prev || !prev->prev) - return FALSE; + g_string_append_c (str, ' '); + g_string_append (str, content_type->type ? content_type->type : "text"); + g_string_append_c (str, '/'); + g_string_append (str, content_type->subtype ? content_type->subtype : "plain"); - iter->cursor = prev; + g_mime_param_list_encode (content_type->params, options, TRUE, str); + g_object_unref (content_type); - return TRUE; + memmove (str->str, str->str + n, (str->len - n) + 1); + + return g_string_free (str, FALSE); } -#if 0 /** - * g_mime_header_iter_get_offset: - * @iter: a #GMimeHeaderIter + * g_mime_header_format_message_id: + * @header: a #GMimeHeader + * @options: (nullable): a #GMimeFormatOptions or %NULL + * @value: a Message-Id or Content-Id header value + * @charset: a charset (note: unused) * - * Gets the current header's file/stream offset. + * Parses the @value and then re-formats it to conform to the formatting options, + * folding the value if necessary. * - * Returns: the file/stream offset or %-1 if unknown or invalid. + * Returns: a newly allocated string containing the reformatted value. **/ -gint64 -g_mime_header_iter_get_offset (GMimeHeaderIter *iter) +char * +g_mime_header_format_message_id (GMimeHeader *header, GMimeFormatOptions *options, const char *value, const char *charset) { - g_return_val_if_fail (iter != NULL, -1); + const char *newline = g_mime_format_options_get_newline (options); - if (!g_mime_header_iter_is_valid (iter)) - return -1; - - return iter->cursor->offset; + return g_strdup_printf (" %s%s", value, newline); } -#endif /** - * g_mime_header_iter_get_name: - * @iter: a #GMimeHeaderIter + * g_mime_header_format_references: + * @header: a #GMimeHeader + * @options: (nullable): a #GMimeFormatOptions or %NULL + * @value: a References or In-Reply-To header value + * @charset: a charset (note: unused) * - * Gets the current header's name. + * Parses the @value and then re-formats it to conform to the formatting options, + * folding the value if necessary. * - * Returns: the header name or %NULL if invalid. + * Returns: a newly allocated string containing the reformatted value. **/ -const char * -g_mime_header_iter_get_name (GMimeHeaderIter *iter) +char * +g_mime_header_format_references (GMimeHeader *header, GMimeFormatOptions *options, const char *value, const char *charset) { - g_return_val_if_fail (iter != NULL, NULL); + const char *newline, *msgid; + GMimeReferences *refs; + guint cur, len, n; + GString *str; + int count, i; + + /* Note: we don't want to break in the middle of msgid tokens as + it seems to break a lot of clients (and servers) */ + newline = g_mime_format_options_get_newline (options); + refs = g_mime_references_parse (header->options, value); + str = g_string_new (header->raw_name); + g_string_append_c (str, ':'); + cur = n = str->len; + + count = g_mime_references_length (refs); + for (i = 0; i < count; i++) { + msgid = g_mime_references_get_message_id (refs, i); + len = strlen (msgid); + if (cur > 1 && cur + len + 3 >= GMIME_FOLD_LEN) { + g_string_append (str, newline); + g_string_append_c (str, '\t'); + cur = 1; + } else { + g_string_append_c (str, ' '); + cur++; + } + + g_string_append_c (str, '<'); + g_string_append_len (str, msgid, len); + g_string_append_c (str, '>'); + cur += len + 2; + } - if (!g_mime_header_iter_is_valid (iter)) - return NULL; + g_mime_references_free (refs); + + g_string_append (str, newline); - return iter->cursor->name; + memmove (str->str, str->str + n, (str->len - n) + 1); + + return g_string_free (str, FALSE); } /** - * g_mime_header_iter_set_value: - * @iter: a #GMimeHeaderIter - * @value: new header value - * - * Sets the current header's value to the new value. + * g_mime_header_format_addrlist: + * @header: a #GMimeHeader + * @options: (nullable): a #GMimeFormatOptions or %NULL + * @value: a Sender, From, Reply-To, To, Cc, or Bcc header value + * @charset: a charset (note: unused) * - * Returns: %TRUE if the value was set or %FALSE otherwise (indicates - * invalid iter). + * Parses the @value and then re-formats it to conform to the formatting options, + * folding the value if necessary. * - * Note: @value should be encoded with a function such as - * g_mime_utils_header_encode_text(). + * Returns: a newly allocated string containing the reformatted value. **/ -gboolean -g_mime_header_iter_set_value (GMimeHeaderIter *iter, const char *value) +char * +g_mime_header_format_addrlist (GMimeHeader *header, GMimeFormatOptions *options, const char *value, const char *charset) { - g_return_val_if_fail (iter != NULL, FALSE); + InternetAddressList *addrlist; + GString *str; + guint n; - if (!g_mime_header_iter_is_valid (iter)) - return FALSE; + str = g_string_new (header->raw_name); + g_string_append_c (str, ':'); + n = str->len; + + g_string_append_c (str, ' '); - g_free (iter->cursor->value); - iter->cursor->value = g_strdup (value); + if (value && (addrlist = internet_address_list_parse (header->options, value))) { + internet_address_list_encode (addrlist, options, str); + g_object_unref (addrlist); + } - g_mime_header_list_set_stream (iter->hdrlist, NULL); + memmove (str->str, str->str + n, (str->len - n) + 1); - return TRUE; + return g_string_free (str, FALSE); } +typedef void (* token_skip_t) (const char **in); + +struct _received_token { + char *token; + size_t len; + token_skip_t skip; +}; + +static void skip_cfws_atom (const char **in); +static void skip_domain (const char **in); +static void skip_addr (const char **in); +static void skip_msgid (const char **in); + +static struct _received_token received_tokens[] = { + { "from ", 5, skip_domain }, + { "by ", 3, skip_domain }, + { "via ", 4, skip_cfws_atom }, + { "with ", 5, skip_cfws_atom }, + { "id ", 3, skip_msgid }, + { "for ", 4, skip_addr } +}; + +static void +skip_cfws_atom (const char **in) +{ + skip_cfws (in); + skip_atom (in); +} + +static void +skip_domain_subliteral (const char **in) +{ + const char *inptr = *in; + + while (*inptr && *inptr != '.' && *inptr != ']') { + if (is_dtext (*inptr)) { + inptr++; + } else if (is_lwsp (*inptr)) { + skip_cfws (&inptr); + } else { + break; + } + } + + *in = inptr; +} + +static void +skip_domain_literal (const char **in) +{ + const char *inptr = *in; + + skip_cfws (&inptr); + while (*inptr && *inptr != ']') { + skip_domain_subliteral (&inptr); + if (*inptr && *inptr != ']') + inptr++; + } + + *in = inptr; +} + +static void +skip_domain (const char **in) +{ + const char *save, *inptr = *in; + + while (inptr && *inptr) { + skip_cfws (&inptr); + if (*inptr == '[') { + /* domain literal */ + inptr++; + skip_domain_literal (&inptr); + if (*inptr == ']') + inptr++; + } else { + skip_atom (&inptr); + } + + save = inptr; + skip_cfws (&inptr); + if (*inptr != '.') { + inptr = save; + break; + } + + inptr++; + } + + *in = inptr; +} + +static void +skip_addrspec (const char **in) +{ + const char *inptr = *in; + + skip_cfws (&inptr); + skip_word (&inptr); + skip_cfws (&inptr); + + while (*inptr == '.') { + inptr++; + skip_cfws (&inptr); + skip_word (&inptr); + skip_cfws (&inptr); + } + + if (*inptr == '@') { + inptr++; + skip_domain (&inptr); + } + + *in = inptr; +} + +static void +skip_addr (const char **in) +{ + const char *inptr = *in; + + skip_cfws (&inptr); + if (*inptr == '<') { + inptr++; + skip_addrspec (&inptr); + if (*inptr == '>') + inptr++; + } else { + skip_addrspec (&inptr); + } + + *in = inptr; +} + +static void +skip_msgid (const char **in) +{ + const char *inptr = *in; + + skip_cfws (&inptr); + if (*inptr == '<') { + inptr++; + skip_addrspec (&inptr); + if (*inptr == '>') + inptr++; + } else { + skip_atom (&inptr); + } + + *in = inptr; +} + +struct _received_part { + struct _received_part *next; + const char *start; + size_t len; +}; + + /** - * g_mime_header_iter_get_value: - * @iter: a #GMimeHeaderIter + * g_mime_header_format_received: + * @header: a #GMimeHeader + * @options: (nullable): a #GMimeFormatOptions or %NULL + * @value: a Received header value + * @charset: a charset (note: unused) * - * Gets the current header's value. + * Parses the @value and then re-formats it to conform to the formatting options, + * folding the value if necessary. * - * Returns: the header's raw, unprocessed value or %NULL if invalid. - * - * Note: The returned value should be decoded with a function such as - * g_mime_utils_header_decode_text() before displaying to the user. + * Returns: a newly allocated string containing the reformatted value. **/ -const char * -g_mime_header_iter_get_value (GMimeHeaderIter *iter) +char * +g_mime_header_format_received (GMimeHeader *header, GMimeFormatOptions *options, const char *value, const char *charset) { - g_return_val_if_fail (iter != NULL, NULL); + struct _received_part *parts, *part, *tail; + const char *inptr, *lwsp = NULL; + const char *newline; + guint len, n, i; + GString *str; + + newline = g_mime_format_options_get_newline (options); + + while (is_lwsp (*value)) + value++; + + if (*value == '\0') + return g_strdup (newline); + + str = g_string_new (header->raw_name); + g_string_append_c (str, ':'); + n = str->len; + + g_string_append_c (str, ' '); + len = str->len; + + tail = parts = part = g_alloca (sizeof (struct _received_part)); + part->start = inptr = value; + part->next = NULL; + + while (*inptr) { + for (i = 0; i < G_N_ELEMENTS (received_tokens); i++) { + if (!strncmp (inptr, received_tokens[i].token, received_tokens[i].len)) { + if (inptr > part->start) { + g_assert (lwsp != NULL); + part->len = lwsp - part->start; + + part = g_alloca (sizeof (struct _received_part)); + part->start = inptr; + part->next = NULL; + + tail->next = part; + tail = part; + } + + inptr += received_tokens[i].len; + received_tokens[i].skip (&inptr); + + lwsp = inptr; + while (is_lwsp (*inptr)) + inptr++; + + if (*inptr == ';') { + inptr++; + + part->len = inptr - part->start; + + lwsp = inptr; + while (is_lwsp (*inptr)) + inptr++; + + part = g_alloca (sizeof (struct _received_part)); + part->start = inptr; + part->next = NULL; + + tail->next = part; + tail = part; + } + + break; + } + } + + if (i == G_N_ELEMENTS (received_tokens)) { + while (*inptr && !is_lwsp (*inptr)) + inptr++; + + lwsp = inptr; + while (is_lwsp (*inptr)) + inptr++; + } + + if (*inptr == '(') { + skip_comment (&inptr); + + lwsp = inptr; + while (is_lwsp (*inptr)) + inptr++; + } + } - if (!g_mime_header_iter_is_valid (iter)) - return NULL; + part->len = lwsp - part->start; + + lwsp = NULL; + part = parts; + do { + len += lwsp ? part->start - lwsp : 0; + if (len + part->len > GMIME_FOLD_LEN && part != parts) { + g_string_append (str, newline); + g_string_append_c (str, '\t'); + len = 1; + } else if (lwsp) { + g_string_append_len (str, lwsp, (size_t) (part->start - lwsp)); + } + + g_string_append_len (str, part->start, part->len); + lwsp = part->start + part->len; + len += part->len; + + part = part->next; + } while (part != NULL); + + g_string_append (str, newline); + + memmove (str->str, str->str + n, (str->len - n) + 1); - return iter->cursor->value; + return g_string_free (str, FALSE); } /** - * g_mime_header_iter_remove: - * @iter: a #GMimeHeaderIter - * - * Removes the current header and advances to the next header. + * g_mime_header_format_default: + * @header: a #GMimeHeader + * @options: (nullable): a #GMimeFormatOptions or %NULL + * @value: a header value + * @charset: a charset to use when encoding the @value * - * Note: If you remove the last header in the list, then @iter will - * become invalid regardless of whether or not other headers remain. + * Parses the @value and then re-formats it to conform to the formatting options, + * folding the value if necessary. * - * Returns: %TRUE on success or %FALSE otherwise. + * Returns: a newly allocated string containing the reformatted value. **/ -gboolean -g_mime_header_iter_remove (GMimeHeaderIter *iter) +char * +g_mime_header_format_default (GMimeHeader *header, GMimeFormatOptions *options, const char *value, const char *charset) { - GMimeHeader *cursor, *header, *next; - GMimeHeaderList *hdrlist; + char *encoded, *raw_value; - g_return_val_if_fail (iter != NULL, FALSE); + encoded = g_mime_utils_header_encode_text (options, value, charset); + raw_value = _g_mime_utils_unstructured_header_fold (header->options, options, header->raw_name, encoded); + g_free (encoded); - if (!g_mime_header_iter_is_valid (iter)) - return FALSE; + return raw_value; +} + + +static void +header_changed (GMimeHeader *header, gpointer user_args, GMimeHeaderList *list) +{ + GMimeHeaderListChangedEventArgs args; - /* save iter state */ - hdrlist = iter->hdrlist; - cursor = iter->cursor; - next = cursor->next; + args.action = GMIME_HEADER_LIST_CHANGED_ACTION_CHANGED; + args.header = header; - if (!(header = g_hash_table_lookup (hdrlist->hash, cursor->name))) - return FALSE; + g_mime_event_emit (list->changed, &args); +} + + +static void g_mime_header_list_class_init (GMimeHeaderListClass *klass); +static void g_mime_header_list_init (GMimeHeaderList *list, GMimeHeaderListClass *klass); +static void g_mime_header_list_finalize (GObject *object); + + +static GObjectClass *list_parent_class = NULL; + + +GType +g_mime_header_list_get_type (void) +{ + static GType type = 0; - if (cursor == header) { - /* update the header lookup table */ - GMimeHeader *node = next; - - g_hash_table_remove (hdrlist->hash, cursor->name); - - while (node->next) { - if (!g_ascii_strcasecmp (node->name, cursor->name)) { - /* enter this node into the lookup table */ - g_hash_table_insert (hdrlist->hash, node->name, node); - break; - } - - node = node->next; - } + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeHeaderListClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_header_list_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeHeaderList), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_header_list_init, + }; + + type = g_type_register_static (G_TYPE_OBJECT, "GMimeHeaderList", &info, 0); } - /* remove/free the header */ - list_unlink ((ListNode *) cursor); - g_mime_header_free (cursor); - hdrlist->version++; - - /* update iter state */ - iter->version = hdrlist->version; - iter->cursor = next; + return type; +} + + +static void +g_mime_header_list_class_init (GMimeHeaderListClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); - return TRUE; + list_parent_class = g_type_class_ref (G_TYPE_OBJECT); + + object_class->finalize = g_mime_header_list_finalize; +} + +static void +g_mime_header_list_init (GMimeHeaderList *list, GMimeHeaderListClass *klass) +{ + list->hash = g_hash_table_new (g_mime_strcase_hash, + g_mime_strcase_equal); + list->changed = g_mime_event_new (list); + list->array = g_ptr_array_new (); +} + +static void +g_mime_header_list_finalize (GObject *object) +{ + GMimeHeaderList *headers = (GMimeHeaderList *) object; + GMimeHeader *header; + guint i; + + for (i = 0; i < headers->array->len; i++) { + header = (GMimeHeader *) headers->array->pdata[i]; + g_mime_event_remove (header->changed, (GMimeEventCallback) header_changed, headers); + g_object_unref (header); + } + + g_ptr_array_free (headers->array, TRUE); + + g_mime_parser_options_free (headers->options); + g_hash_table_destroy (headers->hash); + g_mime_event_free (headers->changed); + + G_OBJECT_CLASS (list_parent_class)->finalize (object); } /** * g_mime_header_list_new: + * @options: (nullable): a #GMimeParserOptions or %NULL * * Creates a new #GMimeHeaderList object. * * Returns: a new header list object. **/ GMimeHeaderList * -g_mime_header_list_new (void) +g_mime_header_list_new (GMimeParserOptions *options) { GMimeHeaderList *headers; - headers = g_slice_new (GMimeHeaderList); - headers->writers = g_hash_table_new_full (g_mime_strcase_hash, - g_mime_strcase_equal, - g_free, NULL); - headers->hash = g_hash_table_new (g_mime_strcase_hash, - g_mime_strcase_equal); - list_init (&headers->list); - headers->changed = g_mime_event_new (headers); - headers->stream = NULL; - headers->version = 0; + headers = g_object_new (GMIME_TYPE_HEADER_LIST, NULL); + headers->options = g_mime_parser_options_clone (options); return headers; } /** - * g_mime_header_list_destroy: + * g_mime_header_list_clear: * @headers: a #GMimeHeaderList * - * Destroy the header list. + * Removes all of the headers from the #GMimeHeaderList. **/ void -g_mime_header_list_destroy (GMimeHeaderList *headers) +g_mime_header_list_clear (GMimeHeaderList *headers) { - GMimeHeader *header, *next; + GMimeHeaderListChangedEventArgs args; + GMimeHeader *header; + guint i; - if (!headers) - return; + g_return_if_fail (GMIME_IS_HEADER_LIST (headers)); - header = (GMimeHeader *) headers->list.head; - while (header->next) { - next = header->next; - g_mime_header_free (header); - header = next; + for (i = 0; i < headers->array->len; i++) { + header = (GMimeHeader *) headers->array->pdata[i]; + g_mime_event_remove (header->changed, (GMimeEventCallback) header_changed, headers); + g_object_unref (header); } - g_hash_table_destroy (headers->writers); - g_hash_table_destroy (headers->hash); + g_hash_table_remove_all (headers->hash); - if (headers->stream) - g_object_unref (headers->stream); + g_ptr_array_set_size (headers->array, 0); - g_mime_event_destroy (headers->changed); + args.action = GMIME_HEADER_LIST_CHANGED_ACTION_CLEARED; + args.header = NULL; - g_slice_free (GMimeHeaderList, headers); + g_mime_event_emit (headers->changed, &args); +} + + +GMimeParserOptions * +_g_mime_header_list_get_options (GMimeHeaderList *headers) +{ + return headers->options; +} + +void +_g_mime_header_list_set_options (GMimeHeaderList *headers, GMimeParserOptions *options) +{ + g_mime_parser_options_free (headers->options); + headers->options = g_mime_parser_options_clone (options); } /** - * g_mime_header_list_clear: + * g_mime_header_list_get_count: * @headers: a #GMimeHeaderList * - * Removes all of the headers from the #GMimeHeaderList. + * Gets the number of headers contained within the header list. + * + * Returns: the number of headers in the header list. **/ -void -g_mime_header_list_clear (GMimeHeaderList *headers) +int +g_mime_header_list_get_count (GMimeHeaderList *headers) { - GMimeHeader *header, *next; + g_return_val_if_fail (GMIME_IS_HEADER_LIST (headers), -1); - g_return_if_fail (headers != NULL); - - header = (GMimeHeader *) headers->list.head; - while (header->next) { - next = header->next; - g_mime_header_free (header); - header = next; - } - - g_hash_table_remove_all (headers->hash); - list_init (&headers->list); - - g_mime_header_list_set_stream (headers, NULL); + return headers->array->len; } @@ -616,11 +1119,11 @@ * Returns: %TRUE if the specified header exists or %FALSE otherwise. **/ gboolean -g_mime_header_list_contains (const GMimeHeaderList *headers, const char *name) +g_mime_header_list_contains (GMimeHeaderList *headers, const char *name) { - const GMimeHeader *header; + GMimeHeader *header; - g_return_val_if_fail (headers != NULL, FALSE); + g_return_val_if_fail (GMIME_IS_HEADER_LIST (headers), FALSE); g_return_val_if_fail (name != NULL, FALSE); if (!(header = g_hash_table_lookup (headers->hash, name))) @@ -635,27 +1138,65 @@ * @headers: a #GMimeHeaderList * @name: header name * @value: header value + * @charset: a charset * * Prepends a header. If @value is %NULL, a space will be set aside * for it (useful for setting the order of headers before values can * be obtained for them) otherwise the header will be unset. - * - * Note: @value should be encoded with a function such as - * g_mime_utils_header_encode_text(). **/ void -g_mime_header_list_prepend (GMimeHeaderList *headers, const char *name, const char *value) +g_mime_header_list_prepend (GMimeHeaderList *headers, const char *name, const char *value, const char *charset) { + GMimeHeaderListChangedEventArgs args; + unsigned char *dest, *src; GMimeHeader *header; + guint n; - g_return_if_fail (headers != NULL); + g_return_if_fail (GMIME_IS_HEADER_LIST (headers)); g_return_if_fail (name != NULL); - header = g_mime_header_new (name, value, -1); - list_prepend (&headers->list, (ListNode *) header); + header = g_mime_header_new (headers->options, name, value, name, NULL, charset, -1); + g_mime_event_add (header->changed, (GMimeEventCallback) header_changed, headers); g_hash_table_replace (headers->hash, header->name, header); - g_mime_header_list_set_stream (headers, NULL); + if (headers->array->len > 0) { + g_ptr_array_set_size (headers->array, headers->array->len + 1); + + dest = ((unsigned char *) headers->array->pdata) + sizeof (void *); + src = (unsigned char *) headers->array->pdata; + n = headers->array->len - 1; + + g_memmove (dest, src, (sizeof (void *) * n)); + headers->array->pdata[0] = header; + } else { + g_ptr_array_add (headers->array, header); + } + + args.action = GMIME_HEADER_LIST_CHANGED_ACTION_ADDED; + args.header = header; + + g_mime_event_emit (headers->changed, &args); +} + + +void +_g_mime_header_list_append (GMimeHeaderList *headers, const char *name, const char *raw_name, + const char *raw_value, gint64 offset) +{ + GMimeHeaderListChangedEventArgs args; + GMimeHeader *header; + + header = g_mime_header_new (headers->options, name, NULL, raw_name, raw_value, NULL, offset); + g_mime_event_add (header->changed, (GMimeEventCallback) header_changed, headers); + g_ptr_array_add (headers->array, header); + + if (!g_hash_table_lookup (headers->hash, name)) + g_hash_table_insert (headers->hash, header->name, header); + + args.action = GMIME_HEADER_LIST_CHANGED_ACTION_ADDED; + args.header = header; + + g_mime_event_emit (headers->changed, &args); } @@ -664,56 +1205,90 @@ * @headers: a #GMimeHeaderList * @name: header name * @value: header value + * @charset: a charset * * Appends a header. If @value is %NULL, a space will be set aside for it * (useful for setting the order of headers before values can be * obtained for them) otherwise the header will be unset. - * - * Note: @value should be encoded with a function such as - * g_mime_utils_header_encode_text(). **/ void -g_mime_header_list_append (GMimeHeaderList *headers, const char *name, const char *value) +g_mime_header_list_append (GMimeHeaderList *headers, const char *name, const char *value, const char *charset) { + GMimeHeaderListChangedEventArgs args; GMimeHeader *header; - g_return_if_fail (headers != NULL); + g_return_if_fail (GMIME_IS_HEADER_LIST (headers)); g_return_if_fail (name != NULL); - header = g_mime_header_new (name, value, -1); - list_append (&headers->list, (ListNode *) header); + header = g_mime_header_new (headers->options, name, value, name, NULL, charset, -1); + g_mime_event_add (header->changed, (GMimeEventCallback) header_changed, headers); + g_ptr_array_add (headers->array, header); if (!g_hash_table_lookup (headers->hash, name)) g_hash_table_insert (headers->hash, header->name, header); - g_mime_header_list_set_stream (headers, NULL); + args.action = GMIME_HEADER_LIST_CHANGED_ACTION_ADDED; + args.header = header; + + g_mime_event_emit (headers->changed, &args); } /** - * g_mime_header_list_get: + * g_mime_header_list_get_header: * @headers: a #GMimeHeaderList * @name: header name * - * Gets the value of the first header with the specified name. + * Gets the first header with the specified name. * - * Returns: the value of the header requested. - * - * Note: The returned value should be decoded with a function such as - * g_mime_utils_header_decode_text() before displaying to the user. + * Returns: (transfer none): a #GMimeHeader for the specified @name. **/ -const char * -g_mime_header_list_get (const GMimeHeaderList *headers, const char *name) +GMimeHeader * +g_mime_header_list_get_header (GMimeHeaderList *headers, const char *name) { - const GMimeHeader *header; + GMimeHeader *header; - g_return_val_if_fail (headers != NULL, NULL); + g_return_val_if_fail (GMIME_IS_HEADER_LIST (headers), NULL); g_return_val_if_fail (name != NULL, NULL); - if (!(header = g_hash_table_lookup (headers->hash, name))) - return NULL; + return g_hash_table_lookup (headers->hash, name); +} + + +void +_g_mime_header_list_set (GMimeHeaderList *headers, const char *name, const char *raw_value) +{ + GMimeHeaderListChangedEventArgs args; + GMimeHeader *header, *hdr; + guint i; - return header->value; + g_return_if_fail (GMIME_IS_HEADER_LIST (headers)); + g_return_if_fail (name != NULL); + + if ((header = g_hash_table_lookup (headers->hash, name))) { + g_mime_header_set_raw_value (header, raw_value); + + for (i = headers->array->len - 1; i > 0; i--) { + hdr = (GMimeHeader *) headers->array->pdata[i]; + + if (hdr == header) + break; + + if (g_ascii_strcasecmp (header->name, hdr->name) != 0) + continue; + + g_mime_event_remove (hdr->changed, (GMimeEventCallback) header_changed, headers); + g_ptr_array_remove_index (headers->array, i); + g_object_unref (hdr); + } + + args.action = GMIME_HEADER_LIST_CHANGED_ACTION_CHANGED; + args.header = header; + + g_mime_event_emit (headers->changed, &args); + } else { + _g_mime_header_list_append (headers, name, name, raw_value, -1); + } } @@ -722,6 +1297,7 @@ * @headers: a #GMimeHeaderList * @name: header name * @value: header value + * @charset: a charset * * Set the value of the specified header. If @value is %NULL and the * header, @name, had not been previously set, a space will be set @@ -731,42 +1307,63 @@ * Note: If there are multiple headers with the specified field name, * the first instance of the header will be replaced and further * instances will be removed. - * - * Additionally, @value should be encoded with a function such as - * g_mime_utils_header_encode_text(). **/ void -g_mime_header_list_set (GMimeHeaderList *headers, const char *name, const char *value) +g_mime_header_list_set (GMimeHeaderList *headers, const char *name, const char *value, const char *charset) { - GMimeHeader *header, *next; + GMimeHeaderListChangedEventArgs args; + GMimeHeader *header, *hdr; + guint i; - g_return_if_fail (headers != NULL); + g_return_if_fail (GMIME_IS_HEADER_LIST (headers)); g_return_if_fail (name != NULL); if ((header = g_hash_table_lookup (headers->hash, name))) { - g_free (header->value); - header->value = g_strdup (value); + g_mime_header_set_value (header, NULL, value, charset); - header = header->next; - while (header->next) { - next = header->next; + for (i = headers->array->len - 1; i > 0; i--) { + hdr = (GMimeHeader *) headers->array->pdata[i]; - if (!g_ascii_strcasecmp (header->name, name)) { - /* remove/free the header */ - list_unlink ((ListNode *) header); - g_mime_header_free (header); - headers->version++; - } + if (hdr == header) + break; - header = next; + if (g_ascii_strcasecmp (header->name, hdr->name) != 0) + continue; + + g_mime_event_remove (hdr->changed, (GMimeEventCallback) header_changed, headers); + g_ptr_array_remove_index (headers->array, i); + g_object_unref (hdr); } + + args.action = GMIME_HEADER_LIST_CHANGED_ACTION_CHANGED; + args.header = header; + + g_mime_event_emit (headers->changed, &args); } else { - header = g_mime_header_new (name, value, -1); - list_append (&headers->list, (ListNode *) header); - g_hash_table_insert (headers->hash, header->name, header); + g_mime_header_list_append (headers, name, value, charset); } +} + + +/** + * g_mime_header_list_get_header_at: + * @headers: a #GMimeHeaderList + * @index: the 0-based index of the header + * + * Gets the header at the specified @index within the list. + * + * Returns: (transfer none): the header at position @index. + **/ +GMimeHeader * +g_mime_header_list_get_header_at (GMimeHeaderList *headers, int index) +{ + g_return_val_if_fail (GMIME_IS_HEADER_LIST (headers), NULL); + g_return_val_if_fail (index >= 0, NULL); + + if ((guint) index >= headers->array->len) + return NULL; - g_mime_header_list_set_stream (headers, NULL); + return (GMimeHeader *) headers->array->pdata[index]; } @@ -775,7 +1372,7 @@ * @headers: a #GMimeHeaderList * @name: header name * - * Remove the specified header. + * Remove the first instance of the specified header. * * Returns: %TRUE if the header was successfully removed or %FALSE if * the specified header could not be found. @@ -783,110 +1380,100 @@ gboolean g_mime_header_list_remove (GMimeHeaderList *headers, const char *name) { - GMimeHeader *header, *node; + GMimeHeaderListChangedEventArgs args; + GMimeHeader *header, *hdr; + guint i; - g_return_val_if_fail (headers != NULL, FALSE); + g_return_val_if_fail (GMIME_IS_HEADER_LIST (headers), FALSE); g_return_val_if_fail (name != NULL, FALSE); if (!(header = g_hash_table_lookup (headers->hash, name))) return FALSE; + /* get the index of the header */ + for (i = 0; i < headers->array->len; i++) { + if (headers->array->pdata[i] == header) + break; + } + + g_mime_event_remove (header->changed, (GMimeEventCallback) header_changed, headers); + g_ptr_array_remove_index (headers->array, i); + g_hash_table_remove (headers->hash, name); + /* look for another header with the same name... */ - node = header->next; - while (node->next) { - if (!g_ascii_strcasecmp (node->name, name)) { + while (i < headers->array->len) { + hdr = (GMimeHeader *) headers->array->pdata[i]; + + if (!g_ascii_strcasecmp (hdr->name, name)) { /* enter this node into the lookup table */ - g_hash_table_replace (headers->hash, node->name, node); + g_hash_table_insert (headers->hash, hdr->name, hdr); break; } - node = node->next; + i++; } - /* invalidate all our outstanding iterators matching @header */ - headers->version++; + args.action = GMIME_HEADER_LIST_CHANGED_ACTION_REMOVED; + args.header = header; - /* remove/free the header */ - list_unlink ((ListNode *) header); - g_mime_header_free (header); - - g_mime_header_list_set_stream (headers, NULL); + g_mime_event_emit (headers->changed, &args); + g_object_unref (header); return TRUE; } /** - * g_mime_header_list_get_iter: + * g_mime_header_list_remove_at: * @headers: a #GMimeHeaderList - * @iter: (out): a #GMimeHeaderIter - * - * Initializes an iterator for traversing @headers. + * @index: the 0-based index of the header to remove * - * Returns: a %TRUE if successful or %FALSE if there are no headers to - * traverse. + * Removes the header at the specified @index from @headers. **/ -gboolean -g_mime_header_list_get_iter (GMimeHeaderList *headers, GMimeHeaderIter *iter) -{ - GMimeHeader *cursor; - - g_return_val_if_fail (headers != NULL, FALSE); - - cursor = (GMimeHeader *) headers->list.head; - if (!cursor->next) - return FALSE; - - iter->version = headers->version; - iter->hdrlist = headers; - iter->cursor = cursor; - - return TRUE; -} - - -/** - * g_mime_header_list_foreach: - * @headers: A #GMimeHeaderList - * @func: (scope call): function to be called for each header. - * @user_data: User data to be passed to the func. - * - * Calls @func for each header name/value pair. - */ void -g_mime_header_list_foreach (const GMimeHeaderList *headers, GMimeHeaderForeachFunc func, gpointer user_data) +g_mime_header_list_remove_at (GMimeHeaderList *headers, int index) { - const GMimeHeader *header; + GMimeHeaderListChangedEventArgs args; + GMimeHeader *header, *hdr; + guint i; - g_return_if_fail (headers != NULL); - g_return_if_fail (func != NULL); + g_return_if_fail (GMIME_IS_HEADER_LIST (headers)); + g_return_if_fail (index >= 0); - header = (const GMimeHeader *) headers->list.head; + if ((guint) index >= headers->array->len) + return; - while (header->next) { - func (header->name, header->value, user_data); - header = header->next; + header = (GMimeHeader *) headers->array->pdata[index]; + g_mime_event_remove (header->changed, (GMimeEventCallback) header_changed, headers); + g_ptr_array_remove_index (headers->array, index); + + /* if this is the first instance of a header with this name, then we'll + * need to update the hash table to point to the next instance... */ + if ((hdr = g_hash_table_lookup (headers->hash, header->name)) == header) { + g_hash_table_remove (headers->hash, header->name); + + for (i = (guint) index; i < headers->array->len; i++) { + hdr = (GMimeHeader *) headers->array->pdata[i]; + + if (!g_ascii_strcasecmp (header->name, hdr->name)) { + g_hash_table_insert (headers->hash, hdr->name, hdr); + break; + } + } } -} - - -static ssize_t -default_writer (GMimeStream *stream, const char *name, const char *value) -{ - ssize_t nwritten; - char *val; - val = g_mime_utils_header_printf ("%s: %s\n", name, value); - nwritten = g_mime_stream_write_string (stream, val); - g_free (val); + args.action = GMIME_HEADER_LIST_CHANGED_ACTION_REMOVED; + args.header = header; - return nwritten; + g_mime_event_emit (headers->changed, &args); + g_object_unref (header); } /** * g_mime_header_list_write_to_stream: * @headers: a #GMimeHeaderList + * @options: (nullable): a #GMimeFormatOptions or %NULL * @stream: output stream * * Write the headers to a stream. @@ -894,38 +1481,36 @@ * Returns: the number of bytes written or %-1 on fail. **/ ssize_t -g_mime_header_list_write_to_stream (const GMimeHeaderList *headers, GMimeStream *stream) +g_mime_header_list_write_to_stream (GMimeHeaderList *headers, GMimeFormatOptions *options, GMimeStream *stream) { ssize_t nwritten, total = 0; - GMimeHeaderWriter writer; - GHashTable *writers; + GMimeStream *filtered; GMimeHeader *header; + GMimeFilter *filter; + guint i; - g_return_val_if_fail (headers != NULL, -1); - g_return_val_if_fail (stream != NULL, -1); - - if (headers->stream) { - g_mime_stream_reset (headers->stream); - return g_mime_stream_write_to_stream (headers->stream, stream); - } + g_return_val_if_fail (GMIME_IS_HEADER_LIST (headers), -1); + g_return_val_if_fail (GMIME_IS_STREAM (stream), -1); - header = (GMimeHeader *) headers->list.head; - writers = headers->writers; + filtered = g_mime_stream_filter_new (stream); + filter = g_mime_format_options_create_newline_filter (options, FALSE); + g_mime_stream_filter_add ((GMimeStreamFilter *) filtered, filter); + g_object_unref (filter); - while (header->next) { - if (header->value) { - if (!(writer = g_hash_table_lookup (writers, header->name))) - writer = default_writer; - - if ((nwritten = writer (stream, header->name, header->value)) == -1) + for (i = 0; i < headers->array->len; i++) { + header = (GMimeHeader *) headers->array->pdata[i]; + + if (!g_mime_format_options_is_hidden_header (options, header->name)) { + if ((nwritten = g_mime_header_write_to_stream (header, options, filtered)) == -1) return -1; total += nwritten; } - - header = header->next; } + g_mime_stream_flush (filtered); + g_object_unref (filtered); + return total; } @@ -933,6 +1518,7 @@ /** * g_mime_header_list_to_string: * @headers: a #GMimeHeaderList + * @options: (nullable): a #GMimeFormatOptions or %NULL * * Allocates a string buffer containing the raw rfc822 headers * contained in @headers. @@ -940,25 +1526,18 @@ * Returns: a string containing the header block. **/ char * -g_mime_header_list_to_string (const GMimeHeaderList *headers) +g_mime_header_list_to_string (GMimeHeaderList *headers, GMimeFormatOptions *options) { GMimeStream *stream; GByteArray *array; char *str; - g_return_val_if_fail (headers != NULL, NULL); + g_return_val_if_fail (GMIME_IS_HEADER_LIST (headers), NULL); array = g_byte_array_new (); stream = g_mime_stream_mem_new (); - g_mime_stream_mem_set_byte_array (GMIME_STREAM_MEM (stream), array); - - if (headers->stream) { - g_mime_stream_reset (headers->stream); - g_mime_stream_write_to_stream (headers->stream, stream); - } else { - g_mime_header_list_write_to_stream (headers, stream); - } - + g_mime_stream_mem_set_byte_array ((GMimeStreamMem *) stream, array); + g_mime_header_list_write_to_stream (headers, options, stream); g_object_unref (stream); g_byte_array_append (array, (unsigned char *) "", 1); @@ -967,83 +1546,3 @@ return str; } - - -/** - * g_mime_header_list_register_writer: - * @headers: a #GMimeHeaderList - * @name: header name - * @writer: writer function - * - * Changes the function used to write @name headers to @writer (or the - * default if @writer is %NULL). This is useful if you want to change - * the default header folding style for a particular header. - **/ -void -g_mime_header_list_register_writer (GMimeHeaderList *headers, const char *name, GMimeHeaderWriter writer) -{ - gpointer okey, oval; - - g_return_if_fail (headers != NULL); - g_return_if_fail (name != NULL); - - g_hash_table_remove (headers->writers, name); - - if (writer) - g_hash_table_insert (headers->writers, g_strdup (name), writer); -} - - - -/** - * g_mime_header_list_set_stream: - * @headers: a #GMimeHeaderList - * @stream: a #GMimeStream - * - * Set the raw header stream. - **/ -void -g_mime_header_list_set_stream (GMimeHeaderList *headers, GMimeStream *stream) -{ - g_return_if_fail (stream == NULL || GMIME_IS_STREAM (stream)); - g_return_if_fail (headers != NULL); - - if (headers->stream == stream) - return; - - if (stream) - g_object_ref (stream); - - if (headers->stream) - g_object_unref (headers->stream); - - headers->stream = stream; - - g_mime_event_emit (headers->changed, NULL); -} - - -/** - * g_mime_header_list_get_stream: - * @headers: a #GMimeHeaderList - * - * Gets the raw stream representing @headers. - * - * Returns: (transfer none): a #GMimeStream if set or %NULL otherwise. - **/ -GMimeStream * -g_mime_header_list_get_stream (GMimeHeaderList *headers) -{ - g_return_val_if_fail (headers != NULL, NULL); - - return headers->stream; -} - - -GMimeEvent * -_g_mime_header_list_get_changed_event (GMimeHeaderList *headers) -{ - g_return_val_if_fail (headers != NULL, NULL); - - return headers->changed; -} diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-header.h gmime-3.0.1/gmime/gmime-header.h --- gmime-2.6.22+dfsg2/gmime/gmime-header.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-header.h 2017-03-28 23:46:26.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -23,110 +23,137 @@ #define __GMIME_HEADER_H__ #include +#include +#include #include G_BEGIN_DECLS -typedef struct _GMimeHeader GMimeHeader; +#define GMIME_TYPE_HEADER (g_mime_header_get_type ()) +#define GMIME_HEADER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_HEADER, GMimeHeader)) +#define GMIME_HEADER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_HEADER, GMimeHeaderClass)) +#define GMIME_IS_HEADER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_HEADER)) +#define GMIME_IS_HEADER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_HEADER)) +#define GMIME_HEADER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_HEADER, GMimeHeaderClass)) + +#define GMIME_TYPE_HEADER_LIST (g_mime_header_list_get_type ()) +#define GMIME_HEADER_LIST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_HEADER_LIST, GMimeHeaderList)) +#define GMIME_HEADER_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_HEADER_LIST, GMimeHeaderListClass)) +#define GMIME_IS_HEADER_LIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_HEADER_LIST)) +#define GMIME_IS_HEADER_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_HEADER_LIST)) +#define GMIME_HEADER_LIST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_HEADER_LIST, GMimeHeaderListClass)) +typedef struct _GMimeHeader GMimeHeader; +typedef struct _GMimeHeaderClass GMimeHeaderClass; -/** - * GMimeHeaderForeachFunc: - * @name: The field name. - * @value: The field value. - * @user_data: The user-supplied callback data. - * - * Function signature for the callback to g_mime_header_list_foreach(). - **/ -typedef void (* GMimeHeaderForeachFunc) (const char *name, const char *value, gpointer user_data); +typedef struct _GMimeHeaderList GMimeHeaderList; +typedef struct _GMimeHeaderListClass GMimeHeaderListClass; /** - * GMimeHeaderList: + * GMimeHeaderRawValueFormatter: + * @header: a #GMimeHeader + * @options: a #GMimeFormatOptions + * @value: an unencoded header value + * @charset: a charset * - * A message or mime-part header. + * Function callback for encoding and formatting a header value. + * + * Returns: the encoded and formatted raw header value. **/ -typedef struct _GMimeHeaderList GMimeHeaderList; +typedef char * (* GMimeHeaderRawValueFormatter) (GMimeHeader *header, GMimeFormatOptions *options, + const char *value, const char *charset); + +char *g_mime_header_format_content_disposition (GMimeHeader *header, GMimeFormatOptions *options, const char *value, const char *charset); +char *g_mime_header_format_content_type (GMimeHeader *header, GMimeFormatOptions *options, const char *value, const char *charset); +char *g_mime_header_format_message_id (GMimeHeader *header, GMimeFormatOptions *options, const char *value, const char *charset); +char *g_mime_header_format_references (GMimeHeader *header, GMimeFormatOptions *options, const char *value, const char *charset); +char *g_mime_header_format_addrlist (GMimeHeader *header, GMimeFormatOptions *options, const char *value, const char *charset); +char *g_mime_header_format_received (GMimeHeader *header, GMimeFormatOptions *options, const char *value, const char *charset); +char *g_mime_header_format_default (GMimeHeader *header, GMimeFormatOptions *options, const char *value, const char *charset); /** - * GMimeHeaderIter: - * @hdrlist: a #GMimeHeaderList - * @cursor: a #GMimeHeader - * @version: the version of @hdrlist when initialized + * GMimeHeader: + * @name: the name of the header + * @value: the unfolded value of the header * - * A message or mime-part header iterator. All members should be - * considered private. + * A message or mime-part header. **/ -typedef struct _GMimeHeaderIter GMimeHeaderIter; - -struct _GMimeHeaderIter { - GMimeHeaderList *hdrlist; - GMimeHeader *cursor; - guint32 version; +struct _GMimeHeader { + GObject parent_object; + + char *name, *value; + + /* < private > */ + GMimeHeaderRawValueFormatter formatter; + GMimeParserOptions *options; + gpointer changed; + char *raw_value; + char *raw_name; + gint64 offset; }; +struct _GMimeHeaderClass { + GObjectClass parent_class; + +}; -GMimeHeaderIter *g_mime_header_iter_new (void); -void g_mime_header_iter_free (GMimeHeaderIter *iter); - -GMimeHeaderIter *g_mime_header_iter_copy (GMimeHeaderIter *iter); -void g_mime_header_iter_copy_to (GMimeHeaderIter *src, GMimeHeaderIter *dest); -gboolean g_mime_header_iter_equal (GMimeHeaderIter *iter1, GMimeHeaderIter *iter2); +GType g_mime_header_get_type (void); -gboolean g_mime_header_iter_is_valid (GMimeHeaderIter *iter); +const char *g_mime_header_get_name (GMimeHeader *header); +const char *g_mime_header_get_raw_name (GMimeHeader *header); -gboolean g_mime_header_iter_first (GMimeHeaderIter *iter); -gboolean g_mime_header_iter_last (GMimeHeaderIter *iter); +const char *g_mime_header_get_value (GMimeHeader *header); +void g_mime_header_set_value (GMimeHeader *header, GMimeFormatOptions *options, const char *value, const char *charset); -gboolean g_mime_header_iter_next (GMimeHeaderIter *iter); -gboolean g_mime_header_iter_prev (GMimeHeaderIter *iter); +const char *g_mime_header_get_raw_value (GMimeHeader *header); +void g_mime_header_set_raw_value (GMimeHeader *header, const char *raw_value); -/*gint64 g_mime_header_iter_get_offset (GMimeHeaderIter *iter);*/ -const char *g_mime_header_iter_get_name (GMimeHeaderIter *iter); -gboolean g_mime_header_iter_set_value (GMimeHeaderIter *iter, const char *value); -const char *g_mime_header_iter_get_value (GMimeHeaderIter *iter); +gint64 g_mime_header_get_offset (GMimeHeader *header); -gboolean g_mime_header_iter_remove (GMimeHeaderIter *iter); +ssize_t g_mime_header_write_to_stream (GMimeHeader *header, GMimeFormatOptions *options, GMimeStream *stream); /** - * GMimeHeaderWriter: - * @stream: The output stream. - * @name: The field name. - * @value: The field value. - * - * Function signature for the callback to - * g_mime_header_list_register_writer(). + * GMimeHeaderList: * - * Returns: the number of bytes written or %-1 on error. + * A list of message or mime-part headers. **/ -typedef ssize_t (* GMimeHeaderWriter) (GMimeStream *stream, const char *name, const char *value); +struct _GMimeHeaderList { + GObject parent_object; + + /* < private > */ + GMimeParserOptions *options; + gpointer changed; + GHashTable *hash; + GPtrArray *array; +}; +struct _GMimeHeaderListClass { + GObjectClass parent_class; + +}; -GMimeHeaderList *g_mime_header_list_new (void); -void g_mime_header_list_destroy (GMimeHeaderList *headers); +GType g_mime_header_list_get_type (void); -void g_mime_header_list_set_stream (GMimeHeaderList *headers, GMimeStream *stream); -GMimeStream *g_mime_header_list_get_stream (GMimeHeaderList *headers); +GMimeHeaderList *g_mime_header_list_new (GMimeParserOptions *options); void g_mime_header_list_clear (GMimeHeaderList *headers); -gboolean g_mime_header_list_contains (const GMimeHeaderList *headers, const char *name); -void g_mime_header_list_prepend (GMimeHeaderList *headers, const char *name, const char *value); -void g_mime_header_list_append (GMimeHeaderList *headers, const char *name, const char *value); -void g_mime_header_list_set (GMimeHeaderList *headers, const char *name, const char *value); -const char *g_mime_header_list_get (const GMimeHeaderList *headers, const char *name); +int g_mime_header_list_get_count (GMimeHeaderList *headers); +gboolean g_mime_header_list_contains (GMimeHeaderList *headers, const char *name); +void g_mime_header_list_prepend (GMimeHeaderList *headers, const char *name, const char *value, const char *charset); +void g_mime_header_list_append (GMimeHeaderList *headers, const char *name, const char *value, const char *charset); +void g_mime_header_list_set (GMimeHeaderList *headers, const char *name, const char *value, const char *charset); +GMimeHeader *g_mime_header_list_get_header (GMimeHeaderList *headers, const char *name); +GMimeHeader *g_mime_header_list_get_header_at (GMimeHeaderList *headers, int index); gboolean g_mime_header_list_remove (GMimeHeaderList *headers, const char *name); +void g_mime_header_list_remove_at (GMimeHeaderList *headers, int index); -gboolean g_mime_header_list_get_iter (GMimeHeaderList *headers, GMimeHeaderIter *iter); - -void g_mime_header_list_foreach (const GMimeHeaderList *headers, GMimeHeaderForeachFunc func, gpointer user_data); - -void g_mime_header_list_register_writer (GMimeHeaderList *headers, const char *name, GMimeHeaderWriter writer); -ssize_t g_mime_header_list_write_to_stream (const GMimeHeaderList *headers, GMimeStream *stream); -char *g_mime_header_list_to_string (const GMimeHeaderList *headers); +ssize_t g_mime_header_list_write_to_stream (GMimeHeaderList *headers, GMimeFormatOptions *options, GMimeStream *stream); +char *g_mime_header_list_to_string (GMimeHeaderList *headers, GMimeFormatOptions *options); G_END_DECLS diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-iconv.c gmime-3.0.1/gmime/gmime-iconv.c --- gmime-2.6.22+dfsg2/gmime/gmime-iconv.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-iconv.c 2017-03-28 23:46:26.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -25,18 +25,9 @@ #include #include -#include -#include #include "gmime-charset.h" #include "gmime-iconv.h" -#include "cache.h" - -#ifdef ENABLE_WARNINGS -#define w(x) x -#else -#define w(x) -#endif /* ENABLE_WARNINGS */ /** @@ -45,180 +36,10 @@ * @short_description: Low-level routines for converting text from one charset to another * @see_also: * - * These functions are wrappers around the system iconv(3) - * routines. The purpose of these wrappers are two-fold: - * - * 1. Cache iconv_t descriptors for you in order to optimize - * opening/closing many descriptors frequently - * - * and - * - * 2. To use the appropriate system charset alias for the MIME charset - * names given as arguments. - **/ - - -#define ICONV_CACHE_SIZE (16) - -typedef struct { - CacheNode node; - guint32 refcount : 31; - guint32 used : 1; - iconv_t cd; -} IconvCacheNode; - - -static Cache *iconv_cache = NULL; -static GHashTable *iconv_open_hash = NULL; - -#ifdef GMIME_ICONV_DEBUG -static int cache_misses = 0; -static int shutdown = 0; -#define d(x) x -#else -#define d(x) -#endif /* GMIME_ICONV_DEBUG */ - -#ifdef G_THREADS_ENABLED -extern void _g_mime_iconv_cache_unlock (void); -extern void _g_mime_iconv_cache_lock (void); -#define ICONV_CACHE_UNLOCK() _g_mime_iconv_cache_unlock () -#define ICONV_CACHE_LOCK() _g_mime_iconv_cache_lock () -#else -#define ICONV_CACHE_UNLOCK() -#define ICONV_CACHE_LOCK() -#endif /* G_THREADS_ENABLED */ - - -/* caller *must* hold the iconv_cache_lock to call any of the following functions */ - - -/** - * iconv_cache_node_new: (skip) - * @key: cache key - * @cd: iconv descriptor - * - * Creates a new cache node, inserts it into the cache and increments - * the cache size. - * - * Returns: a pointer to the newly allocated cache node. - **/ -static IconvCacheNode * -iconv_cache_node_new (const char *key, iconv_t cd) -{ - IconvCacheNode *node; - -#ifdef GMIME_ICONV_DEBUG - cache_misses++; -#endif - - node = (IconvCacheNode *) cache_node_insert (iconv_cache, key); - node->refcount = 1; - node->used = TRUE; - node->cd = cd; - - return node; -} - - -static void -iconv_cache_node_free (CacheNode *node) -{ - IconvCacheNode *inode = (IconvCacheNode *) node; - -#ifdef GMIME_ICONV_DEBUG - if (shutdown) { - fprintf (stderr, "%s: open=%d; used=%s\n", node->key, - inode->refcount, inode->used ? "yes" : "no"); - } -#endif - - iconv_close (inode->cd); -} - - -/** - * iconv_cache_node_expire: - * @node: cache node - * - * Decides whether or not a cache node should be expired. - **/ -static gboolean -iconv_cache_node_expire (Cache *cache, CacheNode *node) -{ - IconvCacheNode *inode = (IconvCacheNode *) node; - - if (inode->refcount == 0) - return TRUE; - - return FALSE; -} - - -static void -iconv_open_node_free (gpointer key, gpointer value, gpointer user_data) -{ - iconv_t cd = (iconv_t) key; - IconvCacheNode *node; - - node = (IconvCacheNode *) cache_node_lookup (iconv_cache, value, FALSE); - g_assert (node); - - if (cd != node->cd) { - node->refcount--; - iconv_close (cd); - } -} - - -/** - * g_mime_iconv_shutdown: - * - * Frees internal iconv caches created in g_mime_iconv_init(). - * - * Note: this function is called for you by g_mime_shutdown(). - **/ -void -g_mime_iconv_shutdown (void) -{ - if (!iconv_cache) - return; - -#ifdef GMIME_ICONV_DEBUG - fprintf (stderr, "There were %d iconv cache misses\n", cache_misses); - fprintf (stderr, "The following %d iconv cache buckets are still open:\n", iconv_cache->size); - shutdown = 1; -#endif - - g_hash_table_foreach (iconv_open_hash, iconv_open_node_free, NULL); - g_hash_table_destroy (iconv_open_hash); - iconv_open_hash = NULL; - - cache_free (iconv_cache); - iconv_cache = NULL; -} - - -/** - * g_mime_iconv_init: - * - * Initialize GMime's iconv cache. This *MUST* be called before any - * gmime-iconv interfaces will work correctly. - * - * Note: this function is called for you by g_mime_init(). + * These functions are wrappers around the system iconv(3) routines. The + * purpose of this wrapper is to use the appropriate system charset alias for + * the MIME charset names given as arguments. **/ -void -g_mime_iconv_init (void) -{ - if (iconv_cache) - return; - - g_mime_charset_map_init (); - - iconv_open_hash = g_hash_table_new (g_direct_hash, g_direct_equal); - iconv_cache = cache_new (iconv_cache_node_expire, iconv_cache_node_free, - sizeof (IconvCacheNode), ICONV_CACHE_SIZE); -} /** @@ -240,10 +61,6 @@ iconv_t g_mime_iconv_open (const char *to, const char *from) { - IconvCacheNode *node; - iconv_t cd; - char *key; - if (from == NULL || to == NULL) { errno = EINVAL; return (iconv_t) -1; @@ -254,57 +71,8 @@ from = g_mime_charset_iconv_name (from); to = g_mime_charset_iconv_name (to); - key = g_alloca (strlen (from) + strlen (to) + 2); - sprintf (key, "%s:%s", from, to); - - ICONV_CACHE_LOCK (); - - if ((node = (IconvCacheNode *) cache_node_lookup (iconv_cache, key, TRUE))) { - if (node->used) { - if ((cd = iconv_open (to, from)) == (iconv_t) -1) - goto exception; - } else { - /* Apparently iconv on Solaris <= 7 segfaults if you pass in - * NULL for anything but inbuf; work around that. (NULL outbuf - * or NULL *outbuf is allowed by Unix98.) - */ - size_t inleft = 0, outleft = 0; - char *outbuf = NULL; - - cd = node->cd; - node->used = TRUE; - - /* reset the descriptor */ - iconv (cd, NULL, &inleft, &outbuf, &outleft); - } - - node->refcount++; - } else { - if ((cd = iconv_open (to, from)) == (iconv_t) -1) - goto exception; - - node = iconv_cache_node_new (key, cd); - } - - g_hash_table_insert (iconv_open_hash, cd, ((CacheNode *) node)->key); - - ICONV_CACHE_UNLOCK (); - return cd; - - exception: - - ICONV_CACHE_UNLOCK (); - -#if w(!)0 - if (errno == EINVAL) - g_warning ("Conversion from '%s' to '%s' is not supported", from, to); - else - g_warning ("Could not open converter from '%s' to '%s': %s", - from, to, strerror (errno)); -#endif - - return cd; + return iconv_open (to, from); } @@ -322,40 +90,5 @@ int g_mime_iconv_close (iconv_t cd) { - IconvCacheNode *node; - const char *key; - - if (cd == (iconv_t) -1) - return 0; - - ICONV_CACHE_LOCK (); - - if ((key = g_hash_table_lookup (iconv_open_hash, cd))) { - g_hash_table_remove (iconv_open_hash, cd); - - node = (IconvCacheNode *) cache_node_lookup (iconv_cache, key, FALSE); - g_assert (node); - - if (iconv_cache->size > ICONV_CACHE_SIZE) { - /* expire before unreffing this node so that it wont get uncached */ - cache_expire_unused (iconv_cache); - } - - node->refcount--; - - if (cd == node->cd) - node->used = FALSE; - else - iconv_close (cd); - } else { - ICONV_CACHE_UNLOCK (); - - d(g_warning ("This iconv context wasn't opened using g_mime_iconv_open()")); - - return iconv_close (cd); - } - - ICONV_CACHE_UNLOCK (); - - return 0; + return iconv_close (cd); } diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-iconv.h gmime-3.0.1/gmime/gmime-iconv.h --- gmime-2.6.22+dfsg2/gmime/gmime-iconv.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-iconv.h 2017-03-28 23:46:26.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -27,11 +27,9 @@ G_BEGIN_DECLS -void g_mime_iconv_init (void); -void g_mime_iconv_shutdown (void); - iconv_t g_mime_iconv_open (const char *to, const char *from); +int g_mime_iconv_close (iconv_t cd); /** * g_mime_iconv: @@ -98,8 +96,6 @@ **/ #define g_mime_iconv(cd,inbuf,inleft,outbuf,outleft) iconv (cd, inbuf, inleft, outbuf, outleft) -int g_mime_iconv_close (iconv_t cd); - G_END_DECLS #endif /* __GMIME_ICONV_H__ */ diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-iconv-utils.c gmime-3.0.1/gmime/gmime-iconv-utils.c --- gmime-2.6.22+dfsg2/gmime/gmime-iconv-utils.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-iconv-utils.c 2017-03-28 23:46:26.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -47,51 +47,6 @@ **/ -#ifdef G_THREADS_ENABLED -extern void _g_mime_iconv_utils_unlock (void); -extern void _g_mime_iconv_utils_lock (void); -#define UNLOCK() _g_mime_iconv_utils_unlock () -#define LOCK() _g_mime_iconv_utils_lock () -#else -#define UNLOCK() -#define LOCK() -#endif /* G_THREADS_ENABLED */ - -static iconv_t utf8_to_locale = (iconv_t) -1; -static iconv_t locale_to_utf8 = (iconv_t) -1; - - -void -g_mime_iconv_utils_init (void) -{ - const char *utf8, *locale; - - utf8 = g_mime_charset_iconv_name ("UTF-8"); - - if (!(locale = g_mime_locale_charset ())) - locale = "US-ASCII"; - - if ((locale = g_mime_charset_iconv_name (locale))) { - utf8_to_locale = iconv_open (locale, utf8); - locale_to_utf8 = iconv_open (utf8, locale); - } -} - -void -g_mime_iconv_utils_shutdown (void) -{ - if (utf8_to_locale != (iconv_t) -1) { - iconv_close (utf8_to_locale); - utf8_to_locale = (iconv_t) -1; - } - - if (locale_to_utf8 != (iconv_t) -1) { - iconv_close (locale_to_utf8); - locale_to_utf8 = (iconv_t) -1; - } -} - - /** * g_mime_iconv_strndup: (skip) * @cd: conversion descriptor @@ -132,7 +87,7 @@ converted = iconv (cd, (char **) &inbuf, &inleft, &outbuf, &outleft); if (converted != (size_t) -1 || errno == EINVAL) { /* - * EINVAL An incomplete multibyte sequence has been encoun + * EINVAL An incomplete multibyte sequence has been encoun- * tered in the input. * * We'll just have to ignore it... @@ -224,11 +179,19 @@ char * g_mime_iconv_locale_to_utf8 (const char *str) { + const char *locale, *utf8; + iconv_t cd; char *buf; - LOCK (); - buf = g_mime_iconv_strdup (locale_to_utf8, str); - UNLOCK (); + if (!(locale = g_mime_locale_charset ())) + locale = "iso-8859-1"; + + locale = g_mime_charset_iconv_name (locale); + utf8 = g_mime_charset_iconv_name ("UTF-8"); + + cd = iconv_open (locale, utf8); + buf = g_mime_iconv_strdup (cd, str); + iconv_close (cd); return buf; } @@ -248,11 +211,19 @@ char * g_mime_iconv_locale_to_utf8_length (const char *str, size_t n) { + const char *locale, *utf8; + iconv_t cd; char *buf; - LOCK (); - buf = g_mime_iconv_strndup (locale_to_utf8, str, n); - UNLOCK (); + if (!(locale = g_mime_locale_charset ())) + locale = "iso-8859-1"; + + locale = g_mime_charset_iconv_name (locale); + utf8 = g_mime_charset_iconv_name ("UTF-8"); + + cd = iconv_open (locale, utf8); + buf = g_mime_iconv_strndup (cd, str, n); + iconv_close (cd); return buf; } @@ -271,11 +242,21 @@ char * g_mime_iconv_utf8_to_locale (const char *str) { + const char *locale, *utf8; + iconv_t cd; char *buf; - LOCK (); - buf = g_mime_iconv_strdup (utf8_to_locale, str); - UNLOCK (); + if (!(locale = g_mime_locale_charset ())) + return g_strdup (str); + + locale = g_mime_charset_iconv_name (locale); + utf8 = g_mime_charset_iconv_name ("UTF-8"); + + if ((cd = iconv_open (utf8, locale)) == (iconv_t) -1) + return g_strdup (str); + + buf = g_mime_iconv_strdup (cd, str); + iconv_close (cd); return buf; } @@ -295,11 +276,21 @@ char * g_mime_iconv_utf8_to_locale_length (const char *str, size_t n) { + const char *locale, *utf8; + iconv_t cd; char *buf; - LOCK (); - buf = g_mime_iconv_strndup (utf8_to_locale, str, n); - UNLOCK (); + if (!(locale = g_mime_locale_charset ())) + return g_strndup (str, n); + + locale = g_mime_charset_iconv_name (locale); + utf8 = g_mime_charset_iconv_name ("UTF-8"); + + if ((cd = iconv_open (utf8, locale)) == (iconv_t) -1) + return g_strndup (str, n); + + buf = g_mime_iconv_strndup (cd, str, n); + iconv_close (cd); return buf; } diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-iconv-utils.h gmime-3.0.1/gmime/gmime-iconv-utils.h --- gmime-2.6.22+dfsg2/gmime/gmime-iconv-utils.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-iconv-utils.h 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-internal.h gmime-3.0.1/gmime/gmime-internal.h --- gmime-2.6.22+dfsg2/gmime/gmime-internal.h 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-internal.h 2017-04-08 17:01:10.000000000 +0000 @@ -0,0 +1,82 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2017 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_INTERNAL_H__ +#define __GMIME_INTERNAL_H__ + +#include +#include +#include +#include +#include + +G_BEGIN_DECLS + +typedef enum { + GMIME_HEADER_LIST_CHANGED_ACTION_ADDED, + GMIME_HEADER_LIST_CHANGED_ACTION_CHANGED, + GMIME_HEADER_LIST_CHANGED_ACTION_REMOVED, + GMIME_HEADER_LIST_CHANGED_ACTION_CLEARED +} GMimeHeaderListChangedAction; + +typedef struct { + GMimeHeaderListChangedAction action; + GMimeHeader *header; +} GMimeHeaderListChangedEventArgs; + +/* GMimeParserOptions */ +G_GNUC_INTERNAL void g_mime_format_options_init (void); +G_GNUC_INTERNAL void g_mime_format_options_shutdown (void); +G_GNUC_INTERNAL GMimeFormatOptions *_g_mime_format_options_clone (GMimeFormatOptions *options, gboolean hidden); + +/* GMimeParserOptions */ +G_GNUC_INTERNAL void g_mime_parser_options_init (void); +G_GNUC_INTERNAL void g_mime_parser_options_shutdown (void); + +/* GMimeHeader */ +G_GNUC_INTERNAL void _g_mime_header_set_raw_value (GMimeHeader *header, const char *raw_value); +G_GNUC_INTERNAL void _g_mime_header_set_offset (GMimeHeader *header, gint64 offset); + +/* GMimeHeaderList */ +G_GNUC_INTERNAL GMimeParserOptions *_g_mime_header_list_get_options (GMimeHeaderList *headers); +G_GNUC_INTERNAL void _g_mime_header_list_set_options (GMimeHeaderList *headers, GMimeParserOptions *options); +G_GNUC_INTERNAL void _g_mime_header_list_append (GMimeHeaderList *headers, const char *name, const char *raw_name, + const char *raw_value, gint64 offset); +G_GNUC_INTERNAL void _g_mime_header_list_set (GMimeHeaderList *headers, const char *name, const char *raw_value); + +/* GMimeObject */ +G_GNUC_INTERNAL void _g_mime_object_block_header_list_changed (GMimeObject *object); +G_GNUC_INTERNAL void _g_mime_object_unblock_header_list_changed (GMimeObject *object); +G_GNUC_INTERNAL void _g_mime_object_set_content_type (GMimeObject *object, GMimeContentType *content_type); +G_GNUC_INTERNAL void _g_mime_object_append_header (GMimeObject *object, const char *name, const char *raw_name, + const char *raw_value, gint64 offset); + +/* utils */ +G_GNUC_INTERNAL char *_g_mime_utils_unstructured_header_fold (GMimeParserOptions *options, GMimeFormatOptions *format, + const char *field, const char *value); +G_GNUC_INTERNAL char *_g_mime_utils_structured_header_fold (GMimeParserOptions *options, GMimeFormatOptions *format, + const char *field, const char *value); +G_GNUC_INTERNAL char *_g_mime_utils_header_decode_text (GMimeParserOptions *options, const char *text, const char **charset); +G_GNUC_INTERNAL char *_g_mime_utils_header_decode_phrase (GMimeParserOptions *options, const char *text, const char **charset); + +G_END_DECLS + +#endif /* __GMIME_INTERNAL_H__ */ diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-message.c gmime-3.0.1/gmime/gmime-message.c --- gmime-2.6.22+dfsg2/gmime/gmime-message.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-message.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -37,6 +37,7 @@ #include "gmime-stream-mem.h" #include "gmime-table-private.h" #include "gmime-parse-utils.h" +#include "gmime-internal.h" #include "gmime-events.h" @@ -49,31 +50,24 @@ * A #GMimeMessage represents an rfc822 message. **/ -extern GMimeEvent *_g_mime_header_list_get_changed_event (GMimeHeaderList *headers); -extern char *_g_mime_utils_unstructured_header_fold (const char *field, const char *value); -extern char *_g_mime_utils_structured_header_fold (const char *field, const char *value); - static void g_mime_message_class_init (GMimeMessageClass *klass); static void g_mime_message_init (GMimeMessage *message, GMimeMessageClass *klass); static void g_mime_message_finalize (GObject *object); /* GMimeObject class methods */ -static void message_prepend_header (GMimeObject *object, const char *header, const char *value); -static void message_append_header (GMimeObject *object, const char *header, const char *value); -static void message_set_header (GMimeObject *object, const char *header, const char *value); -static const char *message_get_header (GMimeObject *object, const char *header); -static gboolean message_remove_header (GMimeObject *object, const char *header); -static char *message_get_headers (GMimeObject *object); -static ssize_t message_write_to_stream (GMimeObject *object, GMimeStream *stream); +static void message_header_added (GMimeObject *object, GMimeHeader *header); +static void message_header_changed (GMimeObject *object, GMimeHeader *header); +static void message_header_removed (GMimeObject *object, GMimeHeader *header); +static void message_headers_cleared (GMimeObject *object); + +static char *message_get_headers (GMimeObject *object, GMimeFormatOptions *options); +static ssize_t message_write_to_stream (GMimeObject *object, GMimeFormatOptions *options, + gboolean content_only, GMimeStream *stream); static void message_encode (GMimeObject *object, GMimeEncodingConstraint constraint); -/*static ssize_t write_structured (GMimeStream *stream, const char *name, const char *value);*/ -static ssize_t write_references (GMimeStream *stream, const char *name, const char *value); -static ssize_t write_addrspec (GMimeStream *stream, const char *name, const char *value); -static ssize_t write_received (GMimeStream *stream, const char *name, const char *value); -static ssize_t write_subject (GMimeStream *stream, const char *name, const char *value); -static ssize_t write_msgid (GMimeStream *stream, const char *name, const char *value); - +static void sender_changed (InternetAddressList *list, gpointer args, GMimeMessage *message); +static void from_changed (InternetAddressList *list, gpointer args, GMimeMessage *message); +static void reply_to_changed (InternetAddressList *list, gpointer args, GMimeMessage *message); static void to_list_changed (InternetAddressList *list, gpointer args, GMimeMessage *message); static void cc_list_changed (InternetAddressList *list, gpointer args, GMimeMessage *message); static void bcc_list_changed (InternetAddressList *list, gpointer args, GMimeMessage *message); @@ -81,17 +75,19 @@ static GMimeObjectClass *parent_class = NULL; - static struct { const char *name; GMimeEventCallback changed_cb; -} recipient_types[] = { - { "To", (GMimeEventCallback) to_list_changed }, - { "Cc", (GMimeEventCallback) cc_list_changed }, - { "Bcc", (GMimeEventCallback) bcc_list_changed } +} address_types[] = { + { "Sender", (GMimeEventCallback) sender_changed }, + { "From", (GMimeEventCallback) from_changed }, + { "Reply-To", (GMimeEventCallback) reply_to_changed }, + { "To", (GMimeEventCallback) to_list_changed }, + { "Cc", (GMimeEventCallback) cc_list_changed }, + { "Bcc", (GMimeEventCallback) bcc_list_changed } }; -#define N_RECIPIENT_TYPES G_N_ELEMENTS (recipient_types) +#define N_ADDRESS_TYPES G_N_ELEMENTS (address_types) static char *rfc822_headers[] = { "Return-Path", @@ -141,61 +137,53 @@ gobject_class->finalize = g_mime_message_finalize; - object_class->prepend_header = message_prepend_header; - object_class->append_header = message_append_header; - object_class->remove_header = message_remove_header; - object_class->set_header = message_set_header; - object_class->get_header = message_get_header; + object_class->header_added = message_header_added; + object_class->header_changed = message_header_changed; + object_class->header_removed = message_header_removed; + object_class->headers_cleared = message_headers_cleared; object_class->get_headers = message_get_headers; object_class->write_to_stream = message_write_to_stream; object_class->encode = message_encode; } static void -mime_part_headers_changed (GMimeHeaderList *headers, gpointer args, GMimeMessage *message) -{ - /* clear the message's header stream */ - g_mime_header_list_set_stream (((GMimeObject *) message)->headers, NULL); -} - -static void -connect_changed_event (GMimeMessage *message, GMimeRecipientType type) +connect_changed_event (GMimeMessage *message, GMimeAddressType type) { - InternetAddressList *list; + InternetAddressList *addrlist; - list = message->recipients[type]; + addrlist = message->addrlists[type]; - g_mime_event_add (list->priv, recipient_types[type].changed_cb, message); + g_mime_event_add (addrlist->changed, address_types[type].changed_cb, message); } static void -disconnect_changed_event (GMimeMessage *message, GMimeRecipientType type) +disconnect_changed_event (GMimeMessage *message, GMimeAddressType type) { - InternetAddressList *list; + InternetAddressList *addrlist; - list = message->recipients[type]; + addrlist = message->addrlists[type]; - g_mime_event_remove (list->priv, recipient_types[type].changed_cb, message); + g_mime_event_remove (addrlist->changed, address_types[type].changed_cb, message); } static void -block_changed_event (GMimeMessage *message, GMimeRecipientType type) +block_changed_event (GMimeMessage *message, GMimeAddressType type) { - InternetAddressList *list; + InternetAddressList *addrlist; - list = message->recipients[type]; + addrlist = message->addrlists[type]; - g_mime_event_block (list->priv, recipient_types[type].changed_cb, message); + g_mime_event_block (addrlist->changed, address_types[type].changed_cb, message); } static void -unblock_changed_event (GMimeMessage *message, GMimeRecipientType type) +unblock_changed_event (GMimeMessage *message, GMimeAddressType type) { - InternetAddressList *list; + InternetAddressList *addrlist; - list = message->recipients[type]; + addrlist = message->addrlists[type]; - g_mime_event_unblock (list->priv, recipient_types[type].changed_cb, message); + g_mime_event_unblock (addrlist->changed, address_types[type].changed_cb, message); } static void @@ -204,508 +192,50 @@ GMimeHeaderList *headers = ((GMimeObject *) message)->headers; guint i; - message->from = NULL; - message->reply_to = NULL; - message->recipients = g_new (InternetAddressList *, N_RECIPIENT_TYPES); - message->subject = NULL; - message->date = 0; - message->tz_offset = 0; + message->addrlists = g_new (InternetAddressList *, N_ADDRESS_TYPES); + ((GMimeObject *) message)->ensure_newline = TRUE; message->message_id = NULL; message->mime_part = NULL; + message->subject = NULL; + message->date = NULL; /* initialize recipient lists */ - for (i = 0; i < N_RECIPIENT_TYPES; i++) { - message->recipients[i] = internet_address_list_new (); + for (i = 0; i < N_ADDRESS_TYPES; i++) { + message->addrlists[i] = internet_address_list_new (); connect_changed_event (message, i); } - - g_mime_header_list_register_writer (headers, "Sender", write_addrspec); - g_mime_header_list_register_writer (headers, "From", write_addrspec); - g_mime_header_list_register_writer (headers, "To", write_addrspec); - g_mime_header_list_register_writer (headers, "Cc", write_addrspec); - g_mime_header_list_register_writer (headers, "Bcc", write_addrspec); - - g_mime_header_list_register_writer (headers, "Resent-Sender", write_addrspec); - g_mime_header_list_register_writer (headers, "Resent-From", write_addrspec); - g_mime_header_list_register_writer (headers, "Resent-To", write_addrspec); - g_mime_header_list_register_writer (headers, "Resent-Cc", write_addrspec); - g_mime_header_list_register_writer (headers, "Resent-Bcc", write_addrspec); - - g_mime_header_list_register_writer (headers, "Subject", write_subject); - g_mime_header_list_register_writer (headers, "Received", write_received); - g_mime_header_list_register_writer (headers, "Message-Id", write_msgid); - g_mime_header_list_register_writer (headers, "References", write_references); } static void g_mime_message_finalize (GObject *object) { GMimeMessage *message = (GMimeMessage *) object; - GMimeEvent *changed; guint i; - g_free (message->from); - g_free (message->reply_to); - /* disconnect changed handlers */ - for (i = 0; i < N_RECIPIENT_TYPES; i++) { + for (i = 0; i < N_ADDRESS_TYPES; i++) { disconnect_changed_event (message, i); - g_object_unref (message->recipients[i]); + g_object_unref (message->addrlists[i]); } - g_free (message->recipients); - + g_free (message->addrlists); + g_free (message->message_id); g_free (message->subject); + g_free (message->marker); - g_free (message->message_id); + if (message->date) + g_date_time_unref (message->date); /* unref child mime part */ - if (message->mime_part) { - changed = _g_mime_header_list_get_changed_event (message->mime_part->headers); - g_mime_event_remove (changed, (GMimeEventCallback) mime_part_headers_changed, message); + if (message->mime_part) g_object_unref (message->mime_part); - } G_OBJECT_CLASS (parent_class)->finalize (object); } -typedef void (* token_skip_t) (const char **in); - -struct _received_token { - char *token; - size_t len; - token_skip_t skip; -}; - -static void skip_atom (const char **in); -static void skip_domain (const char **in); -static void skip_addr (const char **in); -static void skip_msgid (const char **in); - -static struct _received_token received_tokens[] = { - { "from ", 5, skip_domain }, - { "by ", 3, skip_domain }, - { "via ", 4, skip_atom }, - { "with ", 5, skip_atom }, - { "id ", 3, skip_msgid }, - { "for ", 4, skip_addr } -}; - -static void -skip_atom (const char **in) -{ - register const char *inptr; - - decode_lwsp (in); - inptr = *in; - while (is_atom (*inptr)) - inptr++; - *in = inptr; -} - -static void -skip_comment (const char **in) -{ - register const char *inptr = *in; - int depth = 1; - - if (*inptr == '(') - inptr++; - - while (*inptr && depth > 0) { - if (*inptr == '(') - depth++; - else if (*inptr == ')') - depth--; - inptr++; - } - - if (*inptr == ')') - inptr++; - - *in = inptr; -} - -static void -skip_quoted_string (const char **in) -{ - const char *inptr = *in; - - decode_lwsp (&inptr); - if (*inptr == '"') { - inptr++; - while (*inptr && *inptr != '"') { - if (*inptr == '\\') - inptr++; - - if (*inptr) - inptr++; - } - - if (*inptr == '"') - inptr++; - } - - *in = inptr; -} - -static void -skip_word (const char **in) -{ - decode_lwsp (in); - if (**in == '"') { - skip_quoted_string (in); - } else { - skip_atom (in); - } -} - -static void -skip_domain_subliteral (const char **in) -{ - const char *inptr = *in; - - while (*inptr && *inptr != '.' && *inptr != ']') { - if (is_dtext (*inptr)) { - inptr++; - } else if (is_lwsp (*inptr)) { - decode_lwsp (&inptr); - } else { - break; - } - } - - *in = inptr; -} - -static void -skip_domain_literal (const char **in) -{ - const char *inptr = *in; - - decode_lwsp (&inptr); - while (*inptr && *inptr != ']') { - skip_domain_subliteral (&inptr); - if (*inptr && *inptr != ']') - inptr++; - } - - *in = inptr; -} - -static void -skip_domain (const char **in) -{ - const char *save, *inptr = *in; - - while (inptr && *inptr) { - decode_lwsp (&inptr); - if (*inptr == '[') { - /* domain literal */ - inptr++; - skip_domain_literal (&inptr); - if (*inptr == ']') - inptr++; - } else { - skip_atom (&inptr); - } - - save = inptr; - decode_lwsp (&inptr); - if (*inptr != '.') { - inptr = save; - break; - } - - inptr++; - } - - *in = inptr; -} - -static void -skip_addrspec (const char **in) -{ - const char *inptr = *in; - - decode_lwsp (&inptr); - skip_word (&inptr); - decode_lwsp (&inptr); - - while (*inptr == '.') { - inptr++; - skip_word (&inptr); - decode_lwsp (&inptr); - } - - if (*inptr == '@') { - inptr++; - skip_domain (&inptr); - } - - *in = inptr; -} - -static void -skip_addr (const char **in) -{ - const char *inptr = *in; - - decode_lwsp (&inptr); - if (*inptr == '<') { - inptr++; - skip_addrspec (&inptr); - if (*inptr == '>') - inptr++; - } else { - skip_addrspec (&inptr); - } - - *in = inptr; -} - -static void -skip_msgid (const char **in) -{ - const char *inptr = *in; - - decode_lwsp (&inptr); - if (*inptr == '<') { - inptr++; - skip_addrspec (&inptr); - if (*inptr == '>') - inptr++; - } else { - skip_atom (&inptr); - } - - *in = inptr; -} - - -struct _received_part { - struct _received_part *next; - const char *start; - size_t len; -}; - -static ssize_t -write_received (GMimeStream *stream, const char *name, const char *value) -{ - struct _received_part *parts, *part, *tail; - const char *inptr, *lwsp = NULL; - ssize_t nwritten; - GString *str; - size_t len; - guint i; - - while (is_lwsp (*value)) - value++; - - if (*value == '\0') - return 0; - - str = g_string_new (name); - g_string_append_len (str, ": ", 2); - len = 10; - - tail = parts = part = g_alloca (sizeof (struct _received_part)); - part->start = inptr = value; - part->next = NULL; - - while (*inptr) { - for (i = 0; i < G_N_ELEMENTS (received_tokens); i++) { - if (!strncmp (inptr, received_tokens[i].token, received_tokens[i].len)) { - if (inptr > part->start) { - g_assert (lwsp != NULL); - part->len = lwsp - part->start; - - part = g_alloca (sizeof (struct _received_part)); - part->start = inptr; - part->next = NULL; - - tail->next = part; - tail = part; - } - - inptr += received_tokens[i].len; - received_tokens[i].skip (&inptr); - - lwsp = inptr; - while (is_lwsp (*inptr)) - inptr++; - - if (*inptr == ';') { - inptr++; - - part->len = inptr - part->start; - - lwsp = inptr; - while (is_lwsp (*inptr)) - inptr++; - - part = g_alloca (sizeof (struct _received_part)); - part->start = inptr; - part->next = NULL; - - tail->next = part; - tail = part; - } - - break; - } - } - - if (i == G_N_ELEMENTS (received_tokens)) { - while (*inptr && !is_lwsp (*inptr)) - inptr++; - - lwsp = inptr; - while (is_lwsp (*inptr)) - inptr++; - } - - if (*inptr == '(') { - skip_comment (&inptr); - - lwsp = inptr; - while (is_lwsp (*inptr)) - inptr++; - } - } - - part->len = lwsp - part->start; - - lwsp = NULL; - part = parts; - do { - len += lwsp ? part->start - lwsp : 0; - if (len + part->len > GMIME_FOLD_LEN && part != parts) { - g_string_append (str, "\n\t"); - len = 1; - } else if (lwsp) { - g_string_append_len (str, lwsp, (size_t) (part->start - lwsp)); - } - - g_string_append_len (str, part->start, part->len); - lwsp = part->start + part->len; - len += part->len; - - part = part->next; - } while (part != NULL); - - g_string_append_c (str, '\n'); - - nwritten = g_mime_stream_write (stream, str->str, str->len); - g_string_free (str, TRUE); - - return nwritten; -} - -static ssize_t -write_subject (GMimeStream *stream, const char *name, const char *value) -{ - char *folded; - ssize_t n; - - folded = _g_mime_utils_unstructured_header_fold (name, value); - n = g_mime_stream_write_string (stream, folded); - g_free (folded); - - return n; -} - -static ssize_t -write_msgid (GMimeStream *stream, const char *name, const char *value) -{ - /* Note: we don't want to wrap the Message-Id header - seems to - break a lot of clients (and servers) */ - return g_mime_stream_printf (stream, "%s: %s\n", name, value); -} - -static ssize_t -write_references (GMimeStream *stream, const char *name, const char *value) -{ - GMimeReferences *references, *reference; - ssize_t nwritten; - GString *folded; - size_t len, n; - - /* Note: we don't want to break in the middle of msgid tokens as - it seems to break a lot of clients (and servers) */ - references = g_mime_references_decode (value); - folded = g_string_new (name); - g_string_append_c (folded, ':'); - len = folded->len; - - reference = references; - while (reference != NULL) { - n = strlen (reference->msgid); - if (len > 1 && len + n + 3 >= GMIME_FOLD_LEN) { - g_string_append_len (folded, "\n\t", 2); - len = 1; - } else { - g_string_append_c (folded, ' '); - len++; - } - - g_string_append_c (folded, '<'); - g_string_append_len (folded, reference->msgid, n); - g_string_append_c (folded, '>'); - len += n + 2; - - reference = reference->next; - } - - g_mime_references_clear (&references); - - g_string_append_len (folded, "\n", 1); - nwritten = g_mime_stream_write (stream, folded->str, folded->len); - g_string_free (folded, TRUE); - - return nwritten; -} - -#if 0 -static ssize_t -write_structured (GMimeStream *stream, const char *name, const char *value) -{ - char *folded; - ssize_t n; - - folded = _g_mime_utils_structured_header_fold (name, value); - n = g_mime_stream_write_string (stream, folded); - g_free (folded); - - return n; -} -#endif - -static ssize_t -write_addrspec (GMimeStream *stream, const char *name, const char *value) -{ - InternetAddressList *addrlist; - GString *str; - ssize_t n; - - str = g_string_new (name); - g_string_append (str, ": "); - - if (value && (addrlist = internet_address_list_parse_string (value))) { - internet_address_list_writer (addrlist, str); - g_object_unref (addrlist); - } - - g_string_append_c (str, '\n'); - - n = g_mime_stream_write (stream, str->str, str->len); - g_string_free (str, TRUE); - - return n; -} - enum { + HEADER_SENDER, HEADER_FROM, HEADER_REPLY_TO, HEADER_TO, @@ -719,6 +249,7 @@ }; static const char *message_headers[] = { + "Sender", "From", "Reply-To", "To", @@ -730,290 +261,286 @@ "MIME-Version", }; -enum { - PREPEND, - APPEND, - SET -}; - static void -message_add_recipients_from_string (GMimeMessage *message, int action, GMimeRecipientType type, const char *str) +message_update_addresses (GMimeMessage *message, GMimeParserOptions *options, GMimeAddressType type) { - InternetAddressList *recipients, *addrlist; + GMimeHeaderList *headers = ((GMimeObject *) message)->headers; + InternetAddressList *addrlist, *list; + const char *name, *value; + GMimeHeader *header; + int count, i; - recipients = g_mime_message_get_recipients (message, type); + block_changed_event (message, type); - if (action == SET) - internet_address_list_clear (recipients); + addrlist = message->addrlists[type]; - if ((addrlist = internet_address_list_parse_string (str))) { - if (action == PREPEND) - internet_address_list_prepend (recipients, addrlist); - else - internet_address_list_append (recipients, addrlist); + internet_address_list_clear (addrlist); + + count = g_mime_header_list_get_count (headers); + for (i = 0; i < count; i++) { + header = g_mime_header_list_get_header_at (headers, i); + name = g_mime_header_get_name (header); - g_object_unref (addrlist); + if (g_ascii_strcasecmp (address_types[type].name, name) != 0) + continue; + + if ((value = g_mime_header_get_raw_value (header))) { + if ((list = internet_address_list_parse (options, value))) { + internet_address_list_append (addrlist, list); + g_object_unref (list); + } + } } + + unblock_changed_event (message, type); } -static gboolean -process_header (GMimeObject *object, int action, const char *header, const char *value) +static void +process_header (GMimeObject *object, GMimeHeader *header) { - GMimeMessage *message = (GMimeMessage *) object; - InternetAddressList *addrlist; - time_t date; - int offset; + GMimeParserOptions *options = _g_mime_header_list_get_options (object->headers); + GMimeMessage *message = (GMimeMessage *) object; + const char *name, *value; guint i; + name = g_mime_header_get_name (header); + for (i = 0; i < G_N_ELEMENTS (message_headers); i++) { - if (!g_ascii_strcasecmp (message_headers[i], header)) + if (!g_ascii_strcasecmp (message_headers[i], name)) break; } switch (i) { + case HEADER_SENDER: + message_update_addresses (message, options, GMIME_ADDRESS_TYPE_SENDER); + break; case HEADER_FROM: - g_free (message->from); - if ((addrlist = internet_address_list_parse_string (value))) { - message->from = internet_address_list_to_string (addrlist, FALSE); - g_object_unref (addrlist); - } else { - message->from = NULL; - } + message_update_addresses (message, options, GMIME_ADDRESS_TYPE_FROM); break; case HEADER_REPLY_TO: - g_free (message->reply_to); - if ((addrlist = internet_address_list_parse_string (value))) { - message->reply_to = internet_address_list_to_string (addrlist, FALSE); - g_object_unref (addrlist); - } else { - message->reply_to = NULL; - } + message_update_addresses (message, options, GMIME_ADDRESS_TYPE_REPLY_TO); break; case HEADER_TO: - block_changed_event (message, GMIME_RECIPIENT_TYPE_TO); - message_add_recipients_from_string (message, action, GMIME_RECIPIENT_TYPE_TO, value); - unblock_changed_event (message, GMIME_RECIPIENT_TYPE_TO); + message_update_addresses (message, options, GMIME_ADDRESS_TYPE_TO); break; case HEADER_CC: - block_changed_event (message, GMIME_RECIPIENT_TYPE_CC); - message_add_recipients_from_string (message, action, GMIME_RECIPIENT_TYPE_CC, value); - unblock_changed_event (message, GMIME_RECIPIENT_TYPE_CC); + message_update_addresses (message, options, GMIME_ADDRESS_TYPE_CC); break; case HEADER_BCC: - block_changed_event (message, GMIME_RECIPIENT_TYPE_BCC); - message_add_recipients_from_string (message, action, GMIME_RECIPIENT_TYPE_BCC, value); - unblock_changed_event (message, GMIME_RECIPIENT_TYPE_BCC); + message_update_addresses (message, options, GMIME_ADDRESS_TYPE_BCC); break; case HEADER_SUBJECT: g_free (message->subject); - message->subject = g_mime_utils_header_decode_text (value); + + if ((value = g_mime_header_get_value (header))) + message->subject = g_strdup (value); + else + message->subject = NULL; break; case HEADER_DATE: - if (value) { - date = g_mime_utils_header_decode_date (value, &offset); - message->date = date; - message->tz_offset = offset; + if ((value = g_mime_header_get_value (header))) { + if (message->date) + g_date_time_unref (message->date); + + message->date = g_mime_utils_header_decode_date (value); } break; case HEADER_MESSAGE_ID: g_free (message->message_id); - message->message_id = g_mime_utils_decode_message_id (value); - break; - case HEADER_MIME_VERSION: + + if ((value = g_mime_header_get_value (header))) + message->message_id = g_mime_utils_decode_message_id (value); + else + message->message_id = NULL; break; - default: - return FALSE; } - - return TRUE; } static void -message_prepend_header (GMimeObject *object, const char *header, const char *value) +message_header_added (GMimeObject *object, GMimeHeader *header) { - GMimeMessage *message = (GMimeMessage *) object; - - /* Content-* headers don't belong on the message, they belong on the part. */ - if (!g_ascii_strncasecmp ("Content-", header, 8)) { - if (message->mime_part) - g_mime_object_prepend_header (message->mime_part, header, value); - return; - } - - if (!process_header (object, PREPEND, header, value)) - GMIME_OBJECT_CLASS (parent_class)->prepend_header (object, header, value); - else - g_mime_header_list_prepend (object->headers, header, value); + process_header (object, header); - if (message->mime_part) - g_mime_header_list_set_stream (message->mime_part->headers, NULL); + GMIME_OBJECT_CLASS (parent_class)->header_added (object, header); } static void -message_append_header (GMimeObject *object, const char *header, const char *value) +message_header_changed (GMimeObject *object, GMimeHeader *header) { - GMimeMessage *message = (GMimeMessage *) object; - - /* Content-* headers don't belong on the message, they belong on the part. */ - if (!g_ascii_strncasecmp ("Content-", header, 8)) { - if (message->mime_part) - g_mime_object_append_header (message->mime_part, header, value); - return; - } + process_header (object, header); - if (!process_header (object, APPEND, header, value)) - GMIME_OBJECT_CLASS (parent_class)->append_header (object, header, value); - else - g_mime_header_list_append (object->headers, header, value); - - if (message->mime_part) - g_mime_header_list_set_stream (message->mime_part->headers, NULL); + GMIME_OBJECT_CLASS (parent_class)->header_changed (object, header); } static void -message_set_header (GMimeObject *object, const char *header, const char *value) +message_header_removed (GMimeObject *object, GMimeHeader *header) { + GMimeParserOptions *options = _g_mime_header_list_get_options (object->headers); GMimeMessage *message = (GMimeMessage *) object; - - /* Content-* headers don't belong on the message, they belong on the part. */ - if (!g_ascii_strncasecmp ("Content-", header, 8)) { - if (message->mime_part) - g_mime_object_set_header (message->mime_part, header, value); - return; - } - - if (!process_header (object, SET, header, value)) - GMIME_OBJECT_CLASS (parent_class)->set_header (object, header, value); - else - g_mime_header_list_set (object->headers, header, value); - - if (message->mime_part) - g_mime_header_list_set_stream (message->mime_part->headers, NULL); -} - -static const char * -message_get_header (GMimeObject *object, const char *header) -{ - GMimeMessage *message = (GMimeMessage *) object; - const char *value; - - /* Content-* headers don't belong on the message, they belong on the part. */ - if (g_ascii_strncasecmp ("Content-", header, 8) != 0) { - if ((value = GMIME_OBJECT_CLASS (parent_class)->get_header (object, header))) - return value; - - if (!g_ascii_strcasecmp ("MIME-Version", header)) - return "1.0"; - } else if (message->mime_part) { - return g_mime_object_get_header (message->mime_part, header); - } - - return NULL; -} - -static gboolean -message_remove_header (GMimeObject *object, const char *header) -{ - GMimeMessage *message = (GMimeMessage *) object; - InternetAddressList *addrlist; - GMimeRecipientType type; + const char *name; + time_t date; + int offset; guint i; - /* Content-* headers don't belong on the message, they belong on the part. */ - if (!g_ascii_strncasecmp ("Content-", header, 8)) { - if (message->mime_part) - return g_mime_object_remove_header (message->mime_part, header); - - return FALSE; - } + name = g_mime_header_get_name (header); for (i = 0; i < G_N_ELEMENTS (message_headers); i++) { - if (!g_ascii_strcasecmp (message_headers[i], header)) + if (!g_ascii_strcasecmp (message_headers[i], name)) break; } switch (i) { + case HEADER_SENDER: + message_update_addresses (message, options, GMIME_ADDRESS_TYPE_SENDER); + break; case HEADER_FROM: - g_free (message->from); - message->from = NULL; + message_update_addresses (message, options, GMIME_ADDRESS_TYPE_FROM); break; case HEADER_REPLY_TO: - g_free (message->reply_to); - message->reply_to = NULL; + message_update_addresses (message, options, GMIME_ADDRESS_TYPE_REPLY_TO); break; case HEADER_TO: - type = GMIME_RECIPIENT_TYPE_TO; - block_changed_event (message, type); - addrlist = message->recipients[type]; - internet_address_list_clear (addrlist); - unblock_changed_event (message, type); + message_update_addresses (message, options, GMIME_ADDRESS_TYPE_TO); break; case HEADER_CC: - type = GMIME_RECIPIENT_TYPE_CC; - block_changed_event (message, type); - addrlist = message->recipients[type]; - internet_address_list_clear (addrlist); - unblock_changed_event (message, type); + message_update_addresses (message, options, GMIME_ADDRESS_TYPE_CC); break; case HEADER_BCC: - type = GMIME_RECIPIENT_TYPE_BCC; - block_changed_event (message, type); - addrlist = message->recipients[type]; - internet_address_list_clear (addrlist); - unblock_changed_event (message, type); + message_update_addresses (message, options, GMIME_ADDRESS_TYPE_BCC); break; case HEADER_SUBJECT: g_free (message->subject); message->subject = NULL; break; case HEADER_DATE: - message->date = 0; - message->tz_offset = 0; + if (message->date) { + g_date_time_unref (message->date); + message->date = NULL; + } break; case HEADER_MESSAGE_ID: g_free (message->message_id); message->message_id = NULL; break; - default: - break; } - if (GMIME_OBJECT_CLASS (parent_class)->remove_header (object, header)) { - if (message->mime_part) - g_mime_header_list_set_stream (message->mime_part->headers, NULL); + GMIME_OBJECT_CLASS (parent_class)->header_removed (object, header); +} + +static void +message_headers_cleared (GMimeObject *object) +{ + GMimeMessage *message = (GMimeMessage *) object; + guint i; + + for (i = 0; i < N_ADDRESS_TYPES; i++) { + block_changed_event (message, i); + internet_address_list_clear (message->addrlists[i]); + unblock_changed_event (message, i); + } + + g_free (message->message_id); + message->message_id = NULL; + g_free (message->subject); + message->subject = NULL; + + if (message->date) { + g_date_time_unref (message->date); + message->date = NULL; + } + + GMIME_OBJECT_CLASS (parent_class)->headers_cleared (object); +} + + +static ssize_t +write_headers_to_stream (GMimeObject *object, GMimeFormatOptions *options, GMimeStream *stream) +{ + GMimeMessage *message = (GMimeMessage *) object; + GMimeObject *mime_part = message->mime_part; + ssize_t nwritten, total = 0; + + if (mime_part != NULL) { + int body_count = g_mime_header_list_get_count (mime_part->headers); + int count = g_mime_header_list_get_count (object->headers); + GMimeHeader *header, *body_header; + gint64 body_offset, offset; + int body_index = 0; + int index = 0; + + while (index < count && body_index < body_count) { + body_header = g_mime_header_list_get_header_at (mime_part->headers, body_index); + if ((body_offset = g_mime_header_get_offset (body_header)) < 0) + break; + + header = g_mime_header_list_get_header_at (object->headers, index); + offset = g_mime_header_get_offset (header); + + if (offset >= 0 && offset < body_offset) { + if (!g_mime_format_options_is_hidden_header (options, header->name)) { + if ((nwritten = g_mime_header_write_to_stream (header, options, stream)) == -1) + return -1; + + total += nwritten; + } + + index++; + } else { + if (!g_mime_format_options_is_hidden_header (options, header->name)) { + if ((nwritten = g_mime_header_write_to_stream (body_header, options, stream)) == -1) + return -1; + + total += nwritten; + } + + body_index++; + } + } - return TRUE; + while (index < count) { + header = g_mime_header_list_get_header_at (object->headers, index); + + if (!g_mime_format_options_is_hidden_header (options, header->name)) { + if ((nwritten = g_mime_header_write_to_stream (header, options, stream)) == -1) + return -1; + + total += nwritten; + } + + index++; + } + + while (body_index < body_count) { + header = g_mime_header_list_get_header_at (mime_part->headers, body_index); + + if (!g_mime_format_options_is_hidden_header (options, header->name)) { + if ((nwritten = g_mime_header_write_to_stream (header, options, stream)) == -1) + return -1; + + total += nwritten; + } + + body_index++; + } + + return total; } - return FALSE; + return g_mime_header_list_write_to_stream (object->headers, options, stream); } static char * -message_get_headers (GMimeObject *object) +message_get_headers (GMimeObject *object, GMimeFormatOptions *options) { - GMimeMessage *message = (GMimeMessage *) object; GMimeStream *stream; GByteArray *ba; char *str; ba = g_byte_array_new (); stream = g_mime_stream_mem_new (); - g_mime_stream_mem_set_byte_array (GMIME_STREAM_MEM (stream), ba); - - if (message->mime_part && g_mime_header_list_get_stream (message->mime_part->headers)) { - /* if the mime part has raw headers, then it contains the message headers as well */ - g_mime_header_list_write_to_stream (message->mime_part->headers, stream); - } else { - g_mime_header_list_write_to_stream (object->headers, stream); - if (message->mime_part) { - if (g_mime_object_get_header (message->mime_part, "Content-Type") && - !g_mime_header_list_get (object->headers, "MIME-Version")) - g_mime_stream_write_string (stream, "MIME-Version: 1.0\n"); - g_mime_header_list_write_to_stream (message->mime_part->headers, stream); - } - } - + g_mime_stream_mem_set_byte_array ((GMimeStreamMem *) stream, ba); + write_headers_to_stream (object, options, stream); g_object_unref (stream); g_byte_array_append (ba, (unsigned char *) "", 1); str = (char *) ba->data; @@ -1023,39 +550,39 @@ } static ssize_t -message_write_to_stream (GMimeObject *object, GMimeStream *stream) +message_write_to_stream (GMimeObject *object, GMimeFormatOptions *options, gboolean content_only, GMimeStream *stream) { GMimeMessage *message = (GMimeMessage *) object; + GMimeObject *mime_part = message->mime_part; ssize_t nwritten, total = 0; + const char *newline; - if (message->mime_part) { - if (!g_mime_header_list_get_stream (message->mime_part->headers)) { - if ((nwritten = g_mime_header_list_write_to_stream (object->headers, stream)) == -1) - return -1; - - total += nwritten; - - if (!g_mime_header_list_get (object->headers, "MIME-Version")) { - if ((nwritten = g_mime_stream_write_string (stream, "MIME-Version: 1.0\n")) == -1) - return -1; - - total += nwritten; - } - } - - if ((nwritten = g_mime_object_write_to_stream (message->mime_part, stream)) == -1) - return -1; - } else { - if ((nwritten = g_mime_header_list_write_to_stream (object->headers, stream)) == -1) + if (!content_only) { + if ((nwritten = write_headers_to_stream (object, options, stream)) == -1) return -1; total += nwritten; - if ((nwritten = g_mime_stream_write (stream, "\n", 1)) == -1) + newline = g_mime_format_options_get_newline (options); + if ((nwritten = g_mime_stream_write_string (stream, newline)) == -1) return -1; + + total += nwritten; } - total += nwritten; + if (mime_part) { + GMimeObjectClass *klass = GMIME_OBJECT_GET_CLASS (mime_part); + + options = _g_mime_format_options_clone (options, FALSE); + mime_part->ensure_newline = ((GMimeObject *) message)->ensure_newline; + nwritten = klass->write_to_stream (mime_part, options, TRUE, stream); + mime_part->ensure_newline = FALSE; + + if (nwritten == -1) + return -1; + + total += nwritten; + } return total; } @@ -1089,13 +616,16 @@ GMimeMessage *message; guint i; - message = g_object_newv (GMIME_TYPE_MESSAGE, 0, NULL); + message = g_object_new (GMIME_TYPE_MESSAGE, NULL); if (pretty_headers) { /* Populate with the "standard" rfc822 headers so we can have a standard order */ headers = ((GMimeObject *) message)->headers; + + _g_mime_object_block_header_list_changed ((GMimeObject *) message); for (i = 0; i < G_N_ELEMENTS (rfc822_headers); i++) - g_mime_header_list_set (headers, rfc822_headers[i], NULL); + g_mime_header_list_set (headers, rfc822_headers[i], NULL, NULL); + _g_mime_object_unblock_header_list_changed ((GMimeObject *) message); } return message; @@ -1103,211 +633,219 @@ /** - * g_mime_message_set_sender: + * g_mime_message_get_sender: * @message: A #GMimeMessage - * @sender: The name and address of the sender * - * Set the sender's name and address on the MIME Message. - * (ex: "\"Joe Sixpack\" <joe@sixpack.org>") + * Gets the parsed list of addresses in the Sender header. * - * Note: The @sender string should be the raw encoded email - * address. It is probably best to use an #InternetAddress to - * construct and encode this value. + * Returns: (transfer none): the parsed list of addresses in the Sender header. **/ -void -g_mime_message_set_sender (GMimeMessage *message, const char *sender) +InternetAddressList * +g_mime_message_get_sender (GMimeMessage *message) { - InternetAddressList *addrlist; - char *encoded; - - g_return_if_fail (GMIME_IS_MESSAGE (message)); - g_return_if_fail (sender != NULL); - - g_free (message->from); - - if ((addrlist = internet_address_list_parse_string (sender))) { - message->from = internet_address_list_to_string (addrlist, FALSE); - encoded = internet_address_list_to_string (addrlist, TRUE); - g_mime_header_list_set (GMIME_OBJECT (message)->headers, "From", encoded); - g_object_unref (addrlist); - g_free (encoded); - } else { - g_mime_header_list_set (GMIME_OBJECT (message)->headers, "From", ""); - message->from = NULL; - } + g_return_val_if_fail (GMIME_IS_MESSAGE (message), NULL); - if (message->mime_part) - g_mime_header_list_set_stream (message->mime_part->headers, NULL); + return message->addrlists[GMIME_ADDRESS_TYPE_SENDER]; } /** - * g_mime_message_get_sender: + * g_mime_message_get_from: * @message: A #GMimeMessage * - * Gets the email address of the sender from @message. + * Gets the parsed list of addresses in the From header. * - * Returns: the sender's name and address of the @message in a form - * suitable for display or %NULL if no sender is set. If not %NULL, - * the returned string will be in UTF-8. + * Returns: (transfer none): the parsed list of addresses in the From header. **/ -const char * -g_mime_message_get_sender (GMimeMessage *message) +InternetAddressList * +g_mime_message_get_from (GMimeMessage *message) { g_return_val_if_fail (GMIME_IS_MESSAGE (message), NULL); - return message->from; + return message->addrlists[GMIME_ADDRESS_TYPE_FROM]; } /** - * g_mime_message_set_reply_to: + * g_mime_message_get_reply_to: * @message: A #GMimeMessage - * @reply_to: The Reply-To address * - * Set the sender's Reply-To address on the @message. + * Gets the parsed list of addresses in the Reply-To header. * - * Note: The @reply_to string should be the raw encoded email - * address. It is probably best to use an #InternetAddress to - * construct and encode this value. + * Returns: (transfer none): the parsed list of addresses in the Reply-To header. **/ -void -g_mime_message_set_reply_to (GMimeMessage *message, const char *reply_to) +InternetAddressList * +g_mime_message_get_reply_to (GMimeMessage *message) { - InternetAddressList *addrlist; - char *encoded; - - g_return_if_fail (GMIME_IS_MESSAGE (message)); - g_return_if_fail (reply_to != NULL); + g_return_val_if_fail (GMIME_IS_MESSAGE (message), NULL); - g_free (message->reply_to); + return message->addrlists[GMIME_ADDRESS_TYPE_REPLY_TO]; +} + + +/** + * g_mime_message_get_to: + * @message: A #GMimeMessage + * + * Gets combined list of parsed addresses in the To header(s). + * + * Returns: (transfer none): the parsed list of addresses in the To header(s). + **/ +InternetAddressList * +g_mime_message_get_to (GMimeMessage *message) +{ + g_return_val_if_fail (GMIME_IS_MESSAGE (message), NULL); - if ((addrlist = internet_address_list_parse_string (reply_to))) { - message->reply_to = internet_address_list_to_string (addrlist, FALSE); - encoded = internet_address_list_to_string (addrlist, TRUE); - g_mime_header_list_set (GMIME_OBJECT (message)->headers, "Reply-To", encoded); - g_object_unref (addrlist); - g_free (encoded); - } else { - g_mime_header_list_set (GMIME_OBJECT (message)->headers, "Reply-To", ""); - message->reply_to = NULL; - } + return message->addrlists[GMIME_ADDRESS_TYPE_TO]; +} + + +/** + * g_mime_message_get_cc: + * @message: A #GMimeMessage + * + * Gets combined list of parsed addresses in the Cc header(s). + * + * Returns: (transfer none): the parsed list of addresses in the Cc header(s). + **/ +InternetAddressList * +g_mime_message_get_cc (GMimeMessage *message) +{ + g_return_val_if_fail (GMIME_IS_MESSAGE (message), NULL); - if (message->mime_part) - g_mime_header_list_set_stream (message->mime_part->headers, NULL); + return message->addrlists[GMIME_ADDRESS_TYPE_CC]; } /** - * g_mime_message_get_reply_to: + * g_mime_message_get_bcc: * @message: A #GMimeMessage * - * Gets the Reply-To address from @message. + * Gets combined list of parsed addresses in the Bcc header(s). * - * Returns: the sender's Reply-To address in a form suitable for - * display or %NULL if no Reply-To address is set. If not %NULL, the - * returned string will be in UTF-8. + * Returns: (transfer none): the parsed list of addresses in the Bcc header(s). **/ -const char * -g_mime_message_get_reply_to (GMimeMessage *message) +InternetAddressList * +g_mime_message_get_bcc (GMimeMessage *message) { g_return_val_if_fail (GMIME_IS_MESSAGE (message), NULL); - return message->reply_to; + return message->addrlists[GMIME_ADDRESS_TYPE_BCC]; } static void -sync_recipient_header (GMimeMessage *message, GMimeRecipientType type) +sync_internet_address_list (InternetAddressList *list, GMimeMessage *message, const char *name) { GMimeObject *object = (GMimeObject *) message; - const char *name = recipient_types[type].name; - InternetAddressList *list; - char *string; - - /* sync the specified recipient header */ - if ((list = g_mime_message_get_recipients (message, type))) { - string = internet_address_list_to_string (list, TRUE); - g_mime_header_list_set (object->headers, name, string); - g_free (string); - } else { - /* list should never be NULL... */ - g_mime_header_list_set (object->headers, name, NULL); - } + GString *str; + guint n; - if (message->mime_part) - g_mime_header_list_set_stream (message->mime_part->headers, NULL); + str = g_string_new (name); + g_string_append_c (str, ':'); + n = str->len; + + g_string_append_c (str, ' '); + internet_address_list_encode (list, NULL, str); + + _g_mime_object_block_header_list_changed (object); + _g_mime_header_list_set (object->headers, name, str->str + n); + _g_mime_object_unblock_header_list_changed (object); + + g_string_free (str, TRUE); +} + +static void +sync_address_header (GMimeMessage *message, GMimeAddressType type) +{ + InternetAddressList *list = message->addrlists[type]; + const char *name = address_types[type].name; + + sync_internet_address_list (list, message, name); +} + +static void +sender_changed (InternetAddressList *list, gpointer args, GMimeMessage *message) +{ + sync_address_header (message, GMIME_ADDRESS_TYPE_SENDER); +} + +static void +from_changed (InternetAddressList *list, gpointer args, GMimeMessage *message) +{ + sync_address_header (message, GMIME_ADDRESS_TYPE_FROM); +} + +static void +reply_to_changed (InternetAddressList *list, gpointer args, GMimeMessage *message) +{ + sync_address_header (message, GMIME_ADDRESS_TYPE_REPLY_TO); } static void to_list_changed (InternetAddressList *list, gpointer args, GMimeMessage *message) { - sync_recipient_header (message, GMIME_RECIPIENT_TYPE_TO); + sync_address_header (message, GMIME_ADDRESS_TYPE_TO); } static void cc_list_changed (InternetAddressList *list, gpointer args, GMimeMessage *message) { - sync_recipient_header (message, GMIME_RECIPIENT_TYPE_CC); + sync_address_header (message, GMIME_ADDRESS_TYPE_CC); } static void bcc_list_changed (InternetAddressList *list, gpointer args, GMimeMessage *message) { - sync_recipient_header (message, GMIME_RECIPIENT_TYPE_BCC); + sync_address_header (message, GMIME_ADDRESS_TYPE_BCC); } /** - * g_mime_message_add_recipient: + * g_mime_message_add_mailbox: * @message: A #GMimeMessage - * @type: A #GMimeRecipientType - * @name: The recipient's name (or %NULL) - * @addr: The recipient's address + * @type: A #GMimeAddressType + * @name: The name of the mailbox (or %NULL) + * @addr: The address of the mailbox * - * Add a recipient of a chosen type to the MIME message. + * Add a mailbox of a chosen type to the MIME message. * * Note: The @name (and @addr) strings should be in UTF-8. **/ void -g_mime_message_add_recipient (GMimeMessage *message, GMimeRecipientType type, const char *name, const char *addr) +g_mime_message_add_mailbox (GMimeMessage *message, GMimeAddressType type, const char *name, const char *addr) { - InternetAddressList *recipients; + InternetAddressList *addrlist; InternetAddress *ia; g_return_if_fail (GMIME_IS_MESSAGE (message)); - g_return_if_fail (type < N_RECIPIENT_TYPES); + g_return_if_fail (type < N_ADDRESS_TYPES); g_return_if_fail (addr != NULL); - recipients = message->recipients[type]; + addrlist = message->addrlists[type]; ia = internet_address_mailbox_new (name, addr); - internet_address_list_add (recipients, ia); + internet_address_list_add (addrlist, ia); g_object_unref (ia); - - if (message->mime_part) - g_mime_header_list_set_stream (message->mime_part->headers, NULL); - - g_mime_header_list_set_stream (((GMimeObject *) message)->headers, NULL); } /** - * g_mime_message_get_recipients: + * g_mime_message_get_addresses: * @message: A #GMimeMessage - * @type: A #GMimeRecipientType + * @type: A #GMimeAddressType * - * Gets a list of recipients of the specified @type from the @message. + * Gets a list of addresses of the specified @type from the @message. * - * Returns: (transfer none): a list of recipients of the specified + * Returns: (transfer none): a list of addresses of the specified * @type from the @message. **/ InternetAddressList * -g_mime_message_get_recipients (GMimeMessage *message, GMimeRecipientType type) +g_mime_message_get_addresses (GMimeMessage *message, GMimeAddressType type) { g_return_val_if_fail (GMIME_IS_MESSAGE (message), NULL); - g_return_val_if_fail (type < N_RECIPIENT_TYPES, NULL); + g_return_val_if_fail (type < N_ADDRESS_TYPES, NULL); - return message->recipients[type]; + return message->addrlists[type]; } @@ -1329,8 +867,8 @@ g_return_val_if_fail (GMIME_IS_MESSAGE (message), NULL); - for (i = 0; i < N_RECIPIENT_TYPES; i++) { - recipients = message->recipients[i]; + for (i = GMIME_ADDRESS_TYPE_TO; i <= GMIME_ADDRESS_TYPE_BCC; i++) { + recipients = message->addrlists[i]; if (internet_address_list_length (recipients) == 0) continue; @@ -1349,28 +887,19 @@ * g_mime_message_set_subject: * @message: A #GMimeMessage * @subject: Subject string + * @charset: The charset to use for encoding the subject or %NULL to use the default * * Set the subject of a @message. * * Note: The @subject string should be in UTF-8. **/ void -g_mime_message_set_subject (GMimeMessage *message, const char *subject) +g_mime_message_set_subject (GMimeMessage *message, const char *subject, const char *charset) { - char *encoded; - g_return_if_fail (GMIME_IS_MESSAGE (message)); g_return_if_fail (subject != NULL); - g_free (message->subject); - message->subject = g_mime_strdup_trim (subject); - - encoded = g_mime_utils_header_encode_text (message->subject); - g_mime_object_set_header (GMIME_OBJECT (message), "Subject", encoded); - g_free (encoded); - - if (message->mime_part) - g_mime_header_list_set_stream (message->mime_part->headers, NULL); + g_mime_object_set_header ((GMimeObject *) message, "Subject", subject, charset); } @@ -1397,95 +926,36 @@ * g_mime_message_set_date: * @message: A #GMimeMessage * @date: a date to be used in the Date header - * @tz_offset: timezone offset (in +/- hours) * * Sets the Date header on a MIME Message. **/ void -g_mime_message_set_date (GMimeMessage *message, time_t date, int tz_offset) +g_mime_message_set_date (GMimeMessage *message, GDateTime *date) { char *str; g_return_if_fail (GMIME_IS_MESSAGE (message)); - message->date = date; - message->tz_offset = tz_offset; - - str = g_mime_utils_header_format_date (date, tz_offset); - g_mime_object_set_header (GMIME_OBJECT (message), "Date", str); + str = g_mime_utils_header_format_date (date); + g_mime_object_set_header ((GMimeObject *) message, "Date", str, NULL); g_free (str); - - if (message->mime_part) - g_mime_header_list_set_stream (message->mime_part->headers, NULL); } /** * g_mime_message_get_date: * @message: A #GMimeMessage - * @date: (out): pointer to a date in time_t - * @tz_offset: (out): pointer to timezone offset (in +/- hours) * - * Stores the date in time_t format in @date. If @tz_offset is - * non-%NULL, then the timezone offset in will be stored in - * @tz_offset. - **/ -void -g_mime_message_get_date (GMimeMessage *message, time_t *date, int *tz_offset) -{ - g_return_if_fail (GMIME_IS_MESSAGE (message)); - g_return_if_fail (date != NULL); - - *date = message->date; - - if (tz_offset) - *tz_offset = message->tz_offset; -} - - -/** - * g_mime_message_get_date_as_string: - * @message: A #GMimeMessage + * Gets the parsed date and time value from the Date header. * - * Gets the message's sent-date in string format. - * - * Returns: a newly allocated string containing the Date header value. + * Returns: a #GDateTime on success or %NULL if the date could not be parsed. **/ -char * -g_mime_message_get_date_as_string (GMimeMessage *message) +GDateTime * +g_mime_message_get_date (GMimeMessage *message) { g_return_val_if_fail (GMIME_IS_MESSAGE (message), NULL); - return g_mime_utils_header_format_date (message->date, message->tz_offset); -} - - -/** - * g_mime_message_set_date_as_string: - * @message: A #GMimeMessage - * @str: a date string - * - * Sets the sent-date of the message. - **/ -void -g_mime_message_set_date_as_string (GMimeMessage *message, const char *str) -{ - int tz_offset; - time_t date; - char *buf; - - g_return_if_fail (GMIME_IS_MESSAGE (message)); - - date = g_mime_utils_header_decode_date (str, &tz_offset); - message->tz_offset = tz_offset; - message->date = date; - - buf = g_mime_utils_header_format_date (date, tz_offset); - g_mime_object_set_header (GMIME_OBJECT (message), "Date", buf); - g_free (buf); - - if (message->mime_part) - g_mime_header_list_set_stream (message->mime_part->headers, NULL); + return message->date; } @@ -1504,15 +974,9 @@ g_return_if_fail (GMIME_IS_MESSAGE (message)); g_return_if_fail (message_id != NULL); - g_free (message->message_id); - message->message_id = g_mime_strdup_trim (message_id); - msgid = g_strdup_printf ("<%s>", message_id); - g_mime_object_set_header (GMIME_OBJECT (message), "Message-Id", msgid); + g_mime_object_set_header ((GMimeObject *) message, "Message-Id", msgid, NULL); g_free (msgid); - - if (message->mime_part) - g_mime_header_list_set_stream (message->mime_part->headers, NULL); } @@ -1563,31 +1027,31 @@ void g_mime_message_set_mime_part (GMimeMessage *message, GMimeObject *mime_part) { - GMimeEvent *changed; - - g_return_if_fail (mime_part == NULL || GMIME_IS_OBJECT (mime_part)); + g_return_if_fail (GMIME_IS_OBJECT (mime_part)); g_return_if_fail (GMIME_IS_MESSAGE (message)); if (message->mime_part == mime_part) return; - if (message->mime_part) { - changed = _g_mime_header_list_get_changed_event (message->mime_part->headers); - g_mime_event_remove (changed, (GMimeEventCallback) mime_part_headers_changed, message); - - g_mime_header_list_set_stream (message->mime_part->headers, NULL); + if (message->mime_part) g_object_unref (message->mime_part); - } if (mime_part) { - changed = _g_mime_header_list_get_changed_event (mime_part->headers); - g_mime_header_list_set_stream (mime_part->headers, NULL); - g_mime_event_add (changed, (GMimeEventCallback) mime_part_headers_changed, message); + GMimeHeaderList *headers = ((GMimeObject *) message)->headers; + GMimeHeader *header; + int i; + + if (!g_mime_header_list_contains (headers, "MIME-Version")) + g_mime_header_list_append (headers, "MIME-Version", "1.0", NULL); + + for (i = 0; i < g_mime_header_list_get_count (mime_part->headers); i++) { + header = g_mime_header_list_get_header_at (mime_part->headers, i); + _g_mime_header_set_offset (header, -1); + } + g_object_ref (mime_part); } - g_mime_header_list_set_stream (((GMimeObject *) message)->headers, NULL); - message->mime_part = mime_part; } diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-message.h gmime-3.0.1/gmime/gmime-message.h --- gmime-2.6.22+dfsg2/gmime/gmime-message.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-message.h 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -45,46 +45,48 @@ /** - * GMimeRecipientType: - * @GMIME_RECIPIENT_TYPE_TO: Represents the recipients in the To: header. - * @GMIME_RECIPIENT_TYPE_CC: Represents the recipients in the Cc: header. - * @GMIME_RECIPIENT_TYPE_BCC: Represents the recipients in the Bcc: header. + * GMimeAddressType: + * @GMIME_ADDRESS_TYPE_SENDER: Represents the addresses in the Sender header. + * @GMIME_ADDRESS_TYPE_FROM: Represents the addresses in the From header. + * @GMIME_ADDRESS_TYPE_REPLY_TO: Represents the addresses in the Reply-To header. + * @GMIME_ADDRESS_TYPE_TO: Represents the recipients in the To header. + * @GMIME_ADDRESS_TYPE_CC: Represents the recipients in the Cc header. + * @GMIME_ADDRESS_TYPE_BCC: Represents the recipients in the Bcc header. * - * A message recipient type. + * An address type. **/ -typedef enum _GMimeRecipientType { - GMIME_RECIPIENT_TYPE_TO, - GMIME_RECIPIENT_TYPE_CC, - GMIME_RECIPIENT_TYPE_BCC -} GMimeRecipientType; +typedef enum _GMimeAddressType { + GMIME_ADDRESS_TYPE_SENDER, + GMIME_ADDRESS_TYPE_FROM, + GMIME_ADDRESS_TYPE_REPLY_TO, + GMIME_ADDRESS_TYPE_TO, + GMIME_ADDRESS_TYPE_CC, + GMIME_ADDRESS_TYPE_BCC +} GMimeAddressType; /** * GMimeMessage: * @parent_object: parent #GMimeObject + * @addrlists: a table of address lists * @mime_part: toplevel MIME part - * @recipients: hash table of recipients using recipient header name as the hash key * @message_id: Message-Id string - * @reply_to: Reply-To string - * @subject: Subject string - * @from: From string * @date: Date value - * @tz_offset: timezone offset + * @subject: Subject string * * A MIME Message object. **/ struct _GMimeMessage { GMimeObject parent_object; - InternetAddressList **recipients; + InternetAddressList **addrlists; GMimeObject *mime_part; char *message_id; - char *reply_to; + GDateTime *date; char *subject; - char *from; - time_t date; - int tz_offset; + /* < private > */ + char *marker; }; struct _GMimeMessageClass { @@ -97,23 +99,22 @@ GMimeMessage *g_mime_message_new (gboolean pretty_headers); -void g_mime_message_set_sender (GMimeMessage *message, const char *sender); -const char *g_mime_message_get_sender (GMimeMessage *message); - -void g_mime_message_set_reply_to (GMimeMessage *message, const char *reply_to); -const char *g_mime_message_get_reply_to (GMimeMessage *message); +InternetAddressList *g_mime_message_get_from (GMimeMessage *message); +InternetAddressList *g_mime_message_get_sender (GMimeMessage *message); +InternetAddressList *g_mime_message_get_reply_to (GMimeMessage *message); +InternetAddressList *g_mime_message_get_to (GMimeMessage *message); +InternetAddressList *g_mime_message_get_cc (GMimeMessage *message); +InternetAddressList *g_mime_message_get_bcc (GMimeMessage *message); -void g_mime_message_add_recipient (GMimeMessage *message, GMimeRecipientType type, const char *name, const char *addr); -InternetAddressList *g_mime_message_get_recipients (GMimeMessage *message, GMimeRecipientType type); +void g_mime_message_add_mailbox (GMimeMessage *message, GMimeAddressType type, const char *name, const char *addr); +InternetAddressList *g_mime_message_get_addresses (GMimeMessage *message, GMimeAddressType type); InternetAddressList *g_mime_message_get_all_recipients (GMimeMessage *message); -void g_mime_message_set_subject (GMimeMessage *message, const char *subject); +void g_mime_message_set_subject (GMimeMessage *message, const char *subject, const char *charset); const char *g_mime_message_get_subject (GMimeMessage *message); -void g_mime_message_set_date (GMimeMessage *message, time_t date, int tz_offset); -void g_mime_message_get_date (GMimeMessage *message, time_t *date, int *tz_offset); -void g_mime_message_set_date_as_string (GMimeMessage *message, const char *str); -char *g_mime_message_get_date_as_string (GMimeMessage *message); +void g_mime_message_set_date (GMimeMessage *message, GDateTime *date); +GDateTime *g_mime_message_get_date (GMimeMessage *message); void g_mime_message_set_message_id (GMimeMessage *message, const char *message_id); const char *g_mime_message_get_message_id (GMimeMessage *message); diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-message-part.c gmime-3.0.1/gmime/gmime-message-part.c --- gmime-2.6.22+dfsg2/gmime/gmime-message-part.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-message-part.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -47,7 +47,8 @@ static void g_mime_message_part_finalize (GObject *object); /* GMimeObject class methods */ -static ssize_t message_part_write_to_stream (GMimeObject *object, GMimeStream *stream); +static ssize_t message_part_write_to_stream (GMimeObject *object, GMimeFormatOptions *options, + gboolean content_only, GMimeStream *stream); static GMimeObjectClass *parent_class = NULL; @@ -109,26 +110,61 @@ } static ssize_t -message_part_write_to_stream (GMimeObject *object, GMimeStream *stream) +message_part_write_to_stream (GMimeObject *object, GMimeFormatOptions *options, gboolean content_only, GMimeStream *stream) { GMimeMessagePart *part = (GMimeMessagePart *) object; + GMimeMessage *message = part->message; ssize_t nwritten, total = 0; - - /* write the content headers */ - if ((nwritten = g_mime_header_list_write_to_stream (object->headers, stream)) == -1) - return -1; - - total += nwritten; - - /* terminate the headers */ - if ((nwritten = g_mime_stream_write (stream, "\n", 1)) == -1) - return -1; - - total += nwritten; + const char *newline, *eoln; + gboolean match; + size_t len; + + newline = g_mime_format_options_get_newline (options); + + if (!content_only) { + /* write the content headers */ + if ((nwritten = g_mime_header_list_write_to_stream (object->headers, options, stream)) == -1) + return -1; + + total += nwritten; + + /* terminate the headers */ + if ((nwritten = g_mime_stream_write_string (stream, newline)) == -1) + return -1; + + total += nwritten; + } /* write the message */ - if (part->message) { - if ((nwritten = g_mime_object_write_to_stream (GMIME_OBJECT (part->message), stream)) == -1) + if (message) { + if (message->marker && (len = strlen (message->marker)) > 0) { + if (*(eoln = message->marker + (len - 1)) == '\n') { + if (eoln > message->marker && eoln[-1] == '\r') + eoln--; + + /* check if newline sequences match... */ + if (!(match = !strcmp (eoln, newline))) { + /* they don't match... trim off the eoln sequence */ + len = (size_t) (eoln - message->marker); + } + } else { + match = FALSE; + } + + if ((nwritten = g_mime_stream_write (stream, message->marker, len)) == -1) + return -1; + + total += nwritten; + + if (!match) { + if ((nwritten = g_mime_stream_write_string (stream, newline)) == -1) + return -1; + + total += nwritten; + } + } + + if ((nwritten = g_mime_object_write_to_stream ((GMimeObject *) message, options, stream)) == -1) return -1; total += nwritten; @@ -154,10 +190,10 @@ GMimeContentType *content_type; GMimeMessagePart *part; - part = g_object_newv (GMIME_TYPE_MESSAGE_PART, 0, NULL); + part = g_object_new (GMIME_TYPE_MESSAGE_PART, NULL); content_type = g_mime_content_type_new ("message", subtype ? subtype : "rfc822"); - g_mime_object_set_content_type (GMIME_OBJECT (part), content_type); + g_mime_object_set_content_type ((GMimeObject *) part, content_type); g_object_unref (content_type); return part; diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-message-part.h gmime-3.0.1/gmime/gmime-message-part.h --- gmime-2.6.22+dfsg2/gmime/gmime-message-part.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-message-part.h 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-message-partial.c gmime-3.0.1/gmime/gmime-message-partial.c --- gmime-2.6.22+dfsg2/gmime/gmime-message-partial.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-message-partial.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -29,6 +29,7 @@ #include "gmime-message-partial.h" #include "gmime-stream-cat.h" #include "gmime-stream-mem.h" +#include "gmime-internal.h" #include "gmime-parser.h" @@ -41,18 +42,12 @@ * A #GMimeMessagePartial represents the message/partial MIME part. **/ - /* GObject class methods */ static void g_mime_message_partial_class_init (GMimeMessagePartialClass *klass); static void g_mime_message_partial_init (GMimeMessagePartial *catpart, GMimeMessagePartialClass *klass); static void g_mime_message_partial_finalize (GObject *object); /* GMimeObject class methods */ -static void message_partial_prepend_header (GMimeObject *object, const char *header, const char *value); -static void message_partial_append_header (GMimeObject *object, const char *header, const char *value); -static void message_partial_set_header (GMimeObject *object, const char *header, const char *value); -static const char *message_partial_get_header (GMimeObject *object, const char *header); -static gboolean message_partial_remove_header (GMimeObject *object, const char *header); static void message_partial_set_content_type (GMimeObject *object, GMimeContentType *content_type); @@ -94,11 +89,6 @@ gobject_class->finalize = g_mime_message_partial_finalize; - object_class->prepend_header = message_partial_prepend_header; - object_class->append_header = message_partial_append_header; - object_class->remove_header = message_partial_remove_header; - object_class->set_header = message_partial_set_header; - object_class->get_header = message_partial_get_header; object_class->set_content_type = message_partial_set_content_type; } @@ -120,47 +110,6 @@ G_OBJECT_CLASS (parent_class)->finalize (object); } -static void -message_partial_prepend_header (GMimeObject *object, const char *header, const char *value) -{ - /* RFC 1864 states that you cannot set a Content-MD5 on a message part */ - if (!g_ascii_strcasecmp ("Content-MD5", header)) - return; - - GMIME_OBJECT_CLASS (parent_class)->prepend_header (object, header, value); -} - -static void -message_partial_append_header (GMimeObject *object, const char *header, const char *value) -{ - /* RFC 1864 states that you cannot set a Content-MD5 on a message part */ - if (!g_ascii_strcasecmp ("Content-MD5", header)) - return; - - GMIME_OBJECT_CLASS (parent_class)->append_header (object, header, value); -} - -static void -message_partial_set_header (GMimeObject *object, const char *header, const char *value) -{ - /* RFC 1864 states that you cannot set a Content-MD5 on a message part */ - if (!g_ascii_strcasecmp ("Content-MD5", header)) - return; - - GMIME_OBJECT_CLASS (parent_class)->set_header (object, header, value); -} - -static const char * -message_partial_get_header (GMimeObject *object, const char *header) -{ - return GMIME_OBJECT_CLASS (parent_class)->get_header (object, header); -} - -static gboolean -message_partial_remove_header (GMimeObject *object, const char *header) -{ - return GMIME_OBJECT_CLASS (parent_class)->remove_header (object, header); -} static void message_partial_set_content_type (GMimeObject *object, GMimeContentType *content_type) @@ -199,7 +148,7 @@ GMimeMessagePartial *partial; char *num; - partial = g_object_newv (GMIME_TYPE_MESSAGE_PARTIAL, 0, NULL); + partial = g_object_new (GMIME_TYPE_MESSAGE_PARTIAL, NULL); content_type = g_mime_content_type_new ("message", "partial"); @@ -216,7 +165,7 @@ g_mime_content_type_set_parameter (content_type, "total", num); g_free (num); - g_mime_object_set_content_type (GMIME_OBJECT (partial), content_type); + g_mime_object_set_content_type ((GMimeObject *) partial, content_type); g_object_unref (content_type); return partial; @@ -345,18 +294,18 @@ if ((size_t) number != i + 1) goto exception; - wrapper = g_mime_part_get_content_object (GMIME_PART (partial)); + wrapper = g_mime_part_get_content ((GMimePart *) partial); stream = g_mime_data_wrapper_get_stream (wrapper); g_mime_stream_reset (stream); - g_mime_stream_cat_add_source (GMIME_STREAM_CAT (cat), stream); + g_mime_stream_cat_add_source ((GMimeStreamCat *) cat, stream); } parser = g_mime_parser_new (); g_mime_parser_init_with_stream (parser, cat); g_object_unref (cat); - message = g_mime_parser_construct_message (parser); + message = g_mime_parser_construct_message (parser, NULL); g_object_unref (parser); return message; @@ -372,21 +321,27 @@ static GMimeMessage * message_partial_message_new (GMimeMessage *base) { - const char *name, *value; + const char *name, *raw_name, *raw_value; + GMimeHeaderList *headers; GMimeMessage *message; - GMimeHeaderList *list; - GMimeHeaderIter iter; + GMimeHeader *header; + gint64 offset; + int count, i; message = g_mime_message_new (FALSE); - list = ((GMimeObject *) base)->headers; + headers = ((GMimeObject *) base)->headers; - if (g_mime_header_list_get_iter (list, &iter)) { - do { - name = g_mime_header_iter_get_name (&iter); - value = g_mime_header_iter_get_value (&iter); - g_mime_object_append_header ((GMimeObject *) message, name, value); - } while (g_mime_header_iter_next (&iter)); + count = g_mime_header_list_get_count (headers); + + for (i = 0; i < count; i++) { + header = g_mime_header_list_get_header_at (headers, i); + raw_value = g_mime_header_get_raw_value (header); + raw_name = g_mime_header_get_raw_name (header); + offset = g_mime_header_get_offset (header); + name = g_mime_header_get_name (header); + + _g_mime_object_append_header ((GMimeObject *) message, name, raw_name, raw_value, offset); } return message; @@ -397,14 +352,14 @@ * g_mime_message_partial_split_message: * @message: message object * @max_size: max size - * @nparts: number of parts + * @nparts: (out): number of parts * * Splits @message into an array of #GMimeMessage objects each * containing a single #GMimeMessagePartial object containing * @max_size bytes or fewer. @nparts is set to the number of * #GMimeMessagePartial objects created. * - * Returns: (transfer full): an array of #GMimeMessage objects and + * Returns: (nullable) (transfer full): an array of #GMimeMessage objects and * sets @nparts to the number of messages returned or %NULL on fail. **/ GMimeMessage ** @@ -413,6 +368,7 @@ GMimeMessage **messages; GMimeMessagePartial *partial; GMimeStream *stream, *substream; + GMimeFormatOptions *options; GMimeDataWrapper *wrapper; const unsigned char *buf; GPtrArray *parts; @@ -425,8 +381,10 @@ g_return_val_if_fail (GMIME_IS_MESSAGE (message), NULL); + options = g_mime_format_options_get_default (); stream = g_mime_stream_mem_new (); - if (g_mime_object_write_to_stream (GMIME_OBJECT (message), stream) == -1) { + + if (g_mime_object_write_to_stream ((GMimeObject *) message, options, stream) == -1) { g_object_unref (stream); return NULL; } @@ -474,14 +432,14 @@ for (i = 0; i < parts->len; i++) { partial = g_mime_message_partial_new (id, i + 1, parts->len); - wrapper = g_mime_data_wrapper_new_with_stream (GMIME_STREAM (parts->pdata[i]), + wrapper = g_mime_data_wrapper_new_with_stream ((GMimeStream *) parts->pdata[i], GMIME_CONTENT_ENCODING_DEFAULT); g_object_unref (parts->pdata[i]); - g_mime_part_set_content_object (GMIME_PART (partial), wrapper); + g_mime_part_set_content ((GMimePart *) partial, wrapper); g_object_unref (wrapper); parts->pdata[i] = message_partial_message_new (message); - g_mime_message_set_mime_part (GMIME_MESSAGE (parts->pdata[i]), GMIME_OBJECT (partial)); + g_mime_message_set_mime_part ((GMimeMessage *) parts->pdata[i], (GMimeObject *) partial); g_object_unref (partial); } diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-message-partial.h gmime-3.0.1/gmime/gmime-message-partial.h --- gmime-2.6.22+dfsg2/gmime/gmime-message-partial.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-message-partial.h 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-multipart.c gmime-3.0.1/gmime/gmime-multipart.c --- gmime-2.6.22+dfsg2/gmime/gmime-multipart.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-multipart.c 2017-04-23 16:04:05.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -23,16 +23,11 @@ #include #endif -#include -#include -#include #include -#include -#include -#include -#include #include "gmime-multipart.h" +#include "gmime-internal.h" +#include "gmime-common.h" #include "gmime-utils.h" @@ -48,14 +43,14 @@ * A #GMimeMultipart represents all multipart MIME container parts. **/ - /* GObject class methods */ static void g_mime_multipart_class_init (GMimeMultipartClass *klass); static void g_mime_multipart_init (GMimeMultipart *multipart, GMimeMultipartClass *klass); static void g_mime_multipart_finalize (GObject *object); /* GMimeObject class methods */ -static ssize_t multipart_write_to_stream (GMimeObject *object, GMimeStream *stream); +static ssize_t multipart_write_to_stream (GMimeObject *object, GMimeFormatOptions *options, + gboolean content_only, GMimeStream *stream); static void multipart_encode (GMimeObject *object, GMimeEncodingConstraint constraint); /* GMimeMultipart class methods */ @@ -130,8 +125,9 @@ g_mime_multipart_init (GMimeMultipart *multipart, GMimeMultipartClass *klass) { multipart->children = g_ptr_array_new (); - multipart->preface = NULL; - multipart->postface = NULL; + multipart->write_end_boundary = TRUE; + multipart->prologue = NULL; + multipart->epilogue = NULL; } static void @@ -140,8 +136,8 @@ GMimeMultipart *multipart = (GMimeMultipart *) object; guint i; - g_free (multipart->preface); - g_free (multipart->postface); + g_free (multipart->prologue); + g_free (multipart->epilogue); for (i = 0; i < multipart->children->len; i++) g_object_unref (multipart->children->pdata[i]); @@ -152,39 +148,39 @@ } static ssize_t -multipart_write_to_stream (GMimeObject *object, GMimeStream *stream) +multipart_write_to_stream (GMimeObject *object, GMimeFormatOptions *options, gboolean content_only, GMimeStream *stream) { GMimeMultipart *multipart = (GMimeMultipart *) object; + const char *boundary, *newline; ssize_t nwritten, total = 0; - const char *boundary; GMimeObject *part; guint i; - /* make sure a boundary is set unless we are writing out a raw - * header (in which case it should already be set... or if - * not, then it's a broken multipart and so we don't want to - * alter it or we'll completely break the output) */ boundary = g_mime_object_get_content_type_parameter (object, "boundary"); - if (!boundary && !g_mime_header_list_get_stream (object->headers)) { - g_mime_multipart_set_boundary (multipart, NULL); - boundary = g_mime_object_get_content_type_parameter (object, "boundary"); - } - - /* write the content headers */ - if ((nwritten = g_mime_header_list_write_to_stream (object->headers, stream)) == -1) - return -1; + newline = g_mime_format_options_get_newline (options); - total += nwritten; - - /* write the preface */ - if (multipart->preface) { + if (!content_only) { + /* write the content headers */ + if ((nwritten = g_mime_header_list_write_to_stream (object->headers, options, stream)) == -1) + return -1; + + total += nwritten; + /* terminate the headers */ - if (g_mime_stream_write (stream, "\n", 1) == -1) + if ((nwritten = g_mime_stream_write_string (stream, newline)) == -1) + return -1; + + total += nwritten; + } + + /* write the prologue */ + if (multipart->prologue) { + if ((nwritten = g_mime_stream_write_string (stream, multipart->prologue)) == -1) return -1; - total++; + total += nwritten; - if ((nwritten = g_mime_stream_write_string (stream, multipart->preface)) == -1) + if ((nwritten = g_mime_stream_write_string (stream, newline)) == -1) return -1; total += nwritten; @@ -194,29 +190,36 @@ part = multipart->children->pdata[i]; /* write the boundary */ - if ((nwritten = g_mime_stream_printf (stream, "\n--%s\n", boundary)) == -1) + if ((nwritten = g_mime_stream_printf (stream, "--%s%s", boundary, newline)) == -1) return -1; total += nwritten; /* write this part out */ - if ((nwritten = g_mime_object_write_to_stream (part, stream)) == -1) + if ((nwritten = g_mime_object_write_to_stream (part, options, stream)) == -1) return -1; total += nwritten; + + if (!GMIME_IS_MULTIPART (part) || ((GMimeMultipart *) part)->write_end_boundary) { + if ((nwritten = g_mime_stream_write_string (stream, newline)) == -1) + return -1; + + total += nwritten; + } } /* write the end-boundary (but only if a boundary is set) */ - if (boundary) { - if ((nwritten = g_mime_stream_printf (stream, "\n--%s--\n", boundary)) == -1) + if (multipart->write_end_boundary && boundary) { + if ((nwritten = g_mime_stream_printf (stream, "--%s--%s", boundary, newline)) == -1) return -1; total += nwritten; } - /* write the postface */ - if (multipart->postface) { - if ((nwritten = g_mime_stream_write_string (stream, multipart->postface)) == -1) + /* write the epilogue */ + if (multipart->epilogue) { + if ((nwritten = g_mime_stream_write_string (stream, multipart->epilogue)) == -1) return -1; total += nwritten; @@ -251,16 +254,7 @@ GMimeMultipart * g_mime_multipart_new (void) { - GMimeContentType *content_type; - GMimeMultipart *multipart; - - multipart = g_object_newv (GMIME_TYPE_MULTIPART, 0, NULL); - - content_type = g_mime_content_type_new ("multipart", "mixed"); - g_mime_object_set_content_type (GMIME_OBJECT (multipart), content_type); - g_object_unref (content_type); - - return multipart; + return g_mime_multipart_new_with_subtype ("mixed"); } @@ -280,81 +274,83 @@ GMimeContentType *content_type; GMimeMultipart *multipart; - multipart = g_object_newv (GMIME_TYPE_MULTIPART, 0, NULL); + multipart = g_object_new (GMIME_TYPE_MULTIPART, NULL); content_type = g_mime_content_type_new ("multipart", subtype ? subtype : "mixed"); - g_mime_object_set_content_type (GMIME_OBJECT (multipart), content_type); + g_mime_object_set_content_type ((GMimeObject *) multipart, content_type); g_object_unref (content_type); + g_mime_multipart_set_boundary (multipart, NULL); + return multipart; } /** - * g_mime_multipart_set_preface: + * g_mime_multipart_set_prologue: * @multipart: a #GMimeMultipart object - * @preface: preface + * @prologue: prologue * - * Sets the preface on the multipart. + * Sets the prologue on the multipart. **/ void -g_mime_multipart_set_preface (GMimeMultipart *multipart, const char *preface) +g_mime_multipart_set_prologue (GMimeMultipart *multipart, const char *prologue) { g_return_if_fail (GMIME_IS_MULTIPART (multipart)); - g_free (multipart->preface); - multipart->preface = g_strdup (preface); + g_free (multipart->prologue); + multipart->prologue = g_strdup (prologue); } /** - * g_mime_multipart_get_preface: + * g_mime_multipart_get_prologue: * @multipart: a #GMimeMultipart object * - * Gets the preface on the multipart. + * Gets the prologue on the multipart. * - * Returns: a pointer to the preface string on the multipart. + * Returns: a pointer to the prologue string on the multipart. **/ const char * -g_mime_multipart_get_preface (GMimeMultipart *multipart) +g_mime_multipart_get_prologue (GMimeMultipart *multipart) { g_return_val_if_fail (GMIME_IS_MULTIPART (multipart), NULL); - return multipart->preface; + return multipart->prologue; } /** - * g_mime_multipart_set_postface: + * g_mime_multipart_set_epilogue: * @multipart: a #GMimeMultipart object - * @postface: postface + * @epilogue: epilogue * - * Sets the postface on the multipart. + * Sets the epilogue on the multipart. **/ void -g_mime_multipart_set_postface (GMimeMultipart *multipart, const char *postface) +g_mime_multipart_set_epilogue (GMimeMultipart *multipart, const char *epilogue) { g_return_if_fail (GMIME_IS_MULTIPART (multipart)); - g_free (multipart->postface); - multipart->postface = g_strdup (postface); + g_free (multipart->epilogue); + multipart->epilogue = g_strdup (epilogue); } /** - * g_mime_multipart_get_postface: + * g_mime_multipart_get_epilogue: * @multipart: a #GMimeMultipart object * - * Gets the postface on the multipart. + * Gets the epilogue on the multipart. * - * Returns: a pointer to the postface string on the multipart. + * Returns: a pointer to the epilogue string on the multipart. **/ const char * -g_mime_multipart_get_postface (GMimeMultipart *multipart) +g_mime_multipart_get_epilogue (GMimeMultipart *multipart) { g_return_val_if_fail (GMIME_IS_MULTIPART (multipart), NULL); - return multipart->postface; + return multipart->epilogue; } @@ -683,39 +679,6 @@ static void -read_random_pool (unsigned char *buffer, size_t bytes) -{ -#ifdef __unix__ - size_t nread = 0; - ssize_t n; - int fd; - - if ((fd = open ("/dev/urandom", O_RDONLY)) == -1) { - if ((fd = open ("/dev/random", O_RDONLY)) == -1) - return; - } - - do { - do { - n = read (fd, (char *) buffer + nread, bytes - nread); - } while (n == -1 && errno == EINTR); - - if (n == -1 || n == 0) - break; - - nread += n; - } while (nread < bytes); - - close (fd); -#else - size_t i; - - for (i = 0; i < bytes; i++) - buffer[i] = (unsigned char) (rand () % 256); -#endif -} - -static void multipart_set_boundary (GMimeMultipart *multipart, const char *boundary) { char bbuf[35]; @@ -726,7 +689,7 @@ guint32 save = 0; int state = 0; - read_random_pool (digest, 16); + g_mime_read_random_pool (digest, 16); strcpy (bbuf, "=-"); p = (unsigned char *) bbuf + 2; @@ -736,7 +699,7 @@ boundary = bbuf; } - g_mime_object_set_content_type_parameter (GMIME_OBJECT (multipart), "boundary", boundary); + g_mime_object_set_content_type_parameter ((GMimeObject *) multipart, "boundary", boundary); } diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-multipart-encrypted.c gmime-3.0.1/gmime/gmime-multipart-encrypted.c --- gmime-2.6.22+dfsg2/gmime/gmime-multipart-encrypted.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-multipart-encrypted.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -27,11 +27,12 @@ #include #include "gmime-multipart-encrypted.h" +#include "gmime-filter-dos2unix.h" #include "gmime-stream-filter.h" #include "gmime-filter-basic.h" #include "gmime-filter-from.h" -#include "gmime-filter-crlf.h" #include "gmime-stream-mem.h" +#include "gmime-internal.h" #include "gmime-parser.h" #include "gmime-part.h" #include "gmime-error.h" @@ -56,7 +57,6 @@ * multipart/encrypted MIME type. **/ - /* GObject class methods */ static void g_mime_multipart_encrypted_class_init (GMimeMultipartEncryptedClass *klass); static void g_mime_multipart_encrypted_init (GMimeMultipartEncrypted *mps, GMimeMultipartEncryptedClass *klass); @@ -127,10 +127,10 @@ GMimeMultipartEncrypted *multipart; GMimeContentType *content_type; - multipart = g_object_newv (GMIME_TYPE_MULTIPART_ENCRYPTED, 0, NULL); + multipart = g_object_new (GMIME_TYPE_MULTIPART_ENCRYPTED, NULL); content_type = g_mime_content_type_new ("multipart", "encrypted"); - g_mime_object_set_content_type (GMIME_OBJECT (multipart), content_type); + g_mime_object_set_content_type ((GMimeObject *) multipart, content_type); g_object_unref (content_type); return multipart; @@ -139,289 +139,232 @@ /** * g_mime_multipart_encrypted_encrypt: - * @mpe: multipart/encrypted object - * @content: MIME part to encrypt - * @ctx: encryption context + * @ctx: a #GMimeCryptoContext + * @entity: MIME part to encrypt * @sign: %TRUE if the content should also be signed or %FALSE otherwise - * @userid: user id to use for signing (only used if @sign is %TRUE) - * @digest: digest algorithm to use when signing + * @userid: (nullable): user id to use for signing (only used if @sign is %TRUE) + * @flags: a #GMimeEncryptFlags * @recipients: (element-type utf8): an array of recipients to encrypt to * @err: a #GError * - * Attempts to encrypt (and conditionally sign) the @content MIME part + * Attempts to encrypt (and conditionally sign) the @entity MIME part * to the public keys of @recipients using the @ctx encryption - * context. If successful, the encrypted #GMimeObject is set as the - * encrypted part of the multipart/encrypted object @mpe. + * context. If successful, a new multipart/encrypted object is returned. * - * Returns: %0 on success or %-1 on fail. If the encryption fails, an - * exception will be set on @err to provide information as to why the - * failure occured. + * Returns: (nullable) (transfer full): a new #GMimeMultipartEncrypted object on success + * or %NULL on fail. If encrypting fails, an exception will be set on @err to provide + * information as to why the failure occured. **/ -int -g_mime_multipart_encrypted_encrypt (GMimeMultipartEncrypted *mpe, GMimeObject *content, - GMimeCryptoContext *ctx, gboolean sign, - const char *userid, GMimeDigestAlgo digest, - GPtrArray *recipients, GError **err) +GMimeMultipartEncrypted * +g_mime_multipart_encrypted_encrypt (GMimeCryptoContext *ctx, GMimeObject *entity, gboolean sign, const char *userid, + GMimeEncryptFlags flags, GPtrArray *recipients, GError **err) { - GMimeStream *filtered_stream, *ciphertext, *stream; GMimePart *version_part, *encrypted_part; + GMimeMultipartEncrypted *encrypted; + GMimeStream *stream, *ciphertext; GMimeContentType *content_type; - GMimeDataWrapper *wrapper; - GMimeFilter *crlf_filter; + GMimeFormatOptions *options; + GMimeDataWrapper *content; const char *protocol; + GMimeFilter *filter; - g_return_val_if_fail (GMIME_IS_MULTIPART_ENCRYPTED (mpe), -1); - g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), -1); - g_return_val_if_fail (GMIME_IS_OBJECT (content), -1); + g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), NULL); + g_return_val_if_fail (GMIME_IS_OBJECT (entity), NULL); if (!(protocol = g_mime_crypto_context_get_encryption_protocol (ctx))) { g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, _("Encryption not supported.")); - return -1; + return NULL; } /* get the cleartext */ stream = g_mime_stream_mem_new (); - filtered_stream = g_mime_stream_filter_new (stream); - crlf_filter = g_mime_filter_crlf_new (TRUE, FALSE); - g_mime_stream_filter_add (GMIME_STREAM_FILTER (filtered_stream), crlf_filter); - g_object_unref (crlf_filter); - - g_mime_object_write_to_stream (content, filtered_stream); - g_mime_stream_flush (filtered_stream); - g_object_unref (filtered_stream); + options = _g_mime_format_options_clone (NULL, FALSE); + g_mime_format_options_set_newline_format (options, GMIME_NEWLINE_FORMAT_DOS); + + g_mime_object_write_to_stream (entity, options, stream); /* reset the content stream */ g_mime_stream_reset (stream); /* encrypt the content stream */ ciphertext = g_mime_stream_mem_new (); - if (g_mime_crypto_context_encrypt (ctx, sign, userid, digest, recipients, stream, ciphertext, err) == -1) { + if (g_mime_crypto_context_encrypt (ctx, sign, userid, flags, recipients, stream, ciphertext, err) == -1) { g_object_unref (ciphertext); g_object_unref (stream); - return -1; + return NULL; } g_object_unref (stream); g_mime_stream_reset (ciphertext); /* construct the version part */ - content_type = g_mime_content_type_new_from_string (protocol); + content_type = g_mime_content_type_parse (NULL, protocol); version_part = g_mime_part_new_with_type (content_type->type, content_type->subtype); g_object_unref (content_type); - content_type = g_mime_content_type_new_from_string (protocol); - g_mime_object_set_content_type (GMIME_OBJECT (version_part), content_type); g_mime_part_set_content_encoding (version_part, GMIME_CONTENT_ENCODING_7BIT); stream = g_mime_stream_mem_new_with_buffer ("Version: 1\n", strlen ("Version: 1\n")); - wrapper = g_mime_data_wrapper_new_with_stream (stream, GMIME_CONTENT_ENCODING_7BIT); - g_mime_part_set_content_object (version_part, wrapper); - g_object_unref (wrapper); + content = g_mime_data_wrapper_new_with_stream (stream, GMIME_CONTENT_ENCODING_7BIT); + g_mime_part_set_content (version_part, content); + g_object_unref (content); g_object_unref (stream); /* construct the encrypted mime part */ encrypted_part = g_mime_part_new_with_type ("application", "octet-stream"); g_mime_part_set_content_encoding (encrypted_part, GMIME_CONTENT_ENCODING_7BIT); - wrapper = g_mime_data_wrapper_new_with_stream (ciphertext, GMIME_CONTENT_ENCODING_7BIT); - g_mime_part_set_content_object (encrypted_part, wrapper); + content = g_mime_data_wrapper_new_with_stream (ciphertext, GMIME_CONTENT_ENCODING_7BIT); + g_mime_part_set_content (encrypted_part, content); g_object_unref (ciphertext); - g_object_unref (wrapper); + g_object_unref (content); /* save the version and encrypted parts */ - /* FIXME: make sure there aren't any other parts?? */ - g_mime_multipart_add (GMIME_MULTIPART (mpe), GMIME_OBJECT (version_part)); - g_mime_multipart_add (GMIME_MULTIPART (mpe), GMIME_OBJECT (encrypted_part)); + encrypted = g_mime_multipart_encrypted_new (); + g_mime_multipart_add ((GMimeMultipart *) encrypted, (GMimeObject *) version_part); + g_mime_multipart_add ((GMimeMultipart *) encrypted, (GMimeObject *) encrypted_part); g_object_unref (encrypted_part); g_object_unref (version_part); /* set the content-type params for this multipart/encrypted part */ - g_mime_object_set_content_type_parameter (GMIME_OBJECT (mpe), "protocol", protocol); - g_mime_multipart_set_boundary (GMIME_MULTIPART (mpe), NULL); - - return 0; -} - - -static GMimeStream * -g_mime_data_wrapper_get_decoded_stream (GMimeDataWrapper *wrapper) -{ - GMimeStream *decoded_stream; - GMimeFilter *decoder; + g_mime_object_set_content_type_parameter ((GMimeObject *) encrypted, "protocol", protocol); + g_mime_multipart_set_boundary ((GMimeMultipart *) encrypted, NULL); - g_mime_stream_reset (wrapper->stream); - - switch (wrapper->encoding) { - case GMIME_CONTENT_ENCODING_BASE64: - case GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE: - case GMIME_CONTENT_ENCODING_UUENCODE: - decoder = g_mime_filter_basic_new (wrapper->encoding, FALSE); - decoded_stream = g_mime_stream_filter_new (wrapper->stream); - g_mime_stream_filter_add (GMIME_STREAM_FILTER (decoded_stream), decoder); - g_object_unref (decoder); - break; - default: - decoded_stream = wrapper->stream; - g_object_ref (wrapper->stream); - break; - } - - return decoded_stream; + return encrypted; } /** * g_mime_multipart_encrypted_decrypt: - * @mpe: multipart/encrypted object - * @ctx: decryption context - * @result: a #GMimeDecryptionResult - * @err: a #GError - * - * Attempts to decrypt the encrypted MIME part contained within the - * multipart/encrypted object @mpe using the @ctx decryption context. - * - * If @result is non-%NULL, then on a successful decrypt operation, it will be - * updated to point to a newly-allocated #GMimeDecryptResult with signature - * status information as well as a list of recipients that the part was - * encrypted to. - * - * Returns: (transfer full): the decrypted MIME part on success or - * %NULL on fail. If the decryption fails, an exception will be set on - * @err to provide information as to why the failure occured. - **/ -GMimeObject * -g_mime_multipart_encrypted_decrypt (GMimeMultipartEncrypted *mpe, GMimeCryptoContext *ctx, - GMimeDecryptResult **result, GError **err) -{ - return g_mime_multipart_encrypted_decrypt_session (mpe, ctx, NULL, result, err); -} - -/** - * g_mime_multipart_encrypted_decrypt_session: - * @mpe: multipart/encrypted object - * @ctx: decryption context - * @session_key: session key to use - * @result: a #GMimeDecryptionResult + * @encrypted: a #GMimeMultipartEncrypted + * @flags: a #GMimeDecryptFlags + * @session_key: session key to use or %NULL + * @result: (out) (transfer full): a #GMimeDecryptResult * @err: a #GError * * Attempts to decrypt the encrypted MIME part contained within the - * multipart/encrypted object @mpe using the @ctx decryption context - * trying only the supplied session key. If @session_key is - * non-%NULL, but is not valid for the ciphertext, the decryption will - * fail even if other available secret key material may have been able - * to decrypt it. If @session_key is %NULL, this does the same thing - * as g_mime_multipart_encrypted_decrypt(). + * multipart/encrypted object @encrypted. * * When non-%NULL, @session_key should be a %NULL-terminated string, * such as the one returned by g_mime_decrypt_result_get_session_key() - * from a previous decryption. + * from a previous decryption. If the @sesion_key is not valid, decryption + * will fail. * * If @result is non-%NULL, then on a successful decrypt operation, it will be * updated to point to a newly-allocated #GMimeDecryptResult with signature * status information as well as a list of recipients that the part was * encrypted to. * - * Returns: (transfer full): the decrypted MIME part on success or + * Returns: (nullable) (transfer full): the decrypted MIME part on success or * %NULL on fail. If the decryption fails, an exception will be set on * @err to provide information as to why the failure occured. **/ GMimeObject * -g_mime_multipart_encrypted_decrypt_session (GMimeMultipartEncrypted *mpe, GMimeCryptoContext *ctx, - const char *session_key, GMimeDecryptResult **result, - GError **err) +g_mime_multipart_encrypted_decrypt (GMimeMultipartEncrypted *encrypted, GMimeDecryptFlags flags, + const char *session_key, GMimeDecryptResult **result, + GError **err) { - GMimeObject *decrypted, *version, *encrypted; - GMimeStream *stream, *ciphertext; + GMimeObject *decrypted, *version_part, *encrypted_part; + GMimeStream *filtered, *stream, *ciphertext; const char *protocol, *supported; - GMimeStream *filtered_stream; - GMimeContentType *mime_type; - GMimeDataWrapper *wrapper; - GMimeFilter *crlf_filter; + GMimeContentType *content_type; + GMimeDataWrapper *content; GMimeDecryptResult *res; + GMimeCryptoContext *ctx; + GMimeFilter *filter; GMimeParser *parser; - char *content_type; + char *mime_type; - g_return_val_if_fail (GMIME_IS_MULTIPART_ENCRYPTED (mpe), NULL); - g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), NULL); + g_return_val_if_fail (GMIME_IS_MULTIPART_ENCRYPTED (encrypted), NULL); if (result) *result = NULL; - protocol = g_mime_object_get_content_type_parameter (GMIME_OBJECT (mpe), "protocol"); - supported = g_mime_crypto_context_get_encryption_protocol (ctx); - - if (protocol) { - /* make sure the protocol matches the crypto encrypt protocol */ - if (!supported || g_ascii_strcasecmp (supported, protocol) != 0) { - g_set_error (err, GMIME_ERROR, GMIME_ERROR_PROTOCOL_ERROR, - _("Cannot decrypt multipart/encrypted part: unsupported encryption protocol '%s'."), - protocol); - - return NULL; - } - } else if (supported != NULL) { - /* *shrug* - I guess just go on as if they match? */ - protocol = supported; - } else { + if (!(protocol = g_mime_object_get_content_type_parameter ((GMimeObject *) encrypted, "protocol"))) { g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_PROTOCOL_ERROR, _("Cannot decrypt multipart/encrypted part: unspecified encryption protocol.")); return NULL; } - version = g_mime_multipart_get_part (GMIME_MULTIPART (mpe), GMIME_MULTIPART_ENCRYPTED_VERSION); + if (!(ctx = g_mime_crypto_context_new (protocol))) { + g_set_error (err, GMIME_ERROR, GMIME_ERROR_PROTOCOL_ERROR, + _("Cannot decrypt multipart/encrypted part: unregistered encryption protocol '%s'."), + protocol); + + return NULL; + } + + supported = g_mime_crypto_context_get_encryption_protocol (ctx); + + /* make sure the protocol matches the crypto encrypt protocol */ + if (!supported || g_ascii_strcasecmp (supported, protocol) != 0) { + g_set_error (err, GMIME_ERROR, GMIME_ERROR_PROTOCOL_ERROR, + _("Cannot decrypt multipart/encrypted part: unsupported encryption protocol '%s'."), + protocol); + g_object_unref (ctx); + + return NULL; + } + + version_part = g_mime_multipart_get_part ((GMimeMultipart *) encrypted, GMIME_MULTIPART_ENCRYPTED_VERSION); /* make sure the protocol matches the version part's content-type */ - content_type = g_mime_content_type_to_string (version->content_type); - if (g_ascii_strcasecmp (content_type, protocol) != 0) { + mime_type = g_mime_content_type_get_mime_type (version_part->content_type); + if (g_ascii_strcasecmp (mime_type, protocol) != 0) { g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_PARSE_ERROR, _("Cannot decrypt multipart/encrypted part: content-type does not match protocol.")); - g_free (content_type); + g_object_unref (ctx); + g_free (mime_type); return NULL; } - g_free (content_type); + g_free (mime_type); /* get the encrypted part and check that it is of type application/octet-stream */ - encrypted = g_mime_multipart_get_part (GMIME_MULTIPART (mpe), GMIME_MULTIPART_ENCRYPTED_CONTENT); - mime_type = g_mime_object_get_content_type (encrypted); - if (!g_mime_content_type_is_type (mime_type, "application", "octet-stream")) { + encrypted_part = g_mime_multipart_get_part ((GMimeMultipart *) encrypted, GMIME_MULTIPART_ENCRYPTED_CONTENT); + content_type = g_mime_object_get_content_type (encrypted_part); + if (!g_mime_content_type_is_type (content_type, "application", "octet-stream")) { g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_PARSE_ERROR, _("Cannot decrypt multipart/encrypted part: unexpected content type.")); + g_object_unref (ctx); return NULL; } /* get the ciphertext stream */ - wrapper = g_mime_part_get_content_object (GMIME_PART (encrypted)); - ciphertext = g_mime_data_wrapper_get_decoded_stream (wrapper); + content = g_mime_part_get_content ((GMimePart *) encrypted_part); + ciphertext = g_mime_stream_mem_new (); + g_mime_data_wrapper_write_to_stream (content, ciphertext); g_mime_stream_reset (ciphertext); stream = g_mime_stream_mem_new (); - filtered_stream = g_mime_stream_filter_new (stream); - crlf_filter = g_mime_filter_crlf_new (FALSE, FALSE); - g_mime_stream_filter_add (GMIME_STREAM_FILTER (filtered_stream), crlf_filter); - g_object_unref (crlf_filter); + filtered = g_mime_stream_filter_new (stream); + filter = g_mime_filter_dos2unix_new (FALSE); + g_mime_stream_filter_add ((GMimeStreamFilter *) filtered, filter); + g_object_unref (filter); /* get the cleartext */ - if (!(res = g_mime_crypto_context_decrypt_session (ctx, session_key, ciphertext, filtered_stream, err))) { - g_object_unref (filtered_stream); + if (!(res = g_mime_crypto_context_decrypt (ctx, flags, session_key, ciphertext, filtered, err))) { g_object_unref (ciphertext); + g_object_unref (filtered); g_object_unref (stream); + g_object_unref (ctx); return NULL; } - g_mime_stream_flush (filtered_stream); - g_object_unref (filtered_stream); + g_mime_stream_flush (filtered); g_object_unref (ciphertext); + g_object_unref (filtered); + g_object_unref (ctx); g_mime_stream_reset (stream); parser = g_mime_parser_new (); g_mime_parser_init_with_stream (parser, stream); g_object_unref (stream); - decrypted = g_mime_parser_construct_part (parser); + decrypted = g_mime_parser_construct_part (parser, NULL); g_object_unref (parser); if (!decrypted) { diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-multipart-encrypted.h gmime-3.0.1/gmime/gmime-multipart-encrypted.h --- gmime-2.6.22+dfsg2/gmime/gmime-multipart-encrypted.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-multipart-encrypted.h 2017-03-20 13:44:23.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -64,22 +64,17 @@ GMimeMultipartEncrypted *g_mime_multipart_encrypted_new (void); -int g_mime_multipart_encrypted_encrypt (GMimeMultipartEncrypted *mpe, GMimeObject *content, - GMimeCryptoContext *ctx, gboolean sign, - const char *userid, GMimeDigestAlgo digest, - GPtrArray *recipients, GError **err); - -GMimeObject *g_mime_multipart_encrypted_decrypt (GMimeMultipartEncrypted *mpe, - GMimeCryptoContext *ctx, +GMimeMultipartEncrypted *g_mime_multipart_encrypted_encrypt (GMimeCryptoContext *ctx, GMimeObject *entity, + gboolean sign, const char *userid, + GMimeEncryptFlags flags, GPtrArray *recipients, + GError **err); + +GMimeObject *g_mime_multipart_encrypted_decrypt (GMimeMultipartEncrypted *encrypted, + GMimeDecryptFlags flags, + const char *session_key, GMimeDecryptResult **result, GError **err); -GMimeObject *g_mime_multipart_encrypted_decrypt_session (GMimeMultipartEncrypted *mpe, - GMimeCryptoContext *ctx, - const char *session_key, - GMimeDecryptResult **result, - GError **err); - G_END_DECLS #endif /* __GMIME_MULTIPART_ENCRYPTED_H__ */ diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-multipart.h gmime-3.0.1/gmime/gmime-multipart.h --- gmime-2.6.22+dfsg2/gmime/gmime-multipart.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-multipart.h 2017-04-23 16:04:05.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -44,8 +44,8 @@ * @parent_object: parent #GMimeObject * @children: array of MIME sub-parts * @boundary: MIME boundary - * @preface: multipart preface - * @postface: multipart postface + * @prologue: multipart prologue + * @epilogue: multipart epilogue * * A base MIME multipart object. **/ @@ -54,8 +54,11 @@ GPtrArray *children; char *boundary; - char *preface; - char *postface; + char *prologue; + char *epilogue; + + /* < private > */ + gboolean write_end_boundary; }; struct _GMimeMultipartClass { @@ -84,11 +87,11 @@ GMimeMultipart *g_mime_multipart_new_with_subtype (const char *subtype); -void g_mime_multipart_set_preface (GMimeMultipart *multipart, const char *preface); -const char *g_mime_multipart_get_preface (GMimeMultipart *multipart); +void g_mime_multipart_set_prologue (GMimeMultipart *multipart, const char *prologue); +const char *g_mime_multipart_get_prologue (GMimeMultipart *multipart); -void g_mime_multipart_set_postface (GMimeMultipart *multipart, const char *postface); -const char *g_mime_multipart_get_postface (GMimeMultipart *multipart); +void g_mime_multipart_set_epilogue (GMimeMultipart *multipart, const char *epilogue); +const char *g_mime_multipart_get_epilogue (GMimeMultipart *multipart); void g_mime_multipart_clear (GMimeMultipart *multipart); diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-multipart-signed.c gmime-3.0.1/gmime/gmime-multipart-signed.c --- gmime-2.6.22+dfsg2/gmime/gmime-multipart-signed.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-multipart-signed.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -29,10 +29,11 @@ #include "gmime-multipart-encrypted.h" #include "gmime-message-part.h" #include "gmime-stream-filter.h" +#include "gmime-filter-unix2dos.h" #include "gmime-filter-strip.h" #include "gmime-filter-from.h" -#include "gmime-filter-crlf.h" #include "gmime-stream-mem.h" +#include "gmime-internal.h" #include "gmime-parser.h" #include "gmime-error.h" #include "gmime-part.h" @@ -57,7 +58,6 @@ * multipart/signed MIME type. **/ - /* GObject class methods */ static void g_mime_multipart_signed_class_init (GMimeMultipartSignedClass *klass); static void g_mime_multipart_signed_init (GMimeMultipartSigned *mps, GMimeMultipartSignedClass *klass); @@ -141,10 +141,10 @@ GMimeMultipartSigned *multipart; GMimeContentType *content_type; - multipart = g_object_newv (GMIME_TYPE_MULTIPART_SIGNED, 0, NULL); + multipart = g_object_new (GMIME_TYPE_MULTIPART_SIGNED, NULL); content_type = g_mime_content_type_new ("multipart", "signed"); - g_mime_object_set_content_type (GMIME_OBJECT (multipart), content_type); + g_mime_object_set_content_type ((GMimeObject *) multipart, content_type); g_object_unref (content_type); return multipart; @@ -185,59 +185,54 @@ subpart = GMIME_MESSAGE_PART (mime_part)->message->mime_part; sign_prepare (subpart); } else { - encoding = g_mime_part_get_content_encoding (GMIME_PART (mime_part)); + encoding = g_mime_part_get_content_encoding ((GMimePart *) mime_part); if (encoding != GMIME_CONTENT_ENCODING_BASE64) - g_mime_part_set_content_encoding (GMIME_PART (mime_part), - GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE); + g_mime_part_set_content_encoding ((GMimePart *) mime_part, GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE); } } /** * g_mime_multipart_signed_sign: - * @mps: multipart/signed object - * @content: MIME part to sign - * @ctx: encryption crypto context + * @ctx: a #GMimeCryptoContext + * @entity: MIME part to sign * @userid: user id to sign with - * @digest: preferred digest algorithm - * @err: exception + * @err: a #GError * * Attempts to sign the @content MIME part with @userid's private key - * using the @ctx signing context with the @digest algorithm. If - * successful, the signed #GMimeObject is set as the signed part of - * the multipart/signed object @mps. - * - * Returns: %0 on success or %-1 on fail. If the signing fails, an - * exception will be set on @err to provide information as to why the - * failure occured. + * using the @ctx signing context. If successful, a new multipart/signed + * object is returned. + * + * Returns: (nullable) (transfer full): a new #GMimeMultipartSigned object on success + * or %NULL on fail. If signing fails, an exception will be set on @err to provide + * information as to why the failure occured. **/ -int -g_mime_multipart_signed_sign (GMimeMultipartSigned *mps, GMimeObject *content, - GMimeCryptoContext *ctx, const char *userid, - GMimeDigestAlgo digest, GError **err) +GMimeMultipartSigned * +g_mime_multipart_signed_sign (GMimeCryptoContext *ctx, GMimeObject *entity, + const char *userid, GError **err) { GMimeStream *stream, *filtered, *sigstream; GMimeContentType *content_type; - GMimeDataWrapper *wrapper; + GMimeDataWrapper *content; + GMimeMultipartSigned *mps; GMimePart *signature; GMimeFilter *filter; GMimeParser *parser; const char *protocol; const char *micalg; - int rv; + int algo; - g_return_val_if_fail (GMIME_IS_MULTIPART_SIGNED (mps), -1); - g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), -1); - g_return_val_if_fail (GMIME_IS_OBJECT (content), -1); + g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), NULL); + g_return_val_if_fail (GMIME_IS_OBJECT (entity), NULL); if (!(protocol = g_mime_crypto_context_get_signature_protocol (ctx))) { g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, _("Signing not supported.")); - return -1; + return NULL; } /* Prepare all the parts for signing... */ - sign_prepare (content); + sign_prepare (entity); /* get the cleartext */ stream = g_mime_stream_mem_new (); @@ -245,63 +240,59 @@ /* Note: see rfc3156, section 3 - second note */ filter = g_mime_filter_from_new (GMIME_FILTER_FROM_MODE_ARMOR); - g_mime_stream_filter_add (GMIME_STREAM_FILTER (filtered), filter); + g_mime_stream_filter_add ((GMimeStreamFilter *) filtered, filter); g_object_unref (filter); /* Note: see rfc3156, section 5.4 (this is the main difference between rfc2015 and rfc3156) */ filter = g_mime_filter_strip_new (); - g_mime_stream_filter_add (GMIME_STREAM_FILTER (filtered), filter); + g_mime_stream_filter_add ((GMimeStreamFilter *) filtered, filter); g_object_unref (filter); - g_mime_object_write_to_stream (content, filtered); + /* write the entity out to the stream */ + g_mime_object_write_to_stream (entity, NULL, filtered); g_mime_stream_flush (filtered); - g_object_unref (filtered); g_mime_stream_reset (stream); + g_object_unref (filtered); - /* Note: see rfc2015 or rfc3156, section 5.1 */ + /* Note: see rfc2015 or rfc3156, section 5.1 - we do this *after* writing out + * the entity because we'll end up parsing the mime part back out again and + * we don't want it to be in DOS format. */ filtered = g_mime_stream_filter_new (stream); - filter = g_mime_filter_crlf_new (TRUE, FALSE); - g_mime_stream_filter_add (GMIME_STREAM_FILTER (filtered), filter); + filter = g_mime_filter_unix2dos_new (FALSE); + g_mime_stream_filter_add ((GMimeStreamFilter *) filtered, filter); g_object_unref (filter); /* construct the signature stream */ sigstream = g_mime_stream_mem_new (); /* sign the content stream */ - if ((rv = g_mime_crypto_context_sign (ctx, userid, digest, filtered, sigstream, err)) == -1) { + if ((algo = g_mime_crypto_context_sign (ctx, TRUE, userid, filtered, sigstream, err)) == -1) { g_object_unref (sigstream); g_object_unref (filtered); g_object_unref (stream); - return -1; + return NULL; } g_object_unref (filtered); g_mime_stream_reset (sigstream); g_mime_stream_reset (stream); - /* set the multipart/signed protocol and micalg */ - content_type = g_mime_object_get_content_type (GMIME_OBJECT (mps)); - g_mime_content_type_set_parameter (content_type, "protocol", protocol); - micalg = g_strdup (g_mime_crypto_context_digest_name (ctx, (GMimeDigestAlgo) rv)); - g_mime_content_type_set_parameter (content_type, "micalg", micalg); - g_mime_multipart_set_boundary (GMIME_MULTIPART (mps), NULL); - /* construct the content part */ parser = g_mime_parser_new_with_stream (stream); - content = g_mime_parser_construct_part (parser); + entity = g_mime_parser_construct_part (parser, NULL); g_object_unref (stream); g_object_unref (parser); /* construct the signature part */ - content_type = g_mime_content_type_new_from_string (protocol); + content_type = g_mime_content_type_parse (NULL, protocol); signature = g_mime_part_new_with_type (content_type->type, content_type->subtype); g_object_unref (content_type); - wrapper = g_mime_data_wrapper_new (); - g_mime_data_wrapper_set_stream (wrapper, sigstream); - g_mime_part_set_content_object (signature, wrapper); + content = g_mime_data_wrapper_new (); + g_mime_data_wrapper_set_stream (content, sigstream); + g_mime_part_set_content (signature, content); g_object_unref (sigstream); - g_object_unref (wrapper); + g_object_unref (content); /* FIXME: temporary hack, this info should probably be set in * the CryptoContext class - maybe ::sign can take/output a @@ -312,13 +303,19 @@ } /* save the content and signature parts */ - /* FIXME: make sure there aren't any other parts?? */ - g_mime_multipart_add (GMIME_MULTIPART (mps), content); - g_mime_multipart_add (GMIME_MULTIPART (mps), (GMimeObject *) signature); + mps = g_mime_multipart_signed_new (); + g_mime_multipart_add ((GMimeMultipart *) mps, entity); + g_mime_multipart_add ((GMimeMultipart *) mps, (GMimeObject *) signature); g_object_unref (signature); - g_object_unref (content); + g_object_unref (entity); - return 0; + /* set the multipart/signed protocol and micalg */ + micalg = g_mime_crypto_context_digest_name (ctx, (GMimeDigestAlgo) algo); + g_mime_object_set_content_type_parameter ((GMimeObject *) mps, "protocol", protocol); + g_mime_object_set_content_type_parameter ((GMimeObject *) mps, "micalg", micalg); + g_mime_multipart_set_boundary ((GMimeMultipart *) mps, NULL); + + return mps; } static gboolean @@ -358,34 +355,33 @@ /** * g_mime_multipart_signed_verify: - * @mps: multipart/signed object - * @ctx: encryption crypto context - * @err: exception + * @mps: a #GMimeMultipartSigned + * @flags: a #GMimeVerifyFlags + * @err: a #GError * * Attempts to verify the signed MIME part contained within the - * multipart/signed object @mps using the @ctx crypto context. + * multipart/signed object @mps. * - * Returns: (transfer full): a new #GMimeSignatureList object on + * Returns: (nullable) (transfer full): a new #GMimeSignatureList object on * success or %NULL on fail. If the verification fails, an exception * will be set on @err to provide information as to why the failure * occured. **/ GMimeSignatureList * -g_mime_multipart_signed_verify (GMimeMultipartSigned *mps, GMimeCryptoContext *ctx, - GError **err) +g_mime_multipart_signed_verify (GMimeMultipartSigned *mps, GMimeVerifyFlags flags, GError **err) { - const char *supported, *protocol, *micalg; + const char *supported, *protocol; GMimeObject *content, *signature; GMimeStream *stream, *sigstream; GMimeSignatureList *signatures; - GMimeStream *filtered_stream; + GMimeFormatOptions *options; GMimeDataWrapper *wrapper; - GMimeFilter *crlf_filter; + GMimeCryptoContext *ctx; GMimeDigestAlgo digest; - char *content_type; + GMimeFilter *filter; + char *mime_type; g_return_val_if_fail (GMIME_IS_MULTIPART_SIGNED (mps), NULL); - g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), NULL); if (g_mime_multipart_get_count ((GMimeMultipart *) mps) < 2) { g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_PARSE_ERROR, @@ -393,84 +389,76 @@ return NULL; } - protocol = g_mime_object_get_content_type_parameter (GMIME_OBJECT (mps), "protocol"); - micalg = g_mime_object_get_content_type_parameter (GMIME_OBJECT (mps), "micalg"); + if (!(protocol = g_mime_object_get_content_type_parameter ((GMimeObject *) mps, "protocol"))) { + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_PROTOCOL_ERROR, + _("Cannot verify multipart/signed part: unspecified signature protocol.")); + + return NULL; + } + + if (!(ctx = g_mime_crypto_context_new (protocol))) { + g_set_error (err, GMIME_ERROR, GMIME_ERROR_PROTOCOL_ERROR, + _("Cannot verify multipart/signed part: unregistered signature protocol '%s'."), + protocol); + + return NULL; + } supported = g_mime_crypto_context_get_signature_protocol (ctx); - if (protocol) { - /* make sure the protocol matches the crypto sign protocol */ - if (!check_protocol_supported (protocol, supported)) { - g_set_error (err, GMIME_ERROR, GMIME_ERROR_PROTOCOL_ERROR, - _("Cannot verify multipart/signed part: unsupported signature protocol '%s'."), - protocol); - return NULL; - } - } else if (supported != NULL) { - /* *shrug* - I guess just go on as if they match? */ - protocol = supported; - } else { - g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_PROTOCOL_ERROR, - _("Cannot verify multipart/signed part: unspecified signature protocol.")); + /* make sure the protocol matches the crypto sign protocol */ + if (!check_protocol_supported (protocol, supported)) { + g_set_error (err, GMIME_ERROR, GMIME_ERROR_PROTOCOL_ERROR, + _("Cannot verify multipart/signed part: unsupported signature protocol '%s'."), + protocol); + g_object_unref (ctx); return NULL; } - signature = g_mime_multipart_get_part (GMIME_MULTIPART (mps), GMIME_MULTIPART_SIGNED_SIGNATURE); + signature = g_mime_multipart_get_part ((GMimeMultipart *) mps, GMIME_MULTIPART_SIGNED_SIGNATURE); /* make sure the protocol matches the signature content-type */ - content_type = g_mime_content_type_to_string (signature->content_type); - if (g_ascii_strcasecmp (content_type, protocol) != 0) { + mime_type = g_mime_content_type_get_mime_type (signature->content_type); + if (g_ascii_strcasecmp (mime_type, protocol) != 0) { g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_PARSE_ERROR, _("Cannot verify multipart/signed part: signature content-type does not match protocol.")); - g_free (content_type); + g_object_unref (ctx); + g_free (mime_type); return NULL; } - g_free (content_type); + g_free (mime_type); - content = g_mime_multipart_get_part (GMIME_MULTIPART (mps), GMIME_MULTIPART_SIGNED_CONTENT); + content = g_mime_multipart_get_part ((GMimeMultipart *) mps, GMIME_MULTIPART_SIGNED_CONTENT); /* get the content stream */ stream = g_mime_stream_mem_new (); - filtered_stream = g_mime_stream_filter_new (stream); /* Note: see rfc2015 or rfc3156, section 5.1 */ - crlf_filter = g_mime_filter_crlf_new (TRUE, FALSE); - g_mime_stream_filter_add (GMIME_STREAM_FILTER (filtered_stream), crlf_filter); - g_object_unref (crlf_filter); - - g_mime_object_write_to_stream (content, filtered_stream); - g_mime_stream_flush (filtered_stream); - g_object_unref (filtered_stream); + options = _g_mime_format_options_clone (NULL, FALSE); + g_mime_format_options_set_newline_format (options, GMIME_NEWLINE_FORMAT_DOS); + + g_mime_object_write_to_stream (content, options, stream); + g_mime_format_options_free (options); g_mime_stream_reset (stream); /* get the signature stream */ - wrapper = g_mime_part_get_content_object (GMIME_PART (signature)); - - /* FIXME: temporary hack for Balsa to support S/MIME, - * ::verify() should probably take a mime part so it can - * decode this itself if it needs to. */ - if (!g_ascii_strcasecmp (protocol, "application/pkcs7-signature") || - !g_ascii_strcasecmp (protocol, "application/x-pkcs7-signature")) { - sigstream = g_mime_stream_mem_new (); - g_mime_data_wrapper_write_to_stream (wrapper, sigstream); - } else { - sigstream = g_mime_data_wrapper_get_stream (wrapper); - g_object_ref (sigstream); - } + wrapper = g_mime_part_get_content ((GMimePart *) signature); + sigstream = g_mime_stream_mem_new (); + g_mime_data_wrapper_write_to_stream (wrapper, sigstream); g_mime_stream_reset (sigstream); /* verify the signature */ - digest = g_mime_crypto_context_digest_id (ctx, micalg); - signatures = g_mime_crypto_context_verify (ctx, digest, stream, sigstream, err); + signatures = g_mime_crypto_context_verify (ctx, flags, stream, sigstream, NULL, err); d(printf ("attempted to verify:\n----- BEGIN SIGNED PART -----\n%.*s----- END SIGNED PART -----\n", (int) GMIME_STREAM_MEM (stream)->buffer->len, GMIME_STREAM_MEM (stream)->buffer->data)); g_object_unref (sigstream); g_object_unref (stream); + g_object_unref (ctx); return signatures; } diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-multipart-signed.h gmime-3.0.1/gmime/gmime-multipart-signed.h --- gmime-2.6.22+dfsg2/gmime/gmime-multipart-signed.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-multipart-signed.h 2017-03-13 22:50:07.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -64,13 +64,10 @@ GMimeMultipartSigned *g_mime_multipart_signed_new (void); -int g_mime_multipart_signed_sign (GMimeMultipartSigned *mps, GMimeObject *content, - GMimeCryptoContext *ctx, const char *userid, - GMimeDigestAlgo digest, GError **err); - -GMimeSignatureList *g_mime_multipart_signed_verify (GMimeMultipartSigned *mps, - GMimeCryptoContext *ctx, - GError **err); +GMimeMultipartSigned *g_mime_multipart_signed_sign (GMimeCryptoContext *ctx, GMimeObject *entity, + const char *userid, GError **err); + +GMimeSignatureList *g_mime_multipart_signed_verify (GMimeMultipartSigned *mps, GMimeVerifyFlags flags, GError **err); G_END_DECLS diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-object.c gmime-3.0.1/gmime/gmime-object.c --- gmime-2.6.22+dfsg2/gmime/gmime-object.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-object.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -26,9 +26,11 @@ #include #include +#include "gmime-table-private.h" #include "gmime-common.h" #include "gmime-object.h" #include "gmime-stream-mem.h" +#include "gmime-internal.h" #include "gmime-events.h" #include "gmime-utils.h" @@ -43,7 +45,6 @@ * parts are derived. **/ - struct _type_bucket { char *type; GType object_type; @@ -62,19 +63,17 @@ static void g_mime_object_init (GMimeObject *object, GMimeObjectClass *klass); static void g_mime_object_finalize (GObject *object); -static void object_prepend_header (GMimeObject *object, const char *name, const char *value); -static void object_append_header (GMimeObject *object, const char *name, const char *value); -static void object_set_header (GMimeObject *object, const char *name, const char *value); -static const char *object_get_header (GMimeObject *object, const char *name); -static gboolean object_remove_header (GMimeObject *object, const char *name); +static void object_header_added (GMimeObject *object, GMimeHeader *header); +static void object_header_changed (GMimeObject *object, GMimeHeader *header); +static void object_header_removed (GMimeObject *object, GMimeHeader *header); +static void object_headers_cleared (GMimeObject *object); + static void object_set_content_type (GMimeObject *object, GMimeContentType *content_type); -static char *object_get_headers (GMimeObject *object); -static ssize_t object_write_to_stream (GMimeObject *object, GMimeStream *stream); +static char *object_get_headers (GMimeObject *object, GMimeFormatOptions *options); +static ssize_t object_write_to_stream (GMimeObject *object, GMimeFormatOptions *options, gboolean content_only, GMimeStream *stream); static void object_encode (GMimeObject *object, GMimeEncodingConstraint constraint); -static ssize_t write_content_type (GMimeStream *stream, const char *name, const char *value); -static ssize_t write_disposition (GMimeStream *stream, const char *name, const char *value); - +static void header_list_changed (GMimeHeaderList *headers, GMimeHeaderListChangedEventArgs *args, GMimeObject *object); static void content_type_changed (GMimeContentType *content_type, gpointer args, GMimeObject *object); static void content_disposition_changed (GMimeContentDisposition *disposition, gpointer args, GMimeObject *object); @@ -119,11 +118,10 @@ object_class->finalize = g_mime_object_finalize; - klass->prepend_header = object_prepend_header; - klass->append_header = object_append_header; - klass->remove_header = object_remove_header; - klass->set_header = object_set_header; - klass->get_header = object_get_header; + klass->header_added = object_header_added; + klass->header_changed = object_header_changed; + klass->header_removed = object_header_removed; + klass->headers_cleared = object_headers_cleared; klass->set_content_type = object_set_content_type; klass->get_headers = object_get_headers; klass->write_to_stream = object_write_to_stream; @@ -133,123 +131,219 @@ static void g_mime_object_init (GMimeObject *object, GMimeObjectClass *klass) { - object->headers = g_mime_header_list_new (); + GMimeHeaderList *headers; + + headers = g_mime_header_list_new (g_mime_parser_options_get_default ()); + g_mime_event_add (headers->changed, (GMimeEventCallback) header_list_changed, object); + object->headers = headers; + + object->ensure_newline = FALSE; object->content_type = NULL; object->disposition = NULL; object->content_id = NULL; - - g_mime_header_list_register_writer (object->headers, "Content-Type", write_content_type); - g_mime_header_list_register_writer (object->headers, "Content-Disposition", write_disposition); } + static void g_mime_object_finalize (GObject *object) { GMimeObject *mime = (GMimeObject *) object; + GMimeEvent *event; if (mime->content_type) { - g_mime_event_remove (mime->content_type->priv, (GMimeEventCallback) content_type_changed, object); + event = mime->content_type->changed; + g_mime_event_remove (event, (GMimeEventCallback) content_type_changed, object); g_object_unref (mime->content_type); } if (mime->disposition) { - g_mime_event_remove (mime->disposition->priv, (GMimeEventCallback) content_disposition_changed, object); + event = mime->disposition->changed; + g_mime_event_remove (event, (GMimeEventCallback) content_disposition_changed, object); g_object_unref (mime->disposition); } - if (mime->headers) - g_mime_header_list_destroy (mime->headers); + if (mime->headers) { + event = mime->headers->changed; + g_mime_event_remove (event, (GMimeEventCallback) header_list_changed, object); + g_object_unref (mime->headers); + } g_free (mime->content_id); G_OBJECT_CLASS (parent_class)->finalize (object); } +enum { + HEADER_CONTENT_DISPOSITION, + HEADER_CONTENT_TYPE, + HEADER_CONTENT_ID, + HEADER_UNKNOWN, +}; -static ssize_t -write_content_type (GMimeStream *stream, const char *name, const char *value) +static char *content_headers[] = { + "Content-Disposition", + "Content-Type", + "Content-Id", +}; + +static void +object_header_added (GMimeObject *object, GMimeHeader *header) +{ + object_header_changed (object, header); +} + +static void +object_header_changed (GMimeObject *object, GMimeHeader *header) { + GMimeParserOptions *options = _g_mime_header_list_get_options (object->headers); + GMimeContentDisposition *disposition; GMimeContentType *content_type; - ssize_t nwritten; - GString *out; - char *val; - - out = g_string_new (""); - g_string_printf (out, "%s: ", name); - - content_type = g_mime_content_type_new_from_string (value); + const char *name, *value; + guint i; - val = g_mime_content_type_to_string (content_type); - g_string_append (out, val); - g_free (val); + name = g_mime_header_get_name (header); - g_mime_param_write_to_string (content_type->params, TRUE, out); - g_object_unref (content_type); + if (g_ascii_strncasecmp (name, "Content-", 8) != 0) + return; - nwritten = g_mime_stream_write (stream, out->str, out->len); - g_string_free (out, TRUE); + for (i = 0; i < G_N_ELEMENTS (content_headers); i++) { + if (!g_ascii_strcasecmp (content_headers[i] + 8, name + 8)) + break; + } - return nwritten; + switch (i) { + case HEADER_CONTENT_DISPOSITION: + value = g_mime_header_get_value (header); + disposition = g_mime_content_disposition_parse (options, value); + _g_mime_object_set_content_disposition (object, disposition); + g_object_unref (disposition); + break; + case HEADER_CONTENT_TYPE: + value = g_mime_header_get_value (header); + content_type = g_mime_content_type_parse (options, value); + _g_mime_object_set_content_type (object, content_type); + g_object_unref (content_type); + break; + case HEADER_CONTENT_ID: + value = g_mime_header_get_value (header); + g_free (object->content_id); + object->content_id = g_mime_utils_decode_message_id (value); + break; + } } static void -content_type_changed (GMimeContentType *content_type, gpointer args, GMimeObject *object) +object_header_removed (GMimeObject *object, GMimeHeader *header) { - GMimeParam *params; - GString *string; - char *type, *p; - - string = g_string_new ("Content-Type: "); + GMimeEvent *event; + const char *name; + guint i; - type = g_mime_content_type_to_string (content_type); - g_string_append (string, type); - g_free (type); + name = g_mime_header_get_name (header); - if ((params = content_type->params)) - g_mime_param_write_to_string (params, FALSE, string); + if (g_ascii_strncasecmp (name, "Content-", 8) != 0) + return; - p = string->str; - g_string_free (string, FALSE); + for (i = 0; i < G_N_ELEMENTS (content_headers); i++) { + if (!g_ascii_strcasecmp (content_headers[i] + 8, name + 8)) + break; + } - type = p + strlen ("Content-Type: "); - g_mime_header_list_set (object->headers, "Content-Type", type); - g_free (p); + switch (i) { + case HEADER_CONTENT_DISPOSITION: + if (object->disposition) { + event = object->disposition->changed; + g_mime_event_remove (event, (GMimeEventCallback) content_disposition_changed, object); + g_object_unref (object->disposition); + object->disposition = NULL; + } + break; + case HEADER_CONTENT_TYPE: + /* never allow the removal of the Content-Type header */ + break; + case HEADER_CONTENT_ID: + g_free (object->content_id); + object->content_id = NULL; + break; + } } -static ssize_t -write_disposition (GMimeStream *stream, const char *name, const char *value) +static void +object_headers_cleared (GMimeObject *object) { - GMimeContentDisposition *disposition; - ssize_t nwritten; - GString *out; - - out = g_string_new (""); - g_string_printf (out, "%s: ", name); + GMimeEvent *event; - disposition = g_mime_content_disposition_new_from_string (value); - g_string_append (out, disposition->disposition); + if (object->disposition) { + event = object->disposition->changed; + g_mime_event_remove (event, (GMimeEventCallback) content_disposition_changed, object); + g_object_unref (object->disposition); + object->disposition = NULL; + } - g_mime_param_write_to_string (disposition->params, TRUE, out); - g_object_unref (disposition); + g_free (object->content_id); + object->content_id = NULL; +} + +static void +header_list_changed (GMimeHeaderList *headers, GMimeHeaderListChangedEventArgs *args, GMimeObject *object) +{ + switch (args->action) { + case GMIME_HEADER_LIST_CHANGED_ACTION_ADDED: + GMIME_OBJECT_GET_CLASS (object)->header_added (object, args->header); + break; + case GMIME_HEADER_LIST_CHANGED_ACTION_CHANGED: + GMIME_OBJECT_GET_CLASS (object)->header_changed (object, args->header); + break; + case GMIME_HEADER_LIST_CHANGED_ACTION_REMOVED: + GMIME_OBJECT_GET_CLASS (object)->header_removed (object, args->header); + break; + case GMIME_HEADER_LIST_CHANGED_ACTION_CLEARED: + GMIME_OBJECT_GET_CLASS (object)->headers_cleared (object); + break; + } +} + +void +_g_mime_object_block_header_list_changed (GMimeObject *object) +{ + g_mime_event_block (object->headers->changed, (GMimeEventCallback) header_list_changed, object); +} + +void +_g_mime_object_unblock_header_list_changed (GMimeObject *object) +{ + g_mime_event_unblock (object->headers->changed, (GMimeEventCallback) header_list_changed, object); +} + +static void +content_type_changed (GMimeContentType *content_type, gpointer args, GMimeObject *object) +{ + char *raw_value; - nwritten = g_mime_stream_write (stream, out->str, out->len); - g_string_free (out, TRUE); + raw_value = g_mime_content_type_encode (content_type, NULL); - return nwritten; + _g_mime_object_block_header_list_changed (object); + _g_mime_header_list_set (object->headers, "Content-Type", raw_value); + _g_mime_object_unblock_header_list_changed (object); + g_free (raw_value); } static void content_disposition_changed (GMimeContentDisposition *disposition, gpointer args, GMimeObject *object) { - char *str; + char *raw_value; - if (object->disposition) { - str = g_mime_content_disposition_to_string (object->disposition, FALSE); - g_mime_header_list_set (object->headers, "Content-Disposition", str); - g_free (str); + _g_mime_object_block_header_list_changed (object); + + if (disposition) { + raw_value = g_mime_content_disposition_encode (disposition, NULL); + _g_mime_header_list_set (object->headers, "Content-Disposition", raw_value); + g_free (raw_value); } else { g_mime_header_list_remove (object->headers, "Content-Disposition"); } + + _g_mime_object_unblock_header_list_changed (object); } @@ -292,6 +386,7 @@ /** * g_mime_object_new: + * @options: (nullable): a #GMimeParserOptions or %NULL * @content_type: a #GMimeContentType object * * Performs a lookup of registered #GMimeObject subclasses, registered @@ -306,7 +401,7 @@ * parts appropriate for @content_type. **/ GMimeObject * -g_mime_object_new (GMimeContentType *content_type) +g_mime_object_new (GMimeParserOptions *options, GMimeContentType *content_type) { struct _type_bucket *bucket; struct _subtype_bucket *sub; @@ -336,7 +431,8 @@ return NULL; } - object = g_object_newv (obj_type, 0, NULL); + object = g_object_new (obj_type, NULL); + _g_mime_header_list_set_options (object->headers, options); g_mime_object_set_content_type (object, content_type); @@ -346,6 +442,7 @@ /** * g_mime_object_new_type: + * @options: (nullable): a #GMimeParserOptions or %NULL * @type: mime type * @subtype: mime subtype * @@ -360,10 +457,11 @@ * of @type/@subtype. **/ GMimeObject * -g_mime_object_new_type (const char *type, const char *subtype) +g_mime_object_new_type (GMimeParserOptions *options, const char *type, const char *subtype) { struct _type_bucket *bucket; struct _subtype_bucket *sub; + GMimeObject *object; GType obj_type; g_return_val_if_fail (type != NULL, NULL); @@ -389,7 +487,10 @@ return NULL; } - return g_object_newv (obj_type, 0, NULL); + object = g_object_new (obj_type, NULL); + _g_mime_header_list_set_options (object->headers, options); + + return object; } @@ -397,11 +498,11 @@ object_set_content_type (GMimeObject *object, GMimeContentType *content_type) { if (object->content_type) { - g_mime_event_remove (object->content_type->priv, (GMimeEventCallback) content_type_changed, object); + g_mime_event_remove (object->content_type->changed, (GMimeEventCallback) content_type_changed, object); g_object_unref (object->content_type); } - g_mime_event_add (content_type->priv, (GMimeEventCallback) content_type_changed, object); + g_mime_event_add (content_type->changed, (GMimeEventCallback) content_type_changed, object); object->content_type = content_type; g_object_ref (content_type); } @@ -527,7 +628,7 @@ } /** - * g_mime_object_set_content_disposition: + * _g_mime_object_set_content_disposition: * @object: a #GMimeObject * @disposition: a #GMimeContentDisposition object * @@ -541,11 +642,11 @@ _g_mime_object_set_content_disposition (GMimeObject *object, GMimeContentDisposition *disposition) { if (object->disposition) { - g_mime_event_remove (object->disposition->priv, (GMimeEventCallback) content_disposition_changed, object); + g_mime_event_remove (object->disposition->changed, (GMimeEventCallback) content_disposition_changed, object); g_object_unref (object->disposition); } - g_mime_event_add (disposition->priv, (GMimeEventCallback) content_disposition_changed, object); + g_mime_event_add (disposition->changed, (GMimeEventCallback) content_disposition_changed, object); object->disposition = disposition; g_object_ref (disposition); } @@ -697,7 +798,9 @@ object->content_id = g_strdup (content_id); msgid = g_strdup_printf ("<%s>", content_id); - g_mime_object_set_header (object, "Content-Id", msgid); + _g_mime_object_block_header_list_changed (object); + g_mime_header_list_set (object->headers, "Content-Id", msgid, NULL); + _g_mime_object_unblock_header_list_changed (object); g_free (msgid); } @@ -719,92 +822,30 @@ } -enum { - HEADER_CONTENT_DISPOSITION, - HEADER_CONTENT_TYPE, - HEADER_CONTENT_ID, - HEADER_UNKNOWN, -}; - -static char *content_headers[] = { - "Content-Disposition", - "Content-Type", - "Content-Id", -}; - -static gboolean -process_header (GMimeObject *object, const char *header, const char *value) -{ - GMimeContentDisposition *disposition; - GMimeContentType *content_type; - guint i; - - if (g_ascii_strncasecmp (header, "Content-", 8) != 0) - return FALSE; - - for (i = 0; i < G_N_ELEMENTS (content_headers); i++) { - if (!g_ascii_strcasecmp (content_headers[i] + 8, header + 8)) - break; - } - - switch (i) { - case HEADER_CONTENT_DISPOSITION: - disposition = g_mime_content_disposition_new_from_string (value); - _g_mime_object_set_content_disposition (object, disposition); - g_object_unref (disposition); - break; - case HEADER_CONTENT_TYPE: - content_type = g_mime_content_type_new_from_string (value); - _g_mime_object_set_content_type (object, content_type); - g_object_unref (content_type); - break; - case HEADER_CONTENT_ID: - g_free (object->content_id); - object->content_id = g_mime_utils_decode_message_id (value); - break; - default: - return FALSE; - } - - g_mime_header_list_set (object->headers, header, value); - - return TRUE; -} - -static void -object_prepend_header (GMimeObject *object, const char *header, const char *value) -{ - if (!process_header (object, header, value)) - g_mime_header_list_prepend (object->headers, header, value); -} - - /** * g_mime_object_prepend_header: * @object: a #GMimeObject * @header: header name * @value: header value + * @charset: a charset * - * Prepends a raw, unprocessed header to the MIME object. - * - * Note: @value should be encoded with a function such as - * g_mime_utils_header_encode_text(). + * Prepends a new header to the header list. **/ void -g_mime_object_prepend_header (GMimeObject *object, const char *header, const char *value) +g_mime_object_prepend_header (GMimeObject *object, const char *header, const char *value, const char *charset) { g_return_if_fail (GMIME_IS_OBJECT (object)); g_return_if_fail (header != NULL); - g_return_if_fail (value != NULL); - GMIME_OBJECT_GET_CLASS (object)->prepend_header (object, header, value); + g_mime_header_list_prepend (object->headers, header, value, charset); } -static void -object_append_header (GMimeObject *object, const char *header, const char *value) + +void +_g_mime_object_append_header (GMimeObject *object, const char *header, const char *raw_name, + const char *raw_value, gint64 offset) { - if (!process_header (object, header, value)) - g_mime_header_list_append (object->headers, header, value); + _g_mime_header_list_append (object->headers, header, raw_name, raw_value, offset); } @@ -813,28 +854,17 @@ * @object: a #GMimeObject * @header: header name * @value: header value + * @charset: a charset * - * Appends a raw, unprocessed header to the MIME object. - * - * Note: @value should be encoded with a function such as - * g_mime_utils_header_encode_text(). + * Appends a new header to the header list. **/ void -g_mime_object_append_header (GMimeObject *object, const char *header, const char *value) +g_mime_object_append_header (GMimeObject *object, const char *header, const char *value, const char *charset) { g_return_if_fail (GMIME_IS_OBJECT (object)); g_return_if_fail (header != NULL); - g_return_if_fail (value != NULL); - GMIME_OBJECT_GET_CLASS (object)->append_header (object, header, value); -} - - -static void -object_set_header (GMimeObject *object, const char *header, const char *value) -{ - if (!process_header (object, header, value)) - g_mime_header_list_set (object->headers, header, value); + g_mime_header_list_append (object->headers, header, value, charset); } @@ -843,27 +873,17 @@ * @object: a #GMimeObject * @header: header name * @value: header value + * @charset: a charset * - * Sets an arbitrary raw, unprocessed header on the MIME object. - * - * Note: @value should be encoded with a function such as - * g_mime_utils_header_encode_text(). + * Sets a header to the specified value. **/ void -g_mime_object_set_header (GMimeObject *object, const char *header, const char *value) +g_mime_object_set_header (GMimeObject *object, const char *header, const char *value, const char *charset) { g_return_if_fail (GMIME_IS_OBJECT (object)); g_return_if_fail (header != NULL); - g_return_if_fail (value != NULL); - GMIME_OBJECT_GET_CLASS (object)->set_header (object, header, value); -} - - -static const char * -object_get_header (GMimeObject *object, const char *header) -{ - return g_mime_header_list_get (object->headers, header); + g_mime_header_list_set (object->headers, header, value, charset); } @@ -872,54 +892,22 @@ * @object: a #GMimeObject * @header: header name * - * Gets the raw, unprocessed value of the first header with the specified name. + * Gets the value of the first header with the specified name. * - * Returns: the raw, unprocessed value of the requested header if it + * Returns: the value of the requested header if it * exists or %NULL otherwise. - * - * Note: The returned value should be decoded with a function such as - * g_mime_utils_header_decode_text() before displaying to the user. **/ const char * g_mime_object_get_header (GMimeObject *object, const char *header) { - g_return_val_if_fail (GMIME_IS_OBJECT (object), NULL); - g_return_val_if_fail (header != NULL, NULL); - - return GMIME_OBJECT_GET_CLASS (object)->get_header (object, header); -} - - -static gboolean -object_remove_header (GMimeObject *object, const char *header) -{ - guint i; + GMimeHeader *hdr; - for (i = 0; i < G_N_ELEMENTS (content_headers); i++) { - if (!g_ascii_strcasecmp (content_headers[i], header)) - break; - } + g_return_val_if_fail (GMIME_IS_OBJECT (object), NULL); - switch (i) { - case HEADER_CONTENT_DISPOSITION: - if (object->disposition) { - g_mime_event_remove (object->disposition->priv, (GMimeEventCallback) content_disposition_changed, object); - g_object_unref (object->disposition); - object->disposition = NULL; - } - break; - case HEADER_CONTENT_TYPE: - /* never allow the removal of the Content-Type header */ - return FALSE; - case HEADER_CONTENT_ID: - g_free (object->content_id); - object->content_id = NULL; - break; - default: - break; - } + if (!(hdr = g_mime_header_list_get_header (object->headers, header))) + return NULL; - return g_mime_header_list_remove (object->headers, header); + return g_mime_header_get_value (hdr); } @@ -937,22 +925,22 @@ g_mime_object_remove_header (GMimeObject *object, const char *header) { g_return_val_if_fail (GMIME_IS_OBJECT (object), FALSE); - g_return_val_if_fail (header != NULL, FALSE); - return GMIME_OBJECT_GET_CLASS (object)->remove_header (object, header); + return g_mime_header_list_remove (object->headers, header); } static char * -object_get_headers (GMimeObject *object) +object_get_headers (GMimeObject *object, GMimeFormatOptions *options) { - return g_mime_header_list_to_string (object->headers); + return g_mime_header_list_to_string (object->headers, options); } /** * g_mime_object_get_headers: * @object: a #GMimeObject + * @options: (nullable): a #GMimeFormatOptions or %NULL * * Allocates a string buffer containing all of the MIME object's raw * headers. @@ -962,16 +950,16 @@ * Note: The returned string will not be suitable for display. **/ char * -g_mime_object_get_headers (GMimeObject *object) +g_mime_object_get_headers (GMimeObject *object, GMimeFormatOptions *options) { g_return_val_if_fail (GMIME_IS_OBJECT (object), NULL); - return GMIME_OBJECT_GET_CLASS (object)->get_headers (object); + return GMIME_OBJECT_GET_CLASS (object)->get_headers (object, options); } static ssize_t -object_write_to_stream (GMimeObject *object, GMimeStream *stream) +object_write_to_stream (GMimeObject *object, GMimeFormatOptions *options, gboolean content_only, GMimeStream *stream) { return -1; } @@ -980,6 +968,7 @@ /** * g_mime_object_write_to_stream: * @object: a #GMimeObject + * @options: (nullable): a #GMimeFormatOptions or %NULL * @stream: stream * * Write the contents of the MIME object to @stream. @@ -987,12 +976,12 @@ * Returns: the number of bytes written or %-1 on fail. **/ ssize_t -g_mime_object_write_to_stream (GMimeObject *object, GMimeStream *stream) +g_mime_object_write_to_stream (GMimeObject *object, GMimeFormatOptions *options, GMimeStream *stream) { g_return_val_if_fail (GMIME_IS_OBJECT (object), -1); g_return_val_if_fail (GMIME_IS_STREAM (stream), -1); - return GMIME_OBJECT_GET_CLASS (object)->write_to_stream (object, stream); + return GMIME_OBJECT_GET_CLASS (object)->write_to_stream (object, options, FALSE, stream); } @@ -1024,6 +1013,7 @@ /** * g_mime_object_to_string: * @object: a #GMimeObject + * @options: (nullable): a #GMimeFormatOptions or %NULL * * Allocates a string buffer containing the contents of @object. * @@ -1031,7 +1021,7 @@ * object. **/ char * -g_mime_object_to_string (GMimeObject *object) +g_mime_object_to_string (GMimeObject *object, GMimeFormatOptions *options) { GMimeStream *stream; GByteArray *array; @@ -1043,7 +1033,7 @@ stream = g_mime_stream_mem_new (); g_mime_stream_mem_set_byte_array (GMIME_STREAM_MEM (stream), array); - g_mime_object_write_to_stream (object, stream); + g_mime_object_write_to_stream (object, options, stream); g_object_unref (stream); g_byte_array_append (array, (unsigned char *) "", 1); diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-object.h gmime-3.0.1/gmime/gmime-object.h --- gmime-2.6.22+dfsg2/gmime/gmime-object.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-object.h 2017-03-28 23:46:26.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -25,6 +25,8 @@ #include #include +#include +#include #include #include #include @@ -59,24 +61,26 @@ GMimeContentDisposition *disposition; GMimeContentType *content_type; GMimeHeaderList *headers; - char *content_id; + + /* < private > */ + gboolean ensure_newline; }; struct _GMimeObjectClass { GObjectClass parent_class; - void (* prepend_header) (GMimeObject *object, const char *header, const char *value); - void (* append_header) (GMimeObject *object, const char *header, const char *value); - void (* set_header) (GMimeObject *object, const char *header, const char *value); - const char * (* get_header) (GMimeObject *object, const char *header); - gboolean (* remove_header) (GMimeObject *object, const char *header); + void (* header_added) (GMimeObject *object, GMimeHeader *header); + void (* header_changed) (GMimeObject *object, GMimeHeader *header); + void (* header_removed) (GMimeObject *object, GMimeHeader *header); + void (* headers_cleared) (GMimeObject *object); void (* set_content_type) (GMimeObject *object, GMimeContentType *content_type); - char * (* get_headers) (GMimeObject *object); + char * (* get_headers) (GMimeObject *object, GMimeFormatOptions *options); - ssize_t (* write_to_stream) (GMimeObject *object, GMimeStream *stream); + ssize_t (* write_to_stream) (GMimeObject *object, GMimeFormatOptions *options, + gboolean content_only, GMimeStream *stream); void (* encode) (GMimeObject *object, GMimeEncodingConstraint constraint); }; @@ -98,8 +102,8 @@ void g_mime_object_register_type (const char *type, const char *subtype, GType object_type); -GMimeObject *g_mime_object_new (GMimeContentType *content_type); -GMimeObject *g_mime_object_new_type (const char *type, const char *subtype); +GMimeObject *g_mime_object_new (GMimeParserOptions *options, GMimeContentType *content_type); +GMimeObject *g_mime_object_new_type (GMimeParserOptions *options, const char *type, const char *subtype); void g_mime_object_set_content_type (GMimeObject *object, GMimeContentType *content_type); GMimeContentType *g_mime_object_get_content_type (GMimeObject *object); @@ -118,18 +122,18 @@ void g_mime_object_set_content_id (GMimeObject *object, const char *content_id); const char *g_mime_object_get_content_id (GMimeObject *object); -void g_mime_object_prepend_header (GMimeObject *object, const char *header, const char *value); -void g_mime_object_append_header (GMimeObject *object, const char *header, const char *value); -void g_mime_object_set_header (GMimeObject *object, const char *header, const char *value); +void g_mime_object_prepend_header (GMimeObject *object, const char *header, const char *value, const char *charset); +void g_mime_object_append_header (GMimeObject *object, const char *header, const char *value, const char *charset); +void g_mime_object_set_header (GMimeObject *object, const char *header, const char *value, const char *charset); const char *g_mime_object_get_header (GMimeObject *object, const char *header); gboolean g_mime_object_remove_header (GMimeObject *object, const char *header); GMimeHeaderList *g_mime_object_get_header_list (GMimeObject *object); -char *g_mime_object_get_headers (GMimeObject *object); +char *g_mime_object_get_headers (GMimeObject *object, GMimeFormatOptions *options); -ssize_t g_mime_object_write_to_stream (GMimeObject *object, GMimeStream *stream); -char *g_mime_object_to_string (GMimeObject *object); +ssize_t g_mime_object_write_to_stream (GMimeObject *object, GMimeFormatOptions *options, GMimeStream *stream); +char *g_mime_object_to_string (GMimeObject *object, GMimeFormatOptions *options); void g_mime_object_encode (GMimeObject *object, GMimeEncodingConstraint constraint); diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-param.c gmime-3.0.1/gmime/gmime-param.c --- gmime-2.6.22+dfsg2/gmime/gmime-param.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-param.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -30,6 +30,8 @@ #include "gmime-param.h" #include "gmime-common.h" +#include "gmime-events.h" +#include "gmime-internal.h" #include "gmime-table-private.h" #include "gmime-parse-utils.h" #include "gmime-iconv-utils.h" @@ -48,7 +50,7 @@ /** * SECTION: gmime-param - * @title: GMimeParam + * @title: GMimeParamList * @short_description: Content-Type and Content-Disposition parameters * @see_also: #GMimeContentType * @@ -63,29 +65,798 @@ }; +static void g_mime_param_class_init (GMimeParamClass *klass); +static void g_mime_param_init (GMimeParam *cert, GMimeParamClass *klass); +static void g_mime_param_finalize (GObject *object); + +static GObjectClass *parent_class = NULL; + + +GType +g_mime_param_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeParamClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_param_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeParam), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_param_init, + }; + + type = g_type_register_static (G_TYPE_OBJECT, "GMimeParam", &info, 0); + } + + return type; +} + +static void +g_mime_param_class_init (GMimeParamClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_ref (G_TYPE_OBJECT); + + object_class->finalize = g_mime_param_finalize; +} + +static void +g_mime_param_init (GMimeParam *param, GMimeParamClass *klass) +{ + param->method = GMIME_PARAM_ENCODING_METHOD_DEFAULT; + param->changed = g_mime_event_new (param); + param->charset = NULL; + param->value = NULL; + param->name = NULL; + param->lang = NULL; +} + +static void +g_mime_param_finalize (GObject *object) +{ + GMimeParam *param = (GMimeParam *) object; + + g_mime_event_free (param->changed); + g_free (param->charset); + g_free (param->value); + g_free (param->name); + g_free (param->lang); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + /** * g_mime_param_new: - * @name: parameter name - * @value: parameter value * - * Creates a new #GMimeParam node with name @name and value @value. + * Creates a new #GMimeParam. * - * Returns: a new paramter structure. + * Returns: a new #GMimeParam. **/ -GMimeParam * -g_mime_param_new (const char *name, const char *value) +static GMimeParam * +g_mime_param_new (void) +{ + return g_object_new (GMIME_TYPE_PARAM, NULL); +} + + +/** + * g_mime_param_get_name: + * @param: a #GMimeParam + * + * Gets the name of the parameter. + * + * Returns: the name of the parameter. + **/ +const char * +g_mime_param_get_name (GMimeParam *param) +{ + g_return_val_if_fail (GMIME_IS_PARAM (param), NULL); + + return param->name; +} + + +/** + * g_mime_param_get_value: + * @param: a #GMimeParam + * + * Gets the value of the parameter. + * + * Returns: the value of the parameter. + **/ +const char * +g_mime_param_get_value (GMimeParam *param) +{ + g_return_val_if_fail (GMIME_IS_PARAM (param), NULL); + + return param->value; +} + + +/** + * g_mime_param_set_value: + * @param: a #GMimeParam + * @value: the new parameter value + * + * Sets the parameter value to @value. + **/ +void +g_mime_param_set_value (GMimeParam *param, const char *value) +{ + g_return_if_fail (GMIME_IS_PARAM (param)); + g_return_if_fail (value != NULL); + + g_free (param->value); + param->value = g_strdup (value); + + g_mime_event_emit (param->changed, NULL); +} + + +/** + * g_mime_param_get_charset: + * @param: a #GMimeParam + * + * Gets the charset used for encoding the parameter. + * + * Returns: the charset used for encoding the parameter. + **/ +const char * +g_mime_param_get_charset (GMimeParam *param) +{ + g_return_val_if_fail (GMIME_IS_PARAM (param), NULL); + + return param->charset; +} + + +/** + * g_mime_param_set_charset: + * @param: a #GMimeParam + * @charset: the charset or %NULL to use the default + * + * Sets the parameter charset used for encoding the value. + **/ +void +g_mime_param_set_charset (GMimeParam *param, const char *charset) +{ + g_return_if_fail (GMIME_IS_PARAM (param)); + + g_free (param->charset); + param->charset = charset ? g_strdup (charset) : NULL; + + g_mime_event_emit (param->changed, NULL); +} + + +/** + * g_mime_param_get_lang: + * @param: a #GMimeParam + * + * Gets the language specifier used for encoding the parameter. + * + * Returns: the language specifier used for encoding the parameter. + **/ +const char * +g_mime_param_get_lang (GMimeParam *param) +{ + g_return_val_if_fail (GMIME_IS_PARAM (param), NULL); + + return param->lang; +} + + +/** + * g_mime_param_set_lang: + * @param: a #GMimeParam + * @lang: the language specifier + * + * Sets the parameter language specifier used for encoding the value. + **/ +void +g_mime_param_set_lang (GMimeParam *param, const char *lang) +{ + g_return_if_fail (GMIME_IS_PARAM (param)); + + g_free (param->lang); + param->lang = lang ? g_strdup (lang) : NULL; + + g_mime_event_emit (param->changed, NULL); +} + + +/** + * g_mime_param_get_encoding_method: + * @param: a #GMimeParam + * + * Gets the encoding method used for encoding the parameter. + * + * Returns: the encoding method used for encoding the parameter. + **/ +GMimeParamEncodingMethod +g_mime_param_get_encoding_method (GMimeParam *param) +{ + g_return_val_if_fail (GMIME_IS_PARAM (param), GMIME_PARAM_ENCODING_METHOD_DEFAULT); + + return param->method; +} + + +/** + * g_mime_param_set_encoding_method: + * @param: a #GMimeParam + * @method: a #GMimeParamEncodingMethod + * + * Sets the encoding method used for encoding the value. + **/ +void +g_mime_param_set_encoding_method (GMimeParam *param, GMimeParamEncodingMethod method) +{ + g_return_if_fail (GMIME_IS_PARAM (param)); + + param->method = method; + + g_mime_event_emit (param->changed, NULL); +} + + +static void +param_changed (GMimeParam *param, gpointer args, GMimeParamList *list) +{ + g_mime_event_emit (list->changed, NULL); +} + + +static void g_mime_param_list_class_init (GMimeParamListClass *klass); +static void g_mime_param_list_init (GMimeParamList *list, GMimeParamListClass *klass); +static void g_mime_param_list_finalize (GObject *object); + + +static GObjectClass *list_parent_class = NULL; + + +GType +g_mime_param_list_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeParamListClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_param_list_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeParamList), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_param_list_init, + }; + + type = g_type_register_static (G_TYPE_OBJECT, "GMimeParamList", &info, 0); + } + + return type; +} + + +static void +g_mime_param_list_class_init (GMimeParamListClass *klass) { + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + list_parent_class = g_type_class_ref (G_TYPE_OBJECT); + + object_class->finalize = g_mime_param_list_finalize; +} + +static void +g_mime_param_list_init (GMimeParamList *list, GMimeParamListClass *klass) +{ + list->changed = g_mime_event_new (list); + list->array = g_ptr_array_new (); +} + +static void +g_mime_param_list_finalize (GObject *object) +{ + GMimeParamList *list = (GMimeParamList *) object; GMimeParam *param; + guint i; - param = g_new (GMimeParam, 1); + for (i = 0; i < list->array->len; i++) { + param = (GMimeParam *) list->array->pdata[i]; + g_mime_event_remove (param->changed, (GMimeEventCallback) param_changed, list); + g_object_unref (param); + } - param->next = NULL; - param->name = g_strdup (name); + g_ptr_array_free (list->array, TRUE); + g_mime_event_free (list->changed); + + G_OBJECT_CLASS (list_parent_class)->finalize (object); +} + + +/** + * g_mime_param_list_new: + * + * Creates a new Content-Type or Content-Disposition parameter list. + * + * Returns: a new #GMimeParamList. + **/ +GMimeParamList * +g_mime_param_list_new (void) +{ + return g_object_new (GMIME_TYPE_PARAM_LIST, NULL); +} + + +/** + * g_mime_param_list_length: + * @list: a #GMimeParamList + * + * Gets the length of the list. + * + * Returns: the number of #GMimeParam items in the list. + **/ +int +g_mime_param_list_length (GMimeParamList *list) +{ + g_return_val_if_fail (GMIME_IS_PARAM_LIST (list), -1); + + return list->array->len; +} + + +/** + * g_mime_param_list_clear: + * @list: a #GMimeParamList + * + * Clears the list of parameters. + **/ +void +g_mime_param_list_clear (GMimeParamList *list) +{ + GMimeParam *param; + guint i; + + g_return_if_fail (GMIME_IS_PARAM_LIST (list)); + + for (i = 0; i < list->array->len; i++) { + param = (GMimeParam *) list->array->pdata[i]; + g_mime_event_remove (param->changed, (GMimeEventCallback) param_changed, list); + g_object_unref (param); + } + + g_ptr_array_set_size (list->array, 0); + + g_mime_event_emit (list->changed, NULL); +} + + +/** + * g_mime_param_list_add: + * @list: a #GMimeParamList + * @param: a #GMimeParam + * + * Adds a #GMimeParam to the #GMimeParamList. + * + * Returns: the index of the added #GMimeParam. + **/ +static void +g_mime_param_list_add (GMimeParamList *list, GMimeParam *param) +{ + g_mime_event_add (param->changed, (GMimeEventCallback) param_changed, list); + g_ptr_array_add (list->array, param); +} + + +/** + * g_mime_param_list_set_parameter: + * @list: a #GMimeParamList + * @name: The name of the parameter + * @value: The parameter value + * + * Sets the specified parameter to @value. + **/ +void +g_mime_param_list_set_parameter (GMimeParamList *list, const char *name, const char *value) +{ + GMimeParam *param; + guint i; + + g_return_if_fail (GMIME_IS_PARAM_LIST (list)); + g_return_if_fail (name != NULL); + g_return_if_fail (value != NULL); + + for (i = 0; i < list->array->len; i++) { + param = list->array->pdata[i]; + + if (!g_ascii_strcasecmp (param->name, name)) { + g_mime_param_set_value (param, value); + return; + } + } + + param = g_mime_param_new (); param->value = g_strdup (value); + param->name = g_strdup (name); + + g_mime_param_list_add (list, param); + + g_mime_event_emit (list->changed, NULL); +} + + +/** + * g_mime_param_list_get_parameter: + * @list: list: a #GMimeParamList + * @name: the name of the parameter + * + * Gets the #GMimeParam with the given @name. + * + * Returns: (transfer none): the requested #GMimeParam. + **/ +GMimeParam * +g_mime_param_list_get_parameter (GMimeParamList *list, const char *name) +{ + GMimeParam *param; + guint i; + + g_return_val_if_fail (GMIME_IS_PARAM_LIST (list), NULL); + g_return_val_if_fail (name != NULL, NULL); + + for (i = 0; i < list->array->len; i++) { + param = list->array->pdata[i]; + + if (!g_ascii_strcasecmp (param->name, name)) + return param; + } + + return NULL; +} + + +/** + * g_mime_param_list_get_parameter_at: + * @list: a #GMimeParamList + * @index: the index of the requested parameter + * + * Gets the #GMimeParam at the specified @index. + * + * Returns: (transfer none): the #GMimeParam at the specified index. + **/ +GMimeParam * +g_mime_param_list_get_parameter_at (GMimeParamList *list, int index) +{ + g_return_val_if_fail (GMIME_IS_PARAM_LIST (list), NULL); + g_return_val_if_fail (index >= 0, NULL); + + if ((guint) index >= list->array->len) + return NULL; + + return list->array->pdata[index]; +} + + +/** + * g_mime_param_list_remove: + * @list: a #GMimeParamList + * @name: the name of the parameter + * + * Removes a parameter from the #GMimeParamList. + * + * Returns: %TRUE if the specified parameter was removed or %FALSE otherwise. + **/ +gboolean +g_mime_param_list_remove (GMimeParamList *list, const char *name) +{ + GMimeParam *param; + guint i; + + g_return_val_if_fail (GMIME_IS_PARAM_LIST (list), FALSE); + g_return_val_if_fail (name != NULL, FALSE); + + for (i = 0; i < list->array->len; i++) { + param = list->array->pdata[i]; + + if (!g_ascii_strcasecmp (param->name, name)) { + g_mime_event_remove (param->changed, (GMimeEventCallback) param_changed, list); + g_ptr_array_remove_index (list->array, i); + g_object_unref (param); + return TRUE; + } + } + + return FALSE; +} + + +/** + * g_mime_param_list_remove_at: + * @list: a #GMimeParamList + * @index: index of the param to remove + * + * Removes a #GMimeParam from the #GMimeParamList at the specified index. + * + * Returns: %TRUE if a #GMimeParam was removed or %FALSE otherwise. + **/ +gboolean +g_mime_param_list_remove_at (GMimeParamList *list, int index) +{ + GMimeParam *param; + + g_return_val_if_fail (GMIME_IS_PARAM_LIST (list), FALSE); + g_return_val_if_fail (index >= 0, FALSE); + + if ((guint) index >= list->array->len) + return FALSE; + + param = list->array->pdata[index]; + g_mime_event_remove (param->changed, (GMimeEventCallback) param_changed, list); + g_ptr_array_remove_index (list->array, index); + g_object_unref (param); + + return TRUE; +} + + +/* FIXME: I wrote this in a quick & dirty fashion - it may not be 100% correct */ +static char * +encode_param (GMimeParam *param, GMimeFormatOptions *options, GMimeParamEncodingMethod *method) +{ + register const unsigned char *inptr = (const unsigned char *) param->value; + GMimeParamEncodingMethod requested; + const unsigned char *start = inptr; + const char *charset = NULL; + iconv_t cd = (iconv_t) -1; + char *outbuf = NULL; + unsigned char c; + char *outstr; + GString *str; + + while (*inptr && ((inptr - start) < GMIME_FOLD_LEN)) { + if (*inptr > 127) + break; + inptr++; + } + + if (*inptr == '\0') { + *method = GMIME_PARAM_ENCODING_METHOD_DEFAULT; + + return g_strdup (param->value); + } + + if (param->method == GMIME_PARAM_ENCODING_METHOD_DEFAULT) + requested = g_mime_format_options_get_param_encoding_method (options); + else + requested = param->method; + + if (requested == GMIME_PARAM_ENCODING_METHOD_RFC2047) { + *method = GMIME_PARAM_ENCODING_METHOD_RFC2047; + + return g_mime_utils_header_encode_text (options, param->value, param->charset); + } + + *method = GMIME_PARAM_ENCODING_METHOD_RFC2231; + + if (!param->charset) { + if (*inptr > 127) + charset = g_mime_charset_best (param->value, strlen (param->value)); + + if (!charset) + charset = "us-ascii"; + } else { + charset = param->charset; + } + + if (g_ascii_strcasecmp (charset, "UTF-8") != 0) + cd = g_mime_iconv_open (charset, "UTF-8"); + + if (cd != (iconv_t) -1) { + outbuf = g_mime_iconv_strdup (cd, param->value); + g_mime_iconv_close (cd); + if (outbuf == NULL) { + charset = "UTF-8"; + inptr = start; + } else { + inptr = (const unsigned char *) outbuf; + } + } else { + charset = "UTF-8"; + inptr = start; + } + + str = g_string_new (charset); + g_string_append_c (str, '\''); + if (param->lang) + g_string_append (str, param->lang); + g_string_append_c (str, '\''); + + while ((c = *inptr++)) { + if (!is_attrchar (c)) + g_string_append_printf (str, "%%%c%c", tohex[(c >> 4) & 0xf], tohex[c & 0xf]); + else + g_string_append_c (str, c); + } + + g_free (outbuf); + + outstr = g_string_free (str, FALSE); + + return outstr; +} + +static void +g_string_append_len_quoted (GString *str, const char *text, size_t len) +{ + register const char *inptr = text; + const char *inend = text + len; + + g_string_append_c (str, '"'); + + while (inptr < inend) { + if ((*inptr == '"') || *inptr == '\\') + g_string_append_c (str, '\\'); + + g_string_append_c (str, *inptr); + + inptr++; + } + + g_string_append_c (str, '"'); +} + + +/** + * g_mime_param_list_encode: + * @list: a #GMimeParamList + * @options: a #GMimeFormatOptions or %NULL + * @fold: %TRUE if the parameter list should be folded; otherwise, %FALSE + * @str: the output string buffer + * + * Encodes the parameter list into @str, folding lines if required. + **/ +void +g_mime_param_list_encode (GMimeParamList *list, GMimeFormatOptions *options, gboolean fold, GString *str) +{ + const char *newline; + guint count, i; + int used; + + g_return_if_fail (GMIME_IS_PARAM_LIST (list)); + g_return_if_fail (str != NULL); + + newline = g_mime_format_options_get_newline (options); + count = list->array->len; + used = str->len; + + for (i = 0; i < count; i++) { + GMimeParamEncodingMethod method; + gboolean encoded, toolong; + int here = str->len; + char *value, *inptr; + size_t nlen, vlen; + GMimeParam *param; + int quote = 0; + + param = (GMimeParam *) list->array->pdata[i]; + + if (!param->value) + continue; + + if (!(value = encode_param (param, options, &method))) { + w(g_warning ("appending parameter %s=%s violates rfc2184", + param->name, param->value)); + value = g_strdup (param->value); + } + + if (method == GMIME_PARAM_ENCODING_METHOD_DEFAULT) { + for (inptr = value; *inptr; inptr++) { + if (!is_attrchar (*inptr) || is_lwsp (*inptr)) + quote++; + } + + vlen = (size_t) (inptr - value); + } else if (method == GMIME_PARAM_ENCODING_METHOD_RFC2047) { + vlen = strlen (value); + quote = 2; + } else { + vlen = strlen (value); + } + + nlen = strlen (param->name); + + g_string_append_c (str, ';'); + used++; + + if (fold && (used + nlen + vlen + quote > GMIME_FOLD_LEN - 1)) { + g_string_append (str, newline); + g_string_append_c (str, '\t'); + here = str->len; + used = 1; + } else { + g_string_append_c (str, ' '); + here = str->len; + used++; + } + + toolong = nlen + vlen + quote > GMIME_FOLD_LEN - 2; + + if (toolong && method == GMIME_PARAM_ENCODING_METHOD_RFC2231) { + /* we need to do special rfc2184 parameter wrapping */ + size_t maxlen = GMIME_FOLD_LEN - (nlen + 6); + char *inend; + int i = 0; + + inptr = value; + inend = value + vlen; + + while (inptr < inend) { + char *ptr = inptr + MIN ((size_t) (inend - inptr), maxlen); + + if (ptr < inend) { + /* be careful not to break an encoded char (ie %20) */ + char *q = ptr; + int j = 2; + + while (j > 0 && q > inptr && *q != '%') { + j--; + q--; + } + + if (*q == '%') + ptr = q; + } + + if (i != 0) { + g_string_append_c (str, ';'); + + if (fold) { + g_string_append (str, newline); + g_string_append_c (str, '\t'); + } else { + g_string_append_c (str, ' '); + } + + here = str->len; + used = 1; + } + + g_string_append_printf (str, "%s*%d*=", param->name, i++); + g_string_append_len (str, inptr, (size_t) (ptr - inptr)); + used += (str->len - here); + + inptr = ptr; + } + } else { + encoded = method == GMIME_PARAM_ENCODING_METHOD_RFC2231; + + g_string_append_printf (str, "%s%s=", param->name, encoded ? "*" : ""); + + if (quote) + g_string_append_len_quoted (str, value, vlen); + else + g_string_append_len (str, value, vlen); + + used += (str->len - here); + } + + g_free (value); + } - return param; + if (fold) + g_string_append (str, newline); } + #define INT_OVERFLOW(x,d) (((x) > (INT_MAX / 10)) || ((x) == (INT_MAX / 10) && (d) > (INT_MAX % 10))) static int @@ -94,7 +865,7 @@ const unsigned char *inptr; int digit, n = 0; - decode_lwsp (in); + skip_cfws (in); inptr = (const unsigned char *) *in; while (isdigit ((int) *inptr)) { @@ -122,7 +893,7 @@ char *outptr, *out = NULL; gboolean unescape = FALSE; - decode_lwsp (&inptr); + skip_cfws (&inptr); if (*inptr != '"') { *in = inptr; @@ -164,28 +935,28 @@ } static char * -decode_token (const char **in) +decode_token (GMimeRfcComplianceMode mode, const char **in) { const char *inptr = *in; const char *start; - decode_lwsp (&inptr); + skip_cfws (&inptr); start = inptr; -#ifdef STRICT_PARSER - while (is_ttoken (*inptr)) - inptr++; -#else - /* Broken mail clients like to make our lives difficult. Scan - * for a ';' instead of trusting that the client followed the - * specification. */ - while (*inptr && *inptr != ';') - inptr++; - - /* Scan backwards over any trailing lwsp */ - while (inptr > start && is_lwsp (inptr[-1])) - inptr--; -#endif + if (mode != GMIME_RFC_COMPLIANCE_LOOSE) { + while (is_ttoken (*inptr)) + inptr++; + } else { + /* Broken mail clients like to make our lives difficult. Scan + * for a ';' instead of trusting that the client followed the + * specification. */ + while (*inptr && *inptr != ';') + inptr++; + + /* Scan backwards over any trailing lwsp */ + while (inptr > start && is_lwsp (inptr[-1])) + inptr--; + } if (inptr > start) { *in = inptr; @@ -196,24 +967,23 @@ } static char * -decode_value (const char **in) +decode_value (GMimeRfcComplianceMode mode, const char **in) { const char *inptr = *in; - decode_lwsp (&inptr); + skip_cfws (&inptr); *in = inptr; if (*inptr == '"') { return decode_quoted_string (in); } else if (is_ttoken (*inptr)) { - return decode_token (in); + return decode_token (mode, in); } -#ifndef STRICT_PARSER - return decode_token (in); -#else + if (mode == GMIME_RFC_COMPLIANCE_LOOSE) + return decode_token (mode, in); + return NULL; -#endif } /* This function is basically the same as decode_token() @@ -225,7 +995,7 @@ const char *inptr = *in; const char *start; - decode_lwsp (&inptr); + skip_cfws (&inptr); start = inptr; while (is_ttoken (*inptr) && *inptr != '*') @@ -239,24 +1009,24 @@ } static gboolean -decode_rfc2184_param (const char **in, char **paramp, int *part, gboolean *encoded) +decode_rfc2184_param (const char **in, char **namep, int *part, gboolean *encoded) { gboolean is_rfc2184 = FALSE; const char *inptr = *in; - char *param; + char *name; *encoded = FALSE; *part = -1; - param = decode_param_token (&inptr); + name = decode_param_token (&inptr); - decode_lwsp (&inptr); + skip_cfws (&inptr); if (*inptr == '*') { is_rfc2184 = TRUE; inptr++; - decode_lwsp (&inptr); + skip_cfws (&inptr); if (*inptr == '=') { /* form := param*=value */ *encoded = TRUE; @@ -264,38 +1034,43 @@ /* form := param*#=value or param*#*=value */ *part = decode_int (&inptr); - decode_lwsp (&inptr); + skip_cfws (&inptr); if (*inptr == '*') { /* form := param*#*=value */ inptr++; *encoded = TRUE; - decode_lwsp (&inptr); + skip_cfws (&inptr); } } } - if (paramp) - *paramp = param; + *namep = name; - if (param) + if (name) *in = inptr; return is_rfc2184; } static gboolean -decode_param (const char **in, char **paramp, char **valuep, int *id, gboolean *encoded) +decode_param (GMimeParserOptions *options, const char **in, char **namep, char **valuep, int *id, + const char **rfc2047_charset, gboolean *encoded, GMimeParamEncodingMethod *method) { + GMimeRfcComplianceMode mode = g_mime_parser_options_get_parameter_compliance_mode (options); gboolean is_rfc2184 = FALSE; const char *inptr = *in; - char *param, *value = NULL; + char *name, *value = NULL; char *val; - is_rfc2184 = decode_rfc2184_param (&inptr, ¶m, id, encoded); + *method = GMIME_PARAM_ENCODING_METHOD_DEFAULT; + *rfc2047_charset = NULL; + + if ((is_rfc2184 = decode_rfc2184_param (&inptr, &name, id, encoded))) + *method = GMIME_PARAM_ENCODING_METHOD_RFC2231; if (*inptr == '=') { inptr++; - value = decode_value (&inptr); + value = decode_value (mode, &inptr); if (!is_rfc2184 && value) { if (strstr (value, "=?") != NULL) { @@ -304,7 +1079,8 @@ * this, we should handle this case. */ - if ((val = g_mime_utils_header_decode_text (value))) { + if ((val = _g_mime_utils_header_decode_text (options, value, rfc2047_charset))) { + *method = GMIME_PARAM_ENCODING_METHOD_RFC2047; g_free (value); value = val; } @@ -320,22 +1096,23 @@ value = val; } else { d(g_warning ("Failed to convert %s param value (\"%s\") to UTF-8: %s", - param, value, g_strerror (errno))); + name, value, g_strerror (errno))); } } } } - if (param && value) { - *paramp = param; + if (name && value) { *valuep = value; + *namep = name; *in = inptr; return TRUE; - } else { - g_free (param); - g_free (value); - return FALSE; } + + g_free (value); + g_free (name); + + return FALSE; } @@ -389,22 +1166,23 @@ static const char * rfc2184_param_charset (const char **in, char **langp) { - const char *lang, *inptr = *in; + const char *inptr = *in; + const char *start = *in; + const char *lang; char *charset; size_t len; - if (langp) - *langp = NULL; - while (*inptr && *inptr != '\'') inptr++; - if (*inptr != '\'') + if (*inptr != '\'') { + *langp = NULL; return NULL; + } - len = inptr - *in; + len = (size_t) (inptr - start); charset = g_alloca (len + 1); - memcpy (charset, *in, len); + memcpy (charset, start, len); charset[len] = '\0'; lang = ++inptr; @@ -412,10 +1190,13 @@ inptr++; if (*inptr == '\'') { - if (langp) + if (inptr > lang) *langp = g_strndup (lang, (size_t) (inptr - lang)); - + else + *langp = NULL; inptr++; + } else { + *langp = NULL; } *in = inptr; @@ -460,20 +1241,21 @@ } static char * -rfc2184_decode (const char *value) +rfc2184_decode (const char *value, char **charsetp, char **langp) { const char *inptr = value; const char *charset; char *decoded; size_t len; - charset = rfc2184_param_charset (&inptr, NULL); + charset = rfc2184_param_charset (&inptr, langp); + *charsetp = charset ? g_strdup (charset) : NULL; len = strlen (inptr); - decoded = g_alloca (len + 1); + decoded = g_malloc (len + 1); len = hex_decode (inptr, len, decoded); - return charset_convert (charset, g_strdup (decoded), len); + return charset_convert (charset, decoded, len); } static void @@ -520,41 +1302,42 @@ g_free (value); } - rfc2184->param = g_new (GMimeParam, 1); - rfc2184->param->next = NULL; + rfc2184->param = g_mime_param_new (); + rfc2184->param->method = GMIME_PARAM_ENCODING_METHOD_RFC2231; rfc2184->param->name = name; - rfc2184->param->value = NULL; return rfc2184; } -static GMimeParam * -decode_param_list (const char *in) +static GMimeParamList * +decode_param_list (GMimeParserOptions *options, const char *in) { struct _rfc2184_param *rfc2184, *list, *t; - GMimeParam *param, *params, *tail; + char *name, *value, *charset, *lang; + GMimeParamEncodingMethod method; + const char *rfc2047_charset; struct _rfc2184_part *part; GHashTable *rfc2184_hash; const char *inptr = in; - char *name, *value; + GMimeParamList *params; + GMimeParam *param; gboolean encoded; - GString *gvalue; + GString *buf; guint i; int id; - params = NULL; - tail = (GMimeParam *) ¶ms; + params = g_mime_param_list_new (); list = NULL; t = (struct _rfc2184_param *) &list; rfc2184_hash = g_hash_table_new (g_mime_strcase_hash, g_mime_strcase_equal); - decode_lwsp (&inptr); + skip_cfws (&inptr); do { /* invalid format? */ - if (!decode_param (&inptr, &name, &value, &id, &encoded)) { - decode_lwsp (&inptr); + if (!decode_param (options, &inptr, &name, &value, &id, &rfc2047_charset, &encoded, &method)) { + skip_cfws (&inptr); if (*inptr == ';') continue; @@ -571,32 +1354,33 @@ t = rfc2184; g_hash_table_insert (rfc2184_hash, param->name, rfc2184); - - tail->next = param; - tail = param; + g_mime_param_list_add (params, param); } else { rfc2184_param_add_part (rfc2184, value, id, encoded); g_free (name); } } else { - param = g_new (GMimeParam, 1); - param->next = NULL; + param = g_mime_param_new (); param->name = name; if (encoded) { /* singleton encoded rfc2184 param value */ - param->value = rfc2184_decode (value); + param->value = rfc2184_decode (value, &charset, &lang); + param->charset = charset; + param->method = method; + param->lang = lang; g_free (value); } else { /* normal parameter value */ + param->charset = rfc2047_charset ? g_strdup (rfc2047_charset) : NULL; + param->method = method; param->value = value; } - tail->next = param; - tail = param; + g_mime_param_list_add (params, param); } - decode_lwsp (&inptr); + skip_cfws (&inptr); } while (*inptr++ == ';'); g_hash_table_destroy (rfc2184_hash); @@ -606,22 +1390,23 @@ t = rfc2184->next; param = rfc2184->param; - gvalue = g_string_new (""); + buf = g_string_new (""); g_ptr_array_sort (rfc2184->parts, rfc2184_sort_cb); for (i = 0; i < rfc2184->parts->len; i++) { part = rfc2184->parts->pdata[i]; - g_string_append (gvalue, part->value); + g_string_append (buf, part->value); g_free (part->value); g_free (part); } g_ptr_array_free (rfc2184->parts, TRUE); - param->value = charset_convert (rfc2184->charset, gvalue->str, gvalue->len); - g_string_free (gvalue, FALSE); + param->value = charset_convert (rfc2184->charset, buf->str, buf->len); + param->charset = rfc2184->charset ? g_strdup (rfc2184->charset) : NULL; + param->lang = rfc2184->lang; - g_free (rfc2184->lang); + g_string_free (buf, FALSE); g_free (rfc2184); rfc2184 = t; } @@ -631,371 +1416,18 @@ /** - * g_mime_param_new_from_string: - * @str: input string + * g_mime_param_list_parse: + * @options: a #GMimeParserOptions or %NULL + * @str: a string to parse * - * Creates a parameter list based on the input string. + * Parses the input string into a parameter list. * - * Returns: a #GMimeParam structure based on @string. + * Returns: (transfer full): a new #GMimeParamList. **/ -GMimeParam * -g_mime_param_new_from_string (const char *str) +GMimeParamList * +g_mime_param_list_parse (GMimeParserOptions *options, const char *str) { g_return_val_if_fail (str != NULL, NULL); - return decode_param_list (str); -} - - -/** - * g_mime_param_destroy: - * @param: Mime param list to destroy - * - * Releases all memory used by this mime param back to the Operating - * System. - **/ -void -g_mime_param_destroy (GMimeParam *param) -{ - GMimeParam *next; - - while (param) { - next = param->next; - g_free (param->name); - g_free (param->value); - g_free (param); - param = next; - } -} - - -/** - * g_mime_param_next: - * @param: a #GMimeParam node - * - * Gets the next #GMimeParam node in the list. - * - * Returns: the next #GMimeParam node in the list. - **/ -const GMimeParam * -g_mime_param_next (const GMimeParam *param) -{ - g_return_val_if_fail (param != NULL, NULL); - - return param->next; -} - - -/** - * g_mime_param_get_name: - * @param: a #GMimeParam - * - * Gets the name of the parameter. - * - * Returns: the name of the parameter. - **/ -const char * -g_mime_param_get_name (const GMimeParam *param) -{ - g_return_val_if_fail (param != NULL, NULL); - - return param->name; -} - - -/** - * g_mime_param_get_value: - * @param: a #GMimeParam - * - * Gets the value of the parameter. - * - * Returns: the value of the parameter. - **/ -const char * -g_mime_param_get_value (const GMimeParam *param) -{ - g_return_val_if_fail (param != NULL, NULL); - - return param->value; -} - - -/** - * g_mime_param_append: - * @params: param list - * @name: new param name - * @value: new param value - * - * Appends a new parameter with name @name and value @value to the - * parameter list @params. - * - * Returns: a param list with the new param of name @name and value - * @value appended to the list of params @params. - **/ -GMimeParam * -g_mime_param_append (GMimeParam *params, const char *name, const char *value) -{ - GMimeParam *param, *p; - - g_return_val_if_fail (name != NULL, params); - g_return_val_if_fail (value != NULL, params); - - param = g_mime_param_new (name, value); - if (params) { - p = params; - while (p->next) - p = p->next; - p->next = param; - } else - params = param; - - return params; -} - - -/** - * g_mime_param_append_param: - * @params: param list - * @param: param to append - * - * Appends @param to the param list @params. - * - * Returns: a param list with the new param @param appended to the list - * of params @params. - **/ -GMimeParam * -g_mime_param_append_param (GMimeParam *params, GMimeParam *param) -{ - GMimeParam *p; - - g_return_val_if_fail (param != NULL, params); - - if (params) { - p = params; - while (p->next) - p = p->next; - p->next = param; - } else - params = param; - - return params; -} - -/* FIXME: I wrote this in a quick & dirty fasion - it may not be 100% correct */ -static char * -encode_param (const char *in, gboolean *encoded) -{ - register const unsigned char *inptr = (const unsigned char *) in; - const unsigned char *instart = inptr; - iconv_t cd = (iconv_t) -1; - const char *charset = NULL; - char *outbuf = NULL; - unsigned char c; - char *outstr; - GString *out; - - *encoded = FALSE; - - while (*inptr && ((inptr - instart) < GMIME_FOLD_LEN)) { - if (*inptr > 127) - break; - inptr++; - } - - if (*inptr == '\0') - return g_strdup (in); - - if (*inptr > 127) - charset = g_mime_charset_best (in, strlen (in)); - - if (!charset) - charset = "iso-8859-1"; - - if (g_ascii_strcasecmp (charset, "UTF-8") != 0) - cd = g_mime_iconv_open (charset, "UTF-8"); - - if (cd != (iconv_t) -1) { - outbuf = g_mime_iconv_strdup (cd, in); - g_mime_iconv_close (cd); - if (outbuf == NULL) { - charset = "UTF-8"; - inptr = instart; - } else { - inptr = (const unsigned char *) outbuf; - } - } else { - charset = "UTF-8"; - inptr = instart; - } - - /* FIXME: set the 'language' as well, assuming we can get that info...? */ - out = g_string_new (""); - g_string_append_printf (out, "%s''", charset); - - while ((c = *inptr++)) { - if (!is_attrchar (c)) - g_string_append_printf (out, "%%%c%c", tohex[(c >> 4) & 0xf], tohex[c & 0xf]); - else - g_string_append_c (out, c); - } - - g_free (outbuf); - - outstr = out->str; - g_string_free (out, FALSE); - *encoded = TRUE; - - return outstr; -} - -static void -g_string_append_len_quoted (GString *out, const char *in, size_t len) -{ - register const char *inptr; - const char *inend; - - g_string_append_c (out, '"'); - - inptr = in; - inend = in + len; - - while (inptr < inend) { - if ((*inptr == '"') || *inptr == '\\') - g_string_append_c (out, '\\'); - - g_string_append_c (out, *inptr); - - inptr++; - } - - g_string_append_c (out, '"'); -} - -static void -param_list_format (GString *out, const GMimeParam *param, gboolean fold) -{ - int used = out->len; - - while (param) { - gboolean encoded = FALSE; - int here = out->len; - size_t nlen, vlen; - int quote = 0; - char *value; - - if (!param->value) { - param = param->next; - continue; - } - - if (!(value = encode_param (param->value, &encoded))) { - w(g_warning ("appending parameter %s=%s violates rfc2184", - param->name, param->value)); - value = g_strdup (param->value); - } - - if (!encoded) { - char *ch; - - for (ch = value; *ch; ch++) { - if (!is_attrchar (*ch) || is_lwsp (*ch)) - quote++; - } - } - - nlen = strlen (param->name); - vlen = strlen (value); - - if (fold && (used + nlen + vlen + quote > GMIME_FOLD_LEN - 2)) { - g_string_append (out, ";\n\t"); - here = out->len; - used = 1; - } else { - g_string_append (out, "; "); - here = out->len; - used += 2; - } - - if (nlen + vlen + quote > GMIME_FOLD_LEN - 2) { - /* we need to do special rfc2184 parameter wrapping */ - size_t maxlen = GMIME_FOLD_LEN - (nlen + 6); - char *inptr, *inend; - int i = 0; - - inptr = value; - inend = value + vlen; - - while (inptr < inend) { - char *ptr = inptr + MIN ((size_t) (inend - inptr), maxlen); - - if (encoded && ptr < inend) { - /* be careful not to break an encoded char (ie %20) */ - char *q = ptr; - int j = 2; - - for ( ; j > 0 && q > inptr && *q != '%'; j--, q--); - if (*q == '%') - ptr = q; - } - - if (i != 0) { - if (fold) - g_string_append (out, ";\n\t"); - else - g_string_append (out, "; "); - - here = out->len; - used = 1; - } - - g_string_append_printf (out, "%s*%d%s=", param->name, - i++, encoded ? "*" : ""); - - if (encoded || !quote) - g_string_append_len (out, inptr, (size_t) (ptr - inptr)); - else - g_string_append_len_quoted (out, inptr, (size_t) (ptr - inptr)); - - used += (out->len - here); - - inptr = ptr; - } - } else { - g_string_append_printf (out, "%s%s=", param->name, encoded ? "*" : ""); - - if (encoded || !quote) - g_string_append_len (out, value, vlen); - else - g_string_append_len_quoted (out, value, vlen); - - used += (out->len - here); - } - - g_free (value); - - param = param->next; - } - - if (fold) - g_string_append_c (out, '\n'); -} - - -/** - * g_mime_param_write_to_string: - * @param: MIME Param list - * @fold: specifies whether or not to fold headers - * @str: output string - * - * Assumes the output string contains only the Content-* header and - * it's immediate value. - * - * Writes the params out to the string @string. - **/ -void -g_mime_param_write_to_string (const GMimeParam *param, gboolean fold, GString *str) -{ - g_return_if_fail (str != NULL); - - param_list_format (str, param, fold); + return decode_param_list (options, str); } diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-param.h gmime-3.0.1/gmime/gmime-param.h --- gmime-2.6.22+dfsg2/gmime/gmime-param.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-param.h 2017-03-18 01:31:54.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -23,39 +23,112 @@ #define __GMIME_PARAM_H__ #include +#include +#include +#include G_BEGIN_DECLS +#define GMIME_TYPE_PARAM (g_mime_param_get_type ()) +#define GMIME_PARAM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_PARAM, GMimeParam)) +#define GMIME_PARAM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_PARAM, GMimeParamClass)) +#define GMIME_IS_PARAM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_PARAM)) +#define GMIME_IS_PARAM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_PARAM)) +#define GMIME_PARAM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_PARAM, GMimeParamClass)) + +#define GMIME_TYPE_PARAM_LIST (g_mime_param_list_get_type ()) +#define GMIME_PARAM_LIST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_PARAM_LIST, GMimeParamList)) +#define GMIME_PARAM_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_PARAM_LIST, GMimeParamListClass)) +#define GMIME_IS_PARAM_LIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_PARAM_LIST)) +#define GMIME_IS_PARAM_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_PARAM_LIST)) +#define GMIME_PARAM_LIST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_PARAM_LIST, GMimeParamListClass)) + typedef struct _GMimeParam GMimeParam; +typedef struct _GMimeParamClass GMimeParamClass; + +typedef struct _GMimeParamList GMimeParamList; +typedef struct _GMimeParamListClass GMimeParamListClass; /** * GMimeParam: - * @next: Pointer to the next param. - * @name: Parameter name. - * @value: Parameter value. + * @method: The encoding method used for the parameter value. + * @charset: The charset to use when encoding the parameter value. + * @lang: the language specifier to use when encoding the value. + * @name: The parameter name. + * @value: The parameter value. * - * A parameter name/value pair as used for some Content header fields. + * A parameter name/value pair as used in the Content-Type and Content-Disposition headers. **/ struct _GMimeParam { - GMimeParam *next; - char *name; - char *value; + GObject parent_object; + + GMimeParamEncodingMethod method; + char *charset, *lang; + char *name, *value; + + /* < private > */ + gpointer changed; +}; + +struct _GMimeParamClass { + GObjectClass parent_class; + +}; + + +GType g_mime_param_get_type (void); + +const char *g_mime_param_get_name (GMimeParam *param); + +const char *g_mime_param_get_value (GMimeParam *param); +void g_mime_param_set_value (GMimeParam *param, const char *value); + +const char *g_mime_param_get_charset (GMimeParam *param); +void g_mime_param_set_charset (GMimeParam *param, const char *charset); + +const char *g_mime_param_get_lang (GMimeParam *param); +void g_mime_param_set_lang (GMimeParam *param, const char *lang); + +GMimeParamEncodingMethod g_mime_param_get_encoding_method (GMimeParam *param); +void g_mime_param_set_encoding_method (GMimeParam *param, GMimeParamEncodingMethod method); + + +/** + * GMimeParamList: + * + * A list of Content-Type or Content-Disposition parameters. + **/ +struct _GMimeParamList { + /* < private > */ + GObject parent_object; + GPtrArray *array; + gpointer changed; }; -GMimeParam *g_mime_param_new (const char *name, const char *value); -GMimeParam *g_mime_param_new_from_string (const char *str); -void g_mime_param_destroy (GMimeParam *param); +struct _GMimeParamListClass { + GObjectClass parent_class; + +}; + + +GType g_mime_param_list_get_type (void); + +GMimeParamList *g_mime_param_list_new (void); +GMimeParamList *g_mime_param_list_parse (GMimeParserOptions *options, const char *str); + +int g_mime_param_list_length (GMimeParamList *list); -const GMimeParam *g_mime_param_next (const GMimeParam *param); +void g_mime_param_list_clear (GMimeParamList *list); -GMimeParam *g_mime_param_append (GMimeParam *params, const char *name, const char *value); -GMimeParam *g_mime_param_append_param (GMimeParam *params, GMimeParam *param); +void g_mime_param_list_set_parameter (GMimeParamList *list, const char *name, const char *value); +GMimeParam *g_mime_param_list_get_parameter (GMimeParamList *list, const char *name); +GMimeParam *g_mime_param_list_get_parameter_at (GMimeParamList *list, int index); -const char *g_mime_param_get_name (const GMimeParam *param); -const char *g_mime_param_get_value (const GMimeParam *param); +gboolean g_mime_param_list_remove (GMimeParamList *list, const char *name); +gboolean g_mime_param_list_remove_at (GMimeParamList *list, int index); -void g_mime_param_write_to_string (const GMimeParam *param, gboolean fold, GString *str); +void g_mime_param_list_encode (GMimeParamList *list, GMimeFormatOptions *options, gboolean fold, GString *str); G_END_DECLS diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-parser.c gmime-3.0.1/gmime/gmime-parser.c --- gmime-2.6.22+dfsg2/gmime/gmime-parser.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-parser.c 2017-04-23 16:04:05.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -32,17 +32,13 @@ #include "gmime-table-private.h" #include "gmime-message-part.h" #include "gmime-parse-utils.h" +#include "gmime-stream-null.h" #include "gmime-stream-mem.h" #include "gmime-multipart.h" +#include "gmime-internal.h" #include "gmime-common.h" #include "gmime-part.h" -#if GLIB_MAJOR_VERSION > 2 || (GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION >= 14) -#define HAVE_GLIB_REGEX -#elif defined (HAVE_REGEX_H) -#include -#endif - #ifdef ENABLE_WARNINGS #define w(x) x #else @@ -63,6 +59,39 @@ * into multiple #GMimeMessage objects. **/ +typedef enum { + OPENPGP_NONE = 0, + OPENPGP_BEGIN_PGP_MESSAGE = (1 << 0), + OPENPGP_END_PGP_MESSAGE = (1 << 1) | (1 << 0), + OPENPGP_BEGIN_PGP_SIGNED_MESSAGE = (1 << 2), + OPENPGP_BEGIN_PGP_SIGNATURE = (1 << 3) | (1 << 2), + OPENPGP_END_PGP_SIGNATURE = (1 << 4) | (1 << 3) | (1 << 2) +} openpgp_state_t; + +typedef struct { + const char *marker; + size_t len; + openpgp_state_t before; + openpgp_state_t after; +} GMimeOpenPGPMarker; + +static const GMimeOpenPGPMarker openpgp_markers[] = { + { "-----BEGIN PGP MESSAGE-----", 27, OPENPGP_NONE, OPENPGP_BEGIN_PGP_MESSAGE }, + { "-----END PGP MESSAGE-----", 25, OPENPGP_BEGIN_PGP_MESSAGE, OPENPGP_END_PGP_MESSAGE }, + { "-----BEGIN PGP SIGNED MESSAGE-----", 34, OPENPGP_NONE, OPENPGP_BEGIN_PGP_SIGNED_MESSAGE }, + { "-----BEGIN PGP SIGNATURE-----", 29, OPENPGP_BEGIN_PGP_SIGNED_MESSAGE, OPENPGP_BEGIN_PGP_SIGNATURE }, + { "-----END PGP SIGNATURE-----", 27, OPENPGP_BEGIN_PGP_SIGNATURE, OPENPGP_END_PGP_SIGNATURE } +}; + +typedef enum { + BOUNDARY_NONE, + BOUNDARY_EOS, + BOUNDARY_IMMEDIATE, + BOUNDARY_IMMEDIATE_END, + BOUNDARY_PARENT, + BOUNDARY_PARENT_END +} BoundaryType; + typedef struct _boundary_stack { struct _boundary_stack *parent; char *boundary; @@ -72,19 +101,17 @@ gint64 content_end; } BoundaryStack; -typedef struct _header_raw { - struct _header_raw *next; - char *name, *value; +typedef struct { + char *raw_name, *name; + char *raw_value; gint64 offset; -} HeaderRaw; +} Header; typedef struct _content_type { char *type, *subtype; gboolean exists; } ContentType; -extern void _g_mime_object_set_content_type (GMimeObject *object, GMimeContentType *content_type); - static void g_mime_parser_class_init (GMimeParserClass *klass); static void g_mime_parser_init (GMimeParser *parser, GMimeParserClass *klass); static void g_mime_parser_finalize (GObject *object); @@ -92,10 +119,10 @@ static void parser_init (GMimeParser *parser, GMimeStream *stream); static void parser_close (GMimeParser *parser); -static GMimeObject *parser_construct_leaf_part (GMimeParser *parser, ContentType *content_type, - gboolean toplevel, int *found); -static GMimeObject *parser_construct_multipart (GMimeParser *parser, ContentType *content_type, - gboolean toplevel, int *found); +static GMimeObject *parser_construct_leaf_part (GMimeParser *parser, GMimeParserOptions *options, ContentType *content_type, + gboolean toplevel, BoundaryType *found); +static GMimeObject *parser_construct_multipart (GMimeParser *parser, GMimeParserOptions *options, ContentType *content_type, + gboolean toplevel, BoundaryType *found); static GObjectClass *parent_class = NULL; @@ -106,23 +133,23 @@ #define SCAN_HEAD 128 /* conservative growth sizes */ -#define HEADER_INIT_SIZE 128 -#define HEADER_RAW_INIT_SIZE 1024 - +#define HEADER_INIT_SIZE 256 -enum { +typedef enum { GMIME_PARSER_STATE_ERROR = -1, GMIME_PARSER_STATE_INIT, GMIME_PARSER_STATE_FROM, + GMIME_PARSER_STATE_AAAA, GMIME_PARSER_STATE_MESSAGE_HEADERS, GMIME_PARSER_STATE_HEADERS, GMIME_PARSER_STATE_HEADERS_END, GMIME_PARSER_STATE_CONTENT, GMIME_PARSER_STATE_COMPLETE, -}; +} GMimeParserState; struct _GMimeParserPrivate { GMimeStream *stream; + GMimeFormat format; gint64 offset; @@ -132,27 +159,14 @@ char *inptr; char *inend; - gint64 from_offset; - GByteArray *from_line; - GMimeParserHeaderRegexFunc header_cb; gpointer user_data; - -#if defined (HAVE_GLIB_REGEX) GRegex *regex; -#elif defined (HAVE_REGEX_H) - regex_t regex; -#endif - /* header buffer */ - char *headerbuf; - char *headerptr; - size_t headerleft; + GByteArray *marker; + gint64 marker_offset; - /* raw header buffer */ - char *rawbuf; - char *rawptr; - size_t rawleft; + char *preheader; /* current message headerblock offsets */ gint64 message_headers_begin; @@ -165,24 +179,32 @@ /* current header field offset */ gint64 header_offset; + GPtrArray *headers; + + /* header buffer */ + char *headerbuf; + char *headerptr; + size_t headerleft; + + BoundaryStack *bounds; + + openpgp_state_t openpgp; short int state; - unsigned short int unused:10; unsigned short int midline:1; unsigned short int seekable:1; - unsigned short int scan_from:1; unsigned short int have_regex:1; unsigned short int persist_stream:1; unsigned short int respect_content_length:1; - - HeaderRaw *headers; - - BoundaryStack *bounds; + unsigned short int unused:11; }; static const char MBOX_BOUNDARY[6] = "From "; #define MBOX_BOUNDARY_LEN 5 +static const char MMDF_BOUNDARY[6] = "\1\1\1\1"; +#define MMDF_BOUNDARY_LEN 4 + static void parser_push_boundary (GMimeParser *parser, const char *boundary) { @@ -200,6 +222,10 @@ s->boundary = g_strdup (boundary); s->boundarylen = MBOX_BOUNDARY_LEN; s->boundarylenfinal = MBOX_BOUNDARY_LEN; + } else if (boundary == MMDF_BOUNDARY) { + s->boundary = g_strdup (boundary); + s->boundarylen = MMDF_BOUNDARY_LEN; + s->boundarylenfinal = MMDF_BOUNDARY_LEN; } else { s->boundary = g_strdup_printf ("--%s--", boundary); s->boundarylen = strlen (boundary) + 2; @@ -231,40 +257,46 @@ } static const char * -header_raw_find (HeaderRaw *headers, const char *name, gint64 *offset) +parser_find_header (GMimeParser *parser, const char *name, gint64 *offset) { - HeaderRaw *header = headers; + struct _GMimeParserPrivate *priv = parser->priv; + Header *header; + guint i; - while (header) { - if (!g_ascii_strcasecmp (header->name, name)) { - if (offset) - *offset = header->offset; - return header->value; - } + for (i = 0; i < priv->headers->len; i++) { + header = priv->headers->pdata[i]; - header = header->next; + if (g_ascii_strcasecmp (header->name, name) != 0) + continue; + + if (offset) + *offset = header->offset; + + return header->raw_value; } return NULL; } static void -header_raw_clear (HeaderRaw **headers) +parser_free_headers (struct _GMimeParserPrivate *priv) { - HeaderRaw *header, *next; + Header *header; + guint i; - header = *headers; - while (header) { - next = header->next; - g_free (header->name); - g_free (header->value); - - g_slice_free (HeaderRaw, header); + g_free (priv->preheader); + priv->preheader = NULL; + + for (i = 0; i < priv->headers->len; i++) { + header = priv->headers->pdata[i]; - header = next; + g_free (header->name); + g_free (header->raw_name); + g_free (header->raw_value); + g_slice_free (Header, header); } - *headers = NULL; + g_ptr_array_set_size (priv->headers, 0); } GType @@ -307,13 +339,10 @@ { parser->priv = g_new (struct _GMimeParserPrivate, 1); parser->priv->respect_content_length = FALSE; + parser->priv->format = GMIME_FORMAT_MESSAGE; parser->priv->persist_stream = TRUE; parser->priv->have_regex = FALSE; - parser->priv->scan_from = FALSE; - -#if defined (HAVE_GLIB_REGEX) parser->priv->regex = NULL; -#endif parser_init (parser, NULL); } @@ -325,13 +354,8 @@ parser_close (parser); -#if defined (HAVE_GLIB_REGEX) if (parser->priv->regex) g_regex_unref (parser->priv->regex); -#elif defined (HAVE_REGEX_H) - if (parser->priv->have_regex) - regfree (&parser->priv->regex); -#endif g_free (parser->priv); @@ -360,23 +384,17 @@ priv->inptr = priv->inbuf; priv->inend = priv->inbuf; - priv->from_offset = -1; - priv->from_line = g_byte_array_new (); + priv->marker = g_byte_array_new (); + priv->marker_offset = -1; + + priv->preheader = NULL; + + priv->headers = g_ptr_array_new (); priv->headerbuf = g_malloc (HEADER_INIT_SIZE); priv->headerleft = HEADER_INIT_SIZE - 1; priv->headerptr = priv->headerbuf; - if (offset == -1 || !priv->persist_stream) { - priv->rawbuf = g_malloc (HEADER_RAW_INIT_SIZE); - priv->rawleft = HEADER_RAW_INIT_SIZE - 1; - priv->rawptr = priv->rawbuf; - } else { - priv->rawbuf = NULL; - priv->rawptr = NULL; - priv->rawleft = 0; - } - priv->message_headers_begin = -1; priv->message_headers_end = -1; @@ -385,11 +403,11 @@ priv->header_offset = -1; + priv->openpgp = OPENPGP_NONE; + priv->midline = FALSE; priv->seekable = offset != -1; - priv->headers = NULL; - priv->bounds = NULL; } @@ -401,12 +419,12 @@ if (priv->stream) g_object_unref (priv->stream); - g_byte_array_free (priv->from_line, TRUE); + g_byte_array_free (priv->marker, TRUE); g_free (priv->headerbuf); - g_free (priv->rawbuf); - header_raw_clear (&priv->headers); + parser_free_headers (priv); + g_ptr_array_free (priv->headers, TRUE); while (priv->bounds) parser_pop_boundary (parser); @@ -423,7 +441,7 @@ GMimeParser * g_mime_parser_new (void) { - return g_object_newv (GMIME_TYPE_PARSER, 0, NULL); + return g_object_new (GMIME_TYPE_PARSER, NULL); } @@ -520,69 +538,42 @@ void g_mime_parser_set_persist_stream (GMimeParser *parser, gboolean persist) { - struct _GMimeParserPrivate *priv; - g_return_if_fail (GMIME_IS_PARSER (parser)); - priv = parser->priv; - - if (priv->persist_stream == persist) - return; - - if (persist) { - priv->persist_stream = TRUE; - - if (priv->seekable && !priv->rawbuf) { - priv->rawbuf = g_malloc (HEADER_RAW_INIT_SIZE); - priv->rawleft = HEADER_RAW_INIT_SIZE - 1; - priv->rawptr = priv->rawbuf; - } - } else { - priv->persist_stream = FALSE; - - if (priv->rawbuf) { - g_free (priv->rawbuf); - priv->rawbuf = NULL; - priv->rawptr = NULL; - priv->rawleft = 0; - } - } + parser->priv->persist_stream = persist; } /** - * g_mime_parser_get_scan_from: + * g_mime_parser_get_format: * @parser: a #GMimeParser context * - * Gets whether or not @parser is set to scan mbox-style From-lines. + * Gets the format that the parser is set to parse. * - * Returns: whether or not @parser is set to scan mbox-style - * From-lines. + * Returns: the format that the parser is set to parse. **/ -gboolean -g_mime_parser_get_scan_from (GMimeParser *parser) +GMimeFormat +g_mime_parser_get_format (GMimeParser *parser) { - g_return_val_if_fail (GMIME_IS_PARSER (parser), FALSE); + g_return_val_if_fail (GMIME_IS_PARSER (parser), GMIME_FORMAT_MESSAGE); - return parser->priv->scan_from; + return parser->priv->format; } /** - * g_mime_parser_set_scan_from: + * g_mime_parser_set_format: * @parser: a #GMimeParser context - * @scan_from: %TRUE to scan From-lines or %FALSE otherwise - * - * Sets whether or not @parser should scan mbox-style From-lines. + * @format: a #GMimeFormat * - * By default, this feature is disabled. + * Sets the format that the parser should expect the stream to be in. **/ void -g_mime_parser_set_scan_from (GMimeParser *parser, gboolean scan_from) +g_mime_parser_set_format (GMimeParser *parser, GMimeFormat format) { g_return_if_fail (GMIME_IS_PARSER (parser)); - parser->priv->scan_from = scan_from ? 1 : 0; + parser->priv->format = format; } @@ -629,7 +620,7 @@ /** - * g_mime_parser_set_header_regex: + * g_mime_parser_set_header_regex: (skip) * @parser: a #GMimeParser context * @regex: regular expression * @header_cb: callback function @@ -652,17 +643,10 @@ priv = parser->priv; -#if defined (HAVE_GLIB_REGEX) if (priv->regex) { g_regex_unref (priv->regex); priv->regex = NULL; } -#elif defined (HAVE_REGEX_H) - if (priv->have_regex) { - regfree (&priv->regex); - priv->have_regex = FALSE; - } -#endif if (!regex || !header_cb) return; @@ -670,11 +654,7 @@ priv->header_cb = header_cb; priv->user_data = user_data; -#if defined (HAVE_GLIB_REGEX) priv->regex = g_regex_new (regex, G_REGEX_RAW | G_REGEX_EXTENDED | G_REGEX_CASELESS, 0, NULL); -#elif defined (HAVE_REGEX_H) - priv->have_regex = !regcomp (&priv->regex, regex, REG_EXTENDED | REG_ICASE | REG_NOSUB); -#endif } @@ -778,8 +758,19 @@ return g_mime_stream_eos (priv->stream) && priv->inptr == priv->inend; } +static gboolean +is_mbox_marker (const char *inptr, size_t len, gboolean allow_munged) +{ + if (allow_munged && *inptr == '>') { + inptr++; + len--; + } + + return len >= 5 && !strncmp ("From ", inptr, 5); +} + static int -parser_step_from (GMimeParser *parser) +parser_step_marker (GMimeParser *parser, const char *marker, size_t marker_len) { struct _GMimeParserPrivate *priv = parser->priv; register char *inptr; @@ -787,7 +778,7 @@ ssize_t left = 0; size_t len; - g_byte_array_set_size (priv->from_line, 0); + g_byte_array_set_size (priv->marker, 0); inptr = priv->inptr; @@ -821,10 +812,12 @@ len = (size_t) (inptr - start); inptr++; - if (len >= 5 && !strncmp (start, "From ", 5)) { - priv->from_offset = parser_offset (priv, start); - g_byte_array_append (priv->from_line, (unsigned char *) start, len); - goto got_from; + if (len >= marker_len && !strncmp (start, marker, marker_len)) { + priv->marker_offset = parser_offset (priv, start); + + if (priv->format == GMIME_FORMAT_MBOX) + g_byte_array_append (priv->marker, (unsigned char *) start, len); + goto got_marker; } } @@ -832,7 +825,7 @@ left = 0; } while (1); - got_from: + got_marker: priv->state = GMIME_PARSER_STATE_MESSAGE_HEADERS; @@ -841,42 +834,23 @@ return 0; } -#ifdef ALLOC_NEAREST_POW2 -static inline size_t -nearest_pow (size_t num) +static int +parser_step_from (GMimeParser *parser) { - size_t n; - - if (num == 0) - return 0; - - n = num - 1; -#if defined (__GNUC__) && defined (__i386__) - __asm__("bsrl %1,%0\n\t" - "jnz 1f\n\t" - "movl $-1,%0\n" - "1:" : "=r" (n) : "rm" (n)); - n = (1 << (n + 1)); -#else - n |= n >> 1; - n |= n >> 2; - n |= n >> 4; - n |= n >> 8; - n |= n >> 16; - n++; -#endif - - return n; + return parser_step_marker (parser, MBOX_BOUNDARY, MBOX_BOUNDARY_LEN); +} + +static int +parser_step_mmdf (GMimeParser *parser) +{ + return parser_step_marker (parser, MMDF_BOUNDARY, MMDF_BOUNDARY_LEN); } -#define next_alloc_size(n) nearest_pow (n) -#else static inline size_t next_alloc_size (size_t n) { return (n + 63) & ~63; } -#endif #define header_append(priv, start, len) G_STMT_START { \ if (priv->headerleft <= len) { \ @@ -895,43 +869,32 @@ priv->headerleft -= len; \ } G_STMT_END -#define raw_header_append(priv, start, len) G_STMT_START { \ - if (priv->rawbuf) { \ - if (priv->rawleft <= len) { \ - size_t hlen, hoff; \ - \ - hoff = priv->rawptr - priv->rawbuf; \ - hlen = next_alloc_size (hoff + len + 1); \ - \ - priv->rawbuf = g_realloc (priv->rawbuf, hlen); \ - priv->rawptr = priv->rawbuf + hoff; \ - priv->rawleft = (hlen - 1) - hoff; \ - } \ - \ - memcpy (priv->rawptr, start, len); \ - priv->rawptr += len; \ - priv->rawleft -= len; \ - } \ -} G_STMT_END - -#define raw_header_reset(priv) G_STMT_START { \ - if (priv->rawbuf) { \ - priv->rawleft += priv->rawptr - priv->rawbuf; \ - priv->rawptr = priv->rawbuf; \ - } \ -} G_STMT_END - static void -header_parse (GMimeParser *parser, HeaderRaw **tail) +header_parse (GMimeParser *parser) { struct _GMimeParserPrivate *priv = parser->priv; + gboolean valid = TRUE, blank = FALSE; register char *inptr; - HeaderRaw *header; + Header *header; - *priv->headerptr = '\0'; + *priv->headerptr = ':'; inptr = priv->headerbuf; - while (*inptr && *inptr != ':' && !is_type (*inptr, IS_SPACE | IS_CTRL)) + + while (*inptr != ':') { + /* Note: blank spaces are allowed between the field name + * and the ':', but field names themselves are not allowed + * to contain spaces (or control characters). */ + if (is_blank (*inptr)) { + blank = TRUE; + } else if (blank || is_ctrl (*inptr)) { + valid = FALSE; + break; + } + inptr++; + } + + *priv->headerptr = '\0'; if (*inptr != ':') { /* ignore invalid headers */ @@ -939,36 +902,33 @@ (long long) priv->header_offset, priv->headerbuf)); + if (priv->preheader == NULL) + priv->preheader = g_strdup (priv->headerbuf); + priv->headerleft += priv->headerptr - priv->headerbuf; priv->headerptr = priv->headerbuf; - return; } - header = g_slice_new (HeaderRaw); - header->next = NULL; - - header->name = g_strndup (priv->headerbuf, (size_t) (inptr - priv->headerbuf)); - header->value = g_mime_strdup_trim (inptr + 1); + header = g_slice_new (Header); + g_ptr_array_add (priv->headers, header); + header->raw_name = g_strndup (priv->headerbuf, (size_t) (inptr - priv->headerbuf)); + header->raw_value = g_strdup (inptr + 1); header->offset = priv->header_offset; - (*tail)->next = header; - *tail = header; + /* now walk backwards over lwsp characters */ + while (inptr > priv->headerbuf && is_blank (inptr[-1])) + inptr--; + + header->name = g_strndup (priv->headerbuf, (size_t) (inptr - priv->headerbuf)); priv->headerleft += priv->headerptr - priv->headerbuf; priv->headerptr = priv->headerbuf; -#if defined (HAVE_GLIB_REGEX) if (priv->regex && g_regex_match (priv->regex, header->name, 0, NULL)) - priv->header_cb (parser, header->name, header->value, - header->offset, priv->user_data); -#elif defined (HAVE_REGEX_H) - if (priv->have_regex && - !regexec (&priv->header_regex, header->name, 0, NULL, 0)) - priv->header_cb (parser, header->name, header->value, + priv->header_cb (parser, header->name, header->raw_value, header->offset, priv->user_data); -#endif } enum { @@ -980,13 +940,15 @@ }; static gboolean -has_message_headers (HeaderRaw *headers) +has_message_headers (GPtrArray *headers) { unsigned int found = 0; - HeaderRaw *header; + Header *header; + guint i; - header = headers; - while (header != NULL) { + for (i = 0; i < headers->len; i++) { + header = headers->pdata[i]; + if (!g_ascii_strcasecmp (header->name, "Subject")) found |= SUBJECT; else if (!g_ascii_strcasecmp (header->name, "From")) @@ -997,24 +959,22 @@ found |= TO; else if (!g_ascii_strcasecmp (header->name, "Cc")) found |= CC; - - header = header->next; } return found != 0; } static gboolean -has_content_headers (HeaderRaw *headers) +has_content_headers (GPtrArray *headers) { - HeaderRaw *header; + Header *header; + guint i; - header = headers; - while (header != NULL) { + for (i = 0; i < headers->len; i++) { + header = headers->pdata[i]; + if (!g_ascii_strcasecmp (header->name, "Content-Type")) return TRUE; - - header = header->next; } return FALSE; @@ -1026,16 +986,14 @@ struct _GMimeParserPrivate *priv = parser->priv; gboolean eoln, valid = TRUE, fieldname = TRUE; gboolean continuation = FALSE; + gboolean blank = FALSE; register char *inptr; char *start, *inend; ssize_t left = 0; - HeaderRaw *tail; size_t len; priv->midline = FALSE; - raw_header_reset (priv); - header_raw_clear (&priv->headers); - tail = (HeaderRaw *) &priv->headers; + parser_free_headers (priv); priv->headers_begin = parser_offset (priv, NULL); priv->header_offset = priv->headers_begin; @@ -1059,10 +1017,11 @@ /* if we are scanning a new line, check for a folded header */ if (!priv->midline && continuation && (*inptr != ' ' && *inptr != '\t')) { - header_parse (parser, &tail); + header_parse (parser); priv->header_offset = parser_offset (priv, inptr); continuation = FALSE; fieldname = TRUE; + blank = FALSE; valid = TRUE; } @@ -1074,7 +1033,12 @@ *inend = ':'; while (*inptr != ':') { - if (is_type (*inptr, IS_SPACE | IS_CTRL)) { + /* Note: blank spaces are allowed between the field name + * and the ':', but field names themselves are not allowed + * to contain spaces (or control characters). */ + if (is_blank (*inptr)) { + blank = TRUE; + } else if (blank || is_ctrl (*inptr)) { valid = FALSE; break; } @@ -1096,11 +1060,11 @@ } if (!valid) { - if (priv->scan_from && (inptr - start) == 4 - && !strncmp (start, "From ", 5)) + if (priv->format == GMIME_FORMAT_MBOX && + is_mbox_marker (start, (size_t) (inptr - start), FALSE)) goto next_message; - if (priv->headers != NULL) { + if (priv->headers->len > 0) { if (priv->state == GMIME_PARSER_STATE_MESSAGE_HEADERS) { if (has_message_headers (priv->headers)) { /* probably the start of the content, @@ -1116,8 +1080,9 @@ } } else if (priv->state == GMIME_PARSER_STATE_MESSAGE_HEADERS) { /* Be a little more strict when scanning toplevel message - * headers, but remain lenient with From-lines. */ - if ((inptr - start) != 4 || strncmp (start, "From ", 5) != 0) { + * headers, but remain lenient with lines starting with + * "From " or ">From ". */ + if (!is_mbox_marker (start, (size_t) (inptr - start), TRUE)) { priv->state = GMIME_PARSER_STATE_ERROR; return -1; } @@ -1142,7 +1107,6 @@ len--; } - raw_header_append (priv, start, len); header_append (priv, start, len); left = (ssize_t) (inend - inptr); priv->midline = TRUE; @@ -1150,7 +1114,7 @@ goto refill; } - raw_header_append (priv, start, len); + header_append (priv, start, len); if (inptr > start && inptr[-1] == '\r') len--; @@ -1159,10 +1123,8 @@ if (!priv->midline && len == 0) goto headers_end; - header_append (priv, start, len); - /* inptr has to be less than inend - 1 */ - raw_header_append (priv, "\n", 1); + header_append (priv, "\n", 1); priv->midline = FALSE; continuation = TRUE; inptr++; @@ -1178,17 +1140,14 @@ len = (size_t) (inend - inptr); header_append (priv, inptr, len); - raw_header_append (priv, inptr, len); headers_end: if (priv->headerptr > priv->headerbuf) - header_parse (parser, &tail); + header_parse (parser); priv->headers_end = parser_offset (priv, start); priv->state = GMIME_PARSER_STATE_HEADERS_END; - if (priv->rawbuf) - *priv->rawptr = '\0'; priv->inptr = inptr; return 0; @@ -1197,8 +1156,6 @@ priv->headers_end = parser_offset (priv, start); priv->state = GMIME_PARSER_STATE_COMPLETE; - if (priv->rawbuf) - *priv->rawptr = '\0'; priv->inptr = start; return 0; @@ -1207,8 +1164,6 @@ priv->headers_end = parser_offset (priv, start); priv->state = GMIME_PARSER_STATE_CONTENT; - if (priv->rawbuf) - *priv->rawptr = '\0'; priv->inptr = start; return 0; @@ -1242,13 +1197,12 @@ static ContentType * parser_content_type (GMimeParser *parser, GMimeContentType *parent) { - struct _GMimeParserPrivate *priv = parser->priv; ContentType *content_type; const char *value; content_type = g_slice_new (ContentType); - if (!(value = header_raw_find (priv->headers, "Content-Type", NULL)) || + if (!(value = parser_find_header (parser, "Content-Type", NULL)) || !g_mime_parse_content_type (&value, &content_type->type, &content_type->subtype)) { if (parent != NULL && g_mime_content_type_is_type (parent, "multipart", "digest")) { content_type->type = g_strdup ("message"); @@ -1310,8 +1264,10 @@ case GMIME_PARSER_STATE_INIT: priv->message_headers_begin = -1; priv->message_headers_end = -1; - if (priv->scan_from) + if (priv->format == GMIME_FORMAT_MBOX) priv->state = GMIME_PARSER_STATE_FROM; + else if (priv->format == GMIME_FORMAT_MMDF) + priv->state = GMIME_PARSER_STATE_AAAA; else priv->state = GMIME_PARSER_STATE_MESSAGE_HEADERS; break; @@ -1320,6 +1276,11 @@ priv->message_headers_end = -1; parser_step_from (parser); break; + case GMIME_PARSER_STATE_AAAA: + priv->message_headers_begin = -1; + priv->message_headers_end = -1; + parser_step_mmdf (parser); + break; case GMIME_PARSER_STATE_MESSAGE_HEADERS: case GMIME_PARSER_STATE_HEADERS: parser_step_headers (parser); @@ -1347,25 +1308,12 @@ return priv->state; } - -enum { - FOUND_NOTHING, - FOUND_EOS, - FOUND_BOUNDARY, - FOUND_END_BOUNDARY -}; - -#define content_save(content, start, len) G_STMT_START { \ - if (content) \ - g_byte_array_append (content, (unsigned char *) start, len); \ -} G_STMT_END - -#define possible_boundary(scan_from, start, len) \ - ((scan_from && len >= 5 && !strncmp (start, "From ", 5)) || \ +#define possible_boundary(marker, mlen, start, len) \ + ((marker && len >= mlen && !strncmp (start, marker, mlen)) || \ (len >= 2 && (start[0] == '-' && start[1] == '-'))) static gboolean -is_boundary (const char *text, size_t len, const char *boundary, size_t boundary_len) +is_boundary (struct _GMimeParserPrivate *priv, const char *text, size_t len, const char *boundary, size_t boundary_len) { const char *inptr = text + boundary_len; const char *inend = text + len; @@ -1377,8 +1325,13 @@ if (strncmp (text, boundary, boundary_len) != 0) return FALSE; - if (!strncmp (text, "From ", 5)) - return TRUE; + if (priv->format == GMIME_FORMAT_MBOX) { + if (!strncmp (text, MBOX_BOUNDARY, MBOX_BOUNDARY_LEN)) + return TRUE; + } else if (priv->format == GMIME_FORMAT_MMDF) { + if (!strncmp (text, MMDF_BOUNDARY, MMDF_BOUNDARY_LEN)) + return TRUE; + } /* the boundary may be optionally followed by linear whitespace */ while (inptr < inend) { @@ -1391,40 +1344,64 @@ return TRUE; } -static int +static BoundaryType check_boundary (struct _GMimeParserPrivate *priv, const char *start, size_t len) { gint64 offset = parser_offset (priv, start); + const char *marker; + BoundaryStack *s; + size_t mlen; + guint i; + + switch (priv->format) { + case GMIME_FORMAT_MBOX: marker = MBOX_BOUNDARY; mlen = MBOX_BOUNDARY_LEN; break; + case GMIME_FORMAT_MMDF: marker = MMDF_BOUNDARY; mlen = MMDF_BOUNDARY_LEN; break; + default: marker = NULL; mlen = 0; break; + } if (len > 0 && start[len - 1] == '\r') len--; - if (possible_boundary (priv->scan_from, start, len)) { - BoundaryStack *s; + if (!possible_boundary (marker, mlen, start, len)) + return BOUNDARY_NONE; + + d(printf ("checking boundary '%.*s'\n", len, start)); + + s = priv->bounds; + while (s) { + if (offset >= s->content_end && + is_boundary (priv, start, len, s->boundary, s->boundarylenfinal)) { + d(printf ("found %s\n", s->content_end != -1 && offset >= s->content_end ? + "end of content" : "end boundary")); + return s == priv->bounds ? BOUNDARY_IMMEDIATE_END : BOUNDARY_PARENT_END; + } - d(printf ("checking boundary '%.*s'\n", len, start)); + if (is_boundary (priv, start, len, s->boundary, s->boundarylen)) { + d(printf ("found boundary\n")); + return s == priv->bounds ? BOUNDARY_IMMEDIATE : BOUNDARY_PARENT; + } - s = priv->bounds; - while (s) { - if (offset >= s->content_end && - is_boundary (start, len, s->boundary, s->boundarylenfinal)) { - d(printf ("found %s\n", s->content_end != -1 && offset >= s->content_end ? - "end of content" : "end boundary")); - return FOUND_END_BOUNDARY; - } - - if (is_boundary (start, len, s->boundary, s->boundarylen)) { - d(printf ("found boundary\n")); - return FOUND_BOUNDARY; - } + s = s->parent; + } + + d(printf ("'%.*s' not a boundary\n", len, start)); + + if (!strncmp (start, "--", 2)) { + start += 2; + len -= 2; + + /* check for OpenPGP markers... */ + for (i = 0; i < G_N_ELEMENTS (openpgp_markers); i++) { + const char *marker = openpgp_markers[i].marker + 2; + openpgp_state_t state = openpgp_markers[i].before; + size_t n = openpgp_markers[i].len - 2; - s = s->parent; + if (len == n && priv->openpgp == state && !strncmp (marker, start, len)) + priv->openpgp = openpgp_markers[i].after; } - - d(printf ("'%.*s' not a boundary\n", len, start)); } - return FOUND_NOTHING; + return BOUNDARY_NONE; } static gboolean @@ -1440,7 +1417,7 @@ while (*inptr != '\n') inptr++; - return is_boundary (priv->inptr, inptr - priv->inptr, s->boundary, boundary_len); + return is_boundary (priv, priv->inptr, inptr - priv->inptr, s->boundary, boundary_len); } /* Optimization Notes: @@ -1457,20 +1434,23 @@ /* we add 2 for \r\n */ #define MAX_BOUNDARY_LEN(bounds) (bounds ? bounds->boundarylenmax + 2 : 0) -static int -parser_scan_content (GMimeParser *parser, GByteArray *content, guint *crlf) +static BoundaryType +parser_scan_content (GMimeParser *parser, GMimeStream *content, gboolean *empty) { struct _GMimeParserPrivate *priv = parser->priv; + BoundaryType found = BOUNDARY_NONE; char *aligned, *start, *inend; register char *inptr; register int *dword; size_t nleft, len; size_t atleast; - int found = 0; + gint64 pos; int mask; + char c; d(printf ("scan-content\n")); + priv->openpgp = OPENPGP_NONE; priv->midline = FALSE; g_assert (priv->inptr <= priv->inend); @@ -1485,7 +1465,7 @@ nleft = priv->inend - inptr; if (parser_fill (parser, atleast) <= 0) { start = priv->inptr; - found = FOUND_EOS; + found = BOUNDARY_EOS; break; } @@ -1496,7 +1476,7 @@ len = (size_t) (inend - inptr); if (priv->midline && len == nleft) - found = FOUND_EOS; + found = BOUNDARY_EOS; priv->midline = FALSE; @@ -1505,10 +1485,15 @@ start = inptr; /* Note: see optimization comment [1] */ - while (inptr < aligned && *inptr != '\n') + c = *aligned; + *aligned = '\n'; + + while (*inptr != '\n') inptr++; - if (inptr == aligned) { + *aligned = c; + + if (inptr == aligned && c != '\n') { dword = (int *) inptr; do { @@ -1545,7 +1530,7 @@ goto boundary; } - content_save (content, start, len); + g_mime_stream_write (content, start, len); } priv->inptr = inptr; @@ -1556,71 +1541,76 @@ /* don't chew up the boundary */ priv->inptr = start; - if (found != FOUND_EOS) { + pos = g_mime_stream_tell (content); + *empty = pos == 0; + + if (found != BOUNDARY_EOS && pos > 0) { + /* the last \r\n belongs to the boundary */ if (inptr[-1] == '\r') - *crlf = 2; + g_mime_stream_seek (content, -2, GMIME_STREAM_SEEK_CUR); else - *crlf = 1; - } else { - *crlf = 0; + g_mime_stream_seek (content, -1, GMIME_STREAM_SEEK_CUR); } return found; } static void -parser_scan_mime_part_content (GMimeParser *parser, GMimePart *mime_part, int *found) +parser_scan_mime_part_content (GMimeParser *parser, GMimePart *mime_part, BoundaryType *found) { struct _GMimeParserPrivate *priv = parser->priv; GMimeContentEncoding encoding; - GByteArray *content = NULL; - GMimeDataWrapper *wrapper; + GMimeDataWrapper *content; GMimeStream *stream; - gint64 start, end; - guint crlf; + GByteArray *buffer; + gint64 start, len; + gboolean empty; g_assert (priv->state >= GMIME_PARSER_STATE_HEADERS_END); - if (priv->persist_stream && priv->seekable) + if (priv->persist_stream && priv->seekable) { + stream = g_mime_stream_null_new (); start = parser_offset (priv, NULL); - else - content = g_byte_array_new (); + } else { + stream = g_mime_stream_mem_new (); + } - *found = parser_scan_content (parser, content, &crlf); - if (*found != FOUND_EOS) { - /* last '\n' belongs to the boundary */ - if (priv->persist_stream && priv->seekable) - end = parser_offset (priv, NULL) - crlf; - else if (content->len > crlf) - g_byte_array_set_size (content, content->len - crlf); - else - g_byte_array_set_size (content, 0); - } else if (priv->persist_stream && priv->seekable) { - end = parser_offset (priv, NULL); + *found = parser_scan_content (parser, stream, &empty); + len = g_mime_stream_tell (stream); + + if (priv->persist_stream && priv->seekable) { + g_object_unref (stream); + + stream = g_mime_stream_substream (priv->stream, start, start + len); + } else { + buffer = g_mime_stream_mem_get_byte_array ((GMimeStreamMem *) stream); + g_byte_array_set_size (buffer, (guint) len); + g_mime_stream_reset (stream); } encoding = g_mime_part_get_content_encoding (mime_part); + content = g_mime_data_wrapper_new_with_stream (stream, encoding); + g_object_unref (stream); - if (priv->persist_stream && priv->seekable) - stream = g_mime_stream_substream (priv->stream, start, end); - else - stream = g_mime_stream_mem_new_with_byte_array (content); + g_mime_part_set_content (mime_part, content); + g_object_unref (content); - wrapper = g_mime_data_wrapper_new_with_stream (stream, encoding); - g_mime_part_set_content_object (mime_part, wrapper); - g_object_unref (wrapper); - g_object_unref (stream); + if (priv->openpgp == OPENPGP_END_PGP_SIGNATURE) + g_mime_part_set_openpgp_data (mime_part, GMIME_OPENPGP_DATA_SIGNED); + else if (priv->openpgp == OPENPGP_END_PGP_MESSAGE) + g_mime_part_set_openpgp_data (mime_part, GMIME_OPENPGP_DATA_ENCRYPTED); } static void -parser_scan_message_part (GMimeParser *parser, GMimeMessagePart *mpart, int *found) +parser_scan_message_part (GMimeParser *parser, GMimeParserOptions *options, GMimeMessagePart *mpart, BoundaryType *found) { struct _GMimeParserPrivate *priv = parser->priv; ContentType *content_type; GMimeMessage *message; GMimeObject *object; GMimeStream *stream; - HeaderRaw *header; + Header *header; + guint i; g_assert (priv->state == GMIME_PARSER_STATE_CONTENT); @@ -1634,7 +1624,7 @@ atleast = MAX (SCAN_HEAD, MAX_BOUNDARY_LEN (priv->bounds)); if (parser_fill (parser, atleast) <= 0) { - *found = FOUND_EOS; + *found = BOUNDARY_EOS; return; } @@ -1648,13 +1638,18 @@ *found = check_boundary (priv, priv->inptr, inptr - priv->inptr); switch (*found) { - case FOUND_END_BOUNDARY: + case BOUNDARY_IMMEDIATE_END: + case BOUNDARY_IMMEDIATE: + case BOUNDARY_PARENT: + return; + case BOUNDARY_PARENT_END: /* ignore "From " boundaries, boken mailers tend to include these lines... */ if (strncmp (priv->inptr, "From ", 5) != 0) return; break; - case FOUND_BOUNDARY: - return; + case BOUNDARY_NONE: + case BOUNDARY_EOS: + break; } } @@ -1663,46 +1658,48 @@ if (parser_step (parser) == GMIME_PARSER_STATE_ERROR) { /* Note: currently cannot happen because * parser_step_headers() never returns error */ - *found = FOUND_EOS; + *found = BOUNDARY_EOS; return; } message = g_mime_message_new (FALSE); - header = priv->headers; - while (header) { - if (g_ascii_strncasecmp (header->name, "Content-", 8) != 0) - g_mime_object_append_header ((GMimeObject *) message, header->name, header->value); - header = header->next; + ((GMimeObject *) message)->ensure_newline = FALSE; + message->marker = priv->preheader; + priv->preheader = NULL; + + for (i = 0; i < priv->headers->len; i++) { + header = priv->headers->pdata[i]; + + if (g_ascii_strncasecmp (header->name, "Content-", 8) != 0) { + _g_mime_object_append_header ((GMimeObject *) message, header->name, header->raw_name, + header->raw_value, header->offset); + } } content_type = parser_content_type (parser, NULL); if (content_type_is_type (content_type, "multipart", "*")) - object = parser_construct_multipart (parser, content_type, TRUE, found); + object = parser_construct_multipart (parser, options, content_type, TRUE, found); else - object = parser_construct_leaf_part (parser, content_type, TRUE, found); + object = parser_construct_leaf_part (parser, options, content_type, TRUE, found); content_type_destroy (content_type); message->mime_part = object; - /* set the same raw header stream on the message's header-list */ - if ((stream = g_mime_header_list_get_stream (object->headers))) - g_mime_header_list_set_stream (((GMimeObject *) message)->headers, stream); - g_mime_message_part_set_message (mpart, message); g_object_unref (message); } static GMimeObject * -parser_construct_leaf_part (GMimeParser *parser, ContentType *content_type, gboolean toplevel, int *found) +parser_construct_leaf_part (GMimeParser *parser, GMimeParserOptions *options, ContentType *content_type, gboolean toplevel, BoundaryType *found) { struct _GMimeParserPrivate *priv = parser->priv; GMimeObject *object; - GMimeStream *stream; - HeaderRaw *header; + Header *header; + guint i; g_assert (priv->state >= GMIME_PARSER_STATE_HEADERS_END); - object = g_mime_object_new_type (content_type->type, content_type->subtype); + object = g_mime_object_new_type (options, content_type->type, content_type->subtype); if (!content_type->exists) { GMimeContentType *mime_type; @@ -1712,36 +1709,27 @@ g_object_unref (mime_type); } - header = priv->headers; - while (header) { - if (!toplevel || !g_ascii_strncasecmp (header->name, "Content-", 8)) - g_mime_object_append_header (object, header->name, header->value); - header = header->next; + for (i = 0; i < priv->headers->len; i++) { + header = priv->headers->pdata[i]; + + if (!toplevel || !g_ascii_strncasecmp (header->name, "Content-", 8)) { + _g_mime_object_append_header (object, header->name, header->raw_name, + header->raw_value, header->offset); + } } - header_raw_clear (&priv->headers); - - /* set the raw header stream on the header-list */ - if (priv->persist_stream && priv->seekable) - stream = g_mime_stream_substream (priv->stream, priv->headers_begin, priv->headers_end); - else - stream = g_mime_stream_mem_new_with_buffer (priv->rawbuf, priv->rawptr - priv->rawbuf); - - g_mime_header_list_set_stream (object->headers, stream); - g_object_unref (stream); - - raw_header_reset (priv); + parser_free_headers (priv); if (priv->state == GMIME_PARSER_STATE_HEADERS_END) { /* skip empty line after headers */ if (parser_step (parser) == GMIME_PARSER_STATE_ERROR) { - *found = FOUND_EOS; + *found = BOUNDARY_EOS; return object; } } if (GMIME_IS_MESSAGE_PART (object)) - parser_scan_message_part (parser, (GMimeMessagePart *) object, found); + parser_scan_message_part (parser, options, (GMimeMessagePart *) object, found); else parser_scan_mime_part_content (parser, (GMimePart *) object, found); @@ -1773,156 +1761,158 @@ *outptr = '\0'; } -static int -parser_scan_multipart_face (GMimeParser *parser, GMimeMultipart *multipart, gboolean preface) +static BoundaryType +parser_scan_multipart_face (GMimeParser *parser, GMimeMultipart *multipart, gboolean prologue) { + GMimeStream *stream; + BoundaryType found; GByteArray *buffer; + gboolean empty; + gint64 len; char *face; - guint crlf; - int found; - buffer = g_byte_array_new (); - found = parser_scan_content (parser, buffer, &crlf); + stream = g_mime_stream_mem_new (); + found = parser_scan_content (parser, stream, &empty); - if (buffer->len >= crlf) { - /* last '\n' belongs to the boundary */ - g_byte_array_set_size (buffer, buffer->len + 1); - buffer->data[buffer->len - crlf - 1] = '\0'; + if (!empty) { + buffer = g_mime_stream_mem_get_byte_array ((GMimeStreamMem *) stream); + len = g_mime_stream_tell (stream); + g_byte_array_set_size (buffer, len + 1); + buffer->data[buffer->len - 1] = '\0'; face = (char *) buffer->data; crlf2lf (face); - if (preface) - g_mime_multipart_set_preface (multipart, face); + if (prologue) + g_mime_multipart_set_prologue (multipart, face); else - g_mime_multipart_set_postface (multipart, face); + g_mime_multipart_set_epilogue (multipart, face); } - g_byte_array_free (buffer, TRUE); + g_object_unref (stream); return found; } -#define parser_scan_multipart_preface(parser, multipart) parser_scan_multipart_face (parser, multipart, TRUE) -#define parser_scan_multipart_postface(parser, multipart) parser_scan_multipart_face (parser, multipart, FALSE) +#define parser_scan_multipart_prologue(parser, multipart) parser_scan_multipart_face (parser, multipart, TRUE) +#define parser_scan_multipart_epilogue(parser, multipart) parser_scan_multipart_face (parser, multipart, FALSE) -static int -parser_scan_multipart_subparts (GMimeParser *parser, GMimeMultipart *multipart) +static BoundaryType +parser_scan_multipart_subparts (GMimeParser *parser, GMimeParserOptions *options, GMimeMultipart *multipart) { struct _GMimeParserPrivate *priv = parser->priv; ContentType *content_type; GMimeObject *subpart; - int found; + BoundaryType found; do { /* skip over the boundary marker */ if (parser_skip_line (parser) == -1) { - found = FOUND_EOS; + found = BOUNDARY_EOS; break; } /* get the headers */ priv->state = GMIME_PARSER_STATE_HEADERS; if (parser_step (parser) == GMIME_PARSER_STATE_ERROR) { - found = FOUND_EOS; + found = BOUNDARY_EOS; break; } - if (priv->state == GMIME_PARSER_STATE_COMPLETE && priv->headers == NULL) { - found = FOUND_END_BOUNDARY; + if (priv->state == GMIME_PARSER_STATE_COMPLETE && priv->headers->len == 0) { + found = BOUNDARY_IMMEDIATE_END; break; } content_type = parser_content_type (parser, ((GMimeObject *) multipart)->content_type); if (content_type_is_type (content_type, "multipart", "*")) - subpart = parser_construct_multipart (parser, content_type, FALSE, &found); + subpart = parser_construct_multipart (parser, options, content_type, FALSE, &found); else - subpart = parser_construct_leaf_part (parser, content_type, FALSE, &found); + subpart = parser_construct_leaf_part (parser, options, content_type, FALSE, &found); g_mime_multipart_add (multipart, subpart); content_type_destroy (content_type); g_object_unref (subpart); - } while (found == FOUND_BOUNDARY && found_immediate_boundary (priv, FALSE)); + } while (found == BOUNDARY_IMMEDIATE); return found; } static GMimeObject * -parser_construct_multipart (GMimeParser *parser, ContentType *content_type, gboolean toplevel, int *found) +parser_construct_multipart (GMimeParser *parser, GMimeParserOptions *options, ContentType *content_type, gboolean toplevel, BoundaryType *found) { struct _GMimeParserPrivate *priv = parser->priv; GMimeMultipart *multipart; const char *boundary; GMimeObject *object; GMimeStream *stream; - HeaderRaw *header; + Header *header; + guint i; g_assert (priv->state >= GMIME_PARSER_STATE_HEADERS_END); - object = g_mime_object_new_type (content_type->type, content_type->subtype); + object = g_mime_object_new_type (options, content_type->type, content_type->subtype); - header = priv->headers; - while (header) { - if (!toplevel || !g_ascii_strncasecmp (header->name, "Content-", 8)) - g_mime_object_append_header (object, header->name, header->value); - header = header->next; + for (i = 0; i < priv->headers->len; i++) { + header = priv->headers->pdata[i]; + + if (!toplevel || !g_ascii_strncasecmp (header->name, "Content-", 8)) { + _g_mime_object_append_header (object, header->name, header->raw_name, + header->raw_value, header->offset); + } } - header_raw_clear (&priv->headers); - - /* set the raw header stream on the header-list */ - if (priv->persist_stream && priv->seekable) - stream = g_mime_stream_substream (priv->stream, priv->headers_begin, priv->headers_end); - else - stream = g_mime_stream_mem_new_with_buffer (priv->rawbuf, priv->rawptr - priv->rawbuf); - - g_mime_header_list_set_stream (object->headers, stream); - g_object_unref (stream); - - raw_header_reset (priv); + parser_free_headers (priv); multipart = (GMimeMultipart *) object; if (priv->state == GMIME_PARSER_STATE_HEADERS_END) { /* skip empty line after headers */ if (parser_step (parser) == GMIME_PARSER_STATE_ERROR) { - *found = FOUND_EOS; + *found = BOUNDARY_EOS; return object; } } - boundary = g_mime_object_get_content_type_parameter (object, "boundary"); - if (boundary) { + if ((boundary = g_mime_object_get_content_type_parameter (object, "boundary"))) { parser_push_boundary (parser, boundary); - *found = parser_scan_multipart_preface (parser, multipart); + *found = parser_scan_multipart_prologue (parser, multipart); - if (*found == FOUND_BOUNDARY) - *found = parser_scan_multipart_subparts (parser, multipart); + if (*found == BOUNDARY_IMMEDIATE) + *found = parser_scan_multipart_subparts (parser, options, multipart); - if (*found == FOUND_END_BOUNDARY && found_immediate_boundary (priv, TRUE)) { + if (*found == BOUNDARY_IMMEDIATE_END) { /* eat end boundary */ + multipart->write_end_boundary = TRUE; parser_skip_line (parser); parser_pop_boundary (parser); - *found = parser_scan_multipart_postface (parser, multipart); - } else { - parser_pop_boundary (parser); + *found = parser_scan_multipart_epilogue (parser, multipart); + return object; } + + multipart->write_end_boundary = FALSE; + parser_pop_boundary (parser); + + if (*found == BOUNDARY_PARENT_END && found_immediate_boundary (priv, TRUE)) + *found = BOUNDARY_IMMEDIATE_END; + else if (*found == BOUNDARY_PARENT && found_immediate_boundary (priv, FALSE)) + *found = BOUNDARY_IMMEDIATE; } else { w(g_warning ("multipart without boundary encountered")); - /* this will scan everything into the preface */ - *found = parser_scan_multipart_preface (parser, multipart); + /* this will scan everything into the prologue */ + *found = parser_scan_multipart_prologue (parser, multipart); } return object; } static GMimeObject * -parser_construct_part (GMimeParser *parser) +parser_construct_part (GMimeParser *parser, GMimeParserOptions *options) { struct _GMimeParserPrivate *priv = parser->priv; ContentType *content_type; GMimeObject *object; - int found; + BoundaryType found; /* get the headers */ priv->state = GMIME_PARSER_STATE_HEADERS; @@ -1933,9 +1923,9 @@ content_type = parser_content_type (parser, NULL); if (content_type_is_type (content_type, "multipart", "*")) - object = parser_construct_multipart (parser, content_type, FALSE, &found); + object = parser_construct_multipart (parser, options, content_type, FALSE, &found); else - object = parser_construct_leaf_part (parser, content_type, FALSE, &found); + object = parser_construct_leaf_part (parser, options, content_type, FALSE, &found); content_type_destroy (content_type); @@ -1946,23 +1936,24 @@ /** * g_mime_parser_construct_part: * @parser: a #GMimeParser context + * @options: (nullable): a #GMimeParserOptions or %NULL * * Constructs a MIME part from @parser. * - * Returns: (transfer full): a MIME part based on @parser or %NULL on + * Returns: (nullable) (transfer full): a MIME part based on @parser or %NULL on * fail. **/ GMimeObject * -g_mime_parser_construct_part (GMimeParser *parser) +g_mime_parser_construct_part (GMimeParser *parser, GMimeParserOptions *options) { g_return_val_if_fail (GMIME_IS_PARSER (parser), NULL); - return parser_construct_part (parser); + return parser_construct_part (parser, options); } static GMimeMessage * -parser_construct_message (GMimeParser *parser) +parser_construct_message (GMimeParser *parser, GMimeParserOptions *options) { struct _GMimeParserPrivate *priv = parser->priv; unsigned long content_length = ULONG_MAX; @@ -1970,9 +1961,11 @@ GMimeMessage *message; GMimeObject *object; GMimeStream *stream; - HeaderRaw *header; + BoundaryType found; + const char *inptr; + Header *header; char *endptr; - int found; + guint i; /* scan the from-line if we are parsing an mbox */ while (priv->state != GMIME_PARSER_STATE_MESSAGE_HEADERS) { @@ -1987,39 +1980,45 @@ } message = g_mime_message_new (FALSE); - header = priv->headers; - while (header) { + ((GMimeObject *) message)->ensure_newline = FALSE; + + for (i = 0; i < priv->headers->len; i++) { + header = priv->headers->pdata[i]; + if (priv->respect_content_length && !g_ascii_strcasecmp (header->name, "Content-Length")) { - content_length = strtoul (header->value, &endptr, 10); - if (endptr == header->value) + inptr = header->raw_value; + while (is_lwsp (*inptr)) + inptr++; + + content_length = strtoul (inptr, &endptr, 10); + if (endptr == inptr) content_length = ULONG_MAX; } - if (g_ascii_strncasecmp (header->name, "Content-", 8) != 0) - g_mime_object_append_header ((GMimeObject *) message, header->name, header->value); - header = header->next; + if (g_ascii_strncasecmp (header->name, "Content-", 8) != 0) { + _g_mime_object_append_header ((GMimeObject *) message, header->name, header->raw_name, + header->raw_value, header->offset); + } } - if (priv->scan_from) { + if (priv->format == GMIME_FORMAT_MBOX) { parser_push_boundary (parser, MBOX_BOUNDARY); if (priv->respect_content_length && content_length < ULONG_MAX) priv->bounds->content_end = parser_offset (priv, NULL) + content_length; + } else if (priv->format == GMIME_FORMAT_MMDF) { + parser_push_boundary (parser, MMDF_BOUNDARY); } content_type = parser_content_type (parser, NULL); if (content_type_is_type (content_type, "multipart", "*")) - object = parser_construct_multipart (parser, content_type, TRUE, &found); + object = parser_construct_multipart (parser, options, content_type, TRUE, &found); else - object = parser_construct_leaf_part (parser, content_type, TRUE, &found); + object = parser_construct_leaf_part (parser, options, content_type, TRUE, &found); content_type_destroy (content_type); message->mime_part = object; - /* set the same raw header stream on the message's header-list */ - if ((stream = g_mime_header_list_get_stream (object->headers))) - g_mime_header_list_set_stream (((GMimeObject *) message)->headers, stream); - - if (priv->scan_from) { + if (priv->format == GMIME_FORMAT_MBOX) { priv->state = GMIME_PARSER_STATE_FROM; parser_pop_boundary (parser); } @@ -2031,50 +2030,51 @@ /** * g_mime_parser_construct_message: * @parser: a #GMimeParser context + * @options: (nullable): a #GMimeParserOptions or %NULL * * Constructs a MIME message from @parser. * - * Returns: (transfer full): a MIME message or %NULL on fail. + * Returns: (nullable) (transfer full): a MIME message or %NULL on fail. **/ GMimeMessage * -g_mime_parser_construct_message (GMimeParser *parser) +g_mime_parser_construct_message (GMimeParser *parser, GMimeParserOptions *options) { g_return_val_if_fail (GMIME_IS_PARSER (parser), NULL); - return parser_construct_message (parser); + return parser_construct_message (parser, options); } /** - * g_mime_parser_get_from: + * g_mime_parser_get_mbox_marker: * @parser: a #GMimeParser context * * Gets the mbox-style From-line of the most recently parsed message * (gotten from g_mime_parser_construct_message()). * - * Returns: the mbox-style From-line of the most recently parsed + * Returns: (nullable): the mbox-style From-line of the most recently parsed * message or %NULL on error. **/ char * -g_mime_parser_get_from (GMimeParser *parser) +g_mime_parser_get_mbox_marker (GMimeParser *parser) { struct _GMimeParserPrivate *priv; g_return_val_if_fail (GMIME_IS_PARSER (parser), NULL); priv = parser->priv; - if (!priv->scan_from) + if (priv->format != GMIME_FORMAT_MBOX) return NULL; - if (priv->from_line->len) - return g_strndup ((char *) priv->from_line->data, priv->from_line->len); + if (priv->marker->len) + return g_strndup ((char *) priv->marker->data, priv->marker->len); return NULL; } /** - * g_mime_parser_get_from_offset: + * g_mime_parser_get_mbox_marker_offset: * @parser: a #GMimeParser context * * Gets the offset of the most recently parsed mbox-style From-line @@ -2084,17 +2084,17 @@ * or %-1 on error. **/ gint64 -g_mime_parser_get_from_offset (GMimeParser *parser) +g_mime_parser_get_mbox_marker_offset (GMimeParser *parser) { struct _GMimeParserPrivate *priv; g_return_val_if_fail (GMIME_IS_PARSER (parser), -1); priv = parser->priv; - if (!priv->scan_from) + if (priv->format != GMIME_FORMAT_MBOX) return -1; - return priv->from_offset; + return priv->marker_offset; } diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-parser.h gmime-3.0.1/gmime/gmime-parser.h --- gmime-2.6.22+dfsg2/gmime/gmime-parser.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-parser.h 2017-03-28 23:46:26.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -29,6 +29,7 @@ #include #include #include +#include #include G_BEGIN_DECLS @@ -45,6 +46,21 @@ /** + * GMimeFormat: + * @GMIME_FORMAT_MESSAGE: The stream contains a single message. + * @GMIME_FORMAT_MBOX: The stream is in the UNIX mbox format. + * @GMIME_FORMAT_MMDF: The stream is in the MMDF format. + * + * An enum of formats. + **/ +typedef enum { + GMIME_FORMAT_MESSAGE, + GMIME_FORMAT_MBOX, + GMIME_FORMAT_MMDF +} GMimeFormat; + + +/** * GMimeParser: * @parent_object: parent #GObject * @priv: private parser state @@ -89,8 +105,8 @@ gboolean g_mime_parser_get_persist_stream (GMimeParser *parser); void g_mime_parser_set_persist_stream (GMimeParser *parser, gboolean persist); -gboolean g_mime_parser_get_scan_from (GMimeParser *parser); -void g_mime_parser_set_scan_from (GMimeParser *parser, gboolean scan_from); +GMimeFormat g_mime_parser_get_format (GMimeParser *parser); +void g_mime_parser_set_format (GMimeParser *parser, GMimeFormat format); gboolean g_mime_parser_get_respect_content_length (GMimeParser *parser); void g_mime_parser_set_respect_content_length (GMimeParser *parser, gboolean respect_content_length); @@ -99,17 +115,16 @@ GMimeParserHeaderRegexFunc header_cb, gpointer user_data); -GMimeObject *g_mime_parser_construct_part (GMimeParser *parser); - -GMimeMessage *g_mime_parser_construct_message (GMimeParser *parser); +GMimeObject *g_mime_parser_construct_part (GMimeParser *parser, GMimeParserOptions *options); +GMimeMessage *g_mime_parser_construct_message (GMimeParser *parser, GMimeParserOptions *options); gint64 g_mime_parser_tell (GMimeParser *parser); gboolean g_mime_parser_eos (GMimeParser *parser); -char *g_mime_parser_get_from (GMimeParser *parser); +char *g_mime_parser_get_mbox_marker (GMimeParser *parser); +gint64 g_mime_parser_get_mbox_marker_offset (GMimeParser *parser); -gint64 g_mime_parser_get_from_offset (GMimeParser *parser); gint64 g_mime_parser_get_headers_begin (GMimeParser *parser); gint64 g_mime_parser_get_headers_end (GMimeParser *parser); diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-parser-options.c gmime-3.0.1/gmime/gmime-parser-options.c --- gmime-2.6.22+dfsg2/gmime/gmime-parser-options.c 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-parser-options.c 2017-04-23 16:04:10.000000000 +0000 @@ -0,0 +1,395 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2017 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "gmime-parser-options.h" + + +static char *default_charsets[3] = { "utf-8", "iso-8859-1", NULL }; + + +/** + * SECTION: gmime-parser-options + * @title: GMimeParserOptions + * @short_description: Parser options + * @see_also: + * + * A #GMimeParserOptions is used to pass various options to #GMimeParser + * and all of the various other parser functions in GMime. + **/ + + +struct _GMimeParserOptions { + GMimeRfcComplianceMode addresses; + GMimeRfcComplianceMode parameters; + GMimeRfcComplianceMode rfc2047; + gboolean allow_no_domain; + char **charsets; +}; + +static GMimeParserOptions *default_options = NULL; + +G_DEFINE_BOXED_TYPE (GMimeParserOptions, g_mime_parser_options, g_mime_parser_options_clone, g_mime_parser_options_free); + +void +g_mime_parser_options_init (void) +{ + if (default_options == NULL) + default_options = g_mime_parser_options_new (); +} + +void +g_mime_parser_options_shutdown (void) +{ + if (default_options == NULL) + return; + + g_strfreev (default_options->charsets); + g_slice_free (GMimeParserOptions, default_options); + default_options = NULL; +} + + +/** + * g_mime_parser_options_get_default: + * + * Gets the default parser options. + * + * Returns: the default parser options. + **/ +GMimeParserOptions * +g_mime_parser_options_get_default (void) +{ + return default_options; +} + + +/** + * g_mime_parser_options_new: + * + * Creates a new set of #GMimeParserOptions. + * + * Returns: a newly allocated set of #GMimeParserOptions with the default values. + **/ +GMimeParserOptions * +g_mime_parser_options_new (void) +{ + GMimeParserOptions *options; + + options = g_slice_new (GMimeParserOptions); + options->addresses = GMIME_RFC_COMPLIANCE_LOOSE; + options->parameters = GMIME_RFC_COMPLIANCE_LOOSE; + options->rfc2047 = GMIME_RFC_COMPLIANCE_LOOSE; + options->allow_no_domain = FALSE; + + options->charsets = g_malloc (sizeof (char *) * 3); + options->charsets[0] = g_strdup ("utf-8"); + options->charsets[1] = g_strdup ("iso-8859-1"); + options->charsets[2] = NULL; + + return options; +} + + +/** + * g_mime_parser_options_clone: + * @options: (nullable): a #GMimeParserOptions or %NULL + * + * Clones a #GMimeParserOptions. + * + * Returns: (transfer full): a newly allocated #GMimeParserOptions. + **/ +GMimeParserOptions * +g_mime_parser_options_clone (GMimeParserOptions *options) +{ + GMimeParserOptions *clone; + guint i, n = 0; + + if (options == NULL) + options = default_options; + + clone = g_slice_new (GMimeParserOptions); + clone->allow_no_domain = options->allow_no_domain; + clone->addresses = options->addresses; + clone->parameters = options->parameters; + clone->rfc2047 = options->rfc2047; + + while (options->charsets[n]) + n++; + + clone->charsets = g_malloc (sizeof (char *) * (n + 1)); + for (i = 0; i < n; i++) + clone->charsets[i] = g_strdup (options->charsets[i]); + clone->charsets[i] = NULL; + + return clone; +} + + +/** + * g_mime_parser_options_free: + * @options: a #GMimeParserOptions + * + * Frees a set of #GMimeParserOptions. + **/ +void +g_mime_parser_options_free (GMimeParserOptions *options) +{ + g_return_if_fail (options != NULL); + + if (options != default_options) { + g_strfreev (options->charsets); + g_slice_free (GMimeParserOptions, options); + } +} + + +/** + * g_mime_parser_options_get_address_compliance_mode: + * @options: (nullable): a #GMimeParserOptions or %NULL + * + * Gets the compliance mode that should be used when parsing rfc822 addresses. + * + * Note: Even in #GMIME_RFC_COMPLIANCE_STRICT mode, the address parser is fairly liberal in + * what it accepts. Setting it to #GMIME_RFC_COMPLIANCE_LOOSE just makes it try harder to + * deal with garbage input. + * + * Returns: the compliance mode that is currently set. + **/ +GMimeRfcComplianceMode +g_mime_parser_options_get_address_compliance_mode (GMimeParserOptions *options) +{ + return options ? options->addresses : default_options->addresses; +} + + +/** + * g_mime_parser_options_set_address_compliance_mode: + * @options: a #GMimeParserOptions + * @mode: a #GMimeRfcComplianceMode + * + * Sets the compliance mode that should be used when parsing rfc822 addresses. + * + * In general, you'll probably want this value to be #GMIME_RFC_COMPLIANCE_LOOSE + * (the default) as it allows maximum interoperability with existing (broken) mail clients + * and other mail software such as sloppily written perl scripts (aka spambots). + * + * Note: Even in #GMIME_RFC_COMPLIANCE_STRICT mode, the address parser is fairly liberal in + * what it accepts. Setting it to #GMIME_RFC_COMPLIANCE_LOOSE just makes it try harder to + * deal with garbage input. + **/ +void +g_mime_parser_options_set_address_compliance_mode (GMimeParserOptions *options, GMimeRfcComplianceMode mode) +{ + g_return_if_fail (options != NULL); + + options->addresses = mode; +} + + +/** + * g_mime_parser_options_get_allow_addresses_without_domain: + * @options: (nullable): a #GMimeParserOptions or %NULL + * + * Gets whether or not the rfc822 address parser should allow addresses without a domain. + * + * In general, you'll probably want this value to be %FALSE (the default) as it allows + * maximum interoperability with existing (broken) mail clients and other mail software + * such as sloppily written perl scripts (aka spambots) that do not properly quote the + * name when it contains a comma. + * + * This option exists in order to allow parsing of mailbox addresses that do not have a + * domain component. These types of addresses are rare and were typically only used when + * sending mail to other users on the same UNIX system. + * + * Returns: %TRUE if the address parser should allow addresses without a domain. + **/ +gboolean +g_mime_parser_options_get_allow_addresses_without_domain (GMimeParserOptions *options) +{ + return options ? options->allow_no_domain : default_options->allow_no_domain; +} + + +/** + * g_mime_parser_options_set_allow_addresses_without_domain: + * @options: a #GMimeParserOptions + * @allow: %TRUE if the parser should allow addresses without a domain or %FALSE otherwise + * + * Sets whether the rfc822 address parser should allow addresses without a domain. + * + * In general, you'll probably want this value to be %FALSE (the default) as it allows + * maximum interoperability with existing (broken) mail clients and other mail software + * such as sloppily written perl scripts (aka spambots) that do not properly quote the + * name when it contains a comma. + * + * This option exists in order to allow parsing of mailbox addresses that do not have a + * domain component. These types of addresses are rare and were typically only used when + * sending mail to other users on the same UNIX system. + **/ +void +g_mime_parser_options_set_allow_addresses_without_domain (GMimeParserOptions *options, gboolean allow) +{ + g_return_if_fail (options != NULL); + + options->allow_no_domain = allow; +} + + +/** + * g_mime_parser_options_get_parameter_compliance_mode: + * @options: (nullable): a #GMimeParserOptions or %NULL + * + * Gets the compliance mode that should be used when parsing Content-Type and + * Content-Disposition parameters. + * + * Note: Even in #GMIME_RFC_COMPLIANCE_STRICT mode, the parameter parser is fairly liberal + * in what it accepts. Setting it to #GMIME_RFC_COMPLIANCE_LOOSE just makes it try harder + * to deal with garbage input. + * + * Returns: the compliance mode that is currently set. + **/ +GMimeRfcComplianceMode +g_mime_parser_options_get_parameter_compliance_mode (GMimeParserOptions *options) +{ + return options ? options->parameters : default_options->parameters; +} + + +/** + * g_mime_parser_options_set_parameter_compliance_mode: + * @options: a #GMimeParserOptions + * @mode: a #GMimeRfcComplianceMode + * + * Sets the compliance mode that should be used when parsing Content-Type and + * Content-Disposition parameters. + * + * In general, you'll probably want this value to be #GMIME_RFC_COMPLIANCE_LOOSE + * (the default) as it allows maximum interoperability with existing (broken) mail clients + * and other mail software such as sloppily written perl scripts (aka spambots). + * + * Note: Even in #GMIME_RFC_COMPLIANCE_STRICT mode, the parameter parser is fairly liberal + * in what it accepts. Setting it to #GMIME_RFC_COMPLIANCE_LOOSE just makes it try harder + * to deal with garbage input. + **/ +void +g_mime_parser_options_set_parameter_compliance_mode (GMimeParserOptions *options, GMimeRfcComplianceMode mode) +{ + g_return_if_fail (options != NULL); + + options->parameters = mode; +} + + +/** + * g_mime_parser_options_get_rfc2047_compliance_mode: + * @options: (nullable): a #GMimeParserOptions or %NULL + * + * Gets the compliance mode that should be used when parsing rfc2047 encoded words. + * + * Note: Even in #GMIME_RFC_COMPLIANCE_STRICT mode, the rfc2047 parser is fairly liberal + * in what it accepts. Setting it to #GMIME_RFC_COMPLIANCE_LOOSE just makes it try harder + * to deal with garbage input. + * + * Returns: the compliance mode that is currently set. + **/ +GMimeRfcComplianceMode +g_mime_parser_options_get_rfc2047_compliance_mode (GMimeParserOptions *options) +{ + return options ? options->rfc2047 : default_options->rfc2047; +} + + +/** + * g_mime_parser_options_set_rfc2047_compliance_mode: + * @options: a #GMimeParserOptions + * @mode: a #GMimeRfcComplianceMode + * + * Sets the compliance mode that should be used when parsing rfc2047 encoded words. + * + * In general, you'll probably want this value to be #GMIME_RFC_COMPLIANCE_LOOSE + * (the default) as it allows maximum interoperability with existing (broken) mail clients + * and other mail software such as sloppily written perl scripts (aka spambots). + * + * Note: Even in #GMIME_RFC_COMPLIANCE_STRICT mode, the parameter parser is fairly liberal + * in what it accepts. Setting it to #GMIME_RFC_COMPLIANCE_LOOSE just makes it try harder + * to deal with garbage input. + **/ +void +g_mime_parser_options_set_rfc2047_compliance_mode (GMimeParserOptions *options, GMimeRfcComplianceMode mode) +{ + g_return_if_fail (options != NULL); + + options->rfc2047 = mode; +} + + +/** + * g_mime_parser_options_get_fallback_charsets: + * @options: (nullable): a #GMimeParserOptions or %NULL + * + * Gets the fallback charsets to try when decoding 8-bit headers. + * + * Returns: (transfer none): a %NULL-terminated list of charsets to try when + * decoding 8-bit headers. + **/ +const char ** +g_mime_parser_options_get_fallback_charsets (GMimeParserOptions *options) +{ + return (const char **) (options ? options->charsets : default_options->charsets); +} + + +/** + * g_mime_parser_options_set_fallback_charsets: + * @options: a #GMimeParserOptions + * @charsets: a %NULL-terminated list of charsets or %NULL for the default list + * + * Sets the fallback charsets to try when decoding 8-bit headers. + * + * Note: It is recommended that the list of charsets start with utf-8 + * and end with iso-8859-1. + **/ +void +g_mime_parser_options_set_fallback_charsets (GMimeParserOptions *options, const char **charsets) +{ + guint i, n = 0; + + g_return_if_fail (options != NULL); + + g_strfreev (options->charsets); + + if (charsets == NULL || *charsets == NULL) + charsets = (const char **) default_charsets; + + while (charsets[n] != NULL) + n++; + + options->charsets = g_malloc (sizeof (char *) * (n + 1)); + for (i = 0; i < n; i++) + options->charsets[i] = g_strdup (charsets[i]); + options->charsets[n] = NULL; +} diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-parser-options.h gmime-3.0.1/gmime/gmime-parser-options.h --- gmime-2.6.22+dfsg2/gmime/gmime-parser-options.h 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-parser-options.h 2017-04-23 16:04:10.000000000 +0000 @@ -0,0 +1,78 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2017 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_PARSER_OPTIONS_H__ +#define __GMIME_PARSER_OPTIONS_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_PARSER_OPTIONS (gmime_parser_options_get_type ()) + +/** + * GMimeRfcComplianceMode: + * @GMIME_RFC_COMPLIANCE_LOOSE: Attempt to be much more liberal accepting broken and/or invalid formatting. + * @GMIME_RFC_COMPLIANCE_STRICT: Do not attempt to be overly liberal in accepting broken and/or invalid formatting. + * + * An RFC compliance mode. + **/ +typedef enum { + GMIME_RFC_COMPLIANCE_LOOSE, + GMIME_RFC_COMPLIANCE_STRICT +} GMimeRfcComplianceMode; + +/** + * GMimeParserOptions: + * + * A set of parser options used by #GMimeParser and various other parsing functions. + **/ +typedef struct _GMimeParserOptions GMimeParserOptions; + + +GType g_mime_parser_options_get_type (void); + +GMimeParserOptions *g_mime_parser_options_get_default (void); + +GMimeParserOptions *g_mime_parser_options_new (void); +void g_mime_parser_options_free (GMimeParserOptions *options); + +GMimeParserOptions *g_mime_parser_options_clone (GMimeParserOptions *options); + +GMimeRfcComplianceMode g_mime_parser_options_get_address_compliance_mode (GMimeParserOptions *options); +void g_mime_parser_options_set_address_compliance_mode (GMimeParserOptions *options, GMimeRfcComplianceMode mode); + +gboolean g_mime_parser_options_get_allow_addresses_without_domain (GMimeParserOptions *options); +void g_mime_parser_options_set_allow_addresses_without_domain (GMimeParserOptions *options, gboolean allow); + +GMimeRfcComplianceMode g_mime_parser_options_get_parameter_compliance_mode (GMimeParserOptions *options); +void g_mime_parser_options_set_parameter_compliance_mode (GMimeParserOptions *options, GMimeRfcComplianceMode mode); + +GMimeRfcComplianceMode g_mime_parser_options_get_rfc2047_compliance_mode (GMimeParserOptions *options); +void g_mime_parser_options_set_rfc2047_compliance_mode (GMimeParserOptions *options, GMimeRfcComplianceMode mode); + +const char **g_mime_parser_options_get_fallback_charsets (GMimeParserOptions *options); +void g_mime_parser_options_set_fallback_charsets (GMimeParserOptions *options, const char **charsets); + +G_END_DECLS + +#endif /* __GMIME_PARSER_OPTIONS_H__ */ diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-parse-utils.c gmime-3.0.1/gmime/gmime-parse-utils.c --- gmime-2.6.22+dfsg2/gmime/gmime-parse-utils.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-parse-utils.c 2017-03-28 23:46:26.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -56,7 +56,7 @@ register const char *inptr; const char *start = *in; - decode_lwsp (&start); + skip_cfws (&start); inptr = start; /* decode the type */ @@ -66,7 +66,7 @@ *type = g_strndup (start, (size_t) (inptr - start)); start = inptr; - decode_lwsp (&start); + skip_cfws (&start); /* check for type/subtype delimeter */ if (*start++ != '/') { @@ -76,7 +76,7 @@ return FALSE; } - decode_lwsp (&start); + skip_cfws (&start); inptr = start; /* decode the subtype */ @@ -101,41 +101,178 @@ /** - * g_mime_decode_lwsp: - * @in: address of input text string + * g_mime_skip_comment: + * @in: address of input string + * + * Skips a comment. * - * Skips past any LWSP or rfc822 comments in *@in and updates @in. + * Returns: %TRUE on success or %FALSE otherwise. **/ -void -g_mime_decode_lwsp (const char **in) +gboolean +g_mime_skip_comment (const char **in) { - const char *inptr = *in; + register const char *inptr = *in; + int depth = 1; - while (*inptr && (*inptr == '(' || is_lwsp (*inptr))) { - while (*inptr && is_lwsp (*inptr)) + /* skip over the '(' */ + inptr++; + while (*inptr && depth) { + if (*inptr == '\\' && *(inptr + 1)) inptr++; + else if (*inptr == '(') + depth++; + else if (*inptr == ')') + depth--; - /* skip over any comments */ - if (*inptr == '(') { - int depth = 1; - - inptr++; - while (*inptr && depth) { - if (*inptr == '\\' && *(inptr + 1)) - inptr++; - else if (*inptr == '(') - depth++; - else if (*inptr == ')') - depth--; - - inptr++; - } + inptr++; + } + + *in = inptr; + + return depth == 0; +} + + +/** + * g_mime_skip_lwsp: + * @in: address of input string + * + * Skips whitespace. + * + * Returns: %TRUE if any input was skipped or %FALSE otherwise. + **/ +gboolean +g_mime_skip_lwsp (const char **in) +{ + register const char *inptr = *in; + const char *start = inptr; + + while (is_lwsp (*inptr)) + inptr++; + + *in = inptr; + + return inptr > start; +} + + +/** + * g_mime_skip_cfws: + * @in: address of input string + * + * Skips comments and whitespace. + * + * Returns: %TRUE on success or %FALSE on error. + **/ +gboolean +g_mime_skip_cfws (const char **in) +{ + const char *inptr = *in; + + skip_lwsp (&inptr); + + while (*inptr == '(') { + if (!skip_comment (&inptr)) + return FALSE; + + skip_lwsp (&inptr); + } + + *in = inptr; + + return TRUE; +} + + +/** + * g_mime_skip_quoted: + * @in: address of input string + * + * Skips a quoted string. + * + * Returns: %TRUE on success or %FALSE on error. + **/ +gboolean +g_mime_skip_quoted (const char **in) +{ + register const char *inptr = *in; + gboolean escaped = FALSE; + + /* skip over leading '"' */ + inptr++; + + while (*inptr) { + if (*inptr == '\\') { + escaped = !escaped; + } else if (!escaped) { + if (*inptr == '"') + break; + } else { + escaped = FALSE; } + + inptr++; + } + + if (*inptr == '\0') { + *in = inptr; + + return FALSE; } + /* skip over the closing '"' */ + inptr++; + *in = inptr; + + return TRUE; } + +/** + * g_mime_skip_atom: + * @in: address of input string + * + * Skips an atom. + * + * Returns: %TRUE if any input was skipped or %FALSE otherwise. + **/ +gboolean +g_mime_skip_atom (const char **in) +{ + register const char *inptr = *in; + const char *start = inptr; + + while (is_atom (*inptr)) + inptr++; + + *in = inptr; + + return inptr > start; +} + + +/** + * g_mime_skip_word: + * @in: address of input string + * + * Skips a word token. + * + * Returns: %TRUE on success or %FALSE otherwise. + **/ +gboolean +g_mime_skip_word (const char **in) +{ + if (**in == '"') + return skip_quoted (in); + + if (is_atom (**in)) + return skip_atom (in); + + return FALSE; +} + + static const char * decode_quoted_string (const char **in) { @@ -195,7 +332,7 @@ { const char *inptr = *in; - decode_lwsp (&inptr); + skip_cfws (&inptr); if (*inptr == '"') { *in = inptr; return decode_quoted_string (in); @@ -216,10 +353,11 @@ g_string_append_c (domain, *inptr); inptr++; got = TRUE; - } else if (is_lwsp (*inptr)) - decode_lwsp (&inptr); - else + } else if (is_lwsp (*inptr)) { + skip_cfws (&inptr); + } else { break; + } } *in = inptr; @@ -232,7 +370,7 @@ { const char *inptr = *in; - decode_lwsp (&inptr); + skip_cfws (&inptr); while (*inptr && *inptr != ']') { if (decode_subliteral (&inptr, domain) && *inptr == '.') { g_string_append_c (domain, *inptr); @@ -268,7 +406,7 @@ inptr = *in; while (inptr && *inptr) { - decode_lwsp (&inptr); + skip_cfws (&inptr); if (*inptr == '[') { /* domain literal */ g_string_append_c (domain, '['); @@ -294,7 +432,7 @@ } save = inptr; - decode_lwsp (&inptr); + skip_cfws (&inptr); if (*inptr != '.') { inptr = save; break; @@ -308,3 +446,97 @@ return domain->len > initial; } + + +char * +g_mime_decode_addrspec (const char **in) +{ + const char *word, *inptr; + GString *addrspec; + char *str; + + skip_cfws (in); + inptr = *in; + + if (!(word = decode_word (&inptr))) { + w(g_warning ("No local-part in addr-spec: %s", *in)); + return NULL; + } + + addrspec = g_string_new (""); + g_string_append_len (addrspec, word, (size_t) (inptr - word)); + + /* get the rest of the local-part */ + skip_cfws (&inptr); + while (*inptr == '.') { + g_string_append_c (addrspec, *inptr++); + if ((word = decode_word (&inptr))) { + g_string_append_len (addrspec, word, (size_t) (inptr - word)); + skip_cfws (&inptr); + } else { + w(g_warning ("Invalid local-part in addr-spec: %s", *in)); + goto exception; + } + } + + /* we should be at the '@' now... */ + if (*inptr++ != '@') { + w(g_warning ("Invalid addr-spec; missing '@': %s", *in)); + goto exception; + } + + g_string_append_c (addrspec, '@'); + if (!decode_domain (&inptr, addrspec)) { + w(g_warning ("No domain in addr-spec: %s", *in)); + goto exception; + } + + str = addrspec->str; + g_string_free (addrspec, FALSE); + + *in = inptr; + + return str; + + exception: + + g_string_free (addrspec, TRUE); + + return NULL; +} + +char * +g_mime_decode_msgid (const char **in) +{ + const char *inptr = *in; + char *msgid = NULL; + + skip_cfws (&inptr); + if (*inptr != '<') { + w(g_warning ("Invalid msg-id; missing '<': %s", *in)); + } else { + inptr++; + } + + skip_cfws (&inptr); + if ((msgid = decode_addrspec (&inptr))) { + skip_cfws (&inptr); + if (*inptr != '>') { + w(g_warning ("Invalid msg-id; missing '>': %s", *in)); + } else { + inptr++; + } + + *in = inptr; + } else { + w(g_warning ("Invalid msg-id; missing addr-spec: %s", *in)); + *in = inptr; + while (*inptr && *inptr != '>') + inptr++; + + msgid = g_strndup (*in, (size_t) (inptr - *in)); + *in = inptr; + } + + return msgid; +} diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-parse-utils.h gmime-3.0.1/gmime/gmime-parse-utils.h --- gmime-2.6.22+dfsg2/gmime/gmime-parse-utils.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-parse-utils.h 2017-03-28 23:46:26.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -22,12 +22,30 @@ #ifndef __GMIME_PARSE_UTILS_H__ #define __GMIME_PARSE_UTILS_H__ +#include + G_BEGIN_DECLS G_GNUC_INTERNAL gboolean g_mime_parse_content_type (const char **in, char **type, char **subtype); -G_GNUC_INTERNAL void g_mime_decode_lwsp (const char **in); -#define decode_lwsp(in) g_mime_decode_lwsp (in) +G_GNUC_INTERNAL gboolean g_mime_skip_comment (const char **in); +#define skip_comment(in) g_mime_skip_comment (in) + +G_GNUC_INTERNAL gboolean g_mime_skip_lwsp (const char **in); +#define skip_lwsp(in) g_mime_skip_lwsp (in) + +G_GNUC_INTERNAL gboolean g_mime_skip_cfws (const char **in); +#define skip_cfws(in) g_mime_skip_cfws (in) + +G_GNUC_INTERNAL gboolean g_mime_skip_quoted (const char **in); +#define skip_quoted(in) g_mime_skip_quoted (in) + +G_GNUC_INTERNAL gboolean g_mime_skip_atom (const char **in); +#define skip_atom(in) g_mime_skip_atom (in) + +G_GNUC_INTERNAL gboolean g_mime_skip_word (const char **in); +#define skip_word(in) g_mime_skip_word (in) + G_GNUC_INTERNAL const char *g_mime_decode_word (const char **in); #define decode_word(in) g_mime_decode_word (in) @@ -35,6 +53,13 @@ G_GNUC_INTERNAL gboolean g_mime_decode_domain (const char **in, GString *domain); #define decode_domain(in, domain) g_mime_decode_domain (in, domain) + +G_GNUC_INTERNAL char *g_mime_decode_addrspec (const char **in); +#define decode_addrspec(in) g_mime_decode_addrspec (in) + +G_GNUC_INTERNAL char *g_mime_decode_msgid (const char **in); +#define decode_msgid(in) g_mime_decode_msgid (in) + G_END_DECLS #endif /* __GMIME_PARSE_UTILS_H__ */ diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-part.c gmime-3.0.1/gmime/gmime-part.c --- gmime-2.6.22+dfsg2/gmime/gmime-part.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-part.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -28,17 +28,20 @@ #include #include "gmime-part.h" +#include "gmime-error.h" #include "gmime-utils.h" #include "gmime-common.h" +#include "gmime-internal.h" #include "gmime-stream-mem.h" #include "gmime-stream-null.h" #include "gmime-stream-filter.h" #include "gmime-filter-basic.h" #include "gmime-filter-best.h" -#include "gmime-filter-crlf.h" -#include "gmime-filter-md5.h" +#include "gmime-filter-checksum.h" +#include "gmime-filter-unix2dos.h" #include "gmime-table-private.h" +#define _(x) x #define d(x) @@ -58,15 +61,17 @@ static void g_mime_part_finalize (GObject *object); /* GMimeObject class methods */ -static void mime_part_prepend_header (GMimeObject *object, const char *header, const char *value); -static void mime_part_append_header (GMimeObject *object, const char *header, const char *value); -static void mime_part_set_header (GMimeObject *object, const char *header, const char *value); -static gboolean mime_part_remove_header (GMimeObject *object, const char *header); -static ssize_t mime_part_write_to_stream (GMimeObject *object, GMimeStream *stream); +static void mime_part_header_added (GMimeObject *object, GMimeHeader *header); +static void mime_part_header_changed (GMimeObject *object, GMimeHeader *header); +static void mime_part_header_removed (GMimeObject *object, GMimeHeader *header); +static void mime_part_headers_cleared (GMimeObject *object); + +static ssize_t mime_part_write_to_stream (GMimeObject *object, GMimeFormatOptions *options, + gboolean content_only, GMimeStream *stream); static void mime_part_encode (GMimeObject *object, GMimeEncodingConstraint constraint); /* GMimePart class methods */ -static void set_content_object (GMimePart *mime_part, GMimeDataWrapper *content); +static void set_content (GMimePart *mime_part, GMimeDataWrapper *content); static GMimeObjectClass *parent_class = NULL; @@ -107,14 +112,14 @@ gobject_class->finalize = g_mime_part_finalize; - object_class->prepend_header = mime_part_prepend_header; - object_class->append_header = mime_part_append_header; - object_class->remove_header = mime_part_remove_header; - object_class->set_header = mime_part_set_header; + object_class->header_added = mime_part_header_added; + object_class->header_changed = mime_part_header_changed; + object_class->header_removed = mime_part_header_removed; + object_class->headers_cleared = mime_part_headers_cleared; object_class->write_to_stream = mime_part_write_to_stream; object_class->encode = mime_part_encode; - klass->set_content_object = set_content_object; + klass->set_content = set_content; } static void @@ -176,37 +181,43 @@ } static gboolean -process_header (GMimeObject *object, const char *header, const char *value) +process_header (GMimeObject *object, GMimeHeader *header) { GMimePart *mime_part = (GMimePart *) object; + const char *name, *value; char encoding[32]; guint i; - if (g_ascii_strncasecmp (header, "Content-", 8) != 0) + name = g_mime_header_get_name (header); + + if (g_ascii_strncasecmp (name, "Content-", 8) != 0) return FALSE; for (i = 0; i < G_N_ELEMENTS (content_headers); i++) { - if (!g_ascii_strcasecmp (content_headers[i] + 8, header + 8)) + if (!g_ascii_strcasecmp (content_headers[i] + 8, name + 8)) break; } switch (i) { case HEADER_CONTENT_TRANSFER_ENCODING: + value = g_mime_header_get_value (header); copy_atom (value, encoding, sizeof (encoding) - 1); mime_part->encoding = g_mime_content_encoding_from_string (encoding); break; case HEADER_CONTENT_DESCRIPTION: - /* FIXME: we should decode this */ + value = g_mime_header_get_value (header); g_free (mime_part->content_description); - mime_part->content_description = g_mime_strdup_trim (value); + mime_part->content_description = g_strdup (value); break; case HEADER_CONTENT_LOCATION: + value = g_mime_header_get_value (header); g_free (mime_part->content_location); - mime_part->content_location = g_mime_strdup_trim (value); + mime_part->content_location = g_strdup (value); break; case HEADER_CONTENT_MD5: + value = g_mime_header_get_value (header); g_free (mime_part->content_md5); - mime_part->content_md5 = g_mime_strdup_trim (value); + mime_part->content_md5 = g_strdup (value); break; default: return FALSE; @@ -216,41 +227,35 @@ } static void -mime_part_prepend_header (GMimeObject *object, const char *header, const char *value) +mime_part_header_added (GMimeObject *object, GMimeHeader *header) { - if (!process_header (object, header, value)) - GMIME_OBJECT_CLASS (parent_class)->prepend_header (object, header, value); - else - g_mime_header_list_prepend (object->headers, header, value); + if (process_header (object, header)) + return; + + GMIME_OBJECT_CLASS (parent_class)->header_added (object, header); } static void -mime_part_append_header (GMimeObject *object, const char *header, const char *value) +mime_part_header_changed (GMimeObject *object, GMimeHeader *header) { - if (!process_header (object, header, value)) - GMIME_OBJECT_CLASS (parent_class)->append_header (object, header, value); - else - g_mime_header_list_append (object->headers, header, value); + if (process_header (object, header)) + return; + + GMIME_OBJECT_CLASS (parent_class)->header_changed (object, header); } static void -mime_part_set_header (GMimeObject *object, const char *header, const char *value) -{ - if (!process_header (object, header, value)) - GMIME_OBJECT_CLASS (parent_class)->set_header (object, header, value); - else - g_mime_header_list_set (object->headers, header, value); -} - -static gboolean -mime_part_remove_header (GMimeObject *object, const char *header) +mime_part_header_removed (GMimeObject *object, GMimeHeader *header) { GMimePart *mime_part = (GMimePart *) object; + const char *name; guint i; - if (!g_ascii_strncasecmp (header, "Content-", 8)) { + name = g_mime_header_get_name (header); + + if (!g_ascii_strncasecmp (name, "Content-", 8)) { for (i = 0; i < G_N_ELEMENTS (content_headers); i++) { - if (!g_ascii_strcasecmp (content_headers[i] + 8, header + 8)) + if (!g_ascii_strcasecmp (content_headers[i] + 8, name + 8)) break; } @@ -275,13 +280,33 @@ } } - return GMIME_OBJECT_CLASS (parent_class)->remove_header (object, header); + GMIME_OBJECT_CLASS (parent_class)->header_removed (object, header); +} + +static void +mime_part_headers_cleared (GMimeObject *object) +{ + GMimePart *mime_part = (GMimePart *) object; + + mime_part->encoding = GMIME_CONTENT_ENCODING_DEFAULT; + g_free (mime_part->content_description); + mime_part->content_description = NULL; + g_free (mime_part->content_location); + mime_part->content_location = NULL; + g_free (mime_part->content_md5); + mime_part->content_md5 = NULL; + + GMIME_OBJECT_CLASS (parent_class)->headers_cleared (object); } + static ssize_t -write_content (GMimePart *part, GMimeStream *stream) +write_content (GMimePart *part, GMimeFormatOptions *options, GMimeStream *stream) { + GMimeObject *object = (GMimeObject *) part; ssize_t nwritten, total = 0; + GMimeStream *filtered; + GMimeFilter *filter; if (!part->content) return 0; @@ -293,16 +318,17 @@ */ if (part->encoding != g_mime_data_wrapper_get_encoding (part->content)) { - GMimeStream *filtered_stream; + const char *newline = g_mime_format_options_get_newline (options); const char *filename; - GMimeFilter *filter; + + filtered = g_mime_stream_filter_new (stream); switch (part->encoding) { case GMIME_CONTENT_ENCODING_UUENCODE: - filename = g_mime_part_get_filename (part); - nwritten = g_mime_stream_printf (stream, "begin 0644 %s\n", - filename ? filename : "unknown"); - if (nwritten == -1) + if (!(filename = g_mime_part_get_filename (part))) + filename = "unknown"; + + if ((nwritten = g_mime_stream_printf (stream, "begin 0644 %s%s", filename, newline)) == -1) return -1; total += nwritten; @@ -310,20 +336,23 @@ /* fall thru... */ case GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE: case GMIME_CONTENT_ENCODING_BASE64: - filtered_stream = g_mime_stream_filter_new (stream); filter = g_mime_filter_basic_new (part->encoding, TRUE); - g_mime_stream_filter_add (GMIME_STREAM_FILTER (filtered_stream), filter); + g_mime_stream_filter_add ((GMimeStreamFilter *) filtered, filter); g_object_unref (filter); break; default: - filtered_stream = stream; - g_object_ref (stream); break; } - nwritten = g_mime_data_wrapper_write_to_stream (part->content, filtered_stream); - g_mime_stream_flush (filtered_stream); - g_object_unref (filtered_stream); + if (part->encoding != GMIME_CONTENT_ENCODING_BINARY) { + filter = g_mime_format_options_create_newline_filter (options, object->ensure_newline); + g_mime_stream_filter_add ((GMimeStreamFilter *) filtered, filter); + g_object_unref (filter); + } + + nwritten = g_mime_data_wrapper_write_to_stream (part->content, filtered); + g_mime_stream_flush (filtered); + g_object_unref (filtered); if (nwritten == -1) return -1; @@ -331,20 +360,29 @@ total += nwritten; if (part->encoding == GMIME_CONTENT_ENCODING_UUENCODE) { - /* FIXME: get rid of this special-case x-uuencode crap */ - nwritten = g_mime_stream_write (stream, "end\n", 4); - if (nwritten == -1) + if ((nwritten = g_mime_stream_printf (stream, "end%s", newline)) == -1) return -1; total += nwritten; } } else { - GMimeStream *content_stream; + GMimeStream *content; + + content = g_mime_data_wrapper_get_stream (part->content); + g_mime_stream_reset (content); + + filtered = g_mime_stream_filter_new (stream); + + if (part->encoding != GMIME_CONTENT_ENCODING_BINARY) { + filter = g_mime_format_options_create_newline_filter (options, object->ensure_newline); + g_mime_stream_filter_add ((GMimeStreamFilter *) filtered, filter); + g_object_unref (filter); + } - content_stream = g_mime_data_wrapper_get_stream (part->content); - g_mime_stream_reset (content_stream); - nwritten = g_mime_stream_write_to_stream (content_stream, stream); - g_mime_stream_reset (content_stream); + nwritten = g_mime_stream_write_to_stream (content, filtered); + g_mime_stream_flush (filtered); + g_mime_stream_reset (content); + g_object_unref (filtered); if (nwritten == -1) return -1; @@ -356,24 +394,28 @@ } static ssize_t -mime_part_write_to_stream (GMimeObject *object, GMimeStream *stream) +mime_part_write_to_stream (GMimeObject *object, GMimeFormatOptions *options, gboolean content_only, GMimeStream *stream) { GMimePart *mime_part = (GMimePart *) object; ssize_t nwritten, total = 0; + const char *newline; - /* write the content headers */ - if ((nwritten = g_mime_header_list_write_to_stream (object->headers, stream)) == -1) - return -1; - - total += nwritten; - - /* terminate the headers */ - if (g_mime_stream_write (stream, "\n", 1) == -1) - return -1; - - total++; + if (!content_only) { + /* write the content headers */ + if ((nwritten = g_mime_header_list_write_to_stream (object->headers, options, stream)) == -1) + return -1; + + total += nwritten; + + /* terminate the headers */ + newline = g_mime_format_options_get_newline (options); + if ((nwritten = g_mime_stream_write_string (stream, newline)) == -1) + return -1; + + total += nwritten; + } - if ((nwritten = write_content (mime_part, stream)) == -1) + if ((nwritten = write_content (mime_part, options, stream)) == -1) return -1; total += nwritten; @@ -421,7 +463,7 @@ g_mime_stream_filter_add ((GMimeStreamFilter *) stream, filter); g_object_unref (null); - g_mime_object_write_to_stream (object, stream); + g_mime_data_wrapper_write_to_stream (part->content, stream); g_object_unref (stream); encoding = g_mime_filter_best_encoding ((GMimeFilterBest *) filter, constraint); @@ -434,24 +476,15 @@ * g_mime_part_new: * * Creates a new MIME Part object with a default content-type of - * text/plain. + * application/octet-stream. * * Returns: an empty MIME Part object with a default content-type of - * text/plain. + * application/octet-stream. **/ GMimePart * g_mime_part_new (void) { - GMimeContentType *content_type; - GMimePart *mime_part; - - mime_part = g_object_newv (GMIME_TYPE_PART, 0, NULL); - - content_type = g_mime_content_type_new ("text", "plain"); - g_mime_object_set_content_type (GMIME_OBJECT (mime_part), content_type); - g_object_unref (content_type); - - return mime_part; + return g_mime_part_new_with_type ("application", "octet-stream"); } @@ -470,10 +503,10 @@ GMimeContentType *content_type; GMimePart *mime_part; - mime_part = g_object_newv (GMIME_TYPE_PART, 0, NULL); + mime_part = g_object_new (GMIME_TYPE_PART, NULL); content_type = g_mime_content_type_new (type, subtype); - g_mime_object_set_content_type (GMIME_OBJECT (mime_part), content_type); + g_mime_object_set_content_type ((GMimeObject *) mime_part, content_type); g_object_unref (content_type); return mime_part; @@ -490,6 +523,8 @@ void g_mime_part_set_content_description (GMimePart *mime_part, const char *description) { + GMimeObject *object = (GMimeObject *) mime_part; + g_return_if_fail (GMIME_IS_PART (mime_part)); if (mime_part->content_description == description) @@ -497,7 +532,10 @@ g_free (mime_part->content_description); mime_part->content_description = g_strdup (description); - g_mime_header_list_set (GMIME_OBJECT (mime_part)->headers, "Content-Description", description); + + _g_mime_object_block_header_list_changed (object); + g_mime_header_list_set (object->headers, "Content-Description", description, NULL); + _g_mime_object_unblock_header_list_changed (object); } @@ -531,7 +569,7 @@ { g_return_if_fail (GMIME_IS_PART (mime_part)); - g_mime_object_set_content_id (GMIME_OBJECT (mime_part), content_id); + g_mime_object_set_content_id ((GMimeObject *) mime_part, content_id); } @@ -549,7 +587,7 @@ { g_return_val_if_fail (GMIME_IS_PART (mime_part), NULL); - return g_mime_object_get_content_id (GMIME_OBJECT (mime_part)); + return g_mime_object_get_content_id ((GMimeObject *) mime_part); } @@ -563,11 +601,11 @@ void g_mime_part_set_content_md5 (GMimePart *mime_part, const char *content_md5) { + GMimeObject *object = (GMimeObject *) mime_part; unsigned char digest[16], b64digest[32]; - GMimeStreamFilter *filtered_stream; GMimeContentType *content_type; - GMimeFilter *md5_filter; - GMimeStream *stream; + GMimeStream *filtered, *stream; + GMimeFilter *filter; guint32 save = 0; int state = 0; size_t len; @@ -579,28 +617,25 @@ if (!content_md5) { /* compute a md5sum */ stream = g_mime_stream_null_new (); - filtered_stream = (GMimeStreamFilter *) g_mime_stream_filter_new (stream); + filtered = g_mime_stream_filter_new (stream); g_object_unref (stream); content_type = g_mime_object_get_content_type ((GMimeObject *) mime_part); if (g_mime_content_type_is_type (content_type, "text", "*")) { - GMimeFilter *crlf_filter; - - crlf_filter = g_mime_filter_crlf_new (TRUE, FALSE); - g_mime_stream_filter_add (filtered_stream, crlf_filter); - g_object_unref (crlf_filter); + filter = g_mime_filter_unix2dos_new (FALSE); + g_mime_stream_filter_add ((GMimeStreamFilter *) filtered, filter); + g_object_unref (filter); } - md5_filter = g_mime_filter_md5_new (); - g_mime_stream_filter_add (filtered_stream, md5_filter); + filter = g_mime_filter_checksum_new (G_CHECKSUM_MD5); + g_mime_stream_filter_add ((GMimeStreamFilter *) filtered, filter); - stream = (GMimeStream *) filtered_stream; - g_mime_data_wrapper_write_to_stream (mime_part->content, stream); - g_object_unref (stream); + g_mime_data_wrapper_write_to_stream (mime_part->content, filtered); + g_object_unref (filtered); memset (digest, 0, 16); - g_mime_filter_md5_get_digest ((GMimeFilterMd5 *) md5_filter, digest); - g_object_unref (md5_filter); + g_mime_filter_checksum_get_digest ((GMimeFilterChecksum *) filter, digest, 16); + g_object_unref (filter); len = g_mime_encoding_base64_encode_close (digest, 16, b64digest, &state, &save); b64digest[len] = '\0'; @@ -610,7 +645,10 @@ } mime_part->content_md5 = g_strdup (content_md5); - g_mime_header_list_set (GMIME_OBJECT (mime_part)->headers, "Content-Md5", content_md5); + + _g_mime_object_block_header_list_changed (object); + g_mime_header_list_set (object->headers, "Content-Md5", content_md5, NULL); + _g_mime_object_unblock_header_list_changed (object); } @@ -627,43 +665,39 @@ g_mime_part_verify_content_md5 (GMimePart *mime_part) { unsigned char digest[16], b64digest[32]; - GMimeStreamFilter *filtered_stream; GMimeContentType *content_type; - GMimeFilter *md5_filter; - GMimeStream *stream; + GMimeStream *filtered, *stream; + GMimeFilter *filter; guint32 save = 0; int state = 0; size_t len; g_return_val_if_fail (GMIME_IS_PART (mime_part), FALSE); - g_return_val_if_fail (mime_part->content != NULL, FALSE); + g_return_val_if_fail (GMIME_IS_DATA_WRAPPER (mime_part->content), FALSE); if (!mime_part->content_md5) return FALSE; stream = g_mime_stream_null_new (); - filtered_stream = (GMimeStreamFilter *) g_mime_stream_filter_new (stream); + filtered = g_mime_stream_filter_new (stream); g_object_unref (stream); content_type = g_mime_object_get_content_type ((GMimeObject *) mime_part); if (g_mime_content_type_is_type (content_type, "text", "*")) { - GMimeFilter *crlf_filter; - - crlf_filter = g_mime_filter_crlf_new (TRUE, FALSE); - g_mime_stream_filter_add (filtered_stream, crlf_filter); - g_object_unref (crlf_filter); + filter = g_mime_filter_unix2dos_new (FALSE); + g_mime_stream_filter_add ((GMimeStreamFilter *) filtered, filter); + g_object_unref (filter); } - md5_filter = g_mime_filter_md5_new (); - g_mime_stream_filter_add (filtered_stream, md5_filter); + filter = g_mime_filter_checksum_new (G_CHECKSUM_MD5); + g_mime_stream_filter_add ((GMimeStreamFilter *) filtered, filter); - stream = (GMimeStream *) filtered_stream; - g_mime_data_wrapper_write_to_stream (mime_part->content, stream); - g_object_unref (stream); + g_mime_data_wrapper_write_to_stream (mime_part->content, filtered); + g_object_unref (filtered); memset (digest, 0, 16); - g_mime_filter_md5_get_digest ((GMimeFilterMd5 *) md5_filter, digest); - g_object_unref (md5_filter); + g_mime_filter_checksum_get_digest ((GMimeFilterChecksum *) filter, digest, 16); + g_object_unref (filter); len = g_mime_encoding_base64_encode_close (digest, 16, b64digest, &state, &save); b64digest[len] = '\0'; @@ -701,6 +735,8 @@ void g_mime_part_set_content_location (GMimePart *mime_part, const char *content_location) { + GMimeObject *object = (GMimeObject *) mime_part; + g_return_if_fail (GMIME_IS_PART (mime_part)); if (mime_part->content_location == content_location) @@ -708,7 +744,10 @@ g_free (mime_part->content_location); mime_part->content_location = g_strdup (content_location); - g_mime_header_list_set (GMIME_OBJECT (mime_part)->headers, "Content-Location", content_location); + + _g_mime_object_block_header_list_changed (object); + g_mime_header_list_set (object->headers, "Content-Location", content_location, NULL); + _g_mime_object_block_header_list_changed (object); } @@ -740,11 +779,17 @@ void g_mime_part_set_content_encoding (GMimePart *mime_part, GMimeContentEncoding encoding) { + GMimeObject *object = (GMimeObject *) mime_part; + const char *value; + g_return_if_fail (GMIME_IS_PART (mime_part)); + value = g_mime_content_encoding_to_string (encoding); mime_part->encoding = encoding; - g_mime_header_list_set (GMIME_OBJECT (mime_part)->headers, "Content-Transfer-Encoding", - g_mime_content_encoding_to_string (encoding)); + + _g_mime_object_block_header_list_changed (object); + g_mime_header_list_set (object->headers, "Content-Transfer-Encoding", value, NULL); + _g_mime_object_block_header_list_changed (object); } @@ -812,8 +857,6 @@ * value of the Content-Disposition header. * * Returns: %TRUE if the part is an attachment, otherwise %FALSE. - * - * Since: 2.6.21 **/ gboolean g_mime_part_is_attachment (GMimePart *mime_part) @@ -878,7 +921,7 @@ static void -set_content_object (GMimePart *mime_part, GMimeDataWrapper *content) +set_content (GMimePart *mime_part, GMimeDataWrapper *content) { if (mime_part->content) g_object_unref (mime_part->content); @@ -889,26 +932,26 @@ /** - * g_mime_part_set_content_object: + * g_mime_part_set_content: * @mime_part: a #GMimePart object * @content: a #GMimeDataWrapper content object * - * Sets the content object on the mime part. + * Sets the content on the mime part. **/ void -g_mime_part_set_content_object (GMimePart *mime_part, GMimeDataWrapper *content) +g_mime_part_set_content (GMimePart *mime_part, GMimeDataWrapper *content) { g_return_if_fail (GMIME_IS_PART (mime_part)); if (mime_part->content == content) return; - GMIME_PART_GET_CLASS (mime_part)->set_content_object (mime_part, content); + GMIME_PART_GET_CLASS (mime_part)->set_content (mime_part, content); } /** - * g_mime_part_get_content_object: + * g_mime_part_get_content: * @mime_part: a #GMimePart object * * Gets the internal data-wrapper of the specified mime part, or %NULL @@ -918,9 +961,279 @@ * contents. **/ GMimeDataWrapper * -g_mime_part_get_content_object (GMimePart *mime_part) +g_mime_part_get_content (GMimePart *mime_part) { g_return_val_if_fail (GMIME_IS_PART (mime_part), NULL); return mime_part->content; } + + +/** + * g_mime_part_set_openpgp_data: + * @mime_part: a #GMimePart + * @data: a #GMimeOpenPGPData + * + * Sets whether or not (and what type) of OpenPGP data is contained + * within the #GMimePart. + **/ +void +g_mime_part_set_openpgp_data (GMimePart *mime_part, GMimeOpenPGPData data) +{ + g_return_if_fail (GMIME_IS_PART (mime_part)); + + mime_part->openpgp = data; +} + + +/** + * g_mime_part_get_openpgp_data: + * @mime_part: a #GMimePart + * + * Gets whether or not (and what type) of OpenPGP data is contained + * within the #GMimePart. + * + * Returns: a #GMimeOpenPGPData. + **/ +GMimeOpenPGPData +g_mime_part_get_openpgp_data (GMimePart *mime_part) +{ + g_return_val_if_fail (GMIME_IS_PART (mime_part), GMIME_OPENPGP_DATA_NONE); + + return mime_part->openpgp; +} + + +/** + * g_mime_part_openpgp_encrypt: + * @mime_part: a #GMimePart + * @sign: %TRUE if the content should also be signed; otherwise, %FALSE + * @userid: (nullable): the key id (or email address) to use when signing (assuming @sign is %TRUE) + * @flags: a set of #GMimeEncryptFlags + * @recipients: (element-type utf8): an array of recipient key ids and/or email addresses + * @err: a #GError + * + * Encrypts (and optionally signs) the content of the @mime_part and then replaces + * the content with the new, encrypted, content. + * + * Returns: %TRUE on success or %FALSE on error. + **/ +gboolean +g_mime_part_openpgp_encrypt (GMimePart *mime_part, gboolean sign, const char *userid, + GMimeEncryptFlags flags, GPtrArray *recipients, GError **err) +{ + GMimeStream *istream, *encrypted; + GMimeCryptoContext *ctx; + int rv; + + g_return_val_if_fail (GMIME_IS_PART (mime_part), FALSE); + + if (mime_part->content == NULL) { + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_INVALID_OPERATION, + _("No content set on the MIME part.")); + return FALSE; + } + + if (!(ctx = g_mime_crypto_context_new ("application/pgp-encrypted"))) { + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, + _("No crypto context registered for application/pgp-encrypted.")); + return FALSE; + } + + encrypted = g_mime_stream_mem_new (); + istream = g_mime_stream_mem_new (); + g_mime_data_wrapper_write_to_stream (mime_part->content, istream); + g_mime_stream_reset (istream); + + rv = g_mime_crypto_context_encrypt (ctx, sign, userid, flags, recipients, istream, encrypted, err); + g_object_unref (istream); + g_object_unref (ctx); + + if (rv == -1) { + g_object_unref (encrypted); + return FALSE; + } + + g_mime_stream_reset (encrypted); + + g_mime_data_wrapper_set_encoding (mime_part->content, GMIME_CONTENT_ENCODING_DEFAULT); + g_mime_data_wrapper_set_stream (mime_part->content, encrypted); + mime_part->encoding = GMIME_CONTENT_ENCODING_7BIT; + mime_part->openpgp = GMIME_OPENPGP_DATA_ENCRYPTED; + g_object_unref (encrypted); + + return TRUE; +} + + +/** + * g_mime_part_openpgp_decrypt: + * @mime_part: a #GMimePart + * @flags: a set of #GMimeDecryptFlags + * @session_key: (nullable): the session key to use or %NULL + * @err: a #GError + * + * Decrypts the content of the @mime_part and then replaces the content with + * the new, decrypted, content. + * + * Returns: (nullable) (transfer full): a #GMimeDecryptResult on success or %NULL on error. + **/ +GMimeDecryptResult * +g_mime_part_openpgp_decrypt (GMimePart *mime_part, GMimeDecryptFlags flags, const char *session_key, GError **err) +{ + GMimeStream *istream, *decrypted; + GMimeDecryptResult *result; + GMimeCryptoContext *ctx; + + g_return_val_if_fail (GMIME_IS_PART (mime_part), FALSE); + + if (mime_part->content == NULL) { + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_INVALID_OPERATION, + _("No content set on the MIME part.")); + return NULL; + } + + if (!(ctx = g_mime_crypto_context_new ("application/pgp-encrypted"))) { + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, + _("No crypto context registered for application/pgp-encrypted.")); + return NULL; + } + + decrypted = g_mime_stream_mem_new (); + istream = g_mime_stream_mem_new (); + g_mime_data_wrapper_write_to_stream (mime_part->content, istream); + g_mime_stream_reset (istream); + + result = g_mime_crypto_context_decrypt (ctx, flags, session_key, istream, decrypted, err); + g_object_unref (istream); + g_object_unref (ctx); + + if (result == NULL) { + g_object_unref (decrypted); + return NULL; + } + + g_mime_stream_reset (decrypted); + + g_mime_data_wrapper_set_encoding (mime_part->content, GMIME_CONTENT_ENCODING_DEFAULT); + g_mime_data_wrapper_set_stream (mime_part->content, decrypted); + mime_part->openpgp = GMIME_OPENPGP_DATA_NONE; + g_object_unref (decrypted); + + return result; +} + + +/** + * g_mime_part_openpgp_sign: + * @mime_part: a #GMimePart + * @userid: the key id (or email address) to use for signing + * @err: a #GError + * + * Signs the content of the @mime_part and then replaces the content with + * the new, signed, content. + * + * Returns: %TRUE on success or %FALSE on error. + **/ +gboolean +g_mime_part_openpgp_sign (GMimePart *mime_part, const char *userid, GError **err) +{ + GMimeStream *istream, *ostream; + GMimeCryptoContext *ctx; + int rv; + + g_return_val_if_fail (GMIME_IS_PART (mime_part), FALSE); + + if (mime_part->content == NULL) { + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_INVALID_OPERATION, + _("No content set on the MIME part.")); + return FALSE; + } + + if (!(ctx = g_mime_crypto_context_new ("application/pgp-signature"))) { + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, + _("No crypto context registered for application/pgp-signature.")); + return FALSE; + } + + ostream = g_mime_stream_mem_new (); + istream = g_mime_stream_mem_new (); + g_mime_data_wrapper_write_to_stream (mime_part->content, istream); + g_mime_stream_reset (istream); + + rv = g_mime_crypto_context_sign (ctx, FALSE, userid, istream, ostream, err); + g_object_unref (istream); + g_object_unref (ctx); + + if (rv == -1) { + g_object_unref (ostream); + return FALSE; + } + + g_mime_stream_reset (ostream); + + g_mime_data_wrapper_set_encoding (mime_part->content, GMIME_CONTENT_ENCODING_DEFAULT); + g_mime_data_wrapper_set_stream (mime_part->content, ostream); + mime_part->encoding = GMIME_CONTENT_ENCODING_7BIT; + mime_part->openpgp = GMIME_OPENPGP_DATA_SIGNED; + g_object_unref (ostream); + + return TRUE; +} + + +/** + * g_mime_part_openpgp_verify: + * @mime_part: a #GMimePart + * @flags: a set of #GMimeVerifyFlags + * @err: a #GError + * + * Verifies the OpenPGP signature of the @mime_part and then replaces the content + * with the original, raw, content. + * + * Returns: (nullable) (transfer full): a #GMimeSignatureList on success or %NULL on error. + **/ +GMimeSignatureList * +g_mime_part_openpgp_verify (GMimePart *mime_part, GMimeVerifyFlags flags, GError **err) +{ + GMimeStream *istream, *extracted; + GMimeSignatureList *signatures; + GMimeCryptoContext *ctx; + + g_return_val_if_fail (GMIME_IS_PART (mime_part), FALSE); + + if (mime_part->content == NULL) { + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_INVALID_OPERATION, + _("No content set on the MIME part.")); + return NULL; + } + + if (!(ctx = g_mime_crypto_context_new ("application/pgp-signature"))) { + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, + _("No crypto context registered for application/pgp-signature.")); + return NULL; + } + + extracted = g_mime_stream_mem_new (); + istream = g_mime_stream_mem_new (); + g_mime_data_wrapper_write_to_stream (mime_part->content, istream); + g_mime_stream_reset (istream); + + signatures = g_mime_crypto_context_verify (ctx, flags, istream, NULL, extracted, err); + g_object_unref (istream); + g_object_unref (ctx); + + if (signatures == NULL) { + g_object_unref (extracted); + return NULL; + } + + g_mime_stream_reset (extracted); + + g_mime_data_wrapper_set_encoding (mime_part->content, GMIME_CONTENT_ENCODING_DEFAULT); + g_mime_data_wrapper_set_stream (mime_part->content, extracted); + mime_part->openpgp = GMIME_OPENPGP_DATA_NONE; + g_object_unref (extracted); + + return signatures; +} diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-part.h gmime-3.0.1/gmime/gmime-part.h --- gmime-2.6.22+dfsg2/gmime/gmime-part.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-part.h 2017-03-16 01:55:56.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -29,6 +29,7 @@ #include #include #include +#include G_BEGIN_DECLS @@ -43,9 +44,24 @@ typedef struct _GMimePartClass GMimePartClass; /** + * GMimeOpenPGPData: + * @GMIME_OPENPGP_DATA_NONE: The #GMimePart does not contain any OpenPGP data. + * @GMIME_OPENPGP_DATA_ENCRYPTED: The #GMimePart contains OpenPGP encrypted data. + * @GMIME_OPENPGP_DATA_SIGNED: The #GMimePart contains OpenPGP signed data. + * + * The type of OpenPGP data contained within the content of the #GMimePart, if any. + **/ +typedef enum { + GMIME_OPENPGP_DATA_NONE, + GMIME_OPENPGP_DATA_ENCRYPTED, + GMIME_OPENPGP_DATA_SIGNED +} GMimeOpenPGPData; + +/** * GMimePart: * @parent_object: parent #GMimeObject * @encoding: a #GMimeContentEncoding + * @openpgp: a #GMimeOpenPGPData * @content_description: Content-Description string * @content_location: Content-Location string * @content_md5: Content-MD5 string @@ -57,6 +73,7 @@ GMimeObject parent_object; GMimeContentEncoding encoding; + GMimeOpenPGPData openpgp; char *content_description; char *content_location; char *content_md5; @@ -67,7 +84,7 @@ struct _GMimePartClass { GMimeObjectClass parent_class; - void (* set_content_object) (GMimePart *mime_part, GMimeDataWrapper *content); + void (* set_content) (GMimePart *mime_part, GMimeDataWrapper *content); }; @@ -101,8 +118,19 @@ void g_mime_part_set_filename (GMimePart *mime_part, const char *filename); const char *g_mime_part_get_filename (GMimePart *mime_part); -void g_mime_part_set_content_object (GMimePart *mime_part, GMimeDataWrapper *content); -GMimeDataWrapper *g_mime_part_get_content_object (GMimePart *mime_part); +void g_mime_part_set_content (GMimePart *mime_part, GMimeDataWrapper *content); +GMimeDataWrapper *g_mime_part_get_content (GMimePart *mime_part); + +void g_mime_part_set_openpgp_data (GMimePart *mime_part, GMimeOpenPGPData data); +GMimeOpenPGPData g_mime_part_get_openpgp_data (GMimePart *mime_part); + +gboolean g_mime_part_openpgp_encrypt (GMimePart *mime_part, gboolean sign, const char *userid, + GMimeEncryptFlags flags, GPtrArray *recipients, GError **err); +GMimeDecryptResult *g_mime_part_openpgp_decrypt (GMimePart *mime_part, GMimeDecryptFlags flags, + const char *session_key, GError **err); + +gboolean g_mime_part_openpgp_sign (GMimePart *mime_part, const char *userid, GError **err); +GMimeSignatureList *g_mime_part_openpgp_verify (GMimePart *mime_part, GMimeVerifyFlags flags, GError **err); G_END_DECLS diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-part-iter.c gmime-3.0.1/gmime/gmime-part-iter.c --- gmime-2.6.22+dfsg2/gmime/gmime-part-iter.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-part-iter.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -44,6 +44,9 @@ **/ +G_DEFINE_BOXED_TYPE (GMimePartIter, g_mime_part_iter, g_mime_part_iter_clone, g_mime_part_iter_free); + + typedef struct _GMimeObjectStack GMimeObjectStack; struct _GMimeObjectStack { @@ -146,6 +149,32 @@ } +/** + * g_mime_part_iter_clone: + * @iter: a #GMimePartIter + * + * Clones the @iter, including its current state. + * + * Returns: (transfer full): a new #GMimePartIter that is identical to @iter. + **/ +GMimePartIter * +g_mime_part_iter_clone (GMimePartIter *iter) +{ + GMimePartIter *clone; + char *path; + + g_return_val_if_fail (iter != NULL, NULL); + + clone = g_mime_part_iter_new (iter->toplevel); + if ((path = g_mime_part_iter_get_path (iter))) { + g_mime_part_iter_jump_to (clone, path); + g_free (path); + } + + return clone; +} + + /** * g_mime_part_iter_reset: * @iter: a #GMimePartIter diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-part-iter.h gmime-3.0.1/gmime/gmime-part-iter.h --- gmime-2.6.22+dfsg2/gmime/gmime-part-iter.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-part-iter.h 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -26,6 +26,8 @@ G_BEGIN_DECLS +#define GMIME_TYPE_PART_ITER (g_mime_part_iter_get_type ()) + /** * GMimePartIter: * @@ -33,9 +35,13 @@ **/ typedef struct _GMimePartIter GMimePartIter; +GType g_mime_part_iter_get_type (void) G_GNUC_CONST; + GMimePartIter *g_mime_part_iter_new (GMimeObject *toplevel); void g_mime_part_iter_free (GMimePartIter *iter); +GMimePartIter *g_mime_part_iter_clone (GMimePartIter *iter); + void g_mime_part_iter_reset (GMimePartIter *iter); gboolean g_mime_part_iter_jump_to (GMimePartIter *iter, const char *path); diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-pkcs7-context.c gmime-3.0.1/gmime/gmime-pkcs7-context.c --- gmime-2.6.22+dfsg2/gmime/gmime-pkcs7-context.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-pkcs7-context.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -28,20 +28,16 @@ #include #include "gmime-pkcs7-context.h" -#ifdef ENABLE_SMIME +#ifdef ENABLE_CRYPTO #include "gmime-filter-charset.h" #include "gmime-stream-filter.h" -#include "gmime-stream-pipe.h" +#include "gmime-gpgme-utils.h" #include "gmime-stream-mem.h" #include "gmime-stream-fs.h" #include "gmime-charset.h" -#endif /* ENABLE_SMIME */ +#endif /* ENABLE_CRYPTO */ #include "gmime-error.h" -#ifdef ENABLE_SMIME -#include -#endif - #ifdef ENABLE_DEBUG #define d(x) x #else @@ -61,46 +57,52 @@ * all of the encryption and digital signatures. **/ -typedef struct _GMimePkcs7ContextPrivate { - gboolean always_trust; -#ifdef ENABLE_SMIME + +/** + * GMimePkcs7Context: + * + * A PKCS7 crypto context. + **/ +struct _GMimePkcs7Context { + GMimeCryptoContext parent_object; + +#ifdef ENABLE_CRYPTO gpgme_ctx_t ctx; #endif -} Pkcs7Ctx; +}; + +struct _GMimePkcs7ContextClass { + GMimeCryptoContextClass parent_class; + +}; static void g_mime_pkcs7_context_class_init (GMimePkcs7ContextClass *klass); static void g_mime_pkcs7_context_init (GMimePkcs7Context *ctx, GMimePkcs7ContextClass *klass); static void g_mime_pkcs7_context_finalize (GObject *object); static GMimeDigestAlgo pkcs7_digest_id (GMimeCryptoContext *ctx, const char *name); - static const char *pkcs7_digest_name (GMimeCryptoContext *ctx, GMimeDigestAlgo digest); static const char *pkcs7_get_signature_protocol (GMimeCryptoContext *ctx); - static const char *pkcs7_get_encryption_protocol (GMimeCryptoContext *ctx); - static const char *pkcs7_get_key_exchange_protocol (GMimeCryptoContext *ctx); -static int pkcs7_sign (GMimeCryptoContext *ctx, const char *userid, - GMimeDigestAlgo digest, GMimeStream *istream, - GMimeStream *ostream, GError **err); +static int pkcs7_sign (GMimeCryptoContext *ctx, gboolean detach, const char *userid, + GMimeStream *istream, GMimeStream *ostream, GError **err); -static GMimeSignatureList *pkcs7_verify (GMimeCryptoContext *ctx, GMimeDigestAlgo digest, +static GMimeSignatureList *pkcs7_verify (GMimeCryptoContext *ctx, GMimeVerifyFlags flags, GMimeStream *istream, GMimeStream *sigstream, - GError **err); + GMimeStream *ostream, GError **err); -static int pkcs7_encrypt (GMimeCryptoContext *ctx, gboolean sign, const char *userid, - GMimeDigestAlgo digest, GPtrArray *recipients, GMimeStream *istream, - GMimeStream *ostream, GError **err); +static int pkcs7_encrypt (GMimeCryptoContext *ctx, gboolean sign, const char *userid, GMimeEncryptFlags flags, + GPtrArray *recipients, GMimeStream *istream, GMimeStream *ostream, GError **err); -static GMimeDecryptResult *pkcs7_decrypt (GMimeCryptoContext *ctx, GMimeStream *istream, - GMimeStream *ostream, GError **err); +static GMimeDecryptResult *pkcs7_decrypt (GMimeCryptoContext *ctx, GMimeDecryptFlags flags, const char *session_key, + GMimeStream *istream, GMimeStream *ostream, GError **err); -static int pkcs7_import_keys (GMimeCryptoContext *ctx, GMimeStream *istream, - GError **err); +static int pkcs7_import_keys (GMimeCryptoContext *ctx, GMimeStream *istream, GError **err); -static int pkcs7_export_keys (GMimeCryptoContext *ctx, GPtrArray *keys, +static int pkcs7_export_keys (GMimeCryptoContext *ctx, const char *keys[], GMimeStream *ostream, GError **err); @@ -156,27 +158,23 @@ } static void -g_mime_pkcs7_context_init (GMimePkcs7Context *ctx, GMimePkcs7ContextClass *klass) +g_mime_pkcs7_context_init (GMimePkcs7Context *pkcs7, GMimePkcs7ContextClass *klass) { - ctx->priv = g_slice_new (Pkcs7Ctx); - ctx->priv->always_trust = FALSE; -#ifdef ENABLE_SMIME - ctx->priv->ctx = NULL; +#ifdef ENABLE_CRYPTO + pkcs7->ctx = NULL; #endif } static void g_mime_pkcs7_context_finalize (GObject *object) { - GMimePkcs7Context *ctx = (GMimePkcs7Context *) object; + GMimePkcs7Context *pkcs7 = (GMimePkcs7Context *) object; -#ifdef ENABLE_SMIME - if (ctx->priv->ctx) - gpgme_release (ctx->priv->ctx); +#ifdef ENABLE_CRYPTO + if (pkcs7->ctx) + gpgme_release (pkcs7->ctx); #endif - g_slice_free (Pkcs7Ctx, ctx->priv); - G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -261,642 +259,129 @@ return "application/pkcs7-keys"; } -#ifdef ENABLE_SMIME -static gpgme_error_t -pkcs7_passphrase_cb (void *hook, const char *uid_hint, const char *passphrase_info, int prev_was_bad, int fd) -{ - GMimeCryptoContext *context = (GMimeCryptoContext *) hook; - GMimeStream *stream; - gpgme_error_t error; - GError *err = NULL; - gboolean rv; - - if (context->request_passwd) { - stream = g_mime_stream_pipe_new (fd); - rv = context->request_passwd (context, uid_hint, passphrase_info, prev_was_bad, stream, &err); - g_object_unref (stream); - } else { - return GPG_ERR_GENERAL; - } - - if (!rv) { - error = GPG_ERR_CANCELED; - g_error_free (err); - } else { - error = GPG_ERR_NO_ERROR; - } - - return error; -} - -static ssize_t -pkcs7_stream_read (void *stream, void *buffer, size_t size) -{ - return g_mime_stream_read ((GMimeStream *) stream, (char *) buffer, size); -} - -static ssize_t -pkcs7_stream_write (void *stream, const void *buffer, size_t size) -{ - return g_mime_stream_write ((GMimeStream *) stream, (const char *) buffer, size); -} - -static off_t -pkcs7_stream_seek (void *stream, off_t offset, int whence) -{ - switch (whence) { - case SEEK_SET: - return (off_t) g_mime_stream_seek ((GMimeStream *) stream, (gint64) offset, GMIME_STREAM_SEEK_SET); - case SEEK_CUR: - return (off_t) g_mime_stream_seek ((GMimeStream *) stream, (gint64) offset, GMIME_STREAM_SEEK_CUR); - case SEEK_END: - return (off_t) g_mime_stream_seek ((GMimeStream *) stream, (gint64) offset, GMIME_STREAM_SEEK_END); - default: - return -1; - } -} - -static void -pkcs7_stream_free (void *stream) -{ - /* no-op */ -} - -static struct gpgme_data_cbs pkcs7_stream_funcs = { - pkcs7_stream_read, - pkcs7_stream_write, - pkcs7_stream_seek, - pkcs7_stream_free -}; - - - -#define KEY_IS_OK(k) (!((k)->expired || (k)->revoked || \ - (k)->disabled || (k)->invalid)) - -static gpgme_key_t -pkcs7_get_key_by_name (Pkcs7Ctx *pkcs7, const char *name, gboolean secret, GError **err) -{ - time_t now = time (NULL); - gpgme_key_t key = NULL; - gpgme_subkey_t subkey; - gboolean bad = FALSE; - gpgme_error_t error; - int errval = 0; - - if ((error = gpgme_op_keylist_start (pkcs7->ctx, name, secret)) != GPG_ERR_NO_ERROR) { - if (secret) - g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not list secret keys for \"%s\""), name); - else - g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not list keys for \"%s\""), name); - return NULL; - } - - while ((error = gpgme_op_keylist_next (pkcs7->ctx, &key)) == GPG_ERR_NO_ERROR) { - /* check if this key and the relevant subkey are usable */ - if (KEY_IS_OK (key)) { - subkey = key->subkeys; - - while (subkey && ((secret && !subkey->can_sign) || - (!secret && !subkey->can_encrypt))) - subkey = subkey->next; - - if (subkey && KEY_IS_OK (subkey) && - (subkey->expires == 0 || subkey->expires > now)) - break; - - if (subkey->expired) - errval = GPG_ERR_KEY_EXPIRED; - else - errval = GPG_ERR_BAD_KEY; - } else { - if (key->expired) - errval = GPG_ERR_KEY_EXPIRED; - else - errval = GPG_ERR_BAD_KEY; - } - - gpgme_key_unref (key); - bad = TRUE; - key = NULL; - } - - gpgme_op_keylist_end (pkcs7->ctx); - - if (error != GPG_ERR_NO_ERROR && error != GPG_ERR_EOF) { - if (secret) - g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not list secret keys for \"%s\""), name); - else - g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not list keys for \"%s\""), name); - - return NULL; - } - - if (!key) { - if (strchr (name, '@')) { - if (bad) - g_set_error (err, GMIME_GPGME_ERROR, errval, - _("A key for %s is present, but it is expired, disabled, revoked or invalid"), - name); - else - g_set_error (err, GMIME_GPGME_ERROR, GPG_ERR_NOT_FOUND, - _("Could not find a key for %s"), name); - } else { - if (bad) - g_set_error (err, GMIME_GPGME_ERROR, errval, - _("A key with id %s is present, but it is expired, disabled, revoked or invalid"), - name); - else - g_set_error (err, GMIME_GPGME_ERROR, GPG_ERR_NOT_FOUND, - _("Could not find a key with id %s"), name); - } - - return NULL; - } - - return key; -} - -static gboolean -pkcs7_add_signer (Pkcs7Ctx *pkcs7, const char *signer, GError **err) -{ - gpgme_key_t key = NULL; - - if (!(key = pkcs7_get_key_by_name (pkcs7, signer, TRUE, err))) - return FALSE; - - /* set the key (the previous operation guaranteed that it exists, no need - * 2 check return values...) */ - gpgme_signers_add (pkcs7->ctx, key); - gpgme_key_unref (key); - - return TRUE; -} -#endif /* ENABLE_SMIME */ +#define set_passphrase_callback(context) static int -pkcs7_sign (GMimeCryptoContext *context, const char *userid, GMimeDigestAlgo digest, +pkcs7_sign (GMimeCryptoContext *context, gboolean detach, const char *userid, GMimeStream *istream, GMimeStream *ostream, GError **err) { -#ifdef ENABLE_SMIME - GMimePkcs7Context *ctx = (GMimePkcs7Context *) context; - Pkcs7Ctx *pkcs7 = ctx->priv; - gpgme_sign_result_t result; - gpgme_data_t input, output; - gpgme_error_t error; - - if (!pkcs7_add_signer (pkcs7, userid, err)) - return -1; +#ifdef ENABLE_CRYPTO + gpgme_sig_mode_t mode = detach ? GPGME_SIG_MODE_DETACH : GPGME_SIG_MODE_NORMAL; + GMimePkcs7Context *pkcs7 = (GMimePkcs7Context *) context; - gpgme_set_armor (pkcs7->ctx, FALSE); - - if ((error = gpgme_data_new_from_cbs (&input, &pkcs7_stream_funcs, istream)) != GPG_ERR_NO_ERROR) { - g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not open input stream")); - return -1; - } + set_passphrase_callback (context); - if ((error = gpgme_data_new_from_cbs (&output, &pkcs7_stream_funcs, ostream)) != GPG_ERR_NO_ERROR) { - g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not open output stream")); - gpgme_data_release (input); - return -1; - } - - /* sign the input stream */ - if ((error = gpgme_op_sign (pkcs7->ctx, input, output, GPGME_SIG_MODE_DETACH)) != GPG_ERR_NO_ERROR) { - g_set_error (err, GMIME_GPGME_ERROR, error, _("Signing failed")); - gpgme_data_release (output); - gpgme_data_release (input); - return -1; - } - - gpgme_data_release (output); - gpgme_data_release (input); - - /* return the digest algorithm used for signing */ - result = gpgme_op_sign_result (pkcs7->ctx); - - return pkcs7_digest_id (context, gpgme_hash_algo_name (result->signatures->hash_algo)); + return g_mime_gpgme_sign (pkcs7->ctx, mode, userid, istream, ostream, err); #else - g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, _("S/MIME support is not enabled in this build")); + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, + _("S/MIME support is not enabled in this build")); return -1; -#endif /* ENABLE_SMIME */ -} - -#ifdef ENABLE_SMIME -static GMimeCertificateTrust -pkcs7_trust (gpgme_validity_t trust) -{ - switch (trust) { - case GPGME_VALIDITY_UNKNOWN: - default: - return GMIME_CERTIFICATE_TRUST_NONE; - case GPGME_VALIDITY_UNDEFINED: - return GMIME_CERTIFICATE_TRUST_UNDEFINED; - case GPGME_VALIDITY_NEVER: - return GMIME_CERTIFICATE_TRUST_NEVER; - case GPGME_VALIDITY_MARGINAL: - return GMIME_CERTIFICATE_TRUST_MARGINAL; - case GPGME_VALIDITY_FULL: - return GMIME_CERTIFICATE_TRUST_FULLY; - case GPGME_VALIDITY_ULTIMATE: - return GMIME_CERTIFICATE_TRUST_ULTIMATE; - } +#endif /* ENABLE_CRYPTO */ } static GMimeSignatureList * -pkcs7_get_signatures (Pkcs7Ctx *pkcs7, gboolean verify) +pkcs7_verify (GMimeCryptoContext *context, GMimeVerifyFlags flags, GMimeStream *istream, GMimeStream *sigstream, + GMimeStream *ostream, GError **err) { - GMimeSignatureList *signatures; - GMimeSignature *signature; - gpgme_verify_result_t result; - gpgme_subkey_t subkey; - gpgme_signature_t sig; - gpgme_user_id_t uid; - gpgme_key_t key; - - /* get the signature verification results from GpgMe */ - if (!(result = gpgme_op_verify_result (pkcs7->ctx)) || !result->signatures) - return verify ? g_mime_signature_list_new () : NULL; - - /* create a new signature list to return */ - signatures = g_mime_signature_list_new (); - - sig = result->signatures; - - while (sig != NULL) { - signature = g_mime_signature_new (); - g_mime_signature_list_add (signatures, signature); - - if (sig->status != GPG_ERR_NO_ERROR) - g_mime_signature_set_status (signature, GMIME_SIGNATURE_STATUS_ERROR); - else - g_mime_signature_set_status (signature, GMIME_SIGNATURE_STATUS_GOOD); - - g_mime_certificate_set_pubkey_algo (signature->cert, sig->pubkey_algo); - g_mime_certificate_set_digest_algo (signature->cert, sig->hash_algo); - g_mime_certificate_set_fingerprint (signature->cert, sig->fpr); - g_mime_signature_set_expires (signature, sig->exp_timestamp); - g_mime_signature_set_created (signature, sig->timestamp); - - if (sig->exp_timestamp != 0 && sig->exp_timestamp <= time (NULL)) { - /* signature expired, automatically results in a BAD signature */ - signature->errors |= GMIME_SIGNATURE_ERROR_EXPSIG; - signature->status = GMIME_SIGNATURE_STATUS_BAD; - } - - if (gpgme_get_key (pkcs7->ctx, sig->fpr, &key, 0) == GPG_ERR_NO_ERROR && key) { - /* get more signer info from their signing key */ - g_mime_certificate_set_trust (signature->cert, pkcs7_trust (key->owner_trust)); - g_mime_certificate_set_issuer_serial (signature->cert, key->issuer_serial); - g_mime_certificate_set_issuer_name (signature->cert, key->issuer_name); - - /* get the keyid, name, and email address */ - uid = key->uids; - while (uid) { - if (uid->name && *uid->name) - g_mime_certificate_set_name (signature->cert, uid->name); - - if (uid->email && *uid->email) - g_mime_certificate_set_email (signature->cert, uid->email); - - if (uid->uid && *uid->uid) - g_mime_certificate_set_key_id (signature->cert, uid->uid); - - if (signature->cert->name && signature->cert->email && signature->cert->keyid) - break; - - uid = uid->next; - } - - /* get the subkey used for signing */ - subkey = key->subkeys; - while (subkey && !subkey->can_sign) - subkey = subkey->next; - - if (subkey) { - g_mime_certificate_set_created (signature->cert, subkey->timestamp); - g_mime_certificate_set_expires (signature->cert, subkey->expires); - - if (subkey->revoked) { - /* signer's key has been revoked, automatic BAD status */ - signature->errors |= GMIME_SIGNATURE_ERROR_REVKEYSIG; - signature->status = GMIME_SIGNATURE_STATUS_BAD; - } - - if (subkey->expired) { - /* signer's key has expired, automatic BAD status */ - signature->errors |= GMIME_SIGNATURE_ERROR_EXPKEYSIG; - signature->status = GMIME_SIGNATURE_STATUS_BAD; - } - } else { - /* If we don't have the subkey used by the signer, then we can't - * tell what the status is, so set to ERROR if it hasn't already - * been designated as BAD. */ - if (signature->status != GMIME_SIGNATURE_STATUS_BAD) - signature->status = GMIME_SIGNATURE_STATUS_ERROR; - signature->errors |= GMIME_SIGNATURE_ERROR_NO_PUBKEY; - } - - gpgme_key_unref (key); - } else { - /* If we don't have the signer's public key, then we can't tell what - * the status is, so set it to ERROR if it hasn't already been - * designated as BAD. */ - g_mime_certificate_set_trust (signature->cert, GMIME_CERTIFICATE_TRUST_UNDEFINED); - if (signature->status != GMIME_SIGNATURE_STATUS_BAD) - signature->status = GMIME_SIGNATURE_STATUS_ERROR; - signature->errors |= GMIME_SIGNATURE_ERROR_NO_PUBKEY; - } - - sig = sig->next; - } - - return signatures; -} -#endif /* ENABLE_SMIME */ - -static GMimeSignatureList * -pkcs7_verify (GMimeCryptoContext *context, GMimeDigestAlgo digest, - GMimeStream *istream, GMimeStream *sigstream, - GError **err) -{ -#ifdef ENABLE_SMIME - GMimePkcs7Context *ctx = (GMimePkcs7Context *) context; - gpgme_data_t message, signature; - Pkcs7Ctx *pkcs7 = ctx->priv; - gpgme_error_t error; - - if ((error = gpgme_data_new_from_cbs (&message, &pkcs7_stream_funcs, istream)) != GPG_ERR_NO_ERROR) { - g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not open input stream")); - return NULL; - } +#ifdef ENABLE_CRYPTO + GMimePkcs7Context *pkcs7 = (GMimePkcs7Context *) context; - /* if @sigstream is non-NULL, then it is a detached signature */ - if (sigstream != NULL) { - if ((error = gpgme_data_new_from_cbs (&signature, &pkcs7_stream_funcs, sigstream)) != GPG_ERR_NO_ERROR) { - g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not open signature stream")); - gpgme_data_release (message); - return NULL; - } - } else { - signature = NULL; - } - - if ((error = gpgme_op_verify (pkcs7->ctx, signature, message, NULL)) != GPG_ERR_NO_ERROR) { - g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not verify pkcs7 signature")); - if (signature) - gpgme_data_release (signature); - gpgme_data_release (message); - return NULL; - } - - if (signature) - gpgme_data_release (signature); - - if (message) - gpgme_data_release (message); - - /* get/return the pkcs7 signatures */ - return pkcs7_get_signatures (pkcs7, TRUE); + return g_mime_gpgme_verify (pkcs7->ctx, flags, istream, sigstream, ostream, err); #else - g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, _("S/MIME support is not enabled in this build")); + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, + _("S/MIME support is not enabled in this build")); return NULL; -#endif /* ENABLE_SMIME */ +#endif /* ENABLE_CRYPTO */ } -#ifdef ENABLE_SMIME -static void -key_list_free (gpgme_key_t *keys) -{ - gpgme_key_t *key = keys; - - while (*key != NULL) { - gpgme_key_unref (*key); - key++; - } - - g_free (keys); -} -#endif /* ENABLE_SMIME */ - static int -pkcs7_encrypt (GMimeCryptoContext *context, gboolean sign, const char *userid, - GMimeDigestAlgo digest, GPtrArray *recipients, GMimeStream *istream, - GMimeStream *ostream, GError **err) -{ -#ifdef ENABLE_SMIME - GMimePkcs7Context *ctx = (GMimePkcs7Context *) context; - Pkcs7Ctx *pkcs7 = ctx->priv; - gpgme_data_t input, output; - gpgme_error_t error; - gpgme_key_t *rcpts; - gpgme_key_t key; - guint i; +pkcs7_encrypt (GMimeCryptoContext *context, gboolean sign, const char *userid, GMimeEncryptFlags flags, + GPtrArray *recipients, GMimeStream *istream, GMimeStream *ostream, GError **err) +{ +#ifdef ENABLE_CRYPTO + GMimePkcs7Context *pkcs7 = (GMimePkcs7Context *) context; if (sign) { - g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, - _("Cannot sign and encrypt a stream at the same time using pkcs7")); + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, + _("Cannot sign and encrypt a stream at the same time using pkcs7")); return -1; } - /* create an array of recipient keys for GpgMe */ - rcpts = g_new0 (gpgme_key_t, recipients->len + 1); - for (i = 0; i < recipients->len; i++) { - if (!(key = pkcs7_get_key_by_name (pkcs7, recipients->pdata[i], FALSE, err))) { - key_list_free (rcpts); - return -1; - } - - rcpts[i] = key; - } - - if ((error = gpgme_data_new_from_cbs (&input, &pkcs7_stream_funcs, istream)) != GPG_ERR_NO_ERROR) { - g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not open input stream")); - key_list_free (rcpts); - return -1; - } - - if ((error = gpgme_data_new_from_cbs (&output, &pkcs7_stream_funcs, ostream)) != GPG_ERR_NO_ERROR) { - g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not open output stream")); - gpgme_data_release (input); - key_list_free (rcpts); - return -1; - } - - /* encrypt the input stream */ - error = gpgme_op_encrypt (pkcs7->ctx, rcpts, GPGME_ENCRYPT_ALWAYS_TRUST, input, output); - gpgme_data_release (output); - gpgme_data_release (input); - key_list_free (rcpts); - - if (error != GPG_ERR_NO_ERROR) { - g_set_error (err, GMIME_GPGME_ERROR, error, _("Encryption failed")); - return -1; - } - - return 0; + return g_mime_gpgme_encrypt (pkcs7->ctx, sign, userid, flags, recipients, istream, ostream, err); #else - g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, _("S/MIME support is not enabled in this build")); + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, + _("S/MIME support is not enabled in this build")); return -1; -#endif /* ENABLE_SMIME */ +#endif /* ENABLE_CRYPTO */ } -#ifdef ENABLE_SMIME static GMimeDecryptResult * -pkcs7_get_decrypt_result (Pkcs7Ctx *pkcs7) +pkcs7_decrypt (GMimeCryptoContext *context, GMimeDecryptFlags flags, const char *session_key, + GMimeStream *istream, GMimeStream *ostream, GError **err) { - GMimeDecryptResult *result; - gpgme_decrypt_result_t res; - gpgme_recipient_t recipient; - GMimeCertificate *cert; - - result = g_mime_decrypt_result_new (); - result->recipients = g_mime_certificate_list_new (); - result->signatures = pkcs7_get_signatures (pkcs7, FALSE); - - if (!(res = gpgme_op_decrypt_result (pkcs7->ctx)) || !res->recipients) - return result; - - recipient = res->recipients; - while (recipient != NULL) { - cert = g_mime_certificate_new (); - g_mime_certificate_list_add (result->recipients, cert); - - g_mime_certificate_set_pubkey_algo (cert, recipient->pubkey_algo); - g_mime_certificate_set_key_id (cert, recipient->keyid); - - recipient = recipient->next; - } +#ifdef ENABLE_CRYPTO + GMimePkcs7Context *pkcs7 = (GMimePkcs7Context *) context; - return result; -} -#endif /* ENABLE_SMIME */ - -static GMimeDecryptResult * -pkcs7_decrypt (GMimeCryptoContext *context, GMimeStream *istream, - GMimeStream *ostream, GError **err) -{ -#ifdef ENABLE_SMIME - GMimePkcs7Context *ctx = (GMimePkcs7Context *) context; - GMimeDecryptResult *result; - Pkcs7Ctx *pkcs7 = ctx->priv; - gpgme_decrypt_result_t res; - gpgme_data_t input, output; - gpgme_error_t error; - - if ((error = gpgme_data_new_from_cbs (&input, &pkcs7_stream_funcs, istream)) != GPG_ERR_NO_ERROR) { - g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not open input stream")); - return NULL; - } + set_passphrase_callback (context); - if ((error = gpgme_data_new_from_cbs (&output, &pkcs7_stream_funcs, ostream)) != GPG_ERR_NO_ERROR) { - g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not open output stream")); - gpgme_data_release (input); - return NULL; - } - - /* decrypt the input stream */ - if ((error = gpgme_op_decrypt_verify (pkcs7->ctx, input, output)) != GPG_ERR_NO_ERROR) { - g_set_error (err, GMIME_GPGME_ERROR, error, _("Decryption failed")); - gpgme_data_release (output); - gpgme_data_release (input); - return NULL; - } - - gpgme_data_release (output); - gpgme_data_release (input); - - return pkcs7_get_decrypt_result (pkcs7); + return g_mime_gpgme_decrypt (pkcs7->ctx, flags, session_key, istream, ostream, err); #else - g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, _("S/MIME support is not enabled in this build")); + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, + _("S/MIME support is not enabled in this build")); return NULL; -#endif /* ENABLE_SMIME */ +#endif /* ENABLE_CRYPTO */ } static int pkcs7_import_keys (GMimeCryptoContext *context, GMimeStream *istream, GError **err) { -#ifdef ENABLE_SMIME - GMimePkcs7Context *ctx = (GMimePkcs7Context *) context; - Pkcs7Ctx *pkcs7 = ctx->priv; - gpgme_data_t keydata; - gpgme_error_t error; - - if ((error = gpgme_data_new_from_cbs (&keydata, &pkcs7_stream_funcs, istream)) != GPG_ERR_NO_ERROR) { - g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not open input stream")); - return -1; - } +#ifdef ENABLE_CRYPTO + GMimePkcs7Context *pkcs7 = (GMimePkcs7Context *) context; - /* import the key(s) */ - if ((error = gpgme_op_import (pkcs7->ctx, keydata)) != GPG_ERR_NO_ERROR) { - //printf ("import error (%d): %s\n", error & GPG_ERR_CODE_MASK, gpg_strerror (error)); - g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not import key data")); - gpgme_data_release (keydata); - return -1; - } - - gpgme_data_release (keydata); + set_passphrase_callback (context); - return 0; + return g_mime_gpgme_import (pkcs7->ctx, istream, err); #else - g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, _("S/MIME support is not enabled in this build")); + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, + _("S/MIME support is not enabled in this build")); return -1; -#endif /* ENABLE_SMIME */ +#endif /* ENABLE_CRYPTO */ } static int -pkcs7_export_keys (GMimeCryptoContext *context, GPtrArray *keys, GMimeStream *ostream, GError **err) +pkcs7_export_keys (GMimeCryptoContext *context, const char *keys[], GMimeStream *ostream, GError **err) { -#ifdef ENABLE_SMIME - GMimePkcs7Context *ctx = (GMimePkcs7Context *) context; - Pkcs7Ctx *pkcs7 = ctx->priv; - gpgme_data_t keydata; - gpgme_error_t error; - guint i; - - if ((error = gpgme_data_new_from_cbs (&keydata, &pkcs7_stream_funcs, ostream)) != GPG_ERR_NO_ERROR) { - g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not open output stream")); - return -1; - } - - /* export the key(s) */ - for (i = 0; i < keys->len; i++) { - if ((error = gpgme_op_export (pkcs7->ctx, keys->pdata[i], 0, keydata)) != GPG_ERR_NO_ERROR) { - g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not export key data")); - gpgme_data_release (keydata); - return -1; - } - } +#ifdef ENABLE_CRYPTO + GMimePkcs7Context *pkcs7 = (GMimePkcs7Context *) context; - gpgme_data_release (keydata); + set_passphrase_callback (context); - return 0; + return g_mime_gpgme_export (pkcs7->ctx, keys, ostream, err); #else - g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, _("S/MIME support is not enabled in this build")); + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, + _("S/MIME support is not enabled in this build")); return -1; -#endif /* ENABLE_SMIME */ +#endif /* ENABLE_CRYPTO */ } /** * g_mime_pkcs7_context_new: - * @request_passwd: a #GMimePasswordRequestFunc * * Creates a new pkcs7 crypto context object. * * Returns: (transfer full): a new pkcs7 crypto context object. **/ GMimeCryptoContext * -g_mime_pkcs7_context_new (GMimePasswordRequestFunc request_passwd) +g_mime_pkcs7_context_new (void) { -#ifdef ENABLE_SMIME - GMimeCryptoContext *crypto; +#ifdef ENABLE_CRYPTO GMimePkcs7Context *pkcs7; gpgme_ctx_t ctx; @@ -908,50 +393,14 @@ if (gpgme_new (&ctx) != GPG_ERR_NO_ERROR) return NULL; - pkcs7 = g_object_newv (GMIME_TYPE_PKCS7_CONTEXT, 0, NULL); - gpgme_set_passphrase_cb (ctx, pkcs7_passphrase_cb, pkcs7); + pkcs7 = g_object_new (GMIME_TYPE_PKCS7_CONTEXT, NULL); gpgme_set_protocol (ctx, GPGME_PROTOCOL_CMS); - pkcs7->priv->ctx = ctx; + gpgme_set_textmode (ctx, FALSE); + gpgme_set_armor (ctx, FALSE); + pkcs7->ctx = ctx; - crypto = (GMimeCryptoContext *) pkcs7; - crypto->request_passwd = request_passwd; - - return crypto; + return (GMimeCryptoContext *) pkcs7; #else return NULL; -#endif /* ENABLE_SMIME */ -} - - -/** - * g_mime_pkcs7_context_get_always_trust: - * @ctx: a #GMimePkcs7Context - * - * Gets the @always_trust flag on the pkcs7 context. - * - * Returns: the @always_trust flag on the pkcs7 context. - **/ -gboolean -g_mime_pkcs7_context_get_always_trust (GMimePkcs7Context *ctx) -{ - g_return_val_if_fail (GMIME_IS_PKCS7_CONTEXT (ctx), FALSE); - - return ctx->priv->always_trust; -} - - -/** - * g_mime_pkcs7_context_set_always_trust: - * @ctx: a #GMimePkcs7Context - * @always_trust: always trust flag - * - * Sets the @always_trust flag on the pkcs7 context which is used for - * encryption. - **/ -void -g_mime_pkcs7_context_set_always_trust (GMimePkcs7Context *ctx, gboolean always_trust) -{ - g_return_if_fail (GMIME_IS_PKCS7_CONTEXT (ctx)); - - ctx->priv->always_trust = always_trust; +#endif /* ENABLE_CRYPTO */ } diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-pkcs7-context.h gmime-3.0.1/gmime/gmime-pkcs7-context.h --- gmime-2.6.22+dfsg2/gmime/gmime-pkcs7-context.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-pkcs7-context.h 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -36,32 +36,9 @@ typedef struct _GMimePkcs7Context GMimePkcs7Context; typedef struct _GMimePkcs7ContextClass GMimePkcs7ContextClass; - -/** - * GMimePkcs7Context: - * @parent_object: parent #GMimeCryptoContext - * @priv: private context data - * - * A PKCS7 crypto context. - **/ -struct _GMimePkcs7Context { - GMimeCryptoContext parent_object; - - struct _GMimePkcs7ContextPrivate *priv; -}; - -struct _GMimePkcs7ContextClass { - GMimeCryptoContextClass parent_class; - -}; - - GType g_mime_pkcs7_context_get_type (void); -GMimeCryptoContext *g_mime_pkcs7_context_new (GMimePasswordRequestFunc request_passwd); - -gboolean g_mime_pkcs7_context_get_always_trust (GMimePkcs7Context *ctx); -void g_mime_pkcs7_context_set_always_trust (GMimePkcs7Context *ctx, gboolean always_trust); +GMimeCryptoContext *g_mime_pkcs7_context_new (void); G_END_DECLS diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-references.c gmime-3.0.1/gmime/gmime-references.c --- gmime-2.6.22+dfsg2/gmime/gmime-references.c 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-references.c 2017-04-08 17:01:10.000000000 +0000 @@ -0,0 +1,254 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2017 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gmime-table-private.h" +#include "gmime-parse-utils.h" +#include "gmime-references.h" + + +#ifdef ENABLE_WARNINGS +#define w(x) x +#else +#define w(x) +#endif /* ENABLE_WARNINGS */ + + +/** + * SECTION: gmime-references + * @title: GMimeReferences + * @short_description: a list of Message-Ids + * @see_also: + * + * A list of Message-Ids as found in a References or In-Reply-To header. + **/ + +G_DEFINE_BOXED_TYPE (GMimeReferences, g_mime_references, g_mime_references_copy, g_mime_references_free); + + +/** + * g_mime_references_new: + * + * Creates a new #GMimeReferences. + * + * Returns: a new #GMimeReferences. + **/ +GMimeReferences * +g_mime_references_new (void) +{ + GMimeReferences *refs; + + refs = g_malloc (sizeof (GMimeReferences)); + refs->array = g_ptr_array_new (); + + return refs; +} + + +/** + * g_mime_references_free: + * @refs: a #GMimeReferences list + * + * Frees the #GMimeReferences list. + **/ +void +g_mime_references_free (GMimeReferences *refs) +{ + guint i; + + g_return_if_fail (refs != NULL); + + for (i = 0; i < refs->array->len; i++) + g_free (refs->array->pdata[i]); + + g_ptr_array_free (refs->array, TRUE); + g_free (refs); +} + + +/** + * g_mime_references_parse: + * @options: (nullable): a #GMimeParserOptions or %NULL + * @text: string containing a list of msg-ids + * + * Decodes a list of msg-ids as in the References and/or In-Reply-To + * headers defined in rfc822. + * + * Returns: (transfer full): a new #GMimeReferences containing the parsed message ids. + **/ +GMimeReferences * +g_mime_references_parse (GMimeParserOptions *options, const char *text) +{ + const char *word, *inptr = text; + GMimeReferences *refs; + char *msgid; + + g_return_val_if_fail (text != NULL, NULL); + + refs = g_mime_references_new (); + + while (*inptr) { + skip_cfws (&inptr); + if (*inptr == '<') { + /* looks like a msg-id */ + if ((msgid = decode_msgid (&inptr))) { + g_mime_references_append (refs, msgid); + g_free (msgid); + } else { + w(g_warning ("Invalid References header: %s", inptr)); + break; + } + } else if (*inptr) { + /* looks like part of a phrase */ + if (!(word = decode_word (&inptr))) { + w(g_warning ("Invalid References header: %s", inptr)); + break; + } + } + } + + return refs; +} + + +/** + * g_mime_references_copy: + * @refs: the list of references to copy + * + * Copies a #GMimeReferences list. + * + * Returns: (transfer full): a new #GMimeReferences list that contains + * an identical list of items as @refs. + **/ +GMimeReferences * +g_mime_references_copy (GMimeReferences *refs) +{ + GMimeReferences *copy; + guint i; + + g_return_val_if_fail (refs != NULL, NULL); + + copy = g_mime_references_new (); + for (i = 0; i < refs->array->len; i++) + g_mime_references_append (copy, refs->array->pdata[i]); + + return copy; +} + + +/** + * g_mime_references_length: + * @refs: a #GMimeReferences + * + * Gets the length of the #GMimeReferences list. + * + * Returns: the number of message ids in the list. + **/ +int +g_mime_references_length (GMimeReferences *refs) +{ + g_return_val_if_fail (refs != NULL, 0); + + return refs->array->len; +} + + +/** + * g_mime_references_append: + * @refs: a #GMimeReferences + * @msgid: a message-id string + * + * Appends a reference to msgid to the list of references. + **/ +void +g_mime_references_append (GMimeReferences *refs, const char *msgid) +{ + g_return_if_fail (refs != NULL); + g_return_if_fail (msgid != NULL); + + g_ptr_array_add (refs->array, g_strdup (msgid)); +} + + +/** + * g_mime_references_clear: + * @refs: a #GMimeReferences + * + * Clears the #GMimeReferences list. + **/ +void +g_mime_references_clear (GMimeReferences *refs) +{ + guint i; + + g_return_if_fail (refs != NULL); + + for (i = 0; i < refs->array->len; i++) + g_free (refs->array->pdata[i]); + + g_ptr_array_set_size (refs->array, 0); +} + + +/** + * g_mime_references_get_message_id: + * @refs: a #GMimeReferences + * @index: the index of the message id + * + * Gets the specified Message-Id reference from the #GMimeReferences. + * + * Returns: the Message-Id reference from the #GMimeReferences. + **/ +const char * +g_mime_references_get_message_id (GMimeReferences *refs, int index) +{ + g_return_val_if_fail (refs != NULL, NULL); + g_return_val_if_fail (index >= 0, NULL); + g_return_val_if_fail (index < refs->array->len, NULL); + + return refs->array->pdata[index]; +} + + +/** + * g_mime_references_set_message_id: + * @refs: a #GMimeReferences + * @index: the index of the message id + * @msgid: the message id + * + * Sets the specified Message-Id reference from the #GMimeReferences. + **/ +void +g_mime_references_set_message_id (GMimeReferences *refs, int index, const char *msgid) +{ + char *buf; + + g_return_if_fail (refs != NULL); + g_return_if_fail (index >= 0); + g_return_if_fail (index < refs->array->len); + + buf = g_strdup (msgid); + g_free (refs->array->pdata[index]); + refs->array->pdata[index] = buf; +} diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-references.h gmime-3.0.1/gmime/gmime-references.h --- gmime-2.6.22+dfsg2/gmime/gmime-references.h 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-references.h 2017-04-08 17:01:10.000000000 +0000 @@ -0,0 +1,64 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2017 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_REFERENCES_H__ +#define __GMIME_REFERENCES_H__ + +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_REFERENCES (gmime_references_get_type ()) + +typedef struct _GMimeReferences GMimeReferences; + +/** + * GMimeReferences: + * @array: the array of message-id references + * + * A List of references, as per the References or In-Reply-To header + * fields. + **/ +struct _GMimeReferences { + GPtrArray *array; +}; + + +GType g_mime_references_get_type (void) G_GNUC_CONST; + +GMimeReferences *g_mime_references_new (void); +void g_mime_references_free (GMimeReferences *refs); + +GMimeReferences *g_mime_references_parse (GMimeParserOptions *options, const char *text); + +GMimeReferences *g_mime_references_copy (GMimeReferences *refs); + +int g_mime_references_length (GMimeReferences *refs); + +void g_mime_references_append (GMimeReferences *refs, const char *msgid); +void g_mime_references_clear (GMimeReferences *refs); + +const char *g_mime_references_get_message_id (GMimeReferences *refs, int index); +void g_mime_references_set_message_id (GMimeReferences *refs, int index, const char *msgid); + +G_END_DECLS + +#endif /* __GMIME_REFERENCES_H__ */ diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-signature.c gmime-3.0.1/gmime/gmime-signature.c --- gmime-2.6.22+dfsg2/gmime/gmime-signature.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-signature.c 2017-05-21 16:29:14.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -83,11 +83,10 @@ static void g_mime_signature_init (GMimeSignature *sig, GMimeSignatureClass *klass) { - sig->status = GMIME_SIGNATURE_STATUS_GOOD; - sig->errors = GMIME_SIGNATURE_ERROR_NONE; sig->cert = g_mime_certificate_new (); sig->created = (time_t) -1; sig->expires = (time_t) -1; + sig->status = 0; } static void @@ -112,7 +111,7 @@ GMimeSignature * g_mime_signature_new (void) { - return g_object_newv (GMIME_TYPE_SIGNATURE, 0, NULL); + return g_object_new (GMIME_TYPE_SIGNATURE, NULL); } @@ -136,55 +135,20 @@ * g_mime_signature_get_status: * @sig: a #GMimeSignature * - * Get the signature status. + * Get the signature status as a bitfield of #GMimeSignatureStatus flags. * * Returns: the signature status. **/ GMimeSignatureStatus g_mime_signature_get_status (GMimeSignature *sig) { - g_return_val_if_fail (GMIME_IS_SIGNATURE (sig), GMIME_SIGNATURE_STATUS_BAD); + g_return_val_if_fail (GMIME_IS_SIGNATURE (sig), 0); return sig->status; } /** - * g_mime_signature_set_errors: - * @sig: a #GMimeSignature - * @errors: a #GMimeSignatureError - * - * Set the errors on the signature. - **/ -void -g_mime_signature_set_errors (GMimeSignature *sig, GMimeSignatureError errors) -{ - g_return_if_fail (GMIME_IS_SIGNATURE (sig)); - - sig->errors = errors; -} - - -/** - * g_mime_signature_get_errors: - * @sig: a #GMimeSignature - * - * Get the signature errors. If the #GMimeSignatureStatus returned from - * g_mime_signature_get_status() is not #GMIME_SIGNATURE_STATUS_GOOD, then the - * errors may provide a clue as to why. - * - * Returns: a bitfield of errors. - **/ -GMimeSignatureError -g_mime_signature_get_errors (GMimeSignature *sig) -{ - g_return_val_if_fail (GMIME_IS_SIGNATURE (sig), GMIME_SIGNATURE_ERROR_NONE); - - return sig->errors; -} - - -/** * g_mime_signature_set_certificate: * @sig: a #GMimeSignature * @cert: a #GMimeCertificate @@ -370,7 +334,7 @@ GMimeSignatureList * g_mime_signature_list_new (void) { - return g_object_newv (GMIME_TYPE_SIGNATURE_LIST, 0, NULL); + return g_object_new (GMIME_TYPE_SIGNATURE_LIST, NULL); } diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-signature.h gmime-3.0.1/gmime/gmime-signature.h --- gmime-2.6.22+dfsg2/gmime/gmime-signature.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-signature.h 2017-05-21 16:29:14.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -50,46 +50,50 @@ /** * GMimeSignatureStatus: - * @GMIME_SIGNATURE_STATUS_GOOD: Good signature. - * @GMIME_SIGNATURE_STATUS_ERROR: An error occurred. - * @GMIME_SIGNATURE_STATUS_BAD: Bad signature. + * @GMIME_SIGNATURE_STATUS_VALID: The signature is fully valid. + * @GMIME_SIGNATURE_STATUS_GREEN: The signature is good. + * @GMIME_SIGNATURE_STATUS_RED: The signature is bad. + * @GMIME_SIGNATURE_STATUS_KEY_REVOKED: The key has been revoked. + * @GMIME_SIGNATURE_STATUS_KEY_EXPIRED: The key has expired. + * @GMIME_SIGNATURE_STATUS_SIG_EXPIRED: The signature has expired. + * @GMIME_SIGNATURE_STATUS_KEY_MISSING: Can't verify due to missing key. + * @GMIME_SIGNATURE_STATUS_CRL_MISSING: CRL not available. + * @GMIME_SIGNATURE_STATUS_CRL_TOO_OLD: Available CRL is too old. + * @GMIME_SIGNATURE_STATUS_BAD_POLICY: A policy was not met. + * @GMIME_SIGNATURE_STATUS_SYS_ERROR: A system error occurred. + * @GMIME_SIGNATURE_STATUS_TOFU_CONFLICT: Tofu conflict detected. * - * A value representing the signature status for a particular + * A value representing the signature status bit flags for a particular * #GMimeSignature. **/ typedef enum { - GMIME_SIGNATURE_STATUS_GOOD, - GMIME_SIGNATURE_STATUS_ERROR, - GMIME_SIGNATURE_STATUS_BAD + GMIME_SIGNATURE_STATUS_VALID = 0x0001, + GMIME_SIGNATURE_STATUS_GREEN = 0x0002, + GMIME_SIGNATURE_STATUS_RED = 0x0004, + GMIME_SIGNATURE_STATUS_KEY_REVOKED = 0x0010, + GMIME_SIGNATURE_STATUS_KEY_EXPIRED = 0x0020, + GMIME_SIGNATURE_STATUS_SIG_EXPIRED = 0x0040, + GMIME_SIGNATURE_STATUS_KEY_MISSING = 0x0080, + GMIME_SIGNATURE_STATUS_CRL_MISSING = 0x0100, + GMIME_SIGNATURE_STATUS_CRL_TOO_OLD = 0x0200, + GMIME_SIGNATURE_STATUS_BAD_POLICY = 0x0400, + GMIME_SIGNATURE_STATUS_SYS_ERROR = 0x0800, + GMIME_SIGNATURE_STATUS_TOFU_CONFLICT = 0x1000 } GMimeSignatureStatus; /** - * GMimeSignatureError: - * @GMIME_SIGNATURE_ERROR_NONE: No error. - * @GMIME_SIGNATURE_ERROR_EXPSIG: Expired signature. - * @GMIME_SIGNATURE_ERROR_NO_PUBKEY: No public key found. - * @GMIME_SIGNATURE_ERROR_EXPKEYSIG: Expired signature key. - * @GMIME_SIGNATURE_ERROR_REVKEYSIG: Revoked signature key. - * @GMIME_SIGNATURE_ERROR_UNSUPP_ALGO: Unsupported algorithm. + * GMIME_SIGNATURE_STATUS_ERROR_MASK: * - * Possible errors that a #GMimeSignature could have. + * A convenience macro for masking out the non-error bit flags. **/ -typedef enum { - GMIME_SIGNATURE_ERROR_NONE = 0, - GMIME_SIGNATURE_ERROR_EXPSIG = (1 << 0), /* expired signature */ - GMIME_SIGNATURE_ERROR_NO_PUBKEY = (1 << 1), /* no public key */ - GMIME_SIGNATURE_ERROR_EXPKEYSIG = (1 << 2), /* expired key */ - GMIME_SIGNATURE_ERROR_REVKEYSIG = (1 << 3), /* revoked key */ - GMIME_SIGNATURE_ERROR_UNSUPP_ALGO = (1 << 4) /* unsupported algorithm */ -} GMimeSignatureError; +#define GMIME_SIGNATURE_STATUS_ERROR_MASK ~(GMIME_SIGNATURE_STATUS_VALID | GMIME_SIGNATURE_STATUS_GREEN | GMIME_SIGNATURE_STATUS_RED) /** * GMimeSignature: * @parent_object: parent #GObject - * @status: A #GMimeSignatureStatus. - * @errors: A bitfield of #GMimeSignatureError values. + * @status: A bitfield of #GMimeSignatureStatus values. * @cert: The #GMimeCertificate used in the signature. * @created: The creation date of the signature. * @expires: The expiration date of the signature. @@ -100,7 +104,6 @@ GObject parent_object; GMimeSignatureStatus status; - GMimeSignatureError errors; GMimeCertificate *cert; time_t created; time_t expires; @@ -122,9 +125,6 @@ void g_mime_signature_set_status (GMimeSignature *sig, GMimeSignatureStatus status); GMimeSignatureStatus g_mime_signature_get_status (GMimeSignature *sig); -void g_mime_signature_set_errors (GMimeSignature *sig, GMimeSignatureError errors); -GMimeSignatureError g_mime_signature_get_errors (GMimeSignature *sig); - void g_mime_signature_set_created (GMimeSignature *sig, time_t created); time_t g_mime_signature_get_created (GMimeSignature *sig); @@ -135,12 +135,13 @@ /** * GMimeSignatureList: * @parent_object: parent #GObject - * @array: An array of #GMimeSignature objects. * * A collection of #GMimeSignature objects. **/ struct _GMimeSignatureList { GObject parent_object; + + /* < private > */ GPtrArray *array; }; diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-stream-buffer.c gmime-3.0.1/gmime/gmime-stream-buffer.c --- gmime-2.6.22+dfsg2/gmime/gmime-stream-buffer.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-stream-buffer.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -150,8 +150,7 @@ return -1; } - switch (buffer->mode) { - case GMIME_STREAM_BUFFER_BLOCK_READ: + if (buffer->mode == GMIME_STREAM_BUFFER_BLOCK_READ) { while (len > 0) { /* consume what we can from any pre-buffered data we have left */ if ((n = MIN (buffer->buflen, len)) > 0) { @@ -186,45 +185,9 @@ break; } } - break; - case GMIME_STREAM_BUFFER_CACHE_READ: - while (len > 0) { - buflen = (size_t) (buffer->bufend - buffer->bufptr); - if ((n = MIN (buflen, len)) > 0) { - memcpy (buf + nread, buffer->bufptr, n); - buffer->bufptr += n; - nread += n; - len -= n; - } - - if (len > 0) { - /* we need to read more data... */ - offset = buffer->bufptr - buffer->buffer; - - buffer->buflen = buffer->bufend - buffer->buffer + MAX (BUFFER_GROW_SIZE, len); - buffer->buffer = g_realloc (buffer->buffer, buffer->buflen); - buffer->bufend = buffer->buffer + buffer->buflen; - buffer->bufptr = buffer->buffer + offset; - - n = g_mime_stream_read (buffer->source, buffer->bufptr, - buffer->bufend - buffer->bufptr); - - buffer->bufend = n > 0 ? buffer->bufptr + n : buffer->bufptr; - - if (n <= 0) { - if (nread == 0) - return n; - - break; - } - } - } - break; - default: + } else { if ((nread = g_mime_stream_read (buffer->source, buf, len)) == -1) return -1; - - break; } stream->position += nread; @@ -245,8 +208,7 @@ return -1; } - switch (buffer->mode) { - case GMIME_STREAM_BUFFER_BLOCK_WRITE: + if (buffer->mode == GMIME_STREAM_BUFFER_BLOCK_WRITE) { while (left > 0) { n = MIN (BLOCK_BUFFER_LEN - buffer->buflen, left); if (buffer->buflen > 0 || n < BLOCK_BUFFER_LEN) { @@ -295,12 +257,9 @@ break; } } - break; - default: + } else { if ((nwritten = g_mime_stream_write (source, buf, len)) == -1) return -1; - - break; } stream->position += nwritten; @@ -362,14 +321,8 @@ if (!g_mime_stream_eos (buffer->source)) return FALSE; - switch (buffer->mode) { - case GMIME_STREAM_BUFFER_BLOCK_READ: + if (buffer->mode == GMIME_STREAM_BUFFER_BLOCK_READ) return buffer->buflen == 0; - case GMIME_STREAM_BUFFER_CACHE_READ: - return buffer->bufptr == buffer->bufend; - default: - break; - } return TRUE; } @@ -384,24 +337,11 @@ return -1; } - switch (buffer->mode) { - case GMIME_STREAM_BUFFER_BLOCK_READ: - case GMIME_STREAM_BUFFER_BLOCK_WRITE: - if (g_mime_stream_reset (buffer->source) == -1) - return -1; - - buffer->bufptr = buffer->buffer; - buffer->buflen = 0; - break; - case GMIME_STREAM_BUFFER_CACHE_READ: - buffer->bufptr = buffer->buffer; - break; - default: - if (g_mime_stream_reset (buffer->source) == -1) - return -1; - - break; - } + if (g_mime_stream_reset (buffer->source) == -1) + return -1; + + buffer->bufptr = buffer->buffer; + buffer->buflen = 0; return 0; } @@ -486,99 +426,6 @@ } static gint64 -stream_seek_cache_read (GMimeStream *stream, gint64 offset, GMimeSeekWhence whence) -{ - GMimeStreamBuffer *buffer = (GMimeStreamBuffer *) stream; - gint64 buflen, len, total = 0; - gint64 pos, real; - ssize_t nread; - - switch (whence) { - case GMIME_STREAM_SEEK_SET: - real = offset; - break; - case GMIME_STREAM_SEEK_CUR: - real = stream->position + offset; - break; - case GMIME_STREAM_SEEK_END: - if (stream->bound_end == -1) { - /* we have to do a real seek because the end boundary is unknown */ - if ((real = g_mime_stream_seek (buffer->source, offset, whence)) == -1) - return -1; - - if (real < stream->bound_start) { - /* seek offset out of bounds */ - errno = EINVAL; - return -1; - } - } else { - real = stream->bound_end + offset; - if (real > stream->bound_end || real < stream->bound_start) { - /* seek offset out of bounds */ - errno = EINVAL; - return -1; - } - } - break; - default: - /* invalid whence argument */ - errno = EINVAL; - return -1; - } - - if (real > stream->position) { - /* buffer any data between position and real */ - len = real - (stream->bound_start + (buffer->bufend - buffer->bufptr)); - - if (buffer->bufptr + len <= buffer->bufend) { - buffer->bufptr += len; - stream->position = real; - return real; - } - - pos = buffer->bufptr - buffer->buffer; - - buflen = (buffer->bufend - buffer->buffer) + len; - if (buflen < (gint64) G_MAXSIZE) - buffer->buflen = (size_t) buflen; - else - buffer->buflen = G_MAXSIZE; - - buffer->buffer = g_realloc (buffer->buffer, buffer->buflen); - buffer->bufend = buffer->buffer + buffer->buflen; - buffer->bufptr = buffer->buffer + pos; - - do { - nread = g_mime_stream_read (buffer->source, buffer->bufptr, - buffer->bufend - buffer->bufptr); - if (nread > 0) { - total += nread; - buffer->bufptr += nread; - } - } while (nread != -1); - - buffer->bufend = buffer->bufptr; - if (total < len) { - /* we failed to seek that far so reset our bufptr */ - buffer->bufptr = buffer->buffer + pos; - errno = EINVAL; - return -1; - } - } else if (real < stream->bound_start) { - /* seek offset out of bounds */ - errno = EINVAL; - return -1; - } else { - /* seek our cache pointer backwards */ - buffer->bufptr = buffer->buffer + (real - stream->bound_start); - } - - stream->position = real; - - return real; -} - -static gint64 stream_seek (GMimeStream *stream, gint64 offset, GMimeSeekWhence whence) { GMimeStreamBuffer *buffer = (GMimeStreamBuffer *) stream; @@ -589,26 +436,18 @@ return -1; } - switch (buffer->mode) { - case GMIME_STREAM_BUFFER_BLOCK_WRITE: - if (stream_flush (stream) != 0) - return -1; - - if ((real = g_mime_stream_seek (buffer->source, offset, whence)) != -1) { - stream->position = real; - buffer->buflen = 0; - } - - return real; - case GMIME_STREAM_BUFFER_BLOCK_READ: + if (buffer->mode == GMIME_STREAM_BUFFER_BLOCK_READ) return stream_seek_block_read (stream, offset, whence); - case GMIME_STREAM_BUFFER_CACHE_READ: - return stream_seek_cache_read (stream, offset, whence); - default: - /* invalid whence argument */ - errno = EINVAL; + + if (stream_flush (stream) != 0) return -1; + + if ((real = g_mime_stream_seek (buffer->source, offset, whence)) != -1) { + stream->position = real; + buffer->buflen = 0; } + + return real; } static gint64 @@ -642,11 +481,7 @@ { GMimeStreamBuffer *buffer = (GMimeStreamBuffer *) stream; - /* FIXME: for cached reads we want to substream ourself rather - than substreaming our source because we have to assume that - the reason this stream is setup to do cached reads is - because the source stream is unseekable. */ - + /* substream our source */ return GMIME_STREAM_GET_CLASS (buffer->source)->substream (buffer->source, start, end); } @@ -667,34 +502,22 @@ g_return_val_if_fail (GMIME_IS_STREAM (source), NULL); - buffer = g_object_newv (GMIME_TYPE_STREAM_BUFFER, 0, NULL); + buffer = g_object_new (GMIME_TYPE_STREAM_BUFFER, NULL); buffer->source = source; g_object_ref (source); buffer->mode = mode; + buffer->buffer = g_malloc (BLOCK_BUFFER_LEN); + buffer->bufend = buffer->buffer + BLOCK_BUFFER_LEN; + buffer->bufptr = buffer->buffer; + buffer->buflen = 0; - switch (buffer->mode) { - case GMIME_STREAM_BUFFER_BLOCK_READ: - case GMIME_STREAM_BUFFER_BLOCK_WRITE: - buffer->buffer = g_malloc (BLOCK_BUFFER_LEN); - buffer->bufend = buffer->buffer + BLOCK_BUFFER_LEN; - buffer->bufptr = buffer->buffer; - buffer->buflen = 0; - break; - default: - buffer->buffer = g_malloc (BUFFER_GROW_SIZE); - buffer->bufptr = buffer->buffer; - buffer->bufend = buffer->buffer; - buffer->buflen = BUFFER_GROW_SIZE; - break; - } - - g_mime_stream_construct (GMIME_STREAM (buffer), + g_mime_stream_construct ((GMimeStream *) buffer, source->bound_start, source->bound_end); - return GMIME_STREAM (buffer); + return (GMimeStream *) buffer; } @@ -727,10 +550,9 @@ outend = buf + max - 1; if (GMIME_IS_STREAM_BUFFER (stream)) { - GMimeStreamBuffer *buffer = GMIME_STREAM_BUFFER (stream); + GMimeStreamBuffer *buffer = (GMimeStreamBuffer *) stream; - switch (buffer->mode) { - case GMIME_STREAM_BUFFER_BLOCK_READ: + if (buffer->mode == GMIME_STREAM_BUFFER_BLOCK_READ) { while (outptr < outend) { inptr = buffer->bufptr; inend = inptr + buffer->buflen; @@ -757,48 +579,12 @@ buffer->buflen = n; } } - break; - case GMIME_STREAM_BUFFER_CACHE_READ: - while (outptr < outend) { - inptr = buffer->bufptr; - inend = buffer->bufend; - while (outptr < outend && inptr < inend && *inptr != '\n') - c = *outptr++ = *inptr++; - - if (outptr < outend && inptr < inend && c != '\n') - c = *outptr++ = *inptr++; - - buffer->bufptr = inptr; - - if (c == '\n') - break; - - if (inptr == inend && outptr < outend) { - /* buffer more data */ - size_t offset = (size_t) (buffer->bufptr - buffer->buffer); - - buffer->buflen = buffer->bufend - buffer->buffer + - MAX (BUFFER_GROW_SIZE, outend - outptr + 1); - buffer->buffer = g_realloc (buffer->buffer, buffer->buflen); - buffer->bufend = buffer->buffer + buffer->buflen; - buffer->bufptr = buffer->buffer + offset; - nread = g_mime_stream_read (buffer->source, buffer->bufptr, - buffer->bufend - buffer->bufptr); - - buffer->bufend = nread >= 0 ? buffer->bufptr + nread : buffer->bufptr; - - if (nread <= 0) - break; - } - } - break; - default: + + /* increment our stream position pointer */ + stream->position += (outptr - buf); + } else { goto slow_and_painful; - break; } - - /* increment our stream position pointer */ - stream->position += (outptr - buf); } else { /* ugh...do it the slow and painful way... */ slow_and_painful: diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-stream-buffer.h gmime-3.0.1/gmime/gmime-stream-buffer.h --- gmime-2.6.22+dfsg2/gmime/gmime-stream-buffer.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-stream-buffer.h 2017-03-28 23:46:26.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -39,14 +39,12 @@ /** * GMimeStreamBufferMode: - * @GMIME_STREAM_BUFFER_CACHE_READ: Cache all reads. * @GMIME_STREAM_BUFFER_BLOCK_READ: Read in 4k blocks. * @GMIME_STREAM_BUFFER_BLOCK_WRITE: Write in 4k blocks. * * The buffering mode for a #GMimeStreamBuffer stream. **/ typedef enum { - GMIME_STREAM_BUFFER_CACHE_READ, GMIME_STREAM_BUFFER_BLOCK_READ, GMIME_STREAM_BUFFER_BLOCK_WRITE } GMimeStreamBufferMode; diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-stream.c gmime-3.0.1/gmime/gmime-stream.c --- gmime-2.6.22+dfsg2/gmime/gmime-stream.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-stream.c 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -537,10 +537,11 @@ * * Returns: the number of bytes written or %-1 on fail. **/ -ssize_t +gint64 g_mime_stream_write_to_stream (GMimeStream *src, GMimeStream *dest) { - ssize_t nread, nwritten, total = 0; + ssize_t nread, nwritten; + gint64 total = 0; char buf[4096]; g_return_val_if_fail (GMIME_IS_STREAM (src), -1); @@ -579,10 +580,10 @@ * * Returns: the number of bytes written or %-1 on fail. **/ -ssize_t +gint64 g_mime_stream_writev (GMimeStream *stream, GMimeStreamIOVector *vector, size_t count) { - ssize_t total = 0; + gint64 total = 0; size_t i; g_return_val_if_fail (GMIME_IS_STREAM (stream), -1); diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-stream-cat.c gmime-3.0.1/gmime/gmime-stream-cat.c --- gmime-2.6.22+dfsg2/gmime/gmime-stream-cat.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-stream-cat.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -641,11 +641,11 @@ } while (n != NULL); d(fprintf (stderr, "returning a substream containing multiple source streams\n")); - cat = g_object_newv (GMIME_TYPE_STREAM_CAT, 0, NULL); + cat = g_object_new (GMIME_TYPE_STREAM_CAT, NULL); /* Note: we could pass -1 as bound_end, it should Just * Work(tm) but setting absolute bounds is kinda * nice... */ - g_mime_stream_construct (GMIME_STREAM (cat), 0, subend); + g_mime_stream_construct ((GMimeStream *) cat, 0, subend); while (streams != NULL) { s = streams->next; @@ -684,7 +684,7 @@ { GMimeStream *stream; - stream = g_object_newv (GMIME_TYPE_STREAM_CAT, 0, NULL); + stream = g_object_new (GMIME_TYPE_STREAM_CAT, NULL); g_mime_stream_construct (stream, 0, -1); return stream; diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-stream-cat.h gmime-3.0.1/gmime/gmime-stream-cat.h --- gmime-2.6.22+dfsg2/gmime/gmime-stream-cat.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-stream-cat.h 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-stream-file.c gmime-3.0.1/gmime/gmime-stream-file.c --- gmime-2.6.22+dfsg2/gmime/gmime-stream-file.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-stream-file.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -32,6 +32,7 @@ #include #include "gmime-stream-file.h" +#include "gmime-error.h" /** @@ -153,7 +154,8 @@ len = (size_t) MIN (stream->bound_end - stream->position, (gint64) len); /* make sure we are at the right position */ - fseek (fstream->fp, (long) stream->position, SEEK_SET); + if ((fseek (fstream->fp, (long) stream->position, SEEK_SET)) == -1) + return -1; if ((nread = fread (buf, 1, len, fstream->fp)) > 0) stream->position += nread; @@ -181,7 +183,8 @@ len = (size_t) MIN (stream->bound_end - stream->position, (gint64) len); /* make sure we are at the right position */ - fseek (fstream->fp, (long) stream->position, SEEK_SET); + if (fseek (fstream->fp, (long) stream->position, SEEK_SET) == -1) + return -1; if ((nwritten = fwrite (buf, 1, len, fstream->fp)) > 0) stream->position += nwritten; @@ -327,9 +330,13 @@ if (stream->bound_start != -1 && stream->bound_end != -1) return stream->bound_end - stream->bound_start; - fseek (fstream->fp, (long) 0, SEEK_END); + if (fseek (fstream->fp, (long) 0, SEEK_END) == -1) + return -1; + bound_end = ftell (fstream->fp); - fseek (fstream->fp, (long) stream->position, SEEK_SET); + + if (fseek (fstream->fp, (long) stream->position, SEEK_SET) == -1) + return -1; if (bound_end < stream->bound_start) { errno = EINVAL; @@ -344,12 +351,12 @@ { GMimeStreamFile *fstream; - fstream = g_object_newv (GMIME_TYPE_STREAM_FILE, 0, NULL); - g_mime_stream_construct (GMIME_STREAM (fstream), start, end); + fstream = g_object_new (GMIME_TYPE_STREAM_FILE, NULL); + g_mime_stream_construct ((GMimeStream *) fstream, start, end); + fstream->fp = ((GMimeStreamFile *) stream)->fp; fstream->owner = FALSE; - fstream->fp = GMIME_STREAM_FILE (stream)->fp; - return GMIME_STREAM (fstream); + return (GMimeStream *) fstream; } @@ -379,12 +386,12 @@ if ((start = ftell (fp)) == -1) start = 0; - fstream = g_object_newv (GMIME_TYPE_STREAM_FILE, 0, NULL); - g_mime_stream_construct (GMIME_STREAM (fstream), start, -1); + fstream = g_object_new (GMIME_TYPE_STREAM_FILE, NULL); + g_mime_stream_construct ((GMimeStream *) fstream, start, -1); fstream->owner = TRUE; fstream->fp = fp; - return GMIME_STREAM (fstream); + return (GMimeStream *) fstream; } @@ -413,37 +420,38 @@ _setmode (_fileno (fp), O_BINARY); #endif - fstream = g_object_newv (GMIME_TYPE_STREAM_FILE, 0, NULL); - g_mime_stream_construct (GMIME_STREAM (fstream), start, end); + fstream = g_object_new (GMIME_TYPE_STREAM_FILE, NULL); + g_mime_stream_construct ((GMimeStream *) fstream, start, end); fstream->owner = TRUE; fstream->fp = fp; - return GMIME_STREAM (fstream); + return (GMimeStream *) fstream; } /** - * g_mime_stream_file_new_for_path: + * g_mime_stream_file_open: * @path: the path to a file * @mode: as in fopen(3) + * @err: a #GError * * Creates a new #GMimeStreamFile object for the specified @path. * - * Returns: a stream using for reading and/or writing to the specified - * file path or %NULL on error. - * - * Since: 2.6.18 + * Returns: (transfer full): a stream using for reading and/or writing to the + * specified file path or %NULL on error. **/ GMimeStream * -g_mime_stream_file_new_for_path (const char *path, const char *mode) +g_mime_stream_file_open (const char *path, const char *mode, GError **err) { FILE *fp; g_return_val_if_fail (path != NULL, NULL); g_return_val_if_fail (mode != NULL, NULL); - if (!(fp = fopen (path, mode))) + if (!(fp = fopen (path, mode))) { + g_set_error (err, GMIME_ERROR, errno, "Failed to open `%s': %s", path, g_strerror (errno)); return NULL; + } return g_mime_stream_file_new (fp); } diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-stream-file.h gmime-3.0.1/gmime/gmime-stream-file.h --- gmime-2.6.22+dfsg2/gmime/gmime-stream-file.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-stream-file.h 2017-03-18 01:31:54.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -64,7 +64,7 @@ GMimeStream *g_mime_stream_file_new (FILE *fp); GMimeStream *g_mime_stream_file_new_with_bounds (FILE *fp, gint64 start, gint64 end); -GMimeStream *g_mime_stream_file_new_for_path (const char *path, const char *mode); +GMimeStream *g_mime_stream_file_open (const char *path, const char *mode, GError **err); gboolean g_mime_stream_file_get_owner (GMimeStreamFile *stream); void g_mime_stream_file_set_owner (GMimeStreamFile *stream, gboolean owner); diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-stream-filter.c gmime-3.0.1/gmime/gmime-stream-filter.c --- gmime-2.6.22+dfsg2/gmime/gmime-stream-filter.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-stream-filter.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -139,6 +139,7 @@ g_mime_stream_filter_init (GMimeStreamFilter *stream, GMimeStreamFilterClass *klass) { stream->source = NULL; + stream->owner = FALSE; stream->priv = g_new (struct _GMimeStreamFilterPrivate, 1); stream->priv->filters = NULL; stream->priv->filterid = 0; @@ -287,7 +288,7 @@ if (len > 0 && g_mime_stream_write (filter->source, buffer, len) == -1) return -1; - return g_mime_stream_flush (filter->source); + return 0; } static int @@ -299,7 +300,10 @@ if (!priv->last_was_read) stream_flush (stream); - return g_mime_stream_close (filter->source); + if (filter->owner) + return g_mime_stream_close (filter->source); + + return 0; } static gboolean @@ -364,7 +368,7 @@ GMimeStreamFilter *filter = (GMimeStreamFilter *) stream; GMimeStreamFilter *sub; - sub = g_object_newv (GMIME_TYPE_STREAM_FILTER, 0, NULL); + sub = g_object_new (GMIME_TYPE_STREAM_FILTER, NULL); sub->source = filter->source; g_object_ref (sub->source); @@ -392,9 +396,9 @@ sub->priv->filterid = filter->priv->filterid; } - g_mime_stream_construct (GMIME_STREAM (filter), start, end); + g_mime_stream_construct ((GMimeStream *) filter, start, end); - return GMIME_STREAM (sub); + return (GMimeStream *) sub; } @@ -414,15 +418,15 @@ g_return_val_if_fail (GMIME_IS_STREAM (stream), NULL); - filter = g_object_newv (GMIME_TYPE_STREAM_FILTER, 0, NULL); + filter = g_object_new (GMIME_TYPE_STREAM_FILTER, NULL); filter->source = stream; g_object_ref (stream); - g_mime_stream_construct (GMIME_STREAM (filter), + g_mime_stream_construct ((GMimeStream *) filter, stream->bound_start, stream->bound_end); - return GMIME_STREAM (filter); + return (GMimeStream *) filter; } @@ -497,3 +501,40 @@ f = f->next; } } + + +/** + * g_mime_stream_filter_set_owner: + * @stream: a #GMimeStreamFilter + * @owner: %TRUE if this stream should own the source stream or %FALSE otherwise + * + * Sets whether or not @stream owns the source stream.. + * + * Note: @owner should be %TRUE if the stream should close() the + * backend source stream when destroyed or %FALSE otherwise. + **/ +void +g_mime_stream_filter_set_owner (GMimeStreamFilter *stream, gboolean owner) +{ + g_return_if_fail (GMIME_IS_STREAM_FILTER (stream)); + + stream->owner = owner; +} + + +/** + * g_mime_stream_filter_get_owner: + * @stream: a #GMimeStreamFilter + * + * Gets whether or not @stream owns the source stream. + * + * Returns: %TRUE if @stream owns the source stream or %FALSE + * otherwise. + **/ +gboolean +g_mime_stream_filter_get_owner (GMimeStreamFilter *stream) +{ + g_return_val_if_fail (GMIME_IS_STREAM_FILTER (stream), FALSE); + + return stream->owner; +} diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-stream-filter.h gmime-3.0.1/gmime/gmime-stream-filter.h --- gmime-2.6.22+dfsg2/gmime/gmime-stream-filter.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-stream-filter.h 2017-03-20 13:44:23.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -51,6 +51,7 @@ struct _GMimeStreamFilterPrivate *priv; GMimeStream *source; + gboolean owner; }; struct _GMimeStreamFilterClass { @@ -66,6 +67,9 @@ int g_mime_stream_filter_add (GMimeStreamFilter *stream, GMimeFilter *filter); void g_mime_stream_filter_remove (GMimeStreamFilter *stream, int id); +void g_mime_stream_filter_set_owner (GMimeStreamFilter *stream, gboolean owner); +gboolean g_mime_stream_filter_get_owner (GMimeStreamFilter *stream); + G_END_DECLS #endif /* __GMIME_STREAM_FILTER_H__ */ diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-stream-fs.c gmime-3.0.1/gmime/gmime-stream-fs.c --- gmime-2.6.22+dfsg2/gmime/gmime-stream-fs.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-stream-fs.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -33,6 +33,7 @@ #include #include "gmime-stream-fs.h" +#include "gmime-error.h" #ifndef HAVE_FSYNC #ifdef G_OS_WIN32 @@ -161,7 +162,8 @@ len = (size_t) MIN (stream->bound_end - stream->position, (gint64) len); /* make sure we are at the right position */ - lseek (fs->fd, (off_t) stream->position, SEEK_SET); + if (lseek (fs->fd, (off_t) stream->position, SEEK_SET) == -1) + return -1; do { nread = read (fs->fd, buf, len); @@ -197,7 +199,8 @@ len = (size_t) MIN (stream->bound_end - stream->position, (gint64) len); /* make sure we are at the right position */ - lseek (fs->fd, (off_t) stream->position, SEEK_SET); + if (lseek (fs->fd, (off_t) stream->position, SEEK_SET) == -1) + return -1; do { do { @@ -377,8 +380,11 @@ if (stream->bound_end != -1) return stream->bound_end - stream->bound_start; - bound_end = lseek (fs->fd, (off_t) 0, SEEK_END); - lseek (fs->fd, (off_t) stream->position, SEEK_SET); + if ((bound_end = lseek (fs->fd, (off_t) 0, SEEK_END)) == -1) + return -1; + + if (lseek (fs->fd, (off_t) stream->position, SEEK_SET) == -1) + return -1; if (bound_end < stream->bound_start) { errno = EINVAL; @@ -393,9 +399,9 @@ { GMimeStreamFs *fs; - fs = g_object_newv (GMIME_TYPE_STREAM_FS, 0, NULL); - g_mime_stream_construct (GMIME_STREAM (fs), start, end); - fs->fd = GMIME_STREAM_FS (stream)->fd; + fs = g_object_new (GMIME_TYPE_STREAM_FS, NULL); + g_mime_stream_construct ((GMimeStream *) fs, start, end); + fs->fd = ((GMimeStreamFs *) stream)->fd; fs->owner = FALSE; fs->eos = FALSE; @@ -424,8 +430,8 @@ if ((start = lseek (fd, (off_t) 0, SEEK_CUR)) == -1) start = 0; - fs = g_object_newv (GMIME_TYPE_STREAM_FS, 0, NULL); - g_mime_stream_construct (GMIME_STREAM (fs), start, -1); + fs = g_object_new (GMIME_TYPE_STREAM_FS, NULL); + g_mime_stream_construct ((GMimeStream *) fs, start, -1); fs->owner = TRUE; fs->eos = FALSE; fs->fd = fd; @@ -454,8 +460,8 @@ _setmode (fd, O_BINARY); #endif - fs = g_object_newv (GMIME_TYPE_STREAM_FS, 0, NULL); - g_mime_stream_construct (GMIME_STREAM (fs), start, end); + fs = g_object_new (GMIME_TYPE_STREAM_FS, NULL); + g_mime_stream_construct ((GMimeStream *) fs, start, end); fs->owner = TRUE; fs->eos = FALSE; fs->fd = fd; @@ -465,27 +471,28 @@ /** - * g_mime_stream_fs_new_for_path: + * g_mime_stream_fs_open: * @path: the path to a file * @flags: as in open(2) * @mode: as in open(2) + * @err: a #GError * * Creates a new #GMimeStreamFs object for the specified @path. * - * Returns: a stream using for reading and/or writing to the specified - * file path or %NULL on error. - * - * Since: 2.6.18 + * Returns: (transfer full): a stream using for reading and/or writing to the + * specified file path or %NULL on error. **/ GMimeStream * -g_mime_stream_fs_new_for_path (const char *path, int flags, int mode) +g_mime_stream_fs_open (const char *path, int flags, int mode, GError **err) { int fd; g_return_val_if_fail (path != NULL, NULL); - if ((fd = g_open (path, flags, mode)) == -1) + if ((fd = g_open (path, flags, mode)) == -1) { + g_set_error (err, GMIME_ERROR, errno, "Failed to open `%s': %s", path, g_strerror (errno)); return NULL; + } return g_mime_stream_fs_new (fd); } diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-stream-fs.h gmime-3.0.1/gmime/gmime-stream-fs.h --- gmime-2.6.22+dfsg2/gmime/gmime-stream-fs.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-stream-fs.h 2017-03-18 01:31:54.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -64,7 +64,7 @@ GMimeStream *g_mime_stream_fs_new (int fd); GMimeStream *g_mime_stream_fs_new_with_bounds (int fd, gint64 start, gint64 end); -GMimeStream *g_mime_stream_fs_new_for_path (const char *path, int flags, int mode); +GMimeStream *g_mime_stream_fs_open (const char *path, int flags, int mode, GError **err); gboolean g_mime_stream_fs_get_owner (GMimeStreamFs *stream); void g_mime_stream_fs_set_owner (GMimeStreamFs *stream, gboolean owner); diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-stream-gio.c gmime-3.0.1/gmime/gmime-stream-gio.c --- gmime-2.6.22+dfsg2/gmime/gmime-stream-gio.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-stream-gio.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -620,9 +620,9 @@ { GMimeStreamGIO *gio; - gio = g_object_newv (GMIME_TYPE_STREAM_GIO, 0, NULL); - g_mime_stream_construct (GMIME_STREAM (gio), start, end); - gio->file = GMIME_STREAM_GIO (stream)->file; + gio = g_object_new (GMIME_TYPE_STREAM_GIO, NULL); + g_mime_stream_construct ((GMimeStream *) gio, start, end); + gio->file = ((GMimeStreamGIO *) stream)->file; gio->owner = FALSE; gio->eos = FALSE; @@ -645,8 +645,8 @@ g_return_val_if_fail (G_IS_FILE (file), NULL); - gio = g_object_newv (GMIME_TYPE_STREAM_GIO, 0, NULL); - g_mime_stream_construct (GMIME_STREAM (gio), 0, -1); + gio = g_object_new (GMIME_TYPE_STREAM_GIO, NULL); + g_mime_stream_construct ((GMimeStream *) gio, 0, -1); gio->file = file; gio->owner = TRUE; gio->eos = FALSE; @@ -674,8 +674,8 @@ g_return_val_if_fail (G_IS_FILE (file), NULL); - gio = g_object_newv (GMIME_TYPE_STREAM_GIO, 0, NULL); - g_mime_stream_construct (GMIME_STREAM (gio), start, end); + gio = g_object_new (GMIME_TYPE_STREAM_GIO, NULL); + g_mime_stream_construct ((GMimeStream *) gio, start, end); gio->file = file; gio->owner = TRUE; gio->eos = FALSE; diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-stream-gio.h gmime-3.0.1/gmime/gmime-stream-gio.h --- gmime-2.6.22+dfsg2/gmime/gmime-stream-gio.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-stream-gio.h 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-stream.h gmime-3.0.1/gmime/gmime-stream.h --- gmime-2.6.22+dfsg2/gmime/gmime-stream.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-stream.h 2017-03-11 14:31:01.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -73,10 +73,6 @@ /** * GMimeStream: * @parent_object: parent #GObject - * @super_stream: parent stream if this is a substream - * @position: the current stream position - * @bound_start: start boundary of the stream - * @bound_end: end boundary of the stream * * Abstract I/O stream class. **/ @@ -130,9 +126,9 @@ ssize_t g_mime_stream_write_string (GMimeStream *stream, const char *str); ssize_t g_mime_stream_printf (GMimeStream *stream, const char *fmt, ...) G_GNUC_PRINTF (2, 3); -ssize_t g_mime_stream_write_to_stream (GMimeStream *src, GMimeStream *dest); +gint64 g_mime_stream_write_to_stream (GMimeStream *src, GMimeStream *dest); -ssize_t g_mime_stream_writev (GMimeStream *stream, GMimeStreamIOVector *vector, size_t count); +gint64 g_mime_stream_writev (GMimeStream *stream, GMimeStreamIOVector *vector, size_t count); G_END_DECLS diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-stream-mem.c gmime-3.0.1/gmime/gmime-stream-mem.c --- gmime-2.6.22+dfsg2/gmime/gmime-stream-mem.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-stream-mem.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -319,9 +319,9 @@ { GMimeStreamMem *mem; - mem = g_object_newv (GMIME_TYPE_STREAM_MEM, 0, NULL); + mem = g_object_new (GMIME_TYPE_STREAM_MEM, NULL); g_mime_stream_construct ((GMimeStream *) mem, start, end); - mem->buffer = GMIME_STREAM_MEM (stream)->buffer; + mem->buffer = ((GMimeStreamMem *) stream)->buffer; mem->owner = FALSE; return (GMimeStream *) mem; @@ -340,7 +340,7 @@ { GMimeStreamMem *mem; - mem = g_object_newv (GMIME_TYPE_STREAM_MEM, 0, NULL); + mem = g_object_new (GMIME_TYPE_STREAM_MEM, NULL); g_mime_stream_construct ((GMimeStream *) mem, 0, -1); mem->buffer = g_byte_array_new (); mem->owner = TRUE; @@ -362,7 +362,7 @@ { GMimeStreamMem *mem; - mem = g_object_newv (GMIME_TYPE_STREAM_MEM, 0, NULL); + mem = g_object_new (GMIME_TYPE_STREAM_MEM, NULL); g_mime_stream_construct ((GMimeStream *) mem, 0, -1); mem->buffer = array; mem->owner = TRUE; @@ -385,12 +385,10 @@ g_mime_stream_mem_new_with_buffer (const char *buffer, size_t len) { GMimeStreamMem *mem; + + g_return_val_if_fail (buffer != NULL, NULL); - mem = g_object_newv (GMIME_TYPE_STREAM_MEM, 0, NULL); - g_mime_stream_construct ((GMimeStream *) mem, 0, -1); - mem->buffer = g_byte_array_new (); - mem->owner = TRUE; - + mem = (GMimeStreamMem *) g_mime_stream_mem_new (); g_byte_array_append (mem->buffer, (unsigned char *) buffer, len); return (GMimeStream *) mem; @@ -427,7 +425,7 @@ void g_mime_stream_mem_set_byte_array (GMimeStreamMem *mem, GByteArray *array) { - GMimeStream *stream; + GMimeStream *stream = (GMimeStream *) mem; g_return_if_fail (GMIME_IS_STREAM_MEM (mem)); g_return_if_fail (array != NULL); @@ -438,8 +436,6 @@ mem->buffer = array; mem->owner = FALSE; - stream = GMIME_STREAM (mem); - stream->position = 0; stream->bound_start = 0; stream->bound_end = -1; diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-stream-mem.h gmime-3.0.1/gmime/gmime-stream-mem.h --- gmime-2.6.22+dfsg2/gmime/gmime-stream-mem.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-stream-mem.h 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-stream-mmap.c gmime-3.0.1/gmime/gmime-stream-mmap.c --- gmime-2.6.22+dfsg2/gmime/gmime-stream-mmap.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-stream-mmap.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -361,17 +361,15 @@ static GMimeStream * stream_substream (GMimeStream *stream, gint64 start, gint64 end) { - /* FIXME: maybe we should return a GMimeStreamFs? */ GMimeStreamMmap *mstream; - mstream = g_object_newv (GMIME_TYPE_STREAM_MMAP, 0, NULL); - g_mime_stream_construct (GMIME_STREAM (mstream), start, end); - mstream->fd = GMIME_STREAM_MMAP (stream)->fd; + mstream = g_object_new (GMIME_TYPE_STREAM_MMAP, NULL); + g_mime_stream_construct ((GMimeStream *) mstream, start, end); + mstream->maplen = ((GMimeStreamMmap *) stream)->maplen; + mstream->map = ((GMimeStreamMmap *) stream)->map; + mstream->fd = ((GMimeStreamMmap *) stream)->fd; mstream->owner = FALSE; - mstream->maplen = GMIME_STREAM_MMAP (stream)->maplen; - mstream->map = GMIME_STREAM_MMAP (stream)->map; - return (GMimeStream *) mstream; } @@ -405,7 +403,7 @@ if (map == MAP_FAILED) return NULL; - mstream = g_object_newv (GMIME_TYPE_STREAM_MMAP, 0, NULL); + mstream = g_object_new (GMIME_TYPE_STREAM_MMAP, NULL); g_mime_stream_construct ((GMimeStream *) mstream, start, -1); mstream->owner = TRUE; mstream->eos = FALSE; @@ -453,7 +451,7 @@ if ((map = mmap (NULL, len, prot, flags, fd, 0)) == MAP_FAILED) return NULL; - mstream = g_object_newv (GMIME_TYPE_STREAM_MMAP, 0, NULL); + mstream = g_object_new (GMIME_TYPE_STREAM_MMAP, NULL); g_mime_stream_construct ((GMimeStream *) mstream, start, end); mstream->owner = TRUE; mstream->eos = FALSE; diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-stream-mmap.h gmime-3.0.1/gmime/gmime-stream-mmap.h --- gmime-2.6.22+dfsg2/gmime/gmime-stream-mmap.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-stream-mmap.h 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-stream-null.c gmime-3.0.1/gmime/gmime-stream-null.c --- gmime-2.6.22+dfsg2/gmime/gmime-stream-null.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-stream-null.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -113,6 +113,7 @@ { stream->written = 0; stream->newlines = 0; + stream->count_newlines = FALSE; } static void @@ -139,10 +140,12 @@ register const char *inptr = buf; const char *inend = buf + len; - while (inptr < inend) { - if (*inptr == '\n') - null->newlines++; - inptr++; + if (null->count_newlines) { + while (inptr < inend) { + if (*inptr == '\n') + null->newlines++; + inptr++; + } } null->written += len; @@ -228,7 +231,7 @@ { GMimeStream *null; - null = g_object_newv (GMIME_TYPE_STREAM_NULL, 0, NULL); + null = g_object_new (GMIME_TYPE_STREAM_NULL, NULL); g_mime_stream_construct (null, start, end); return null; @@ -247,8 +250,43 @@ { GMimeStream *null; - null = g_object_newv (GMIME_TYPE_STREAM_NULL, 0, NULL); + null = g_object_new (GMIME_TYPE_STREAM_NULL, NULL); g_mime_stream_construct (null, 0, -1); return null; } + + +/** + * g_mime_stream_null_set_count_newlines: + * @stream: a #GMimeStreamNull + * @count: %TRUE if newlines should be counted or %FALSE otherwise + * + * Sets whether or not the stream should keep track of the number of newlines + * encountered. + **/ +void +g_mime_stream_null_count_newlines (GMimeStreamNull *stream, gboolean count) +{ + g_return_if_fail (GMIME_IS_STREAM_NULL (stream)); + + stream->count_newlines = count; +} + + +/** + * g_mime_stream_null_get_count_newlines: + * @stream: a #GMimeStreamNull + * + * Gets whether or not the stream should keep track of the number of newlines + * encountered. + * + * Returns: %TRUE if the stream should count the number of newlines or %FALSE otherwise. + **/ +gboolean +g_mime_stream_null_get_count_newlines (GMimeStreamNull *stream) +{ + g_return_val_if_fail (GMIME_IS_STREAM_NULL (stream), FALSE); + + return stream->count_newlines; +} diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-stream-null.h gmime-3.0.1/gmime/gmime-stream-null.h --- gmime-2.6.22+dfsg2/gmime/gmime-stream-null.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-stream-null.h 2017-03-20 13:44:23.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -42,6 +42,7 @@ * @parent_object: parent #GMimeStream * @written: number of bytes written to this stream * @newlines: the number of newlines written to this stream + * @count_newlines: whether or not the stream should count newlines * * A #GMimeStream which has no backing store. **/ @@ -50,6 +51,8 @@ size_t written; size_t newlines; + + gboolean count_newlines; }; struct _GMimeStreamNullClass { @@ -62,6 +65,9 @@ GMimeStream *g_mime_stream_null_new (void); +void g_mime_stream_null_set_count_newlines (GMimeStreamNull *stream, gboolean count); +gboolean g_mime_stream_null_get_count_newlines (GMimeStreamNull *stream); + G_END_DECLS #endif /* __GMIME_STREAM_NULL_H__ */ diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-stream-pipe.c gmime-3.0.1/gmime/gmime-stream-pipe.c --- gmime-2.6.22+dfsg2/gmime/gmime-stream-pipe.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-stream-pipe.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -279,7 +279,15 @@ static GMimeStream * stream_substream (GMimeStream *stream, gint64 start, gint64 end) { - return NULL; + GMimeStreamPipe *pipes; + + pipes = g_object_new (GMIME_TYPE_STREAM_PIPE, NULL); + g_mime_stream_construct ((GMimeStream *) pipes, start, end); + pipes->fd = ((GMimeStreamPipe *) stream)->fd; + pipes->owner = FALSE; + pipes->eos = FALSE; + + return (GMimeStream *) pipes; } @@ -296,8 +304,8 @@ { GMimeStreamPipe *pipes; - pipes = g_object_newv (GMIME_TYPE_STREAM_PIPE, 0, NULL); - g_mime_stream_construct (GMIME_STREAM (pipes), 0, -1); + pipes = g_object_new (GMIME_TYPE_STREAM_PIPE, NULL); + g_mime_stream_construct ((GMimeStream *) pipes, 0, -1); pipes->owner = TRUE; pipes->eos = FALSE; pipes->fd = fd; diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-stream-pipe.h gmime-3.0.1/gmime/gmime-stream-pipe.h --- gmime-2.6.22+dfsg2/gmime/gmime-stream-pipe.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-stream-pipe.h 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-table-private.h gmime-3.0.1/gmime/gmime-table-private.h --- gmime-2.6.22+dfsg2/gmime/gmime-table-private.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-table-private.h 2017-03-11 14:36:26.000000000 +0000 @@ -1,10 +1,10 @@ /* THIS FILE IS AUTOGENERATED: DO NOT EDIT! */ -/** +/* * To regenerate: * make gen-table * ./gen-table > gmime-table-private.h - **/ + */ static unsigned short gmime_special_table[256] = { 1029,1029,1029,1029,1029,1029,1029,1029,1029,3175,1031,1029,1029,1063,1029,1029, diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-text-part.c gmime-3.0.1/gmime/gmime-text-part.c --- gmime-2.6.22+dfsg2/gmime/gmime-text-part.c 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-text-part.c 2017-04-08 17:01:10.000000000 +0000 @@ -0,0 +1,309 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2017 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include "gmime-text-part.h" +#include "gmime-stream-mem.h" +#include "gmime-stream-filter.h" +#include "gmime-filter-charset.h" +#include "gmime-charset.h" + +#define d(x) + + +/** + * SECTION: gmime-text-part + * @title: GMimeTextPart + * @short_description: textual MIME parts + * @see_also: + * + * A #GMimeTextPart represents any text MIME part. + **/ + +/* GObject class methods */ +static void g_mime_text_part_class_init (GMimeTextPartClass *klass); +static void g_mime_text_part_init (GMimeTextPart *mime_part, GMimeTextPartClass *klass); +static void g_mime_text_part_finalize (GObject *object); + + +static GMimePartClass *parent_class = NULL; + + +GType +g_mime_text_part_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeTextPartClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_text_part_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeTextPart), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_text_part_init, + }; + + type = g_type_register_static (GMIME_TYPE_PART, "GMimeTextPart", &info, 0); + } + + return type; +} + + +static void +g_mime_text_part_class_init (GMimeTextPartClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_PART); + + gobject_class->finalize = g_mime_text_part_finalize; +} + +static void +g_mime_text_part_init (GMimeTextPart *mime_part, GMimeTextPartClass *klass) +{ +} + +static void +g_mime_text_part_finalize (GObject *object) +{ + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +/** + * g_mime_text_part_new: + * + * Creates a new text MIME part object with a default content-type of + * text/plain. + * + * Returns: an empty MIME Part object with a default content-type of + * text/plain. + **/ +GMimeTextPart * +g_mime_text_part_new (void) +{ + GMimeContentType *content_type; + GMimeTextPart *mime_part; + + mime_part = g_object_new (GMIME_TYPE_TEXT_PART, NULL); + + content_type = g_mime_content_type_new ("text", "plain"); + g_mime_object_set_content_type ((GMimeObject *) mime_part, content_type); + g_object_unref (content_type); + + return mime_part; +} + + +/** + * g_mime_text_part_new_with_subtype: + * @subtype: textual subtype string + * + * Creates a new text MIME part with a sepcified subtype. + * + * Returns: an empty text MIME part object with the specified subtype. + **/ +GMimeTextPart * +g_mime_text_part_new_with_subtype (const char *subtype) +{ + GMimeContentType *content_type; + GMimeTextPart *mime_part; + + mime_part = g_object_new (GMIME_TYPE_TEXT_PART, NULL); + + content_type = g_mime_content_type_new ("text", subtype); + g_mime_object_set_content_type ((GMimeObject *) mime_part, content_type); + g_object_unref (content_type); + + return mime_part; +} + + +/** + * g_mime_text_part_set_charset: + * @mime_part: a #GMimeTextPart + * @charset: the name of the charset + * + * Sets the charset parameter on the Content-Type header to the specified value. + **/ +void +g_mime_text_part_set_charset (GMimeTextPart *mime_part, const char *charset) +{ + GMimeContentType *content_type; + + g_return_if_fail (GMIME_IS_TEXT_PART (mime_part)); + g_return_if_fail (charset != NULL); + + content_type = g_mime_object_get_content_type ((GMimeObject *) mime_part); + g_mime_content_type_set_parameter (content_type, "charset", charset); +} + + +/** + * g_mime_text_part_get_charset: + * @mime_part: a #GMimeTextPart + * + * Gets the value of the charset parameter on the Content-Type header. + * + * Returns: the value of the charset parameter or %NULL if unavailable. + **/ +const char * +g_mime_text_part_get_charset (GMimeTextPart *mime_part) +{ + GMimeContentType *content_type; + + g_return_val_if_fail (GMIME_IS_TEXT_PART (mime_part), NULL); + + content_type = g_mime_object_get_content_type ((GMimeObject *) mime_part); + + return g_mime_content_type_get_parameter (content_type, "charset"); +} + + +/** + * g_mime_text_part_set_text: + * @mime_part: a #GMimeTextPart + * @text: the text in utf-8 + * + * Sets the specified text as the content and updates the charset parameter on the Content-Type header. + **/ +void +g_mime_text_part_set_text (GMimeTextPart *mime_part, const char *text) +{ + GMimeContentType *content_type; + GMimeStream *filtered, *stream; + GMimeContentEncoding encoding; + GMimeDataWrapper *content; + GMimeFilter *filter; + const char *charset; + GMimeCharset mask; + size_t len; + + g_return_if_fail (GMIME_IS_TEXT_PART (mime_part)); + g_return_if_fail (text != NULL); + + len = strlen (text); + + g_mime_charset_init (&mask); + g_mime_charset_step (&mask, text, len); + + switch (mask.level) { + case 1: charset = "iso-8859-1"; break; + case 0: charset = "us-ascii"; break; + default: charset = "utf-8"; break; + } + + content_type = g_mime_object_get_content_type ((GMimeObject *) mime_part); + g_mime_content_type_set_parameter (content_type, "charset", charset); + + stream = g_mime_stream_mem_new_with_buffer (text, len); + + if (mask.level == 1) { + filtered = g_mime_stream_filter_new (stream); + g_object_unref (stream); + + filter = g_mime_filter_charset_new ("utf-8", charset); + g_mime_stream_filter_add ((GMimeStreamFilter *) filtered, filter); + g_object_unref (filter); + + stream = filtered; + } + + content = g_mime_data_wrapper_new_with_stream (stream, GMIME_CONTENT_ENCODING_DEFAULT); + g_object_unref (stream); + + g_mime_part_set_content ((GMimePart *) mime_part, content); + g_object_unref (content); + + encoding = g_mime_part_get_content_encoding ((GMimePart *) mime_part); + + /* if the user has already specified encoding the content with base64/qp/uu, don't change it */ + if (encoding > GMIME_CONTENT_ENCODING_BINARY) + return; + + /* ...otherwise, set an appropriate Content-Transfer-Encoding based on the text provided... */ + if (mask.level > 0) + g_mime_part_set_content_encoding ((GMimePart *) mime_part, GMIME_CONTENT_ENCODING_8BIT); + else + g_mime_part_set_content_encoding ((GMimePart *) mime_part, GMIME_CONTENT_ENCODING_7BIT); +} + + +/** + * g_mime_text_part_get_text: + * @mime_part: a #GMimeTextPart + * + * Gets the text content of the @mime_part as a string. + * + * Returns: a newly allocated string containing the utf-8 encoded text content. + **/ +char * +g_mime_text_part_get_text (GMimeTextPart *mime_part) +{ + GMimeContentType *content_type; + GMimeStream *filtered, *stream; + GMimeDataWrapper *content; + GMimeFilter *filter; + const char *charset; + GByteArray *buf; + + g_return_val_if_fail (GMIME_IS_TEXT_PART (mime_part), NULL); + + if (!(content = g_mime_part_get_content ((GMimePart *) mime_part))) + return NULL; + + content_type = g_mime_object_get_content_type ((GMimeObject *) mime_part); + stream = g_mime_stream_mem_new (); + + if ((charset = g_mime_content_type_get_parameter (content_type, "charset")) != NULL) { + filter = g_mime_filter_charset_new (charset, "utf-8"); + filtered = g_mime_stream_filter_new (stream); + g_mime_stream_filter_add ((GMimeStreamFilter *) filtered, filter); + g_object_unref (filter); + + g_mime_data_wrapper_write_to_stream (content, filtered); + g_mime_stream_flush (filtered); + g_object_unref (filtered); + } else { + g_mime_data_wrapper_write_to_stream (content, stream); + } + + g_mime_stream_write (stream, "", 1); + + buf = g_mime_stream_mem_get_byte_array ((GMimeStreamMem *) stream); + g_mime_stream_mem_set_owner ((GMimeStreamMem *) stream, FALSE); + g_object_unref (stream); + + return (char *) g_byte_array_free (buf, FALSE); +} diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-text-part.h gmime-3.0.1/gmime/gmime-text-part.h --- gmime-2.6.22+dfsg2/gmime/gmime-text-part.h 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-text-part.h 2017-03-09 00:57:14.000000000 +0000 @@ -0,0 +1,70 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2017 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_TEXT_PART_H__ +#define __GMIME_TEXT_PART_H__ + +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_TEXT_PART (g_mime_text_part_get_type ()) +#define GMIME_TEXT_PART(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_TEXT_PART, GMimeTextPart)) +#define GMIME_TEXT_PART_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_TEXT_PART, GMimeTextPartClass)) +#define GMIME_IS_TEXT_PART(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_TEXT_PART)) +#define GMIME_IS_TEXT_PART_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_TEXT_PART)) +#define GMIME_TEXT_PART_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_TEXT_PART, GMimeTextPartClass)) + +typedef struct _GMimeTextPart GMimeTextPart; +typedef struct _GMimeTextPartClass GMimeTextPartClass; + +/** + * GMimeTextPart: + * @parent_object: parent #GMimePart + * + * A text MIME part object. + **/ +struct _GMimeTextPart { + GMimePart parent_object; + +}; + +struct _GMimeTextPartClass { + GMimePartClass parent_class; + +}; + + +GType g_mime_text_part_get_type (void); + +/* constructors */ +GMimeTextPart *g_mime_text_part_new (void); +GMimeTextPart *g_mime_text_part_new_with_subtype (const char *subtype); + +void g_mime_text_part_set_charset (GMimeTextPart *mime_part, const char *charset); +const char *g_mime_text_part_get_charset (GMimeTextPart *mime_part); + +void g_mime_text_part_set_text (GMimeTextPart *mime_part, const char *text); +char *g_mime_text_part_get_text (GMimeTextPart *mime_part); + +G_END_DECLS + +#endif /* __GMIME_TEXT_PART_H__ */ diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-utils.c gmime-3.0.1/gmime/gmime-utils.c --- gmime-2.6.22+dfsg2/gmime/gmime-utils.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-utils.c 2017-05-06 14:24:46.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -50,7 +50,13 @@ #include #include +#ifdef LIBIDN +#include +#endif + #include "gmime-utils.h" +#include "gmime-common.h" +#include "gmime-internal.h" #include "gmime-table-private.h" #include "gmime-parse-utils.h" #include "gmime-part.h" @@ -77,19 +83,6 @@ * and encodings. **/ -extern gboolean _g_mime_enable_rfc2047_workarounds (void); -extern gboolean _g_mime_use_only_user_charsets (void); - -#ifdef G_THREADS_ENABLED -extern void _g_mime_msgid_unlock (void); -extern void _g_mime_msgid_lock (void); -#define MSGID_UNLOCK() _g_mime_msgid_unlock () -#define MSGID_LOCK() _g_mime_msgid_lock () -#else -#define MSGID_UNLOCK() -#define MSGID_LOCK() -#endif - #define GMIME_FOLD_PREENCODED (GMIME_FOLD_LEN / 2) /* date parser macros */ @@ -109,6 +102,14 @@ #define DATE_TOKEN_NON_TIMEZONE_NUMERIC (1 << 6) #define DATE_TOKEN_HAS_SIGN (1 << 7) +static char base36[36] = { + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', + 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', + 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', + 'W', 'X', 'Y', 'Z' +}; + static unsigned char tohex[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' @@ -190,35 +191,40 @@ /** * g_mime_utils_header_format_date: - * @date: time_t date representation - * @tz_offset: Timezone offset + * @date: a #GDateTime * * Allocates a string buffer containing the rfc822 formatted date - * string represented by @time and @tz_offset. + * string represented by @date. * * Returns: a valid string representation of the date. **/ char * -g_mime_utils_header_format_date (time_t date, int tz_offset) +g_mime_utils_header_format_date (GDateTime *date) { - struct tm tm; + int wday, year, month, day, hour, min, sec, tz_offset, sign; + GTimeSpan tz; - date += ((tz_offset / 100) * (60 * 60)) + (tz_offset % 100) * 60; + g_return_val_if_fail (date != NULL, NULL); -#if defined (HAVE_GMTIME_R) - gmtime_r (&date, &tm); -#elif defined (HAVE_GMTIME_S) - gmtime_s (&tm, &date); -#else - memcpy (&tm, gmtime (&date), sizeof (tm)); -#endif + wday = g_date_time_get_day_of_week (date); + year = g_date_time_get_year (date); + month = g_date_time_get_month (date); + day = g_date_time_get_day_of_month (date); + hour = g_date_time_get_hour (date); + min = g_date_time_get_minute (date); + sec = g_date_time_get_second (date); + tz = g_date_time_get_utc_offset (date); + + sign = tz < 0 ? -1 : 1; + tz *= sign; + + tz_offset = 100 * (tz / G_TIME_SPAN_HOUR); + tz_offset += (tz % G_TIME_SPAN_HOUR) / G_TIME_SPAN_MINUTE; + tz_offset *= sign; return g_strdup_printf ("%s, %02d %s %04d %02d:%02d:%02d %+05d", - tm_days[tm.tm_wday], tm.tm_mday, - tm_months[tm.tm_mon], - tm.tm_year + 1900, - tm.tm_hour, tm.tm_min, tm.tm_sec, - tz_offset); + tm_days[wday % 7], day, tm_months[month - 1], + year, hour, min, sec, tz_offset); } /* This is where it gets ugly... */ @@ -292,14 +298,16 @@ if (*inptr == '-') { sign = -1; inptr++; - } else if (*inptr == '+') + } else if (*inptr == '+') { inptr++; + } - for ( ; inptr < inend; inptr++) { + while (inptr < inend) { if (!(*inptr >= '0' && *inptr <= '9')) return -1; - else - val = (val * 10) + (*inptr - '0'); + + val = (val * 10) + (*inptr - '0'); + inptr++; } val *= sign; @@ -381,7 +389,7 @@ for (i = 0; i < 12; i++) { if (!g_ascii_strncasecmp (in, tm_months[i], 3)) - return i; + return i + 1; } return -1; /* unknown month */ @@ -439,151 +447,112 @@ return TRUE; } -static int +static GTimeZone * get_tzone (date_token **token) { const char *inptr, *inend; - size_t inlen; - int i, t; + char tzone[8]; + GTimeZone *tz; + size_t len, n; + int value, i; + guint t; for (i = 0; *token && i < 2; *token = (*token)->next, i++) { inptr = (*token)->start; - inlen = (*token)->len; - inend = inptr + inlen; + len = (*token)->len; + inend = inptr + len; - if (*inptr == '+' || *inptr == '-') { - return decode_int (inptr, inlen); - } else { - if (*inptr == '(') { - inptr++; - if (*(inend - 1) == ')') - inlen -= 2; - else - inlen--; - } + if (len >= 6) + continue; + + if (len == 5 && (*inptr == '+' || *inptr == '-')) { + if ((value = decode_int (inptr, len)) == -1) + return NULL; - for (t = 0; t < 15; t++) { - size_t len = strlen (tz_offsets[t].name); - - if (len != inlen) - continue; - - if (!strncmp (inptr, tz_offsets[t].name, len)) - return tz_offsets[t].offset; - } + memcpy (tzone, inptr, len); + tzone[len] = '\0'; + + return g_time_zone_new (tzone); } - } - - return -1; -} - -static time_t -mktime_utc (struct tm *tm) -{ - time_t tt; - long tz; - - tm->tm_isdst = -1; - tt = mktime (tm); - -#if defined (G_OS_WIN32) && !defined (__MINGW32__) - _get_timezone (&tz); - if (tm->tm_isdst > 0) { - int dst; - _get_dstbias (&dst); - tz += dst; - } -#elif defined (HAVE_TM_GMTOFF) - tz = -tm->tm_gmtoff; -#elif defined (HAVE_TIMEZONE) - if (tm->tm_isdst > 0) { -#if defined (HAVE_ALTZONE) - tz = altzone; -#else /* !defined (HAVE_ALTZONE) */ - tz = (timezone - 3600); -#endif - } else { - tz = timezone; + if (*inptr == '(') { + inptr++; + if (*(inend - 1) == ')') + len -= 2; + else + len--; + } + + for (t = 0; t < G_N_ELEMENTS (tz_offsets); t++) { + n = strlen (tz_offsets[t].name); + + if (n != len || strncmp (inptr, tz_offsets[t].name, n) != 0) + continue; + + snprintf (tzone, 6, "%+05d", tz_offsets[t].offset); + + return g_time_zone_new (tzone); + } } -#elif defined (HAVE__TIMEZONE) - tz = _timezone; -#else -#error Neither HAVE_TIMEZONE nor HAVE_TM_GMTOFF defined. Rerun autoheader, autoconf, etc. -#endif - return tt - tz; + return NULL; } -static time_t -parse_rfc822_date (date_token *tokens, int *tzone) +static GDateTime * +parse_rfc822_date (date_token *tokens) { - int hour, min, sec, offset, n; + int wday, year, month, day, hour, min, sec, n; + GTimeZone *tz = NULL; date_token *token; - struct tm tm; - time_t t; - - g_return_val_if_fail (tokens != NULL, (time_t) 0); + GDateTime *date; token = tokens; - memset ((void *) &tm, 0, sizeof (struct tm)); + wday = year = month = day = hour = min = sec = 0; if ((n = get_wday (token->start, token->len)) != -1) { /* not all dates may have this... */ - tm.tm_wday = n; token = token->next; + wday = n; } /* get the mday */ if (!token || (n = get_mday (token->start, token->len)) == -1) - return (time_t) 0; + return NULL; - tm.tm_mday = n; token = token->next; + day = n; /* get the month */ if (!token || (n = get_month (token->start, token->len)) == -1) - return (time_t) 0; + return NULL; - tm.tm_mon = n; token = token->next; + month = n; /* get the year */ if (!token || (n = get_year (token->start, token->len)) == -1) - return (time_t) 0; + return NULL; - tm.tm_year = n - 1900; token = token->next; + year = n; /* get the hour/min/sec */ if (!token || !get_time (token->start, token->len, &hour, &min, &sec)) - return (time_t) 0; + return NULL; - tm.tm_hour = hour; - tm.tm_min = min; - tm.tm_sec = sec; token = token->next; /* get the timezone */ - if (!token || (n = get_tzone (&token)) == -1) { + if (!token || !(tz = get_tzone (&token))) { /* I guess we assume tz is GMT? */ - offset = 0; - } else { - offset = n; + tz = g_time_zone_new_utc (); } - t = mktime_utc (&tm); - - /* t is now GMT of the time we want, but not offset by the timezone ... */ + date = g_date_time_new (tz, year, month, day, hour, min, (gdouble) sec); + g_time_zone_unref (tz); - /* this should convert the time to the GMT equiv time */ - t -= ((offset / 100) * 60 * 60) + (offset % 100) * 60; - - if (tzone) - *tzone = offset; - - return t; + return date; } @@ -596,87 +565,93 @@ #define is_tzone_numeric(t) (((date_token_mask (t) & DATE_TOKEN_NON_TIMEZONE_NUMERIC) == 0) && (date_token_mask (t) & DATE_TOKEN_HAS_SIGN)) #define is_tzone(t) (is_tzone_alpha (t) || is_tzone_numeric (t)) -static time_t -parse_broken_date (date_token *tokens, int *tzone) +#define YEAR (1 << 0) +#define MONTH (1 << 1) +#define DAY (1 << 2) +#define WEEKDAY (1 << 3) +#define TIME (1 << 4) +#define TZONE (1 << 5) + +static GDateTime * +parse_broken_date (date_token *tokens) { - gboolean got_wday, got_month, got_tzone; - int hour, min, sec, offset, n; + int wday, year, month, day, hour, min, sec, n; + GTimeZone *tz = NULL; date_token *token; - struct tm tm; - time_t t; + GDateTime *date; + int mask; - memset ((void *) &tm, 0, sizeof (struct tm)); - got_wday = got_month = got_tzone = FALSE; - offset = 0; + wday = year = month = day = hour = min = sec = 0; + mask = 0; token = tokens; while (token) { - if (is_weekday (token) && !got_wday) { + if (is_weekday (token) && !(mask & WEEKDAY)) { if ((n = get_wday (token->start, token->len)) != -1) { d(printf ("weekday; ")); - got_wday = TRUE; - tm.tm_wday = n; + mask |= WEEKDAY; + wday = n; goto next; } } - if (is_month (token) && !got_month) { + if (is_month (token) && !(mask & MONTH)) { if ((n = get_month (token->start, token->len)) != -1) { d(printf ("month; ")); - got_month = TRUE; - tm.tm_mon = n; + mask |= MONTH; + month = n; goto next; } } - if (is_time (token) && !tm.tm_hour && !tm.tm_min && !tm.tm_sec) { + if (is_time (token) && !(mask & TIME)) { if (get_time (token->start, token->len, &hour, &min, &sec)) { d(printf ("time; ")); - tm.tm_hour = hour; - tm.tm_min = min; - tm.tm_sec = sec; + mask |= TIME; goto next; } } - if (is_tzone (token) && !got_tzone) { + if (is_tzone (token) && !(mask & TZONE)) { date_token *t = token; - if ((n = get_tzone (&t)) != -1) { + if ((tz = get_tzone (&t))) { d(printf ("tzone; ")); - got_tzone = TRUE; - offset = n; + mask |= TZONE; goto next; } } if (is_numeric (token)) { - if (token->len == 4 && !tm.tm_year) { + if (token->len == 4 && !(mask & YEAR)) { if ((n = get_year (token->start, token->len)) != -1) { d(printf ("year; ")); - tm.tm_year = n - 1900; + mask |= YEAR; + year = n; goto next; } } else { /* Note: assumes MM-DD-YY ordering if '0 < MM < 12' holds true */ - if (!got_month && token->next && is_numeric (token->next)) { + if (!(mask & MONTH) && token->next && is_numeric (token->next)) { if ((n = decode_int (token->start, token->len)) > 12) { goto mday; } else if (n > 0) { d(printf ("mon; ")); - got_month = TRUE; - tm.tm_mon = n - 1; + mask |= MONTH; + month = n; } goto next; - } else if (!tm.tm_mday && (n = get_mday (token->start, token->len)) != -1) { + } else if (!(mask & DAY) && (n = get_mday (token->start, token->len)) != -1) { mday: d(printf ("mday; ")); - tm.tm_mday = n; + mask |= DAY; + day = n; goto next; - } else if (!tm.tm_year) { + } else if (!(mask & YEAR)) { if ((n = get_year (token->start, token->len)) != -1) { d(printf ("2-digit year; ")); - tm.tm_year = n - 1900; + mask |= YEAR; + year = n; } goto next; } @@ -692,17 +667,20 @@ d(printf ("\n")); - t = mktime_utc (&tm); - - /* t is now GMT of the time we want, but not offset by the timezone ... */ + if (!(mask & (YEAR | MONTH | DAY | TIME))) { + if (tz != NULL) + g_time_zone_unref (tz); + + return NULL; + } - /* this should convert the time to the GMT equiv time */ - t -= ((offset / 100) * 60 * 60) + (offset % 100) * 60; + if (tz == NULL) + tz = g_time_zone_new_utc (); - if (tzone) - *tzone = offset; + date = g_date_time_new (tz, year, month, day, hour, min, (gdouble) sec); + g_time_zone_unref (tz); - return t; + return date; } #if 0 @@ -753,30 +731,23 @@ /** * g_mime_utils_header_decode_date: * @str: input date string - * @tz_offset: (out): timezone offset * - * Decodes the rfc822 date string and saves the GMT offset into - * @tz_offset if non-NULL. + * Parses the rfc822 date string. * - * Returns: the time_t representation of the date string specified by - * @str or (time_t) %0 on error. If @tz_offset is non-NULL, the value - * of the timezone offset will be stored. + * Returns: (nullable) (transfer full): the #GDateTime representation of the date + * string specified by @str or %NULL on error. **/ -time_t -g_mime_utils_header_decode_date (const char *str, int *tz_offset) +GDateTime * +g_mime_utils_header_decode_date (const char *str) { date_token *token, *tokens; - time_t date; + GDateTime *date; - if (!(tokens = datetok (str))) { - if (tz_offset) - *tz_offset = 0; - - return (time_t) 0; - } + if (!(tokens = datetok (str))) + return NULL; - if (!(date = parse_rfc822_date (tokens, tz_offset))) - date = parse_broken_date (tokens, tz_offset); + if (!(date = parse_rfc822_date (tokens))) + date = parse_broken_date (tokens); /* cleanup */ while (tokens) { @@ -803,8 +774,12 @@ { static unsigned long int count = 0; const char *hostname = NULL; + unsigned char block[8]; + unsigned long value; char *name = NULL; - char *msgid; + GString *msgid; + char *ascii; + int i; if (!fqdn) { #ifdef HAVE_UTSNAME_DOMAINNAME @@ -868,107 +843,42 @@ fqdn = name != NULL ? name : (hostname[0] ? hostname : "localhost.localdomain"); } - MSGID_LOCK (); - msgid = g_strdup_printf ("%lu.%lu.%lu@%s", (unsigned long int) time (NULL), - (unsigned long int) getpid (), count++, fqdn); - MSGID_UNLOCK (); - - g_free (name); - - return msgid; -} - -static char * -decode_addrspec (const char **in) -{ - const char *word, *inptr; - GString *addrspec; - char *str; - - decode_lwsp (in); - inptr = *in; - - if (!(word = decode_word (&inptr))) { - w(g_warning ("No local-part in addr-spec: %s", *in)); - return NULL; - } - - addrspec = g_string_new (""); - g_string_append_len (addrspec, word, (size_t) (inptr - word)); - - /* get the rest of the local-part */ - decode_lwsp (&inptr); - while (*inptr == '.') { - g_string_append_c (addrspec, *inptr++); - if ((word = decode_word (&inptr))) { - g_string_append_len (addrspec, word, (size_t) (inptr - word)); - decode_lwsp (&inptr); - } else { - w(g_warning ("Invalid local-part in addr-spec: %s", *in)); - goto exception; - } - } - - /* we should be at the '@' now... */ - if (*inptr++ != '@') { - w(g_warning ("Invalid addr-spec; missing '@': %s", *in)); - goto exception; - } - - g_string_append_c (addrspec, '@'); - if (!decode_domain (&inptr, addrspec)) { - w(g_warning ("No domain in addr-spec: %s", *in)); - goto exception; - } - - str = addrspec->str; - g_string_free (addrspec, FALSE); - - *in = inptr; - - return str; - - exception: + value = (unsigned long) time (NULL); + g_mime_read_random_pool (block, 8); + msgid = g_string_new (""); - g_string_free (addrspec, TRUE); - - return NULL; -} - -static char * -decode_msgid (const char **in) -{ - const char *inptr = *in; - char *msgid = NULL; + do { + g_string_append_c (msgid, base36[(int) (value % 36)]); + value /= 36; + } while (value != 0); + + g_string_append_c (msgid, '.'); + + value = 0; + for (i = 0; i < 8; i++) + value = (value << 8) | block[i]; - decode_lwsp (&inptr); - if (*inptr != '<') { - w(g_warning ("Invalid msg-id; missing '<': %s", *in)); + do { + g_string_append_c (msgid, base36[(int) (value % 36)]); + value /= 36; + } while (value != 0); + + g_string_append_c (msgid, '@'); + +#ifdef LIBIDN + if (idna_to_ascii_8z (fqdn, &ascii, 0) == IDNA_SUCCESS) { + g_string_append (msgid, ascii); + free (ascii); } else { - inptr++; + g_string_append (msgid, fqdn); } +#else + g_string_append (msgid, fqdn); +#endif - decode_lwsp (&inptr); - if ((msgid = decode_addrspec (&inptr))) { - decode_lwsp (&inptr); - if (*inptr != '>') { - w(g_warning ("Invalid msg-id; missing '>': %s", *in)); - } else { - inptr++; - } - - *in = inptr; - } else { - w(g_warning ("Invalid msg-id; missing addr-spec: %s", *in)); - *in = inptr; - while (*inptr && *inptr != '>') - inptr++; - - msgid = g_strndup (*in, (size_t) (inptr - *in)); - *in = inptr; - } + g_free (name); - return msgid; + return g_string_free (msgid, FALSE); } @@ -988,147 +898,6 @@ return decode_msgid (&message_id); } - -/** - * g_mime_references_decode: - * @text: string containing a list of msg-ids - * - * Decodes a list of msg-ids as in the References and/or In-Reply-To - * headers defined in rfc822. - * - * Returns: a list of referenced msg-ids. - **/ -GMimeReferences * -g_mime_references_decode (const char *text) -{ - GMimeReferences refs, *tail, *ref; - const char *word, *inptr = text; - char *msgid; - - g_return_val_if_fail (text != NULL, NULL); - - tail = (GMimeReferences *) &refs; - refs.next = NULL; - - while (*inptr) { - decode_lwsp (&inptr); - if (*inptr == '<') { - /* looks like a msg-id */ - if ((msgid = decode_msgid (&inptr))) { - ref = g_new (GMimeReferences, 1); - ref->next = NULL; - ref->msgid = msgid; - tail->next = ref; - tail = ref; - } else { - w(g_warning ("Invalid References header: %s", inptr)); - break; - } - } else if (*inptr) { - /* looks like part of a phrase */ - if (!(word = decode_word (&inptr))) { - w(g_warning ("Invalid References header: %s", inptr)); - break; - } - } - } - - return refs.next; -} - - -/** - * g_mime_references_append: - * @refs: the address of a #GMimeReferences list - * @msgid: a message-id string - * - * Appends a reference to msgid to the list of references. - **/ -void -g_mime_references_append (GMimeReferences **refs, const char *msgid) -{ - GMimeReferences *ref; - - g_return_if_fail (refs != NULL); - g_return_if_fail (msgid != NULL); - - ref = (GMimeReferences *) refs; - while (ref->next) - ref = ref->next; - - ref->next = g_new (GMimeReferences, 1); - ref->next->msgid = g_strdup (msgid); - ref->next->next = NULL; -} - - -/** - * g_mime_references_free: - * @refs: a #GMimeReferences list - * - * Frees the #GMimeReferences list. - **/ -void -g_mime_references_free (GMimeReferences *refs) -{ - GMimeReferences *ref, *next; - - ref = refs; - while (ref) { - next = ref->next; - g_free (ref->msgid); - g_free (ref); - ref = next; - } -} - - -/** - * g_mime_references_clear: - * @refs: address of a #GMimeReferences list - * - * Clears the #GMimeReferences list and resets it to %NULL. - **/ -void -g_mime_references_clear (GMimeReferences **refs) -{ - g_return_if_fail (refs != NULL); - - g_mime_references_free (*refs); - *refs = NULL; -} - - -/** - * g_mime_references_get_next: - * @ref: a #GMimeReferences list - * - * Advances to the next reference node in the #GMimeReferences list. - * - * Returns: the next reference node in the #GMimeReferences list. - **/ -const GMimeReferences * -g_mime_references_get_next (const GMimeReferences *ref) -{ - return ref ? ref->next : NULL; -} - - -/** - * g_mime_references_get_message_id: - * @ref: a #GMimeReferences list - * - * Gets the Message-Id reference from the #GMimeReferences node. - * - * Returns: the Message-Id reference from the #GMimeReferences node. - **/ -const char * -g_mime_references_get_message_id (const GMimeReferences *ref) -{ - return ref ? ref->msgid : NULL; -} - - static gboolean need_quotes (const char *string) { @@ -1237,7 +1006,7 @@ /** * g_mime_utils_text_is_8bit: - * @text: text to check for 8bit chars + * @text: (array length=len) (element-type guint8): text to check for 8bit chars * @len: text length * * Determines if @text contains 8bit characters within the first @len @@ -1265,7 +1034,7 @@ /** * g_mime_utils_best_encoding: - * @text: text to encode + * @text: (array length=len) (element-type guint8): text to encode * @len: text length * * Determines the best content encoding for the first @len bytes of @@ -1394,13 +1163,9 @@ } -#define USER_CHARSETS_INCLUDE_UTF8 (1 << 0) -#define USER_CHARSETS_INCLUDE_LOCALE (1 << 1) -#define USER_CHARSETS_INCLUDE_LATIN1 (1 << 2) - - /** * g_mime_utils_decode_8bit: + * @options: (nullable): a #GMimeParserOptions or %NULL * @text: (array length=len) (element-type guint8): input text in * unknown 8bit/multibyte character set * @len: input text length @@ -1414,70 +1179,20 @@ * Returns: a UTF-8 string representation of @text. **/ char * -g_mime_utils_decode_8bit (const char *text, size_t len) +g_mime_utils_decode_8bit (GMimeParserOptions *options, const char *text, size_t len) { - const char **charsets, **user_charsets, *locale, *best; size_t outleft, outlen, min, ninval; - unsigned int included = 0; + const char **charsets; + const char *best; iconv_t cd; char *out; - int i = 0; + int i; g_return_val_if_fail (text != NULL, NULL); - locale = g_mime_locale_charset (); - if (!g_ascii_strcasecmp (locale, "iso-8859-1") || - !g_ascii_strcasecmp (locale, "UTF-8")) { - /* If the user's locale charset is either of these, we - * don't need to include the locale charset in our list - * of fallback charsets. */ - included |= USER_CHARSETS_INCLUDE_LOCALE; - } - - if ((user_charsets = g_mime_user_charsets ())) { - while (user_charsets[i]) - i++; - } - - charsets = g_alloca (sizeof (char *) * (i + 4)); - i = 0; - - if (user_charsets) { - while (user_charsets[i]) { - /* keep a record of whether or not the user-supplied - * charsets include UTF-8, Latin1, or the user's locale - * charset so that we avoid doubling our efforts for - * these 3 charsets. We could have used a hash table - * to keep track of unique charsets, but we can - * (hopefully) assume that user_charsets is a unique - * list of charsets with no duplicates. */ - if (!g_ascii_strcasecmp (user_charsets[i], "iso-8859-1")) - included |= USER_CHARSETS_INCLUDE_LATIN1; - - if (!g_ascii_strcasecmp (user_charsets[i], "UTF-8")) - included |= USER_CHARSETS_INCLUDE_UTF8; - - if (!g_ascii_strcasecmp (user_charsets[i], locale)) - included |= USER_CHARSETS_INCLUDE_LOCALE; - - charsets[i] = user_charsets[i]; - i++; - } - } - - if (!(included & USER_CHARSETS_INCLUDE_UTF8)) - charsets[i++] = "UTF-8"; - - if (!(included & USER_CHARSETS_INCLUDE_LOCALE)) - charsets[i++] = locale; - - if (!(included & USER_CHARSETS_INCLUDE_LATIN1)) - charsets[i++] = "iso-8859-1"; - - charsets[i] = NULL; - - min = len; + charsets = g_mime_parser_options_get_fallback_charsets (options); best = charsets[0]; + min = len; outleft = (len * 2) + 16; out = g_malloc (outleft + 1); @@ -1767,16 +1482,17 @@ } static rfc2047_token * -tokenize_rfc2047_phrase (const char *in, size_t *len) +tokenize_rfc2047_phrase (GMimeParserOptions *options, const char *in, size_t *len) { - gboolean enable_rfc2047_workarounds = _g_mime_enable_rfc2047_workarounds (); rfc2047_token list, *lwsp, *token, *tail; register const char *inptr = in; + GMimeRfcComplianceMode mode; gboolean encoded = FALSE; const char *text, *word; gboolean ascii; size_t n; + mode = g_mime_parser_options_get_rfc2047_compliance_mode (options); tail = (rfc2047_token *) &list; list.next = NULL; lwsp = NULL; @@ -1794,7 +1510,7 @@ word = inptr; ascii = TRUE; if (is_atom (*inptr)) { - if (G_UNLIKELY (enable_rfc2047_workarounds)) { + if (G_LIKELY (mode == GMIME_RFC_COMPLIANCE_LOOSE)) { /* Make an extra effort to detect and * separate encoded-word tokens that * have been merged with other @@ -1901,16 +1617,17 @@ } static rfc2047_token * -tokenize_rfc2047_text (const char *in, size_t *len) +tokenize_rfc2047_text (GMimeParserOptions *options, const char *in, size_t *len) { - gboolean enable_rfc2047_workarounds = _g_mime_enable_rfc2047_workarounds (); rfc2047_token list, *lwsp, *token, *tail; register const char *inptr = in; + GMimeRfcComplianceMode mode; gboolean encoded = FALSE; const char *text, *word; gboolean ascii; size_t n; + mode = g_mime_parser_options_get_rfc2047_compliance_mode (options); tail = (rfc2047_token *) &list; list.next = NULL; lwsp = NULL; @@ -1929,7 +1646,7 @@ word = inptr; ascii = TRUE; - if (G_UNLIKELY (enable_rfc2047_workarounds)) { + if (G_LIKELY (mode == GMIME_RFC_COMPLIANCE_LOOSE)) { if (!strncmp (inptr, "=?", 2)) { inptr += 2; @@ -2035,7 +1752,7 @@ } static char * -rfc2047_decode_tokens (rfc2047_token *tokens, size_t buflen) +rfc2047_decode_tokens (GMimeParserOptions *options, rfc2047_token *tokens, size_t buflen, const char **charset_out) { rfc2047_token *token, *next; size_t outlen, ninval, len; @@ -2051,6 +1768,9 @@ decoded = g_string_sized_new (buflen + 1); outbuf = g_byte_array_sized_new (76); + + if (charset_out) + *charset_out = NULL; token = tokens; while (token != NULL) { @@ -2066,6 +1786,11 @@ state = 0; save = 0; + /* Note: if any token was encoded in UTF-8, return UTF-8 as the charset used; + * otherwise, use the first charset we encounter... */ + if (charset_out && (*charset_out == NULL || !g_ascii_strcasecmp (charset, "UTF-8"))) + *charset_out = charset; + /* find the end of the run (and measure the buffer length we'll need) */ while (next && next->encoding == encoding && !strcmp (next->charset, charset)) { len += next->length; @@ -2109,7 +1834,7 @@ "be corrupt: %s", charset[0] ? charset : "unspecified charset", g_strerror (errno))); - str = g_mime_utils_decode_8bit ((char *) outptr, outlen); + str = g_mime_utils_decode_8bit (options, (char *) outptr, outlen); g_string_append (decoded, str); g_free (str); } else { @@ -2131,7 +1856,7 @@ } } else if (token->is_8bit) { /* *sigh* I hate broken mailers... */ - str = g_mime_utils_decode_8bit (token->text, token->length); + str = g_mime_utils_decode_8bit (options, token->text, token->length); g_string_append (decoded, str); g_free (str); } else { @@ -2148,30 +1873,32 @@ /** - * g_mime_utils_header_decode_text: + * _g_mime_utils_header_decode_text: * @text: header text to decode + * @options: (nullable): a #GMimeParserOptions or %NULL + * @charset: (optional): if non-%NULL, this will be set to the charset used in the rfc2047 encoded-word tokens * * Decodes an rfc2047 encoded 'text' header. * - * Note: See g_mime_set_user_charsets() for details on how charset - * conversion is handled for unencoded 8bit text and/or wrongly - * specified rfc2047 encoded-word tokens. - * * Returns: a newly allocated UTF-8 string representing the the decoded * header. **/ char * -g_mime_utils_header_decode_text (const char *text) +_g_mime_utils_header_decode_text (GMimeParserOptions *options, const char *text, const char **charset) { rfc2047_token *tokens; char *decoded; size_t len; - if (text == NULL) + if (text == NULL) { + if (charset) + *charset = NULL; + return g_strdup (""); + } - tokens = tokenize_rfc2047_text (text, &len); - decoded = rfc2047_decode_tokens (tokens, len); + tokens = tokenize_rfc2047_text (options, text, &len); + decoded = rfc2047_decode_tokens (options, tokens, len, charset); rfc2047_token_list_free (tokens); return decoded; @@ -2179,36 +1906,72 @@ /** - * g_mime_utils_header_decode_phrase: + * g_mime_utils_header_decode_text: + * @text: header text to decode + * @options: (nullable): a #GMimeParserOptions or %NULL + * + * Decodes an rfc2047 encoded 'text' header. + * + * Returns: a newly allocated UTF-8 string representing the the decoded + * header. + **/ +char * +g_mime_utils_header_decode_text (GMimeParserOptions *options, const char *text) +{ + return _g_mime_utils_header_decode_text (options, text, NULL); +} + + +/** + * _g_mime_utils_header_decode_phrase: * @phrase: header to decode + * @options: (nullable): a #GMimeParserOptions or %NULL + * @charset: (optional): if non-%NULL, this will be set to the charset used in the rfc2047 encoded-word tokens * * Decodes an rfc2047 encoded 'phrase' header. * - * Note: See g_mime_set_user_charsets() for details on how charset - * conversion is handled for unencoded 8bit text and/or wrongly - * specified rfc2047 encoded-word tokens. - * * Returns: a newly allocated UTF-8 string representing the the decoded * header. **/ char * -g_mime_utils_header_decode_phrase (const char *phrase) +_g_mime_utils_header_decode_phrase (GMimeParserOptions *options, const char *phrase, const char **charset) { rfc2047_token *tokens; char *decoded; size_t len; - if (phrase == NULL) + if (phrase == NULL) { + if (charset) + *charset = NULL; + return g_strdup (""); + } - tokens = tokenize_rfc2047_phrase (phrase, &len); - decoded = rfc2047_decode_tokens (tokens, len); + tokens = tokenize_rfc2047_phrase (options, phrase, &len); + decoded = rfc2047_decode_tokens (options, tokens, len, charset); rfc2047_token_list_free (tokens); return decoded; } +/** + * g_mime_utils_header_decode_phrase: + * @phrase: header to decode + * @options: (nullable): a #GMimeParserOptions or %NULL + * + * Decodes an rfc2047 encoded 'phrase' header. + * + * Returns: a newly allocated UTF-8 string representing the the decoded + * header. + **/ +char * +g_mime_utils_header_decode_phrase (GMimeParserOptions *options, const char *phrase) +{ + return _g_mime_utils_header_decode_phrase (options, phrase, NULL); +} + + /* rfc2047 version of quoted-printable */ static size_t quoted_encode (const char *in, size_t len, unsigned char *out, gushort safemask) @@ -2560,24 +2323,21 @@ } static char * -rfc2047_encode (const char *in, gushort safemask) +rfc2047_encode (GMimeFormatOptions *options, const char *in, gushort safemask, const char *user_charset) { rfc822_word *words, *word, *prev = NULL; - const char **charsets, *charset; - const char *start; + const char *charset, *start; GMimeCharset mask; GString *out; char *outstr; size_t len; - int i; + int i = 0; if (!(words = rfc2047_encode_get_rfc822_words (in, safemask & IS_PSAFE))) return g_strdup (in); rfc2047_encode_merge_rfc822_words (&words); - charsets = g_mime_user_charsets (); - out = g_string_new (""); /* output words now with spaces between them */ @@ -2617,7 +2377,7 @@ rfc2047_encode_word (out, start, len, "us-ascii", safemask); break; case 1: /* iso-8859-1 */ - if (!_g_mime_use_only_user_charsets ()) { + if (user_charset == NULL) { rfc2047_encode_word (out, start, len, "iso-8859-1", safemask); break; } @@ -2626,15 +2386,11 @@ g_mime_charset_init (&mask); g_mime_charset_step (&mask, start, len); - for (i = 0; charsets && charsets[i]; i++) { - if (g_mime_charset_can_encode (&mask, charsets[i], start, len)) { - charset = charsets[i]; - break; - } - } - - if (!charset) + if (user_charset && g_mime_charset_can_encode (&mask, user_charset, start, len)) { + charset = user_charset; + } else { charset = g_mime_charset_best_name (&mask); + } rfc2047_encode_word (out, start, len, charset, safemask); break; @@ -2660,7 +2416,9 @@ /** * g_mime_utils_header_encode_phrase: + * @options: (nullable): a #GMimeFormatOptions or %NULL * @phrase: phrase to encode + * @charset: (nullable): the charset to use or %NULL to use the default * * Encodes a 'phrase' header according to the rules in rfc2047. * @@ -2668,18 +2426,20 @@ * addresses. **/ char * -g_mime_utils_header_encode_phrase (const char *phrase) +g_mime_utils_header_encode_phrase (GMimeFormatOptions *options, const char *phrase, const char *charset) { if (phrase == NULL) return NULL; - return rfc2047_encode (phrase, IS_PSAFE); + return rfc2047_encode (options, phrase, IS_PSAFE, charset); } /** * g_mime_utils_header_encode_text: + * @options: (nullable): a #GMimeFormatOptions or %NULL * @text: text to encode + * @charset: (nullable): the charset to use or %NULL to use the default * * Encodes a 'text' header according to the rules in rfc2047. * @@ -2687,17 +2447,18 @@ * headers like "Subject". **/ char * -g_mime_utils_header_encode_text (const char *text) +g_mime_utils_header_encode_text (GMimeFormatOptions *options, const char *text, const char *charset) { if (text == NULL) return NULL; - return rfc2047_encode (text, IS_ESAFE); + return rfc2047_encode (options, text, IS_ESAFE, charset); } static char * -header_fold_tokens (const char *field, const char *value, size_t vlen, rfc2047_token *tokens, gboolean structured) +header_fold_tokens (GMimeFormatOptions *options, const char *field, const char *value, + size_t vlen, rfc2047_token *tokens, gboolean structured, gboolean include_field) { rfc2047_token *token, *next; size_t lwsp, tab, len, n; @@ -2706,8 +2467,12 @@ len = strlen (field) + 2; output = g_string_sized_new (len + vlen + 1); - g_string_append (output, field); - g_string_append (output, ": "); + if (include_field) { + g_string_append (output, field); + g_string_append (output, ": "); + } else { + g_string_append_c (output, ' '); + } lwsp = 0; tab = 0; @@ -2824,6 +2589,8 @@ /** * g_mime_utils_structured_header_fold: + * @options: (nullable): a #GMimeParserOptions or %NULL + * @format: (nullable): a #GMimeFormatOptions or %NULL * @header: header field and value string * * Folds a structured header according to the rules in rfc822. @@ -2831,7 +2598,7 @@ * Returns: an allocated string containing the folded header. **/ char * -g_mime_utils_structured_header_fold (const char *header) +g_mime_utils_structured_header_fold (GMimeParserOptions *options, GMimeFormatOptions *format, const char *header) { rfc2047_token *tokens; const char *value; @@ -2855,8 +2622,8 @@ while (*value && is_lwsp (*value)) value++; - tokens = tokenize_rfc2047_phrase (value, &len); - folded = header_fold_tokens (field, value, len, tokens, TRUE); + tokens = tokenize_rfc2047_phrase (options, value, &len); + folded = header_fold_tokens (format, field, value, len, tokens, TRUE, TRUE); g_free (field); return folded; @@ -2865,6 +2632,8 @@ /** * _g_mime_utils_structured_header_fold: + * @options: (nullable): a #GMimeParserOptions or %NULL + * @format: (nullable): a #GMimeFormatOptions or %NULL * @field: header field * @value: header value * @@ -2873,7 +2642,8 @@ * Returns: an allocated string containing the folded header. **/ char * -_g_mime_utils_structured_header_fold (const char *field, const char *value) +_g_mime_utils_structured_header_fold (GMimeParserOptions *options, GMimeFormatOptions *format, + const char *field, const char *value) { rfc2047_token *tokens; size_t len; @@ -2882,16 +2652,18 @@ return NULL; if (value == NULL) - return g_strdup_printf ("%s: \n", field); + return g_strdup ("\n"); - tokens = tokenize_rfc2047_phrase (value, &len); + tokens = tokenize_rfc2047_phrase (options, value, &len); - return header_fold_tokens (field, value, len, tokens, TRUE); + return header_fold_tokens (format, field, value, len, tokens, TRUE, FALSE); } /** * g_mime_utils_unstructured_header_fold: + * @options: (nullable): a #GMimeParserOptions or %NULL + * @format: (nullable): a #GMimeFormatOptions or %NULL * @header: header field and value string * * Folds an unstructured header according to the rules in rfc822. @@ -2899,7 +2671,7 @@ * Returns: an allocated string containing the folded header. **/ char * -g_mime_utils_unstructured_header_fold (const char *header) +g_mime_utils_unstructured_header_fold (GMimeParserOptions *options, GMimeFormatOptions *format, const char *header) { rfc2047_token *tokens; const char *value; @@ -2923,8 +2695,8 @@ while (*value && is_lwsp (*value)) value++; - tokens = tokenize_rfc2047_text (value, &len); - folded = header_fold_tokens (field, value, len, tokens, FALSE); + tokens = tokenize_rfc2047_text (options, value, &len); + folded = header_fold_tokens (format, field, value, len, tokens, FALSE, TRUE); g_free (field); return folded; @@ -2933,6 +2705,8 @@ /** * _g_mime_utils_unstructured_header_fold: + * @options: (nullable): a #GMimeParserOptions or %NULL + * @format: (nullable): a #GMimeFormatOptions or %NULL * @field: header field * @value: header value * @@ -2941,7 +2715,7 @@ * Returns: an allocated string containing the folded header. **/ char * -_g_mime_utils_unstructured_header_fold (const char *field, const char *value) +_g_mime_utils_unstructured_header_fold (GMimeParserOptions *options, GMimeFormatOptions *format, const char *field, const char *value) { rfc2047_token *tokens; size_t len; @@ -2950,54 +2724,38 @@ return NULL; if (value == NULL) - return g_strdup_printf ("%s: \n", field); + return g_strdup ("\n"); - tokens = tokenize_rfc2047_text (value, &len); + tokens = tokenize_rfc2047_text (options, value, &len); - return header_fold_tokens (field, value, len, tokens, FALSE); -} - - -/** - * g_mime_utils_header_fold: - * @header: header field and value string - * - * Folds a structured header according to the rules in rfc822. - * - * Returns: an allocated string containing the folded header. - * - * WARNING: This function is obsolete. Use - * g_mime_utils_structured_header_fold() instead. - **/ -char * -g_mime_utils_header_fold (const char *header) -{ - return g_mime_utils_structured_header_fold (header); + return header_fold_tokens (format, field, value, len, tokens, FALSE, FALSE); } /** * g_mime_utils_header_printf: - * @format: string format + * @options: (nullable): a #GMimeParserOptions or %NULL + * @format: (nullable): a #GMimeFormatOptions or %NULL + * @text: text with printf-style formatters * @...: arguments * * Allocates a buffer containing a formatted header specified by the * @Varargs. * * Returns: an allocated string containing the folded header specified - * by @format and the following arguments. + * by @text and the following arguments. **/ char * -g_mime_utils_header_printf (const char *format, ...) +g_mime_utils_header_printf (GMimeParserOptions *options, GMimeFormatOptions *format, const char *text, ...) { char *buf, *ret; va_list ap; - va_start (ap, format); - buf = g_strdup_vprintf (format, ap); + va_start (ap, text); + buf = g_strdup_vprintf (text, ap); va_end (ap); - ret = g_mime_utils_unstructured_header_fold (buf); + ret = g_mime_utils_unstructured_header_fold (options, format, buf); g_free (buf); return ret; diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-utils.h gmime-3.0.1/gmime/gmime-utils.h --- gmime-2.6.22+dfsg2/gmime/gmime-utils.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-utils.h 2017-03-28 23:46:26.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -23,49 +23,25 @@ #define __GMIME_UTILS_H__ #include -#include #include +#include +#include #include G_BEGIN_DECLS -typedef struct _GMimeReferences GMimeReferences; - -/** - * GMimeReferences: - * @next: Pointer to the next reference. - * @msgid: Reference message-id. - * - * A List of references, as per the References or In-Reply-To header - * fields. - **/ -struct _GMimeReferences { - GMimeReferences *next; - char *msgid; -}; - - -time_t g_mime_utils_header_decode_date (const char *str, int *tz_offset); -char *g_mime_utils_header_format_date (time_t date, int tz_offset); +GDateTime *g_mime_utils_header_decode_date (const char *str); +char *g_mime_utils_header_format_date (GDateTime *date); char *g_mime_utils_generate_message_id (const char *fqdn); /* decode a message-id */ char *g_mime_utils_decode_message_id (const char *message_id); -/* decode a References or In-Reply-To header */ -GMimeReferences *g_mime_references_decode (const char *text); -void g_mime_references_append (GMimeReferences **refs, const char *msgid); -void g_mime_references_clear (GMimeReferences **refs); -void g_mime_references_free (GMimeReferences *refs); -const GMimeReferences *g_mime_references_get_next (const GMimeReferences *ref); -const char *g_mime_references_get_message_id (const GMimeReferences *ref); - -char *g_mime_utils_structured_header_fold (const char *header); -char *g_mime_utils_unstructured_header_fold (const char *header); -char *g_mime_utils_header_fold (const char *header); -char *g_mime_utils_header_printf (const char *format, ...) G_GNUC_PRINTF (1, 2); +char *g_mime_utils_structured_header_fold (GMimeParserOptions *options, GMimeFormatOptions *format, const char *header); +char *g_mime_utils_unstructured_header_fold (GMimeParserOptions *options, GMimeFormatOptions *format, const char *header); +char *g_mime_utils_header_printf (GMimeParserOptions *options, GMimeFormatOptions *format, const char *text, ...) G_GNUC_PRINTF (3, 4); char *g_mime_utils_quote_string (const char *str); void g_mime_utils_unquote_string (char *str); @@ -75,14 +51,14 @@ GMimeContentEncoding g_mime_utils_best_encoding (const unsigned char *text, size_t len); /* utility function to convert text in an unknown 8bit/multibyte charset to UTF-8 */ -char *g_mime_utils_decode_8bit (const char *text, size_t len); +char *g_mime_utils_decode_8bit (GMimeParserOptions *options, const char *text, size_t len); /* utilities to (de/en)code headers */ -char *g_mime_utils_header_decode_text (const char *text); -char *g_mime_utils_header_encode_text (const char *text); +char *g_mime_utils_header_decode_text (GMimeParserOptions *options, const char *text); +char *g_mime_utils_header_encode_text (GMimeFormatOptions *options, const char *text, const char *charset); -char *g_mime_utils_header_decode_phrase (const char *phrase); -char *g_mime_utils_header_encode_phrase (const char *phrase); +char *g_mime_utils_header_decode_phrase (GMimeParserOptions *options, const char *phrase); +char *g_mime_utils_header_encode_phrase (GMimeFormatOptions *options, const char *phrase, const char *charset); G_END_DECLS diff -Nru gmime-2.6.22+dfsg2/gmime/gmime-version.h gmime-3.0.1/gmime/gmime-version.h --- gmime-2.6.22+dfsg2/gmime/gmime-version.h 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/gmime/gmime-version.h 2017-05-21 16:38:13.000000000 +0000 @@ -0,0 +1,76 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_VERSION_H__ +#define __GMIME_VERSION_H__ + +/** + * GMIME_MAJOR_VERSION: + * + * GMime's major version. + **/ +#define GMIME_MAJOR_VERSION (3) + +/** + * GMIME_MINOR_VERSION: + * + * GMime's minor version. + **/ +#define GMIME_MINOR_VERSION (0) + +/** + * GMIME_MICRO_VERSION: + * + * GMime's micro version. + **/ +#define GMIME_MICRO_VERSION (1) + +/** + * GMIME_BINARY_AGE: + * + * GMime's binary age. + **/ +#define GMIME_BINARY_AGE (1) + +/** + * GMIME_INTERFACE_AGE: + * + * GMime's interface age. + **/ +#define GMIME_INTERFACE_AGE (1) + + +/** + * GMIME_CHECK_VERSION: + * @major: Minimum major version + * @minor: Minimum minor version + * @micro: Minimum micro version + * + * Check whether a GMime version equal to or greater than + * @major.@minor.@micro is present. + **/ +#define GMIME_CHECK_VERSION(major,minor,micro) \ + (GMIME_MAJOR_VERSION > (major) || \ + (GMIME_MAJOR_VERSION == (major) && GMIME_MINOR_VERSION > (minor)) || \ + (GMIME_MAJOR_VERSION == (major) && GMIME_MINOR_VERSION == (minor) && \ + GMIME_MICRO_VERSION >= (micro))) + +#endif /* __GMIME_VERSION_H__ */ diff -Nru gmime-2.6.22+dfsg2/gmime/internet-address.c gmime-3.0.1/gmime/internet-address.c --- gmime-2.6.22+dfsg2/gmime/internet-address.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/internet-address.c 2017-04-23 16:04:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -24,17 +24,22 @@ #endif #include +#include #include #include #include +#ifdef LIBIDN +#include +#endif + #include "internet-address.h" #include "gmime-table-private.h" #include "gmime-parse-utils.h" #include "gmime-iconv-utils.h" +#include "gmime-internal.h" #include "gmime-events.h" #include "gmime-utils.h" -#include "list.h" #ifdef ENABLE_WARNINGS @@ -91,6 +96,7 @@ INTERNET_ADDRESS_FOLD = 1 << 1, }; +static gboolean addrspec_parse (const char **in, const char *sentinels, char **addrspec, int *at); static void internet_address_class_init (InternetAddressClass *klass); static void internet_address_init (InternetAddress *ia, InternetAddressClass *klass); @@ -141,7 +147,8 @@ static void internet_address_init (InternetAddress *ia, InternetAddressClass *klass) { - ia->priv = g_mime_event_new ((GObject *) ia); + ia->changed = g_mime_event_new ((GObject *) ia); + ia->charset = NULL; ia->name = NULL; } @@ -150,7 +157,8 @@ { InternetAddress *ia = (InternetAddress *) object; - g_mime_event_destroy (ia->priv); + g_mime_event_free (ia->changed); + g_free (ia->charset); g_free (ia->name); G_OBJECT_CLASS (parent_class)->finalize (object); @@ -167,6 +175,7 @@ ia->name = buf; } + /** * internet_address_set_name: * @ia: a #InternetAddress @@ -183,7 +192,7 @@ _internet_address_set_name (ia, name); - g_mime_event_emit (ia->priv, NULL); + g_mime_event_emit (ia->changed, NULL); } @@ -193,8 +202,8 @@ * * Gets the display name of the #InternetAddress. * - * Returns: the name of the mailbox or group in a form suitable for - * display if available or %NULL otherwise. If the name is available, + * Returns: (nullable): the name of the mailbox or group in a form suitable + * for display if available or %NULL otherwise. If the name is available, * the returned string will be in UTF-8. **/ const char * @@ -207,8 +216,49 @@ /** + * internet_address_set_charset: + * @ia: a #InternetAddress + * @charset: (nullable): the charset to use when encoding the name or %NULL to use the defaults + * + * Set the charset to use for encoding the name of the mailbox or group. + **/ +void +internet_address_set_charset (InternetAddress *ia, const char *charset) +{ + char *buf; + + g_return_if_fail (IS_INTERNET_ADDRESS (ia)); + + buf = charset ? g_strdup (charset) : NULL; + g_free (ia->charset); + ia->charset = buf; + + g_mime_event_emit (ia->changed, NULL); +} + + +/** + * internet_address_get_charset: + * @ia: a #InternetAddress + * + * Gets the charset to be used when encoding the name of the mailbox or group. + * + * Returns: (nullable): the charset to be used when encoding the name of the + * mailbox or group if available or %NULL otherwise. + **/ +const char * +internet_address_get_charset (InternetAddress *ia) +{ + g_return_val_if_fail (IS_INTERNET_ADDRESS (ia), NULL); + + return ia->charset; +} + + +/** * internet_address_to_string: * @ia: Internet Address object + * @options: (nullable): a #GMimeFormatOptions or %NULL * @encode: %TRUE if the address should be rfc2047 encoded * * Allocates a string containing the contents of the #InternetAddress @@ -218,7 +268,7 @@ * rfc822 format. **/ char * -internet_address_to_string (InternetAddress *ia, gboolean encode) +internet_address_to_string (InternetAddress *ia, GMimeFormatOptions *options, gboolean encode) { guint32 flags = encode ? INTERNET_ADDRESS_ENCODE : 0; size_t linelen = 0; @@ -226,7 +276,7 @@ char *str; string = g_string_new (""); - INTERNET_ADDRESS_GET_CLASS (ia)->to_string (ia, flags, &linelen, string); + INTERNET_ADDRESS_GET_CLASS (ia)->to_string (ia, options, flags, &linelen, string); str = string->str; g_string_free (string, FALSE); @@ -239,7 +289,8 @@ static void internet_address_mailbox_init (InternetAddressMailbox *mailbox, InternetAddressMailboxClass *klass); static void internet_address_mailbox_finalize (GObject *object); -static void mailbox_to_string (InternetAddress *ia, guint32 flags, size_t *linelen, GString *out); +static void mailbox_to_string (InternetAddress *ia, GMimeFormatOptions *options, guint32 flags, + size_t *linelen, GString *out); static GObjectClass *mailbox_parent_class = NULL; @@ -286,7 +337,9 @@ static void internet_address_mailbox_init (InternetAddressMailbox *mailbox, InternetAddressMailboxClass *klass) { + mailbox->idn_addr = NULL; mailbox->addr = NULL; + mailbox->at = -1; } static void @@ -294,11 +347,26 @@ { InternetAddressMailbox *mailbox = (InternetAddressMailbox *) object; + g_free (mailbox->idn_addr); g_free (mailbox->addr); G_OBJECT_CLASS (mailbox_parent_class)->finalize (object); } +static InternetAddress * +_internet_address_mailbox_new (const char *name, const char *addr, int at) +{ + InternetAddressMailbox *mailbox; + + mailbox = g_object_new (INTERNET_ADDRESS_TYPE_MAILBOX, NULL); + mailbox->addr = g_strdup (addr); + mailbox->at = at; + + _internet_address_set_name ((InternetAddress *) mailbox, name); + + return (InternetAddress *) mailbox; +} + /** * internet_address_mailbox_new: @@ -316,11 +384,14 @@ internet_address_mailbox_new (const char *name, const char *addr) { InternetAddressMailbox *mailbox; + const char *inptr = addr; g_return_val_if_fail (addr != NULL, NULL); - mailbox = g_object_newv (INTERNET_ADDRESS_TYPE_MAILBOX, 0, NULL); - mailbox->addr = g_strdup (addr); + mailbox = g_object_new (INTERNET_ADDRESS_TYPE_MAILBOX, NULL); + + if (!addrspec_parse (&inptr, "", &mailbox->addr, &mailbox->at)) + mailbox->addr = g_strdup (addr); _internet_address_set_name ((InternetAddress *) mailbox, name); @@ -338,15 +409,22 @@ void internet_address_mailbox_set_addr (InternetAddressMailbox *mailbox, const char *addr) { + const char *inptr = addr; + g_return_if_fail (INTERNET_ADDRESS_IS_MAILBOX (mailbox)); if (mailbox->addr == addr) return; + g_free (mailbox->idn_addr); + mailbox->idn_addr = NULL; + g_free (mailbox->addr); - mailbox->addr = g_strdup (addr); - g_mime_event_emit (((InternetAddress *) mailbox)->priv, NULL); + if (!addrspec_parse (&inptr, "", &mailbox->addr, &mailbox->at)) + mailbox->addr = g_strdup (addr); + + g_mime_event_emit (((InternetAddress *) mailbox)->changed, NULL); } @@ -356,7 +434,7 @@ * * Gets the addr-spec of the internet address mailbox. * - * Returns: the address of the mailbox. + * Returns: the addr-spec string. **/ const char * internet_address_mailbox_get_addr (InternetAddressMailbox *mailbox) @@ -367,11 +445,49 @@ } +/** + * internet_address_mailbox_get_idn_addr: + * @mailbox: a #InternetAddressMailbox + * + * Gets the IDN ascii-encoded addr-spec. + * + * Returns: the encoded addr-spec string. + **/ +const char * +internet_address_mailbox_get_idn_addr (InternetAddressMailbox *mailbox) +{ + GString *encoded; + char *ascii; + + g_return_val_if_fail (INTERNET_ADDRESS_IS_MAILBOX (mailbox), NULL); + +#ifdef LIBIDN + if (!mailbox->idn_addr && mailbox->at > 0) { + encoded = g_string_new (""); + g_string_append_len (encoded, mailbox->addr, mailbox->at + 1); + if (idna_to_ascii_8z (mailbox->addr + mailbox->at + 1, &ascii, 0) == IDNA_SUCCESS) { + g_string_append (encoded, ascii); + free (ascii); + } else { + g_string_append (encoded, mailbox->addr + mailbox->at + 1); + } + + mailbox->idn_addr = g_string_free (encoded, FALSE); + } + + return mailbox->idn_addr ? mailbox->idn_addr : mailbox->addr; +#else + return mailbox->addr; +#endif +} + + static void internet_address_group_class_init (InternetAddressGroupClass *klass); static void internet_address_group_init (InternetAddressGroup *group, InternetAddressGroupClass *klass); static void internet_address_group_finalize (GObject *object); -static void group_to_string (InternetAddress *ia, guint32 flags, size_t *linelen, GString *out); +static void group_to_string (InternetAddress *ia, GMimeFormatOptions *options, guint32 flags, + size_t *linelen, GString *out); static GObjectClass *group_parent_class = NULL; @@ -418,7 +534,7 @@ static void members_changed (InternetAddressList *members, gpointer args, InternetAddress *group) { - g_mime_event_emit (((InternetAddress *) group)->priv, NULL); + g_mime_event_emit (((InternetAddress *) group)->changed, NULL); } static void @@ -426,7 +542,7 @@ { group->members = internet_address_list_new (); - g_mime_event_add (group->members->priv, (GMimeEventCallback) members_changed, group); + g_mime_event_add (group->members->changed, (GMimeEventCallback) members_changed, group); } static void @@ -434,7 +550,7 @@ { InternetAddressGroup *group = (InternetAddressGroup *) object; - g_mime_event_remove (group->members->priv, (GMimeEventCallback) members_changed, group); + g_mime_event_remove (group->members->changed, (GMimeEventCallback) members_changed, group); g_object_unref (group->members); @@ -458,7 +574,7 @@ { InternetAddress *group; - group = g_object_newv (INTERNET_ADDRESS_TYPE_GROUP, 0, NULL); + group = g_object_new (INTERNET_ADDRESS_TYPE_GROUP, NULL); _internet_address_set_name (group, name); return group; @@ -482,18 +598,18 @@ return; if (group->members) { - g_mime_event_remove (group->members->priv, (GMimeEventCallback) members_changed, group); + g_mime_event_remove (group->members->changed, (GMimeEventCallback) members_changed, group); g_object_unref (group->members); } if (members) { - g_mime_event_add (members->priv, (GMimeEventCallback) members_changed, group); + g_mime_event_add (members->changed, (GMimeEventCallback) members_changed, group); g_object_ref (members); } group->members = members; - g_mime_event_emit (((InternetAddress *) group)->priv, NULL); + g_mime_event_emit (((InternetAddress *) group)->changed, NULL); } @@ -583,14 +699,14 @@ static void internet_address_list_init (InternetAddressList *list, InternetAddressListClass *klass) { - list->priv = g_mime_event_new ((GObject *) list); + list->changed = g_mime_event_new ((GObject *) list); list->array = g_ptr_array_new (); } static void address_changed (InternetAddress *ia, gpointer args, InternetAddressList *list) { - g_mime_event_emit (list->priv, NULL); + g_mime_event_emit (list->changed, NULL); } static void @@ -602,11 +718,11 @@ for (i = 0; i < list->array->len; i++) { ia = (InternetAddress *) list->array->pdata[i]; - g_mime_event_remove (ia->priv, (GMimeEventCallback) address_changed, list); + g_mime_event_remove (ia->changed, (GMimeEventCallback) address_changed, list); g_object_unref (ia); } - g_mime_event_destroy (list->priv); + g_mime_event_free (list->changed); g_ptr_array_free (list->array, TRUE); @@ -624,7 +740,7 @@ InternetAddressList * internet_address_list_new (void) { - return g_object_newv (INTERNET_ADDRESS_LIST_TYPE, 0, NULL); + return g_object_new (INTERNET_ADDRESS_LIST_TYPE, NULL); } @@ -661,13 +777,13 @@ for (i = 0; i < list->array->len; i++) { ia = (InternetAddress *) list->array->pdata[i]; - g_mime_event_remove (ia->priv, (GMimeEventCallback) address_changed, list); + g_mime_event_remove (ia->changed, (GMimeEventCallback) address_changed, list); g_object_unref (ia); } g_ptr_array_set_size (list->array, 0); - g_mime_event_emit (list->priv, NULL); + g_mime_event_emit (list->changed, NULL); } @@ -676,7 +792,7 @@ { int index; - g_mime_event_add (ia->priv, (GMimeEventCallback) address_changed, list); + g_mime_event_add (ia->changed, (GMimeEventCallback) address_changed, list); index = list->array->len; g_ptr_array_add (list->array, ia); @@ -705,7 +821,7 @@ index = _internet_address_list_add (list, ia); g_object_ref (ia); - g_mime_event_emit (list->priv, NULL); + g_mime_event_emit (list->changed, NULL); return index; } @@ -741,12 +857,12 @@ for (i = 0; i < prepend->array->len; i++) { ia = (InternetAddress *) prepend->array->pdata[i]; - g_mime_event_add (ia->priv, (GMimeEventCallback) address_changed, list); + g_mime_event_add (ia->changed, (GMimeEventCallback) address_changed, list); list->array->pdata[i] = ia; g_object_ref (ia); } - g_mime_event_emit (list->priv, NULL); + g_mime_event_emit (list->changed, NULL); } @@ -771,12 +887,12 @@ for (i = 0; i < append->array->len; i++) { ia = (InternetAddress *) append->array->pdata[i]; - g_mime_event_add (ia->priv, (GMimeEventCallback) address_changed, list); + g_mime_event_add (ia->changed, (GMimeEventCallback) address_changed, list); list->array->pdata[len + i] = ia; g_object_ref (ia); } - g_mime_event_emit (list->priv, NULL); + g_mime_event_emit (list->changed, NULL); } @@ -799,7 +915,7 @@ g_return_if_fail (IS_INTERNET_ADDRESS (ia)); g_return_if_fail (index >= 0); - g_mime_event_add (ia->priv, (GMimeEventCallback) address_changed, list); + g_mime_event_add (ia->changed, (GMimeEventCallback) address_changed, list); g_object_ref (ia); if ((guint) index < list->array->len) { @@ -816,7 +932,7 @@ g_ptr_array_add (list->array, ia); } - g_mime_event_emit (list->priv, NULL); + g_mime_event_emit (list->changed, NULL); } @@ -870,12 +986,12 @@ return FALSE; ia = list->array->pdata[index]; - g_mime_event_remove (ia->priv, (GMimeEventCallback) address_changed, list); + g_mime_event_remove (ia->changed, (GMimeEventCallback) address_changed, list); g_object_unref (ia); g_ptr_array_remove_index (list->array, index); - g_mime_event_emit (list->priv, NULL); + g_mime_event_emit (list->changed, NULL); return TRUE; } @@ -979,26 +1095,26 @@ if ((old = list->array->pdata[index]) == ia) return; - g_mime_event_remove (old->priv, (GMimeEventCallback) address_changed, list); + g_mime_event_remove (old->changed, (GMimeEventCallback) address_changed, list); g_object_unref (old); - g_mime_event_add (ia->priv, (GMimeEventCallback) address_changed, list); + g_mime_event_add (ia->changed, (GMimeEventCallback) address_changed, list); list->array->pdata[index] = ia; g_object_ref (ia); - g_mime_event_emit (list->priv, NULL); + g_mime_event_emit (list->changed, NULL); } static char * -encoded_name (const char *raw, gboolean rfc2047_encode) +encoded_name (GMimeFormatOptions *options, const char *raw, gboolean rfc2047_encode, const char *charset) { char *name; g_return_val_if_fail (raw != NULL, NULL); if (rfc2047_encode) { - name = g_mime_utils_header_encode_phrase (raw); + name = g_mime_utils_header_encode_phrase (options, raw, charset); } else { name = g_mime_utils_quote_string (raw); } @@ -1007,18 +1123,22 @@ } static void -linewrap (GString *string) +linewrap (GString *str, const char *newline) { - if (string->len > 0 && string->str[string->len - 1] == ' ') { - string->str[string->len - 1] = '\n'; - g_string_append_c (string, '\t'); + if (str->len > 0 && str->str[str->len - 1] == ' ') { + str->str[str->len - 1] = newline[0]; + + if (newline[1]) + g_string_append_c (str, newline[1]); } else { - g_string_append (string, "\n\t"); + g_string_append (str, newline); } + + g_string_append_c (str, '\t'); } static void -append_folded_name (GString *string, size_t *linelen, const char *name) +append_folded_name (GString *str, size_t *linelen, const char *name, const char *newline) { const char *word, *lwsp; size_t len; @@ -1050,11 +1170,11 @@ len = lwsp - word; if (*linelen > 1 && (*linelen + len) > GMIME_FOLD_LEN) { - linewrap (string); + linewrap (str, newline); *linelen = 1; } - g_string_append_len (string, word, len); + g_string_append_len (str, word, len); *linelen += len; word = lwsp; @@ -1062,76 +1182,83 @@ word++; if (*word && is_lwsp (*lwsp)) { - g_string_append_c (string, ' '); + g_string_append_c (str, ' '); (*linelen)++; } } } static void -mailbox_to_string (InternetAddress *ia, guint32 flags, size_t *linelen, GString *string) +mailbox_to_string (InternetAddress *ia, GMimeFormatOptions *options, guint32 flags, size_t *linelen, GString *str) { InternetAddressMailbox *mailbox = (InternetAddressMailbox *) ia; gboolean encode = flags & INTERNET_ADDRESS_ENCODE; gboolean fold = flags & INTERNET_ADDRESS_FOLD; + const char *newline, *addr; char *name; size_t len; + newline = g_mime_format_options_get_newline (options); + + addr = internet_address_mailbox_get_idn_addr (mailbox); + if (ia->name && *ia->name) { - name = encoded_name (ia->name, encode); + name = encoded_name (options, ia->name, encode, ia->charset); len = strlen (name); if (fold && (*linelen + len) > GMIME_FOLD_LEN) { if (len > GMIME_FOLD_LEN) { /* we need to break up the name */ - append_folded_name (string, linelen, name); + append_folded_name (str, linelen, name, newline); } else { /* the name itself is short enough to fit on a single * line, but only if we write it on a line by itself */ if (*linelen > 1) { - linewrap (string); + linewrap (str, newline); *linelen = 1; } - g_string_append_len (string, name, len); + g_string_append_len (str, name, len); *linelen += len; } } else { /* we can safely fit the name on this line */ - g_string_append_len (string, name, len); + g_string_append_len (str, name, len); *linelen += len; } g_free (name); - len = strlen (mailbox->addr); + len = strlen (addr); if (fold && (*linelen + len + 3) >= GMIME_FOLD_LEN) { - g_string_append_len (string, "\n\t<", 3); + g_string_append (str, newline); + g_string_append_len (str, "\t<", 2); *linelen = 2; } else { - g_string_append_len (string, " <", 2); + g_string_append_len (str, " <", 2); *linelen += 2; } - g_string_append_len (string, mailbox->addr, len); - g_string_append_c (string, '>'); + g_string_append_len (str, addr, len); + g_string_append_c (str, '>'); *linelen += len + 1; } else { - len = strlen (mailbox->addr); + len = strlen (addr); if (fold && (*linelen + len) > GMIME_FOLD_LEN) { - linewrap (string); + linewrap (str, newline); *linelen = 1; } - g_string_append_len (string, mailbox->addr, len); + g_string_append_len (str, addr, len); *linelen += len; } } static void -_internet_address_list_to_string (const InternetAddressList *list, guint32 flags, size_t *linelen, GString *string) +_internet_address_list_to_string (const InternetAddressList *list, GMimeFormatOptions *options, guint32 flags, + size_t *linelen, GString *str) { InternetAddress *ia; guint i; @@ -1139,42 +1266,45 @@ for (i = 0; i < list->array->len; i++) { ia = (InternetAddress *) list->array->pdata[i]; - INTERNET_ADDRESS_GET_CLASS (ia)->to_string (ia, flags, linelen, string); + INTERNET_ADDRESS_GET_CLASS (ia)->to_string (ia, options, flags, linelen, str); if (i + 1 < list->array->len) { - g_string_append (string, ", "); + g_string_append (str, ", "); *linelen += 2; } } } static void -group_to_string (InternetAddress *ia, guint32 flags, size_t *linelen, GString *string) +group_to_string (InternetAddress *ia, GMimeFormatOptions *options, guint32 flags, size_t *linelen, GString *str) { InternetAddressGroup *group = (InternetAddressGroup *) ia; gboolean encode = flags & INTERNET_ADDRESS_ENCODE; gboolean fold = flags & INTERNET_ADDRESS_FOLD; + const char *newline; char *name = NULL; size_t len = 0; + newline = g_mime_format_options_get_newline (options); + if (ia->name != NULL) { - name = encoded_name (ia->name, encode); + name = encoded_name (options, ia->name, encode, ia->charset); len = strlen (name); if (fold && *linelen > 1 && (*linelen + len + 1) > GMIME_FOLD_LEN) { - linewrap (string); + linewrap (str, newline); *linelen = 1; } - g_string_append_len (string, name, len); + g_string_append_len (str, name, len); } - g_string_append_len (string, ": ", 2); + g_string_append_len (str, ": ", 2); *linelen += len + 2; g_free (name); - _internet_address_list_to_string (group->members, flags, linelen, string); - g_string_append_c (string, ';'); + _internet_address_list_to_string (group->members, options, flags, linelen, str); + g_string_append_c (str, ';'); *linelen += 1; } @@ -1182,489 +1312,824 @@ /** * internet_address_list_to_string: * @list: list of internet addresses + * @options: (nullable): a #GMimeFormatOptions or %NULL * @encode: %TRUE if the address should be rfc2047 encoded * * Allocates a string buffer containing the rfc822 formatted addresses * in @list. * - * Returns: a string containing the list of addresses in rfc822 format - * or %NULL if no addresses are contained in the list. + * Returns: (nullable): a string containing the list of addresses in rfc822 + * format or %NULL if no addresses are contained in the list. **/ char * -internet_address_list_to_string (InternetAddressList *list, gboolean encode) +internet_address_list_to_string (InternetAddressList *list, GMimeFormatOptions *options, gboolean encode) { guint32 flags = encode ? INTERNET_ADDRESS_ENCODE : 0; size_t linelen = 0; - GString *string; - char *str; + GString *str; g_return_val_if_fail (IS_INTERNET_ADDRESS_LIST (list), NULL); if (list->array->len == 0) return NULL; - string = g_string_new (""); - _internet_address_list_to_string (list, flags, &linelen, string); - str = string->str; - - g_string_free (string, FALSE); + str = g_string_new (""); + _internet_address_list_to_string (list, options, flags, &linelen, str); - return str; + return g_string_free (str, FALSE); } /** - * internet_address_list_writer: + * internet_address_list_encode: * @list: list of internet addresses + * @options: (nullable): a #GMimeFormatOptions or %NULL * @str: string to write to * * Writes the rfc2047-encoded rfc822 formatted addresses in @list to * @str, folding appropriately. **/ void -internet_address_list_writer (InternetAddressList *list, GString *str) +internet_address_list_encode (InternetAddressList *list, GMimeFormatOptions *options, GString *str) { guint32 flags = INTERNET_ADDRESS_ENCODE | INTERNET_ADDRESS_FOLD; - size_t linelen = str->len; + const char *newline; + size_t linelen; g_return_if_fail (IS_INTERNET_ADDRESS_LIST (list)); g_return_if_fail (str != NULL); - _internet_address_list_to_string (list, flags, &linelen, str); + newline = g_mime_format_options_get_newline (options); + linelen = str->len; + + _internet_address_list_to_string (list, options, flags, &linelen, str); + + g_string_append (str, newline); } -static void -_internet_address_decode_name (InternetAddress *ia, GString *name) + +static char * +decode_name (GMimeParserOptions *options, const char *name, size_t len, const char **charset) { char *value, *buf = NULL; - char *phrase; - if (!g_utf8_validate (name->str, name->len, NULL)) { + if (!g_utf8_validate (name, len, NULL)) { /* A (broken) mailer has sent us raw 8bit/multibyte text data... */ - buf = g_mime_utils_decode_8bit (name->str, name->len); - phrase = buf; + buf = g_mime_utils_decode_8bit (options, name, len); } else { - phrase = name->str; + buf = g_strndup (name, len); } /* decode the phrase */ - g_mime_utils_unquote_string (phrase); - value = g_mime_utils_header_decode_phrase (phrase); - g_free (ia->name); - ia->name = value; + g_mime_utils_unquote_string (buf); + value = _g_mime_utils_header_decode_phrase (options, buf, charset); + g_strstrip (value); g_free (buf); + + return value; } -static InternetAddress *decode_address (const char **in); -static void -skip_lwsp (const char **in) +typedef enum { + ALLOW_MAILBOX = 1 << 0, + ALLOW_GROUP = 1 << 1, + ALLOW_ANY = ALLOW_MAILBOX | ALLOW_GROUP +} AddressParserFlags; + +static gboolean +decode_route (const char **in) { - register const char *inptr = *in; + const char *start = *in; + const char *inptr = *in; + GString *route; + + route = g_string_new (""); - while (*inptr && is_lwsp (*inptr)) + do { inptr++; + + g_string_append_c (route, '@'); + if (!decode_domain (&inptr, route)) { + g_string_free (route, TRUE); + goto error; + } + + skip_cfws (&inptr); + if (*inptr == ',') { + g_string_append_c (route, ','); + inptr++; + skip_cfws (&inptr); + + /* obs-domain-lists allow commas with nothing between them... */ + while (*inptr == ',') { + inptr++; + skip_cfws (&inptr); + } + } + } while (*inptr == '@'); + + g_string_free (route, TRUE); + skip_cfws (&inptr); + + if (*inptr != ':') { + w(g_warning ("Invalid route domain-list, missing ':': %.*s", inptr - start, start)); + goto error; + } *in = inptr; + + return TRUE; + + error: + + while (*inptr && *inptr != ':' && *inptr != '>') + inptr++; + + *in = inptr; + + return FALSE; } -static InternetAddress * -decode_addrspec (const char **in) +static gboolean +localpart_parse (GString *localpart, const char **in) { - InternetAddress *mailbox = NULL; - const char *start, *inptr, *word; - gboolean got_local = FALSE; - GString *addr; - size_t len; + const char *inptr = *in; + const char *start = *in; + const char *word; - addr = g_string_new (""); - inptr = *in; + do { + word = inptr; + + if (!skip_word (&inptr)) + goto error; + + if (!g_utf8_validate (word, (size_t) (inptr - word), NULL)) + goto error; + + g_string_append_len (localpart, word, (size_t) (inptr - word)); + + if (!skip_cfws (&inptr)) + goto error; + + if (*inptr != '.') + break; + + g_string_append_c (localpart, *inptr++); + + if (!skip_cfws (&inptr)) + goto error; + + if (*inptr == '\0') + goto error; + } while (TRUE); - decode_lwsp (&inptr); + *in = inptr; - /* some spam bots set their addresses to stuff like: ).ORHH@em.ca */ - while (*inptr && !(*inptr == '"' || is_atom (*inptr))) - inptr++; + return TRUE; - start = inptr; + error: + *in = inptr; - /* extract the first word of the local-part */ - if ((word = decode_word (&inptr))) { - g_string_append_len (addr, word, (size_t) (inptr - word)); - decode_lwsp (&inptr); - got_local = TRUE; - } + return FALSE; +} + +#define COMMA_GREATER_THAN_OR_SEMICOLON ",>;" + +static gboolean +dotatom_parse (GString *str, const char **in, const char *sentinels) +{ + const char *atom, *comment; + const char *inptr = *in; + const char *start = *in; + GString *domain = str; - /* extract the rest of the local-part */ - while (word && *inptr == '.') { - /* Note: According to the spec, only a single '.' is - * allowed between word tokens in the local-part of an - * addr-spec token, but according to Evolution bug - * #547969, some Japanese cellphones have email - * addresses that look like x..y@somewhere.jp */ - do { + do { + if (!is_atom (*inptr)) + goto error; + + atom = inptr; + while (is_atom (*inptr)) inptr++; - decode_lwsp (&inptr); - g_string_append_c (addr, '.'); - } while (*inptr == '.'); - if ((word = decode_word (&inptr))) - g_string_append_len (addr, word, (size_t) (inptr - word)); + if (!g_utf8_validate (atom, (size_t) (inptr - atom), NULL)) + goto error; - decode_lwsp (&inptr); - } - - if (*inptr == '@') { - len = addr->len; +#if LIBIDN + if (domain == str && !strncmp (atom, "xn--", 4)) { + /* from here on out, we'll use a temp domain buffer so that + * we can decode it once we're done parsing it */ + domain = g_string_new (""); + } +#endif + + g_string_append_len (domain, atom, (size_t) (inptr - atom)); + + comment = inptr; + if (!skip_cfws (&inptr)) + goto error; - g_string_append_c (addr, '@'); + if (*inptr != '.') { + inptr = comment; + break; + } + + /* skip over the '.' */ inptr++; - if (!decode_domain (&inptr, addr)) { - /* drop the @domain and continue as if it weren't there */ - w(g_warning ("Missing domain in addr-spec: %.*s", - inptr - start, start)); - g_string_truncate (addr, len); - } - } else if (got_local) { - w(g_warning ("Missing '@' and domain in addr-spec: %.*s", - inptr - start, start)); + if (!skip_cfws (&inptr)) + goto error; + + /* allow domains to end with a '.', but strip it off */ + if (*inptr == '\0' || strchr (sentinels, *inptr)) + break; + + g_string_append_c (domain, '.'); + } while (TRUE); + +#ifdef LIBIDN + if (domain != str) { + char *unicode; + + if (idna_to_unicode_8z8z (domain->str, &unicode, 0) == IDNA_SUCCESS) { + g_string_append (str, unicode); + free (unicode); + } else { + g_string_append_len (str, domain->str, domain->len); + } + + g_string_free (domain, TRUE); } +#endif *in = inptr; - if (!got_local) { - w(g_warning ("Invalid addr-spec, missing local-part: %.*s", - inptr - start, start)); - g_string_free (addr, TRUE); - return NULL; + return TRUE; + + error: +#ifdef LIBIDN + if (domain != str) { + g_string_append_len (str, domain->str, domain->len); + g_string_free (domain, TRUE); } +#endif - mailbox = g_object_newv (INTERNET_ADDRESS_TYPE_MAILBOX, 0, NULL); - ((InternetAddressMailbox *) mailbox)->addr = addr->str; - g_string_free (addr, FALSE); + *in = inptr; - return mailbox; + return FALSE; } -static InternetAddress * -decode_group (const char **in) +static gboolean +domain_literal_parse (GString *str, const char **in) { - InternetAddressGroup *group; - InternetAddress *addr; - const char *inptr; + const char *inptr = *in; - inptr = *in; + g_string_append_c (str, '['); + inptr++; - addr = internet_address_group_new (NULL); - group = (InternetAddressGroup *) addr; + skip_lwsp (&inptr); - decode_lwsp (&inptr); - while (*inptr && *inptr != ';') { - InternetAddress *member; + do { + while (is_dtext (*inptr)) + g_string_append_c (str, *inptr++); - if ((member = decode_address (&inptr))) - _internet_address_group_add_member (group, member); + skip_lwsp (&inptr); - decode_lwsp (&inptr); - while (*inptr == ',') { - inptr++; - decode_lwsp (&inptr); - if ((member = decode_address (&inptr))) - _internet_address_group_add_member (group, member); - - decode_lwsp (&inptr); - } - } + if (*inptr == '\0') + goto error; + + if (*inptr == ']') + break; + + if (!is_dtext (*inptr)) + goto error; + } while (TRUE); + + g_string_append_c (str, ']'); + *in = inptr + 1; + + return TRUE; + error: *in = inptr; - return addr; + return FALSE; } static gboolean -decode_route (const char **in) +domain_parse (GString *str, const char **in, const char *sentinels) { + if (**in == '[') + return domain_literal_parse (str, in); + + return dotatom_parse (str, in, sentinels); +} + +static gboolean +addrspec_parse (const char **in, const char *sentinels, char **addrspec, int *at) +{ + const char *inptr = *in; const char *start = *in; + GString *str; + guint domain; + + str = g_string_new (""); + + if (!localpart_parse (str, &inptr)) + goto error; + + if (*inptr == '\0' || strchr (sentinels, *inptr)) { + *addrspec = g_string_free (str, FALSE); + *in = inptr; + *at = -1; + return TRUE; + } + + if (*inptr != '@') + goto error; + + *at = str->len; + g_string_append_c (str, *inptr++); + + if (*inptr == '\0') + goto error; + + if (!skip_cfws (&inptr)) + goto error; + + if (*inptr == '\0') + goto error; + + if (!domain_parse (str, &inptr, sentinels)) + goto error; + + *addrspec = g_string_free (str, FALSE); + *in = inptr; + + return TRUE; + + error: + g_string_free (str, TRUE); + *addrspec = NULL; + *in = inptr; + *at = -1; + + return FALSE; +} + +// TODO: rename to angleaddr_parse?? +static gboolean +mailbox_parse (GMimeParserOptions *options, const char **in, const char *name, InternetAddress **address) +{ + GMimeRfcComplianceMode mode = g_mime_parser_options_get_address_compliance_mode (options); const char *inptr = *in; - GString *route; + char *addrspec = NULL; + int at; - route = g_string_new (""); + /* skip over the '<' */ + inptr++; - do { + /* Note: check for excessive angle brackets like the example described in section 7.1.2 of rfc7103... */ + if (*inptr == '<') { + if (mode != GMIME_RFC_COMPLIANCE_LOOSE) + goto error; + + do { + inptr++; + } while (*inptr == '<'); + } + + if (*inptr == '\0') + goto error; + + if (!skip_cfws (&inptr)) + goto error; + + if (*inptr == '@') { + if (!decode_route (&inptr)) + goto error; + + if (*inptr != ':') + goto error; + inptr++; - g_string_append_c (route, '@'); - if (!decode_domain (&inptr, route)) { - g_string_free (route, TRUE); + if (!skip_cfws (&inptr)) goto error; - } + } + + // Note: The only syntactically correct sentinel token here is the '>', but alas... to deal with the first + // example in section 7.1.5 of rfc7103, we need to at least handle ',' as a sentinel and might as well handle + // ';' as well in case the mailbox is within a group address. + // + // Example: + if (!addrspec_parse (&inptr, COMMA_GREATER_THAN_OR_SEMICOLON, &addrspec, &at)) + goto error; + + if (!skip_cfws (&inptr)) + goto error; + + if (*inptr != '>') { + if (mode != GMIME_RFC_COMPLIANCE_LOOSE) + goto error; + } else { + /* skip over the '>' */ + inptr++; - decode_lwsp (&inptr); - if (*inptr == ',') { - g_string_append_c (route, ','); - inptr++; - decode_lwsp (&inptr); + /* Note: check for excessive angle brackets like the example described in section 7.1.2 of rfc7103... */ + if (*inptr == '>') { + if (mode != GMIME_RFC_COMPLIANCE_LOOSE) + goto error; - /* obs-domain-lists allow commas with nothing between them... */ - while (*inptr == ',') { + do { inptr++; - decode_lwsp (&inptr); - } + } while (*inptr == '>'); } - } while (*inptr == '@'); - - g_string_free (route, TRUE); - decode_lwsp (&inptr); - - if (*inptr != ':') { - w(g_warning ("Invalid route domain-list, missing ':': %.*s", inptr - start, start)); - goto error; } - /* eat the ':' */ - *in = inptr + 1; + *address = _internet_address_mailbox_new (name, addrspec, at); + g_free (addrspec); + *in = inptr; return TRUE; error: + g_free (addrspec); + *address = NULL; + *in = inptr; - while (*inptr && *inptr != ':' && *inptr != '>') - inptr++; + return FALSE; +} + +static gboolean address_list_parse (InternetAddressList *list, GMimeParserOptions *options, const char **in, gboolean is_group); + +static gboolean +group_parse (InternetAddressGroup *group, GMimeParserOptions *options, const char **in) +{ + const char *inptr = *in; - if (*inptr == ':') - inptr++; + /* skip over the ':' */ + inptr++; + + if (*inptr != '\0') { + address_list_parse (group->members, options, &inptr, TRUE); + + if (*inptr != ';') { + while (*inptr && *inptr != ';') + inptr++; + } else { + inptr++; + } + } *in = inptr; - return FALSE; + return TRUE; } -static InternetAddress * -decode_address (const char **in) +static gboolean +address_parse (GMimeParserOptions *options, AddressParserFlags flags, const char **in, const char **charset, InternetAddress **address) { - const char *inptr, *start, *word, *comment = NULL; - InternetAddress *addr = NULL; - gboolean has_lwsp = FALSE; - gboolean is_word; - GString *name; - - decode_lwsp (in); - start = inptr = *in; - - name = g_string_new (""); - - /* Both groups and mailboxes can begin with a phrase (denoting - * the display name for the address). Collect all of the - * tokens that make up this name phrase. - */ + GMimeRfcComplianceMode mode = g_mime_parser_options_get_address_compliance_mode (options); + int min_words = g_mime_parser_options_get_allow_addresses_without_domain (options) ? 1 : 0; + gboolean trim_leading_quote = FALSE; + const char *inptr = *in; + const char *start; + size_t length; + int words = 0; + + if (!skip_cfws (&inptr) || *inptr == '\0') + goto error; + + /* keep track of the start & length of the phrase */ + start = inptr; + length = 0; + while (*inptr) { - if ((word = decode_word (&inptr))) { - g_string_append_len (name, word, (size_t) (inptr - word)); + if (mode != GMIME_RFC_COMPLIANCE_LOOSE) { + if (!skip_word (&inptr)) + break; + } else if (*inptr == '"') { + const char *qstring = inptr; - check_lwsp: - word = inptr; - skip_lwsp (&inptr); - - /* is the next token a word token? */ - is_word = *inptr == '"' || is_atom (*inptr); - - if (inptr > word && is_word) { - g_string_append_c (name, ' '); - has_lwsp = TRUE; + if (!skip_quoted (&inptr)) { + inptr = qstring + 1; + + skip_lwsp (&inptr); + + if (!skip_atom (&inptr)) + break; + + if (start == qstring) + trim_leading_quote = TRUE; } - - if (is_word) - continue; + } else { + if (!skip_atom (&inptr)) + break; } - /* specials = "(" / ")" / "<" / ">" / "@" ; Must be in quoted- - * / "," / ";" / ":" / "\" / <"> ; string, to use - * / "." / "[" / "]" ; within a word. - */ - if (*inptr == ':') { - /* rfc2822 group */ - inptr++; - addr = decode_group (&inptr); - decode_lwsp (&inptr); - if (*inptr != ';') - w(g_warning ("Invalid group spec, missing closing ';': %.*s", - inptr - start, start)); - else - inptr++; - break; - } else if (*inptr == '<') { - /* rfc2822 angle-addr */ + length = (size_t) (inptr - start); + + do { + if (!skip_cfws (&inptr)) + goto error; + + /* Note: some clients don't quote dots in the name */ + if (*inptr != '.') + break; + inptr++; - /* check for obsolete routing... */ - if (*inptr != '@' || decode_route (&inptr)) { - /* rfc2822 addr-spec */ - addr = decode_addrspec (&inptr); - } + length = (size_t) (inptr - start); + } while (TRUE); + + words++; + + /* Note: some clients don't quote commas in the name */ + if (*inptr == ',' && words > min_words) { + inptr++; - decode_lwsp (&inptr); - if (*inptr != '>') { - w(g_warning ("Invalid rfc2822 angle-addr, missing closing '>': %.*s", - inptr - start, start)); - - while (*inptr && *inptr != '>' && *inptr != ',') - inptr++; - - if (*inptr == '>') - inptr++; - } else { - inptr++; - } + length = (size_t) (inptr - start); - /* if comment is non-NULL, we can check for a comment containing a name */ - comment = inptr; - break; - } else if (*inptr == '(') { - /* beginning of a comment, use decode_lwsp() to skip past it */ - decode_lwsp (&inptr); - } else if (*inptr && strchr ("@,;", *inptr)) { - if (name->len == 0) { - if (*inptr == '@') { - GString *domain; - - w(g_warning ("Unexpected address: %s: skipping.", start)); - - /* skip over @domain? */ - inptr++; - domain = g_string_new (""); - decode_domain (&inptr, domain); - g_string_free (domain, TRUE); - } else { - /* empty address */ - } - break; - } else if (has_lwsp) { - /* assume this is just an unquoted special that we should - treat as part of the name */ - w(g_warning ("Unquoted '%c' in address name: %s: ignoring.", *inptr, start)); - g_string_append_c (name, *inptr); - inptr++; - - goto check_lwsp; - } + if (!skip_cfws (&inptr)) + goto error; + } + } + + if (!skip_cfws (&inptr)) + goto error; + + // specials = "(" / ")" / "<" / ">" / "@" ; Must be in quoted- + // / "," / ";" / ":" / "\" / <"> ; string, to use + // / "." / "[" / "]" ; within a word. + + if (*inptr == '\0' || *inptr == ',' || *inptr == '>' || *inptr == ';') { + /* we've completely gobbled up an addr-spec w/o a domain */ + char sentinel = *inptr != '\0' ? *inptr : ','; + char sentinels[2] = { sentinel, 0 }; + char *name, *addrspec; + int at; + + /* rewind back to the beginning of the local-part */ + inptr = start; + + if (!(flags & ALLOW_MAILBOX)) + goto error; + + if (!addrspec_parse (&inptr, sentinels, &addrspec, &at)) + goto error; + + skip_lwsp (&inptr); + + if (*inptr == '(') { + const char *comment = inptr; + char *buf; - addrspec: - /* what we thought was a name was actually an addrspec? */ - g_string_truncate (name, 0); - inptr = start; + if (!skip_comment (&inptr)) + goto error; - addr = decode_addrspec (&inptr); + comment++; - /* if comment is non-NULL, we can check for a comment containing a name */ - comment = inptr; - break; - } else if (*inptr == '.') { - /* This would normally signify that we are - * decoding the local-part of an addr-spec, - * but sadly, it is common for broken mailers - * to forget to quote/encode .'s in the name - * phrase. */ - g_string_append_c (name, *inptr); - inptr++; + name = decode_name (options, comment, (size_t) ((inptr - 1) - comment), charset); + } else { + name = g_strdup (""); + } + + if (*inptr == '>') { + if (mode != GMIME_RFC_COMPLIANCE_LOOSE) + goto error; - goto check_lwsp; - } else if (*inptr) { - /* Technically, these are all invalid tokens - * but in the interest of being liberal in - * what we accept, we'll ignore them. */ - w(g_warning ("Unexpected char '%c' in address: %s: ignoring.", *inptr, start)); - g_string_append_c (name, *inptr); inptr++; - - goto check_lwsp; + } + + *address = _internet_address_mailbox_new (name, addrspec, at); + g_free (addrspec); + g_free (name); + *in = inptr; + + return TRUE; + } + + if (*inptr == ':') { + /* rfc2822 group address */ + InternetAddressGroup *group; + const char *phrase = start; + gboolean retval; + char *name; + + if (!(flags & ALLOW_GROUP)) + goto error; + + if (trim_leading_quote) { + phrase++; + length--; + } + + if (length > 0) { + name = decode_name (options, phrase, length, charset); } else { - goto addrspec; + name = g_strdup (""); } + + group = (InternetAddressGroup *) internet_address_group_new (name); + *address = (InternetAddress *) group; + g_free (name); + + retval = group_parse (group, options, &inptr); + *in = inptr; + + return retval; } - /* Note: will also skip over any comments */ - decode_lwsp (&inptr); + if (!(flags & ALLOW_MAILBOX)) + goto error; - if (name->len == 0 && comment && inptr > comment) { - /* missing a name, look for a trailing comment */ - if ((comment = memchr (comment, '(', inptr - comment))) { - const char *cend; + if (*inptr == '@') { + /* we're either in the middle of an addr-spec token or we completely gobbled up + * an addr-spec w/o a domain */ + char *name, *addrspec; + int at; + + /* rewind back to the beginning of the local-part */ + inptr = start; + + if (!addrspec_parse (&inptr, COMMA_GREATER_THAN_OR_SEMICOLON, &addrspec, &at)) + goto error; + + skip_lwsp (&inptr); + + if (*inptr == '(') { + const char *comment = inptr; + char *buf; - /* find the end of the comment */ - cend = inptr - 1; - while (cend > comment && is_lwsp (*cend)) - cend--; + if (!skip_comment (&inptr)) + goto error; - if (*cend == ')') - cend--; + comment++; + + name = decode_name (options, comment, (size_t) ((inptr - 1) - comment), charset); + } else { + name = g_strdup (""); + } + + if (!skip_cfws (&inptr)) { + g_free (addrspec); + g_free (name); + goto error; + } + + if (*inptr == '\0') { + *address = _internet_address_mailbox_new (name, addrspec, at); + g_free (addrspec); + g_free (name); + *in = inptr; - g_string_append_len (name, comment + 1, (size_t) (cend - comment)); + return TRUE; + } + + if (*inptr == '<') { + /* We have an address like "user@example.com "; i.e. the name + * is an unquoted string with an '@'. */ + const char *end; + + if (mode != GMIME_RFC_COMPLIANCE_LOOSE) + goto error; + + end = inptr; + while (end > start && is_lwsp (*(end - 1))) + end--; + + length = (size_t) (end - start); + g_free (addrspec); + g_free (name); + + /* fall through to the rfc822 angle-addr token case... */ + } else { + /* Note: since there was no '<', there should not be a '>'... but we handle it + * anyway in order to deal with the second Unbalanced Angle Brackets example in + * section 7.1.3: second@example.org> */ + if (*inptr == '>') { + if (mode != GMIME_RFC_COMPLIANCE_LOOSE) + goto error; + + inptr++; + } + + *address = _internet_address_mailbox_new (name, addrspec, at); + g_free (addrspec); + g_free (name); + *in = inptr; + + return TRUE; } } - if (addr && name->len > 0) - _internet_address_decode_name (addr, name); + if (*inptr == '<') { + /* rfc2822 angle-addr token */ + const char *phrase = start; + gboolean retval; + char *name; + + if (trim_leading_quote) { + phrase++; + length--; + } + + if (length > 0) { + name = decode_name (options, phrase, length, charset); + } else { + name = g_strdup (""); + } + + retval = mailbox_parse (options, &inptr, name, address); + g_free (name); + *in = inptr; + + return retval; + } + + error: + *address = NULL; + *in = inptr; + + return FALSE; +} + +static gboolean +address_list_parse (InternetAddressList *list, GMimeParserOptions *options, const char **in, gboolean is_group) +{ + InternetAddress *address; + const char *charset; + const char *inptr; + + if (!skip_cfws (in)) + return FALSE; - g_string_free (name, TRUE); + inptr = *in; + + if (*inptr == '\0') + return FALSE; + + while (*inptr) { + if (is_group && *inptr == ';') + break; + + charset = NULL; + + if (!address_parse (options, ALLOW_ANY, &inptr, &charset, &address)) { + /* skip this address... */ + while (*inptr && *inptr != ',' && (!is_group || *inptr != ';')) + inptr++; + } else { + _internet_address_list_add (list, address); + + if (charset) + address->charset = g_strdup (charset); + } + + /* Note: we loop here in case there are any null addresses between commas */ + do { + if (!skip_cfws (&inptr)) { + *in = inptr; + + return FALSE; + } + + if (*inptr != ',') + break; + + inptr++; + } while (TRUE); + } *in = inptr; - return addr; + return TRUE; } /** - * internet_address_list_parse_string: + * internet_address_list_parse: + * @options: (nullable): a #GMimeParserOptions or %NULL * @str: a string containing internet addresses * * Construct a list of internet addresses from the given string. * - * Returns: (transfer full): a #InternetAddressList or %NULL if the + * Returns: (nullable) (transfer full): a #InternetAddressList or %NULL if the * input string does not contain any addresses. **/ InternetAddressList * -internet_address_list_parse_string (const char *str) +internet_address_list_parse (GMimeParserOptions *options, const char *str) { - InternetAddressList *addrlist; + InternetAddressList *list; const char *inptr = str; - InternetAddress *addr; - const char *start; - addrlist = internet_address_list_new (); + g_return_val_if_fail (str != NULL, NULL); - while (inptr && *inptr) { - start = inptr; - - if ((addr = decode_address (&inptr))) { - _internet_address_list_add (addrlist, addr); - } else { - w(g_warning ("Invalid or incomplete address: %.*s", - inptr - start, start)); - } - - decode_lwsp (&inptr); - if (*inptr == ',') { - inptr++; - decode_lwsp (&inptr); - - /* obs-mbox-list and obs-addr-list allow for empty members (commas with nothing between them) */ - while (*inptr == ',') { - inptr++; - decode_lwsp (&inptr); - } - } else if (*inptr) { - w(g_warning ("Parse error at '%s': expected ','", inptr)); - /* try skipping to the next address */ - if ((inptr = strchr (inptr, ','))) - inptr++; - } - } - - if (addrlist->array->len == 0) { - g_object_unref (addrlist); - addrlist = NULL; + list = internet_address_list_new (); + if (!address_list_parse (list, options, &inptr, FALSE) || list->array->len == 0) { + g_object_unref (list); + return NULL; } - return addrlist; + return list; } diff -Nru gmime-2.6.22+dfsg2/gmime/internet-address.h gmime-3.0.1/gmime/internet-address.h --- gmime-2.6.22+dfsg2/gmime/internet-address.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/internet-address.h 2017-04-08 17:01:14.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -25,6 +25,9 @@ #include #include +#include +#include + G_BEGIN_DECLS #define INTERNET_ADDRESS_TYPE (internet_address_get_type ()) @@ -69,23 +72,27 @@ /** * InternetAddress: * @parent_object: parent #GObject - * @priv: private data + * @charset: the charset used for encoding the name * @name: display name * * An RFC 2822 Address object. **/ struct _InternetAddress { GObject parent_object; - gpointer priv; + char *charset; char *name; + + /* < private > */ + gpointer changed; }; struct _InternetAddressClass { GObjectClass parent_class; /* public virtual methods */ - void (* to_string) (InternetAddress *ia, guint32 flags, size_t *linelen, GString *out); + void (* to_string) (InternetAddress *ia, GMimeFormatOptions *options, guint32 flags, + size_t *linelen, GString *str); }; @@ -94,20 +101,27 @@ void internet_address_set_name (InternetAddress *ia, const char *name); const char *internet_address_get_name (InternetAddress *ia); -char *internet_address_to_string (InternetAddress *ia, gboolean encode); +void internet_address_set_charset (InternetAddress *ia, const char *charset); +const char *internet_address_get_charset (InternetAddress *ia); + +char *internet_address_to_string (InternetAddress *ia, GMimeFormatOptions *options, gboolean encode); /** * InternetAddressMailbox: * @parent_object: parent #InternetAddress - * @addr: address string + * @idn_addr: the ascii-encoded version of @addr + * @addr: the address string + * @at: the index of the '@' character * * An RFC 2822 Mailbox address. **/ struct _InternetAddressMailbox { InternetAddress parent_object; + char *idn_addr; char *addr; + int at; }; struct _InternetAddressMailboxClass { @@ -122,7 +136,7 @@ void internet_address_mailbox_set_addr (InternetAddressMailbox *mailbox, const char *addr); const char *internet_address_mailbox_get_addr (InternetAddressMailbox *mailbox); - +const char *internet_address_mailbox_get_idn_addr (InternetAddressMailbox *mailbox); /** * InternetAddressGroup: @@ -156,16 +170,17 @@ /** * InternetAddressList: * @parent_object: parent #GObject - * @priv: private data * @array: The array of #InternetAddress objects. * * A collection of #InternetAddress objects. **/ struct _InternetAddressList { GObject parent_object; - gpointer priv; GPtrArray *array; + + /* < private > */ + gpointer changed; }; struct _InternetAddressListClass { @@ -195,11 +210,10 @@ InternetAddress *internet_address_list_get_address (InternetAddressList *list, int index); void internet_address_list_set_address (InternetAddressList *list, int index, InternetAddress *ia); -char *internet_address_list_to_string (InternetAddressList *list, gboolean encode); - -InternetAddressList *internet_address_list_parse_string (const char *str); +char *internet_address_list_to_string (InternetAddressList *list, GMimeFormatOptions *options, gboolean encode); +void internet_address_list_encode (InternetAddressList *list, GMimeFormatOptions *options, GString *str); -void internet_address_list_writer (InternetAddressList *list, GString *str); +InternetAddressList *internet_address_list_parse (GMimeParserOptions *options, const char *str); G_END_DECLS diff -Nru gmime-2.6.22+dfsg2/gmime/Makefile.am gmime-3.0.1/gmime/Makefile.am --- gmime-2.6.22+dfsg2/gmime/Makefile.am 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime/Makefile.am 2017-04-08 17:01:10.000000000 +0000 @@ -17,10 +17,11 @@ EXTRA_DIST = gmime-version.h.in gmime-version.h -lib_LTLIBRARIES = libgmime-2.6.la +lib_LTLIBRARIES = libgmime-3.0.la -libgmime_2_6_la_SOURCES = \ +libgmime_3_0_la_SOURCES = \ gmime.c \ + gmime-application-pkcs7-mime.c \ gmime-certificate.c \ gmime-charset.c \ gmime-common.c \ @@ -34,16 +35,20 @@ gmime-filter-basic.c \ gmime-filter-best.c \ gmime-filter-charset.c \ - gmime-filter-crlf.c \ + gmime-filter-checksum.c \ + gmime-filter-dos2unix.c \ gmime-filter-enriched.c \ gmime-filter-from.c \ gmime-filter-gzip.c \ gmime-filter-html.c \ - gmime-filter-md5.c \ + gmime-filter-smtp-data.c \ gmime-filter-strip.c \ + gmime-filter-unix2dos.c \ gmime-filter-windows.c \ gmime-filter-yenc.c \ + gmime-format-options.c \ gmime-gpg-context.c \ + gmime-gpgme-utils.c \ gmime-header.c \ gmime-iconv.c \ gmime-iconv-utils.c \ @@ -57,9 +62,11 @@ gmime-param.c \ gmime-parse-utils.c \ gmime-parser.c \ + gmime-parser-options.c \ gmime-part.c \ gmime-part-iter.c \ gmime-pkcs7-context.c \ + gmime-references.c \ gmime-signature.c \ gmime-stream.c \ gmime-stream-buffer.c \ @@ -72,11 +79,13 @@ gmime-stream-mmap.c \ gmime-stream-null.c \ gmime-stream-pipe.c \ + gmime-text-part.c \ gmime-utils.c \ internet-address.c gmimeinclude_HEADERS = \ gmime.h \ + gmime-application-pkcs7-mime.h \ gmime-certificate.h \ gmime-charset.h \ gmime-content-type.h \ @@ -89,15 +98,18 @@ gmime-filter-basic.h \ gmime-filter-best.h \ gmime-filter-charset.h \ - gmime-filter-crlf.h \ + gmime-filter-checksum.h \ + gmime-filter-dos2unix.h \ gmime-filter-enriched.h \ gmime-filter-from.h \ gmime-filter-gzip.h \ gmime-filter-html.h \ - gmime-filter-md5.h \ + gmime-filter-smtp-data.h \ gmime-filter-strip.h \ + gmime-filter-unix2dos.h \ gmime-filter-windows.h \ gmime-filter-yenc.h \ + gmime-format-options.h \ gmime-gpg-context.h \ gmime-header.h \ gmime-iconv.h \ @@ -111,9 +123,11 @@ gmime-object.h \ gmime-param.h \ gmime-parser.h \ + gmime-parser-options.h \ gmime-part.h \ gmime-part-iter.h \ gmime-pkcs7-context.h \ + gmime-references.h \ gmime-signature.h \ gmime-stream.h \ gmime-stream-buffer.h \ @@ -126,6 +140,7 @@ gmime-stream-mmap.h \ gmime-stream-null.h \ gmime-stream-pipe.h \ + gmime-text-part.h \ gmime-utils.h \ gmime-version.h \ internet-address.h @@ -134,6 +149,8 @@ gmime-charset-map-private.h \ gmime-table-private.h \ gmime-parse-utils.h \ + gmime-gpgme-utils.h \ + gmime-internal.h \ gmime-common.h \ gmime-events.h @@ -156,8 +173,8 @@ uninstall-libtool-import-lib: endif -libgmime_2_6_la_LIBADD = $(top_builddir)/util/libutil.la $(GLIB_LIBS) -libgmime_2_6_la_LDFLAGS = \ +libgmime_3_0_la_LIBADD = $(top_builddir)/util/libutil.la $(GLIB_LIBS) $(LIBIDN_LIBS) +libgmime_3_0_la_LDFLAGS = \ -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ -export-dynamic $(no_undefined) @@ -179,18 +196,18 @@ INTROSPECTION_COMPILER_ARGS = --includedir=$(srcdir) if HAVE_INTROSPECTION -GMime-2.6.gir: libgmime-2.6.la -GMime_2_6_gir_INCLUDES = GObject-2.0 Gio-2.0 -GMime_2_6_gir_CFLAGS = $(AM_CPPFLAGS) -GMime_2_6_gir_LIBS = libgmime-2.6.la -GMime_2_6_gir_FILES = $(gmimeinclude_HEADERS) $(libgmime_2_6_la_SOURCES) -GMime_2_6_gir_EXPORT_PACKAGES = gmime-2.6 -GMime_2_6_gir_SCANNERFLAGS = \ +GMime-3.0.gir: libgmime-3.0.la +GMime_3_0_gir_INCLUDES = GObject-2.0 Gio-2.0 +GMime_3_0_gir_CFLAGS = $(AM_CPPFLAGS) +GMime_3_0_gir_LIBS = libgmime-3.0.la +GMime_3_0_gir_FILES = $(gmimeinclude_HEADERS) $(libgmime_3_0_la_SOURCES) +GMime_3_0_gir_EXPORT_PACKAGES = gmime-3.0 +GMime_3_0_gir_SCANNERFLAGS = \ --c-include="gmime/gmime.h" \ --accept-unprefixed \ --symbol-prefix "gmime_" \ --symbol-prefix "g_mime_" -INTROSPECTION_GIRS += GMime-2.6.gir +INTROSPECTION_GIRS += GMime-3.0.gir girdir = $(datadir)/gir-1.0 gir_DATA = $(INTROSPECTION_GIRS) @@ -204,21 +221,21 @@ if ENABLE_VAPIGEN -include $(VAPIGEN_MAKEFILE) -gmime-2.6.vapi: GMime-2.6.gir GMime-2.6.metadata +gmime-3.0.vapi: GMime-3.0.gir GMime-3.0.metadata -VAPIGEN_VAPIS = gmime-2.6.vapi -gmime_2_6_vapi_DEPS = gio-2.0 -gmime_2_6_vapi_METADATADIRS = $(srcdir) -gmime_2_6_vapi_FILES = GMime-2.6.gir +VAPIGEN_VAPIS = gmime-3.0.vapi +gmime_3_0_vapi_DEPS = gio-2.0 +gmime_3_0_vapi_METADATADIRS = $(srcdir) +gmime_3_0_vapi_FILES = GMime-3.0.gir -gmime-2.6.deps: - $(AM_V_GEN) for pkg in $(gmime_2_6_vapi_DEPS); do \ +gmime-3.0.deps: + $(AM_V_GEN) for pkg in $(gmime_3_0_vapi_DEPS); do \ echo $$pkg >> $@; \ done vapidir = $(datadir)/vala/vapi vapi_DATA = $(VAPIGEN_VAPIS) $(VAPIGEN_VAPIS:.vapi=.deps) -EXTRA_DIST += GMime-2.6.metadata +EXTRA_DIST += GMime-3.0.metadata CLEANFILES += $(vapi_DATA) endif diff -Nru gmime-2.6.22+dfsg2/gmime/Makefile.in gmime-3.0.1/gmime/Makefile.in --- gmime-2.6.22+dfsg2/gmime/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/gmime/Makefile.in 2017-05-21 16:38:03.000000000 +0000 @@ -0,0 +1,1266 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +noinst_PROGRAMS = gen-table$(EXEEXT) charset-map$(EXEEXT) +@HAVE_INTROSPECTION_TRUE@am__append_1 = GMime-3.0.gir +@HAVE_INTROSPECTION_TRUE@am__append_2 = $(gir_DATA) $(typelib_DATA) +@ENABLE_VAPIGEN_TRUE@am__append_3 = GMime-3.0.metadata +@ENABLE_VAPIGEN_TRUE@am__append_4 = $(vapi_DATA) +subdir = gmime +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gpgme.m4 \ + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/introspection.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/vapigen.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(gmimeinclude_HEADERS) \ + $(noinst_HEADERS) $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = gmime-version.h +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" \ + "$(DESTDIR)$(typelibdir)" "$(DESTDIR)$(vapidir)" \ + "$(DESTDIR)$(gmimeincludedir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgmime_3_0_la_DEPENDENCIES = $(top_builddir)/util/libutil.la \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_libgmime_3_0_la_OBJECTS = gmime.lo gmime-application-pkcs7-mime.lo \ + gmime-certificate.lo gmime-charset.lo gmime-common.lo \ + gmime-content-type.lo gmime-crypto-context.lo \ + gmime-data-wrapper.lo gmime-disposition.lo gmime-encodings.lo \ + gmime-events.lo gmime-filter.lo gmime-filter-basic.lo \ + gmime-filter-best.lo gmime-filter-charset.lo \ + gmime-filter-checksum.lo gmime-filter-dos2unix.lo \ + gmime-filter-enriched.lo gmime-filter-from.lo \ + gmime-filter-gzip.lo gmime-filter-html.lo \ + gmime-filter-smtp-data.lo gmime-filter-strip.lo \ + gmime-filter-unix2dos.lo gmime-filter-windows.lo \ + gmime-filter-yenc.lo gmime-format-options.lo \ + gmime-gpg-context.lo gmime-gpgme-utils.lo gmime-header.lo \ + gmime-iconv.lo gmime-iconv-utils.lo gmime-message.lo \ + gmime-message-part.lo gmime-message-partial.lo \ + gmime-multipart.lo gmime-multipart-encrypted.lo \ + gmime-multipart-signed.lo gmime-object.lo gmime-param.lo \ + gmime-parse-utils.lo gmime-parser.lo gmime-parser-options.lo \ + gmime-part.lo gmime-part-iter.lo gmime-pkcs7-context.lo \ + gmime-references.lo gmime-signature.lo gmime-stream.lo \ + gmime-stream-buffer.lo gmime-stream-cat.lo \ + gmime-stream-file.lo gmime-stream-filter.lo gmime-stream-fs.lo \ + gmime-stream-gio.lo gmime-stream-mem.lo gmime-stream-mmap.lo \ + gmime-stream-null.lo gmime-stream-pipe.lo gmime-text-part.lo \ + gmime-utils.lo internet-address.lo +libgmime_3_0_la_OBJECTS = $(am_libgmime_3_0_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libgmime_3_0_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(libgmime_3_0_la_LDFLAGS) $(LDFLAGS) \ + -o $@ +PROGRAMS = $(noinst_PROGRAMS) +am_charset_map_OBJECTS = charset-map.$(OBJEXT) +charset_map_OBJECTS = $(am_charset_map_OBJECTS) +charset_map_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(charset_map_LDFLAGS) $(LDFLAGS) -o $@ +am_gen_table_OBJECTS = gen-table.$(OBJEXT) +gen_table_OBJECTS = $(am_gen_table_OBJECTS) +gen_table_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(gen_table_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libgmime_3_0_la_SOURCES) $(charset_map_SOURCES) \ + $(gen_table_SOURCES) +DIST_SOURCES = $(libgmime_3_0_la_SOURCES) $(charset_map_SOURCES) \ + $(gen_table_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +DATA = $(gir_DATA) $(typelib_DATA) $(vapi_DATA) +HEADERS = $(gmimeinclude_HEADERS) $(noinst_HEADERS) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/gmime-version.h.in \ + $(top_srcdir)/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DB2HTML = @DB2HTML@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DOLT_BASH = @DOLT_BASH@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMIME_API_VERSION = @GMIME_API_VERSION@ +GMIME_BINARY_AGE = @GMIME_BINARY_AGE@ +GMIME_CFLAGS = @GMIME_CFLAGS@ +GMIME_INCLUDEDIR = @GMIME_INCLUDEDIR@ +GMIME_INTERFACE_AGE = @GMIME_INTERFACE_AGE@ +GMIME_LIBDIR = @GMIME_LIBDIR@ +GMIME_LIBS = @GMIME_LIBS@ +GMIME_LIBS_PRIVATE = @GMIME_LIBS_PRIVATE@ +GMIME_MAJOR_VERSION = @GMIME_MAJOR_VERSION@ +GMIME_MICRO_VERSION = @GMIME_MICRO_VERSION@ +GMIME_MINOR_VERSION = @GMIME_MINOR_VERSION@ +GMIME_VERSION = @GMIME_VERSION@ +GOBJECT_QUERY = @GOBJECT_QUERY@ +GPGME_CONFIG = @GPGME_CONFIG@ +GPGME_PTHREAD_CFLAGS = @GPGME_PTHREAD_CFLAGS@ +GPGME_PTHREAD_LIBS = @GPGME_PTHREAD_LIBS@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBIDN_CFLAGS = @LIBIDN_CFLAGS@ +LIBIDN_LIBS = @LIBIDN_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTCOMPILE = @LTCOMPILE@ +LTCXXCOMPILE = @LTCXXCOMPILE@ +LTLIBOBJS = @LTLIBOBJS@ +LTP = @LTP@ +LTP_GENHTML = @LTP_GENHTML@ +LT_AGE = @LT_AGE@ +LT_CURRENT = @LT_CURRENT@ +LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@ +LT_RELEASE = @LT_RELEASE@ +LT_REVISION = @LT_REVISION@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MV = @MV@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM = @RM@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHTOOL = @SHTOOL@ +STRIP = @STRIP@ +TAR = @TAR@ +VAPIGEN = @VAPIGEN@ +VAPIGEN_MAKEFILE = @VAPIGEN_MAKEFILE@ +VAPIGEN_VAPIDIR = @VAPIGEN_VAPIDIR@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = . +gmimeincludedir = $(includedir)/gmime-$(GMIME_API_VERSION)/gmime +AM_CPPFLAGS = \ + -I$(top_srcdir) \ + -I$(top_builddir) \ + -I$(top_srcdir)/util \ + -I$(top_builddir)/util \ + -DG_LOG_DOMAIN=\"gmime\" \ + $(GMIME_CFLAGS) \ + $(GLIB_CFLAGS) + +EXTRA_DIST = gmime-version.h.in gmime-version.h $(am__append_3) +lib_LTLIBRARIES = libgmime-3.0.la +libgmime_3_0_la_SOURCES = \ + gmime.c \ + gmime-application-pkcs7-mime.c \ + gmime-certificate.c \ + gmime-charset.c \ + gmime-common.c \ + gmime-content-type.c \ + gmime-crypto-context.c \ + gmime-data-wrapper.c \ + gmime-disposition.c \ + gmime-encodings.c \ + gmime-events.c \ + gmime-filter.c \ + gmime-filter-basic.c \ + gmime-filter-best.c \ + gmime-filter-charset.c \ + gmime-filter-checksum.c \ + gmime-filter-dos2unix.c \ + gmime-filter-enriched.c \ + gmime-filter-from.c \ + gmime-filter-gzip.c \ + gmime-filter-html.c \ + gmime-filter-smtp-data.c \ + gmime-filter-strip.c \ + gmime-filter-unix2dos.c \ + gmime-filter-windows.c \ + gmime-filter-yenc.c \ + gmime-format-options.c \ + gmime-gpg-context.c \ + gmime-gpgme-utils.c \ + gmime-header.c \ + gmime-iconv.c \ + gmime-iconv-utils.c \ + gmime-message.c \ + gmime-message-part.c \ + gmime-message-partial.c \ + gmime-multipart.c \ + gmime-multipart-encrypted.c \ + gmime-multipart-signed.c \ + gmime-object.c \ + gmime-param.c \ + gmime-parse-utils.c \ + gmime-parser.c \ + gmime-parser-options.c \ + gmime-part.c \ + gmime-part-iter.c \ + gmime-pkcs7-context.c \ + gmime-references.c \ + gmime-signature.c \ + gmime-stream.c \ + gmime-stream-buffer.c \ + gmime-stream-cat.c \ + gmime-stream-file.c \ + gmime-stream-filter.c \ + gmime-stream-fs.c \ + gmime-stream-gio.c \ + gmime-stream-mem.c \ + gmime-stream-mmap.c \ + gmime-stream-null.c \ + gmime-stream-pipe.c \ + gmime-text-part.c \ + gmime-utils.c \ + internet-address.c + +gmimeinclude_HEADERS = \ + gmime.h \ + gmime-application-pkcs7-mime.h \ + gmime-certificate.h \ + gmime-charset.h \ + gmime-content-type.h \ + gmime-crypto-context.h \ + gmime-data-wrapper.h \ + gmime-disposition.h \ + gmime-encodings.h \ + gmime-error.h \ + gmime-filter.h \ + gmime-filter-basic.h \ + gmime-filter-best.h \ + gmime-filter-charset.h \ + gmime-filter-checksum.h \ + gmime-filter-dos2unix.h \ + gmime-filter-enriched.h \ + gmime-filter-from.h \ + gmime-filter-gzip.h \ + gmime-filter-html.h \ + gmime-filter-smtp-data.h \ + gmime-filter-strip.h \ + gmime-filter-unix2dos.h \ + gmime-filter-windows.h \ + gmime-filter-yenc.h \ + gmime-format-options.h \ + gmime-gpg-context.h \ + gmime-header.h \ + gmime-iconv.h \ + gmime-iconv-utils.h \ + gmime-message.h \ + gmime-message-part.h \ + gmime-message-partial.h \ + gmime-multipart.h \ + gmime-multipart-encrypted.h \ + gmime-multipart-signed.h \ + gmime-object.h \ + gmime-param.h \ + gmime-parser.h \ + gmime-parser-options.h \ + gmime-part.h \ + gmime-part-iter.h \ + gmime-pkcs7-context.h \ + gmime-references.h \ + gmime-signature.h \ + gmime-stream.h \ + gmime-stream-buffer.h \ + gmime-stream-cat.h \ + gmime-stream-file.h \ + gmime-stream-filter.h \ + gmime-stream-fs.h \ + gmime-stream-gio.h \ + gmime-stream-mem.h \ + gmime-stream-mmap.h \ + gmime-stream-null.h \ + gmime-stream-pipe.h \ + gmime-text-part.h \ + gmime-utils.h \ + gmime-version.h \ + internet-address.h + +noinst_HEADERS = \ + gmime-charset-map-private.h \ + gmime-table-private.h \ + gmime-parse-utils.h \ + gmime-gpgme-utils.h \ + gmime-internal.h \ + gmime-common.h \ + gmime-events.h + +@PLATFORM_WIN32_TRUE@no_undefined = -no-undefined +libgmime_3_0_la_LIBADD = $(top_builddir)/util/libutil.la $(GLIB_LIBS) $(LIBIDN_LIBS) +libgmime_3_0_la_LDFLAGS = \ + -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ + -export-dynamic $(no_undefined) + +gen_table_SOURCES = gen-table.c +gen_table_LDFLAGS = +gen_table_DEPENDENCIES = +gen_table_LDADD = +charset_map_SOURCES = charset-map.c +charset_map_LDFLAGS = +charset_map_DEPENDENCIES = +charset_map_LDADD = $(top_builddir)/util/libutil.la $(GLIB_LIBS) +CLEANFILES = $(am__append_2) $(am__append_4) +INTROSPECTION_GIRS = $(am__append_1) +INTROSPECTION_SCANNER_ARGS = --add-include-path=$(srcdir) +INTROSPECTION_COMPILER_ARGS = --includedir=$(srcdir) +@HAVE_INTROSPECTION_TRUE@GMime_3_0_gir_INCLUDES = GObject-2.0 Gio-2.0 +@HAVE_INTROSPECTION_TRUE@GMime_3_0_gir_CFLAGS = $(AM_CPPFLAGS) +@HAVE_INTROSPECTION_TRUE@GMime_3_0_gir_LIBS = libgmime-3.0.la +@HAVE_INTROSPECTION_TRUE@GMime_3_0_gir_FILES = $(gmimeinclude_HEADERS) $(libgmime_3_0_la_SOURCES) +@HAVE_INTROSPECTION_TRUE@GMime_3_0_gir_EXPORT_PACKAGES = gmime-3.0 +@HAVE_INTROSPECTION_TRUE@GMime_3_0_gir_SCANNERFLAGS = \ +@HAVE_INTROSPECTION_TRUE@ --c-include="gmime/gmime.h" \ +@HAVE_INTROSPECTION_TRUE@ --accept-unprefixed \ +@HAVE_INTROSPECTION_TRUE@ --symbol-prefix "gmime_" \ +@HAVE_INTROSPECTION_TRUE@ --symbol-prefix "g_mime_" + +@HAVE_INTROSPECTION_TRUE@girdir = $(datadir)/gir-1.0 +@HAVE_INTROSPECTION_TRUE@gir_DATA = $(INTROSPECTION_GIRS) +@HAVE_INTROSPECTION_TRUE@typelibdir = $(libdir)/girepository-1.0 +@HAVE_INTROSPECTION_TRUE@typelib_DATA = $(INTROSPECTION_GIRS:.gir=.typelib) +@ENABLE_VAPIGEN_TRUE@VAPIGEN_VAPIS = gmime-3.0.vapi +@ENABLE_VAPIGEN_TRUE@gmime_3_0_vapi_DEPS = gio-2.0 +@ENABLE_VAPIGEN_TRUE@gmime_3_0_vapi_METADATADIRS = $(srcdir) +@ENABLE_VAPIGEN_TRUE@gmime_3_0_vapi_FILES = GMime-3.0.gir +@ENABLE_VAPIGEN_TRUE@vapidir = $(datadir)/vala/vapi +@ENABLE_VAPIGEN_TRUE@vapi_DATA = $(VAPIGEN_VAPIS) $(VAPIGEN_VAPIS:.vapi=.deps) +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gmime/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gmime/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +gmime-version.h: $(top_builddir)/config.status $(srcdir)/gmime-version.h.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ + +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libgmime-3.0.la: $(libgmime_3_0_la_OBJECTS) $(libgmime_3_0_la_DEPENDENCIES) $(EXTRA_libgmime_3_0_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgmime_3_0_la_LINK) -rpath $(libdir) $(libgmime_3_0_la_OBJECTS) $(libgmime_3_0_la_LIBADD) $(LIBS) + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +charset-map$(EXEEXT): $(charset_map_OBJECTS) $(charset_map_DEPENDENCIES) $(EXTRA_charset_map_DEPENDENCIES) + @rm -f charset-map$(EXEEXT) + $(AM_V_CCLD)$(charset_map_LINK) $(charset_map_OBJECTS) $(charset_map_LDADD) $(LIBS) + +gen-table$(EXEEXT): $(gen_table_OBJECTS) $(gen_table_DEPENDENCIES) $(EXTRA_gen_table_DEPENDENCIES) + @rm -f gen-table$(EXEEXT) + $(AM_V_CCLD)$(gen_table_LINK) $(gen_table_OBJECTS) $(gen_table_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/charset-map.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gen-table.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-application-pkcs7-mime.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-certificate.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-charset.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-common.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-content-type.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-crypto-context.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-data-wrapper.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-disposition.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-encodings.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-events.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-filter-basic.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-filter-best.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-filter-charset.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-filter-checksum.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-filter-dos2unix.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-filter-enriched.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-filter-from.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-filter-gzip.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-filter-html.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-filter-smtp-data.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-filter-strip.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-filter-unix2dos.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-filter-windows.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-filter-yenc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-filter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-format-options.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-gpg-context.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-gpgme-utils.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-header.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-iconv-utils.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-iconv.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-message-part.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-message-partial.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-message.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-multipart-encrypted.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-multipart-signed.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-multipart.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-object.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-param.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-parse-utils.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-parser-options.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-parser.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-part-iter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-part.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-pkcs7-context.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-references.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-signature.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-stream-buffer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-stream-cat.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-stream-file.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-stream-filter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-stream-fs.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-stream-gio.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-stream-mem.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-stream-mmap.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-stream-null.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-stream-pipe.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-stream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-text-part.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-utils.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/internet-address.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-girDATA: $(gir_DATA) + @$(NORMAL_INSTALL) + @list='$(gir_DATA)'; test -n "$(girdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(girdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(girdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(girdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(girdir)" || exit $$?; \ + done + +uninstall-girDATA: + @$(NORMAL_UNINSTALL) + @list='$(gir_DATA)'; test -n "$(girdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(girdir)'; $(am__uninstall_files_from_dir) +install-typelibDATA: $(typelib_DATA) + @$(NORMAL_INSTALL) + @list='$(typelib_DATA)'; test -n "$(typelibdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(typelibdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(typelibdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(typelibdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(typelibdir)" || exit $$?; \ + done + +uninstall-typelibDATA: + @$(NORMAL_UNINSTALL) + @list='$(typelib_DATA)'; test -n "$(typelibdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(typelibdir)'; $(am__uninstall_files_from_dir) +install-vapiDATA: $(vapi_DATA) + @$(NORMAL_INSTALL) + @list='$(vapi_DATA)'; test -n "$(vapidir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(vapidir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(vapidir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(vapidir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(vapidir)" || exit $$?; \ + done + +uninstall-vapiDATA: + @$(NORMAL_UNINSTALL) + @list='$(vapi_DATA)'; test -n "$(vapidir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(vapidir)'; $(am__uninstall_files_from_dir) +install-gmimeincludeHEADERS: $(gmimeinclude_HEADERS) + @$(NORMAL_INSTALL) + @list='$(gmimeinclude_HEADERS)'; test -n "$(gmimeincludedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(gmimeincludedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(gmimeincludedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(gmimeincludedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(gmimeincludedir)" || exit $$?; \ + done + +uninstall-gmimeincludeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(gmimeinclude_HEADERS)'; test -n "$(gmimeincludedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(gmimeincludedir)'; $(am__uninstall_files_from_dir) + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA) $(HEADERS) +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" "$(DESTDIR)$(typelibdir)" "$(DESTDIR)$(vapidir)" "$(DESTDIR)$(gmimeincludedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + clean-noinstPROGRAMS mostlyclean-am + +distclean: distclean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-data-local install-girDATA \ + install-gmimeincludeHEADERS install-typelibDATA \ + install-vapiDATA + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-libLTLIBRARIES + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-girDATA uninstall-gmimeincludeHEADERS \ + uninstall-libLTLIBRARIES uninstall-local uninstall-typelibDATA \ + uninstall-vapiDATA + +.MAKE: $(am__recursive_targets) install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-am clean clean-generic clean-libLTLIBRARIES \ + clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-data-local install-dvi install-dvi-am \ + install-exec install-exec-am install-girDATA \ + install-gmimeincludeHEADERS install-html install-html-am \ + install-info install-info-am install-libLTLIBRARIES \ + install-man install-pdf install-pdf-am install-ps \ + install-ps-am install-strip install-typelibDATA \ + install-vapiDATA installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am uninstall-girDATA uninstall-gmimeincludeHEADERS \ + uninstall-libLTLIBRARIES uninstall-local uninstall-typelibDATA \ + uninstall-vapiDATA + +.PRECIOUS: Makefile + + +install-data-local: install-libtool-import-lib + +uninstall-local: uninstall-libtool-import-lib + +@OS_WIN32_TRUE@install-libtool-import-lib: +@OS_WIN32_TRUE@ $(INSTALL) .libs/libgmime-$(GMIME_API_VERSION).dll.a $(DESTDIR)$(libdir) + +@OS_WIN32_TRUE@uninstall-libtool-import-lib: +@OS_WIN32_TRUE@ -rm $(DESTDIR)$(libdir)/libgmime-$(GMIME_API_VERSION).dll.a +@OS_WIN32_FALSE@install-libtool-import-lib: +@OS_WIN32_FALSE@uninstall-libtool-import-lib: + +-include $(INTROSPECTION_MAKEFILE) + +@HAVE_INTROSPECTION_TRUE@GMime-3.0.gir: libgmime-3.0.la + +@ENABLE_VAPIGEN_TRUE@-include $(VAPIGEN_MAKEFILE) + +@ENABLE_VAPIGEN_TRUE@gmime-3.0.vapi: GMime-3.0.gir GMime-3.0.metadata + +@ENABLE_VAPIGEN_TRUE@gmime-3.0.deps: +@ENABLE_VAPIGEN_TRUE@ $(AM_V_GEN) for pkg in $(gmime_3_0_vapi_DEPS); do \ +@ENABLE_VAPIGEN_TRUE@ echo $$pkg >> $@; \ +@ENABLE_VAPIGEN_TRUE@ done + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff -Nru gmime-2.6.22+dfsg2/gmime.spec gmime-3.0.1/gmime.spec --- gmime-2.6.22+dfsg2/gmime.spec 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/gmime.spec 2017-05-21 16:43:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Note that this is NOT a relocatable package +%define ver 3.0.1 +%define prefix /usr +%define enable_gtk_doc 0 + +%if %{enable_gtk_doc} +%define gtkdoc_configure_flags --enable-gtk-doc +%else +%define gtkdoc_configure_flags --disable-gtk-doc +%endif + +Summary: MIME library +Name: gmime +Version: %ver +Release: 1 +Copyright: LGPL +Group: Development/Libraries +URL: https://github.com/jstedfast/gmime + +Source: ftp://ftp.gnome.org/pub/GNOME/sources/gmime/3.0/gmime-%{version}.tar.bz2 +BuildRoot: /var/tmp/%{name}-%{version}-%{release}-root + +Requires: glib2 >= 2.26.0 +BuildRequires: glib2-devel >= 2.26.0 + +%description +GMime is a set of utilities for parsing and creating messages using +the Multipurpose Internet Mail Extension (MIME) + +%prep +%setup + +%build +if [ ! -f configure ]; then + CFLAGS="$RPM_OPT_FLAGS" ./autogen.sh $ARCHFLAG %{config_opts} +fi +CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%prefix +make + +%install +rm -rf $RPM_BUILD_ROOT +make install DESTDIR=${RPM_BUILD_ROOT} + +# rename to prevent conflict with uu* utils from sharutils + +mv $RPM_BUILD_ROOT%{prefix}/bin/uuencode $RPM_BUILD_ROOT%{prefix}/bin/gmime-uuencode +mv $RPM_BUILD_ROOT%{prefix}/bin/uudecode $RPM_BUILD_ROOT%{prefix}/bin/gmime-uudecode + +%clean +rm -rf $RPM_BUILD_ROOT + +%files +%defattr(-, root, root) + +%doc doc/html/* AUTHORS ChangeLog NEWS README LICENSE COPYING TODO +%{prefix}/bin/* +%{prefix}/lib/*.sh +%{prefix}/lib/libgmime* +%{prefix}/lib/pkgconfig/* +%{prefix}/include/gmime-3.0/gmime/*.h +%if %{enable_gtk_doc} +%{_datadir}/gtk-doc/html/*/* +%endif + +%changelog +* Mon Nov 29 2004 Ryan Skadberg +- Added in sharp package for .NET bindings + +* Wed Dec 9 2002 Benjamin Lee +- fixed sharutils conflict with uudecode and uuencode. +- removed duplicate libgmime inclusion in %files. + +* Wed Dec 4 2002 Benjamin Lee +- fixed files for gtk-doc, pkconfig, and includes. + +* Sat Mar 24 2001 Leland Elie +- created spec file. diff -Nru gmime-2.6.22+dfsg2/gmime.spec.in gmime-3.0.1/gmime.spec.in --- gmime-2.6.22+dfsg2/gmime.spec.in 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/gmime.spec.in 2017-04-08 17:01:10.000000000 +0000 @@ -1,15 +1,8 @@ # Note that this is NOT a relocatable package %define ver @VERSION@ %define prefix /usr -%define enable_mono 0 %define enable_gtk_doc 0 -%if %{enable_mono} -%define mono_configure_flags --enable-mono -%else -%define mono_configure_flags --disable-mono -%endif - %if %{enable_gtk_doc} %define gtkdoc_configure_flags --enable-gtk-doc %else @@ -22,47 +15,31 @@ Release: 1 Copyright: LGPL Group: Development/Libraries -URL: http://spruce.sourceforge.net/gmime/ +URL: https://github.com/jstedfast/gmime -Source: ftp://ftp.gnome.org/pub/GNOME/sources/gmime/2.4/gmime-%{version}.tar.bz2 +Source: ftp://ftp.gnome.org/pub/GNOME/sources/gmime/3.0/gmime-%{version}.tar.bz2 BuildRoot: /var/tmp/%{name}-%{version}-%{release}-root -Requires: glib2 >= 2.12.0 -BuildRequires: glib2-devel >= 2.12.0 +Requires: glib2 >= 2.26.0 +BuildRequires: glib2-devel >= 2.26.0 %description GMime is a set of utilities for parsing and creating messages using the Multipurpose Internet Mail Extension (MIME) -%if %{enable_mono} - -%package sharp -Summary: .NET bindings for GMime -Group: Development/Libraries -Requires: %{name} = %{version}-%{release} -BuildRequires: mono-core >= 2.0.0 -BuildRequires: gtk-sharp >= 2.4.0 -Requires: mono-core >= 2.0.0 -Requires: gtk-sharp >= 2.4.0 - -%description sharp -.NET Bindings for GMime - -%endif - %prep %setup %build if [ ! -f configure ]; then - CFLAGS="$RPM_OPT_FLAGS" ./autogen.sh $ARCHFLAG %{config_opts} %{mono_configure_flags} + CFLAGS="$RPM_OPT_FLAGS" ./autogen.sh $ARCHFLAG %{config_opts} fi -CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%prefix %{mono_configure_flags} +CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%prefix make %install rm -rf $RPM_BUILD_ROOT -make install DESTDIR=${RPM_BUILD_ROOT} GACUTIL_FLAGS="/package gtk-sharp /root ${RPM_BUILD_ROOT}/usr/lib" +make install DESTDIR=${RPM_BUILD_ROOT} # rename to prevent conflict with uu* utils from sharutils @@ -80,20 +57,11 @@ %{prefix}/lib/*.sh %{prefix}/lib/libgmime* %{prefix}/lib/pkgconfig/* -%{prefix}/include/gmime-2.6/gmime/*.h +%{prefix}/include/gmime-3.0/gmime/*.h %if %{enable_gtk_doc} %{_datadir}/gtk-doc/html/*/* %endif -%if %{enable_mono} - -%files sharp -%{prefix}/lib/mono/gmime-sharp/* -%{prefix}/lib/mono/gac/gmime-sharp/* -%{prefix}/share/gapi/gmime-api.xml - -%endif - %changelog * Mon Nov 29 2004 Ryan Skadberg - Added in sharp package for .NET bindings diff -Nru gmime-2.6.22+dfsg2/iconv-detect.c gmime-3.0.1/iconv-detect.c --- gmime-2.6.22+dfsg2/iconv-detect.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/iconv-detect.c 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 1999-2014 Jeffrey Stedfast + * Copyright (C) 1999-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License diff -Nru gmime-2.6.22+dfsg2/INSTALL gmime-3.0.1/INSTALL --- gmime-2.6.22+dfsg2/INSTALL 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/INSTALL 2016-06-28 13:40:13.000000000 +0000 @@ -0,0 +1,370 @@ +Installation Instructions +************************* + +Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation, +Inc. + + Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. This file is offered as-is, +without warranty of any kind. + +Basic Installation +================== + + Briefly, the shell command `./configure && make && make install' +should configure, build, and install this package. The following +more-detailed instructions are generic; see the `README' file for +instructions specific to this package. Some packages provide this +`INSTALL' file but do not implement all of the features documented +below. The lack of an optional feature in a given package is not +necessarily a bug. More recommendations for GNU packages can be found +in *note Makefile Conventions: (standards)Makefile Conventions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. Caching is +disabled by default to prevent problems with accidental use of stale +cache files. + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You need `configure.ac' if +you want to change it or regenerate `configure' using a newer version +of `autoconf'. + + The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. + + Running `configure' might take a while. While running, it prints + some messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package, generally using the just-built uninstalled binaries. + + 4. Type `make install' to install the programs and any data files and + documentation. When installing into a prefix owned by root, it is + recommended that the package be configured and built as a regular + user, and only the `make install' phase executed with root + privileges. + + 5. Optionally, type `make installcheck' to repeat any self-tests, but + this time using the binaries in their final installed location. + This target does not install anything. Running this target as a + regular user, particularly if the prior `make install' required + root privileges, verifies that the installation completed + correctly. + + 6. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + + 7. Often, you can also type `make uninstall' to remove the installed + files again. In practice, not all packages have tested that + uninstallation works correctly, even though it is required by the + GNU Coding Standards. + + 8. Some packages, particularly those that use Automake, provide `make + distcheck', which can by used by developers to test that all other + targets like `make install' and `make uninstall' work correctly. + This target is generally not run by end users. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c99 CFLAGS=-g LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you can use GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. This +is known as a "VPATH" build. + + With a non-GNU `make', it is safer to compile the package for one +architecture at a time in the source code directory. After you have +installed the package for one architecture, use `make distclean' before +reconfiguring for another architecture. + + On MacOS X 10.5 and later systems, you can create libraries and +executables that work on multiple system types--known as "fat" or +"universal" binaries--by specifying multiple `-arch' options to the +compiler but only a single `-arch' option to the preprocessor. Like +this: + + ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CPP="gcc -E" CXXCPP="g++ -E" + + This is not guaranteed to produce working output in all cases, you +may have to build one architecture at a time and combine the results +using the `lipo' tool if you have problems. + +Installation Names +================== + + By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX', where PREFIX must be an +absolute file name. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. In general, the +default for these options is expressed in terms of `${prefix}', so that +specifying just `--prefix' will affect all of the other directory +specifications that were not explicitly provided. + + The most portable way to affect installation locations is to pass the +correct locations to `configure'; however, many packages provide one or +both of the following shortcuts of passing variable assignments to the +`make install' command line to change installation locations without +having to reconfigure or recompile. + + The first method involves providing an override variable for each +affected directory. For example, `make install +prefix=/alternate/directory' will choose an alternate location for all +directory configuration variables that were expressed in terms of +`${prefix}'. Any directories that were specified during `configure', +but not in terms of `${prefix}', must each be overridden at install +time for the entire installation to be relocated. The approach of +makefile variable overrides for each directory variable is required by +the GNU Coding Standards, and ideally causes no recompilation. +However, some platforms have known limitations with the semantics of +shared libraries that end up requiring recompilation when using this +method, particularly noticeable in packages that use GNU Libtool. + + The second method involves providing the `DESTDIR' variable. For +example, `make install DESTDIR=/alternate/directory' will prepend +`/alternate/directory' before all installation names. The approach of +`DESTDIR' overrides is not required by the GNU Coding Standards, and +does not work on platforms that have drive letters. On the other hand, +it does better at avoiding recompilation issues, and works well even +when some directory options were not specified in terms of `${prefix}' +at `configure' time. + +Optional Features +================= + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + + Some packages offer the ability to configure how verbose the +execution of `make' will be. For these packages, running `./configure +--enable-silent-rules' sets the default to minimal output, which can be +overridden with `make V=1'; while running `./configure +--disable-silent-rules' sets the default to verbose, which can be +overridden with `make V=0'. + +Particular systems +================== + + On HP-UX, the default C compiler is not ANSI C compatible. If GNU +CC is not installed, it is recommended to use the following options in +order to use an ANSI C compiler: + + ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" + +and if that doesn't work, install pre-built binaries of GCC for HP-UX. + + HP-UX `make' updates targets which have the same time stamps as +their prerequisites, which makes it generally unusable when shipped +generated files such as `configure' are involved. Use GNU `make' +instead. + + On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot +parse its `' header file. The option `-nodtk' can be used as +a workaround. If GNU CC is not installed, it is therefore recommended +to try + + ./configure CC="cc" + +and if that doesn't work, try + + ./configure CC="cc -nodtk" + + On Solaris, don't put `/usr/ucb' early in your `PATH'. This +directory contains several dysfunctional programs; working variants of +these programs are available in `/usr/bin'. So, if you need `/usr/ucb' +in your `PATH', put it _after_ `/usr/bin'. + + On Haiku, software installed for all users goes in `/boot/common', +not `/usr/local'. It is recommended to use the following options: + + ./configure --prefix=/boot/common + +Specifying the System Type +========================== + + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS + KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + + Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for `CONFIG_SHELL' due to +an Autoconf limitation. Until the limitation is lifted, you can use +this workaround: + + CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash + +`configure' Invocation +====================== + + `configure' recognizes the following options to control how it +operates. + +`--help' +`-h' + Print a summary of all of the options to `configure', and exit. + +`--help=short' +`--help=recursive' + Print a summary of the options unique to this package's + `configure', and exit. The `short' variant lists options used + only in the top level, while the `recursive' variant lists options + also present in any nested packages. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--prefix=DIR' + Use DIR as the installation prefix. *note Installation Names:: + for more details, including other options available for fine-tuning + the installation locations. + +`--no-create' +`-n' + Run the configure checks, but stop before creating any output + files. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. diff -Nru gmime-2.6.22+dfsg2/install-sh gmime-3.0.1/install-sh --- gmime-2.6.22+dfsg2/install-sh 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/install-sh 2016-06-28 13:40:13.000000000 +0000 @@ -0,0 +1,501 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2013-12-25.23; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# 'make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +tab=' ' +nl=' +' +IFS=" $tab$nl" + +# Set DOITPROG to "echo" to test this script. + +doit=${DOITPROG-} +doit_exec=${doit:-exec} + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +is_target_a_directory=possibly + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) + is_target_a_directory=always + dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; + + -T) is_target_a_directory=never;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +# We allow the use of options -d and -T together, by making -d +# take the precedence; this is for compatibility with GNU install. + +if test -n "$dir_arg"; then + if test -n "$dst_arg"; then + echo "$0: target directory not allowed when installing a directory." >&2 + exit 1 + fi +fi + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call 'install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + if test $# -gt 1 || test "$is_target_a_directory" = always; then + if test ! -d "$dst_arg"; then + echo "$0: $dst_arg: Is not a directory." >&2 + exit 1 + fi + fi +fi + +if test -z "$dir_arg"; then + do_exit='(exit $ret); exit $ret' + trap "ret=129; $do_exit" 1 + trap "ret=130; $do_exit" 2 + trap "ret=141; $do_exit" 13 + trap "ret=143; $do_exit" 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names problematic for 'test' and other utilities. + case $src in + -* | [=\(\)!]) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + dst=$dst_arg + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test "$is_target_a_directory" = never; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + dstdir=`dirname "$dst"` + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; + esac + + oIFS=$IFS + IFS=/ + set -f + set fnord $dstdir + shift + set +f + IFS=$oIFS + + prefixes= + + for d + do + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + set +f && + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff -Nru gmime-2.6.22+dfsg2/ltmain.sh gmime-3.0.1/ltmain.sh --- gmime-2.6.22+dfsg2/ltmain.sh 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/ltmain.sh 2016-12-22 14:07:52.000000000 +0000 @@ -0,0 +1,11147 @@ +#! /bin/sh +## DO NOT EDIT - This file generated from ./build-aux/ltmain.in +## by inline-source v2014-01-03.01 + +# libtool (GNU libtool) 2.4.6 +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +PROGRAM=libtool +PACKAGE=libtool +VERSION=2.4.6 +package_revision=2.4.6 + + +## ------ ## +## Usage. ## +## ------ ## + +# Run './libtool --help' for help with using this script from the +# command line. + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# After configure completes, it has a better idea of some of the +# shell tools we need than the defaults used by the functions shared +# with bootstrap, so set those here where they can still be over- +# ridden by the user, but otherwise take precedence. + +: ${AUTOCONF="autoconf"} +: ${AUTOMAKE="automake"} + + +## -------------------------- ## +## Source external libraries. ## +## -------------------------- ## + +# Much of our low-level functionality needs to be sourced from external +# libraries, which are installed to $pkgauxdir. + +# Set a version string for this script. +scriptversion=2015-01-20.17; # UTC + +# General shell script boiler plate, and helper functions. +# Written by Gary V. Vaughan, 2004 + +# Copyright (C) 2004-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. + +# As a special exception to the GNU General Public License, if you distribute +# this file as part of a program or library that is built using GNU Libtool, +# you may include this file under the same distribution terms that you use +# for the rest of that program. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# Evaluate this file near the top of your script to gain access to +# the functions and variables defined here: +# +# . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh +# +# If you need to override any of the default environment variable +# settings, do that before evaluating this file. + + +## -------------------- ## +## Shell normalisation. ## +## -------------------- ## + +# Some shells need a little help to be as Bourne compatible as possible. +# Before doing anything else, make sure all that help has been provided! + +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac +fi + +# NLS nuisances: We save the old values in case they are required later. +_G_user_locale= +_G_safe_locale= +for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test set = \"\${$_G_var+set}\"; then + save_$_G_var=\$$_G_var + $_G_var=C + export $_G_var + _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" + _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" + fi" +done + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Make sure IFS has a sensible default +sp=' ' +nl=' +' +IFS="$sp $nl" + +# There are apparently some retarded systems that use ';' as a PATH separator! +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + + +## ------------------------- ## +## Locate command utilities. ## +## ------------------------- ## + + +# func_executable_p FILE +# ---------------------- +# Check that FILE is an executable regular file. +func_executable_p () +{ + test -f "$1" && test -x "$1" +} + + +# func_path_progs PROGS_LIST CHECK_FUNC [PATH] +# -------------------------------------------- +# Search for either a program that responds to --version with output +# containing "GNU", or else returned by CHECK_FUNC otherwise, by +# trying all the directories in PATH with each of the elements of +# PROGS_LIST. +# +# CHECK_FUNC should accept the path to a candidate program, and +# set $func_check_prog_result if it truncates its output less than +# $_G_path_prog_max characters. +func_path_progs () +{ + _G_progs_list=$1 + _G_check_func=$2 + _G_PATH=${3-"$PATH"} + + _G_path_prog_max=0 + _G_path_prog_found=false + _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} + for _G_dir in $_G_PATH; do + IFS=$_G_save_IFS + test -z "$_G_dir" && _G_dir=. + for _G_prog_name in $_G_progs_list; do + for _exeext in '' .EXE; do + _G_path_prog=$_G_dir/$_G_prog_name$_exeext + func_executable_p "$_G_path_prog" || continue + case `"$_G_path_prog" --version 2>&1` in + *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; + *) $_G_check_func $_G_path_prog + func_path_progs_result=$func_check_prog_result + ;; + esac + $_G_path_prog_found && break 3 + done + done + done + IFS=$_G_save_IFS + test -z "$func_path_progs_result" && { + echo "no acceptable sed could be found in \$PATH" >&2 + exit 1 + } +} + + +# We want to be able to use the functions in this file before configure +# has figured out where the best binaries are kept, which means we have +# to search for them ourselves - except when the results are already set +# where we skip the searches. + +# Unless the user overrides by setting SED, search the path for either GNU +# sed, or the sed that truncates its output the least. +test -z "$SED" && { + _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for _G_i in 1 2 3 4 5 6 7; do + _G_sed_script=$_G_sed_script$nl$_G_sed_script + done + echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed + _G_sed_script= + + func_check_prog_sed () + { + _G_path_prog=$1 + + _G_count=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo '' >> conftest.nl + "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin + rm -f conftest.sed + SED=$func_path_progs_result +} + + +# Unless the user overrides by setting GREP, search the path for either GNU +# grep, or the grep that truncates its output the least. +test -z "$GREP" && { + func_check_prog_grep () + { + _G_path_prog=$1 + + _G_count=0 + _G_path_prog_max=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo 'GREP' >> conftest.nl + "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin + GREP=$func_path_progs_result +} + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# All uppercase variable names are used for environment variables. These +# variables can be overridden by the user before calling a script that +# uses them if a suitable command of that name is not already available +# in the command search PATH. + +: ${CP="cp -f"} +: ${ECHO="printf %s\n"} +: ${EGREP="$GREP -E"} +: ${FGREP="$GREP -F"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} + + +## -------------------- ## +## Useful sed snippets. ## +## -------------------- ## + +sed_dirname='s|/[^/]*$||' +sed_basename='s|^.*/||' + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s|\([`"$\\]\)|\\\1|g' + +# Same as above, but do not quote variable references. +sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' + +# Sed substitution that converts a w32 file name or path +# that contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-'\' parameter expansions in output of sed_double_quote_subst that +# were '\'-ed in input to the same. If an odd number of '\' preceded a +# '$' in input to sed_double_quote_subst, that '$' was protected from +# expansion. Since each input '\' is now two '\'s, look for any number +# of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. +_G_bs='\\' +_G_bs2='\\\\' +_G_bs4='\\\\\\\\' +_G_dollar='\$' +sed_double_backslash="\ + s/$_G_bs4/&\\ +/g + s/^$_G_bs2$_G_dollar/$_G_bs&/ + s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g + s/\n//g" + + +## ----------------- ## +## Global variables. ## +## ----------------- ## + +# Except for the global variables explicitly listed below, the following +# functions in the '^func_' namespace, and the '^require_' namespace +# variables initialised in the 'Resource management' section, sourcing +# this file will not pollute your global namespace with anything +# else. There's no portable way to scope variables in Bourne shell +# though, so actually running these functions will sometimes place +# results into a variable named after the function, and often use +# temporary variables in the '^_G_' namespace. If you are careful to +# avoid using those namespaces casually in your sourcing script, things +# should continue to work as you expect. And, of course, you can freely +# overwrite any of the functions or variables defined here before +# calling anything to customize them. + +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +# Allow overriding, eg assuming that you follow the convention of +# putting '$debug_cmd' at the start of all your functions, you can get +# bash to show function call trace with: +# +# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name +debug_cmd=${debug_cmd-":"} +exit_cmd=: + +# By convention, finish your script with: +# +# exit $exit_status +# +# so that you can set exit_status to non-zero if you want to indicate +# something went wrong during execution without actually bailing out at +# the point of failure. +exit_status=$EXIT_SUCCESS + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath=$0 + +# The name of this program. +progname=`$ECHO "$progpath" |$SED "$sed_basename"` + +# Make sure we have an absolute progpath for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` + progdir=`cd "$progdir" && pwd` + progpath=$progdir/$progname + ;; + *) + _G_IFS=$IFS + IFS=${PATH_SEPARATOR-:} + for progdir in $PATH; do + IFS=$_G_IFS + test -x "$progdir/$progname" && break + done + IFS=$_G_IFS + test -n "$progdir" || progdir=`pwd` + progpath=$progdir/$progname + ;; +esac + + +## ----------------- ## +## Standard options. ## +## ----------------- ## + +# The following options affect the operation of the functions defined +# below, and should be set appropriately depending on run-time para- +# meters passed on the command line. + +opt_dry_run=false +opt_quiet=false +opt_verbose=false + +# Categories 'all' and 'none' are always available. Append any others +# you will pass as the first argument to func_warning from your own +# code. +warning_categories= + +# By default, display warnings according to 'opt_warning_types'. Set +# 'warning_func' to ':' to elide all warnings, or func_fatal_error to +# treat the next displayed warning as a fatal error. +warning_func=func_warn_and_continue + +# Set to 'all' to display all warnings, 'none' to suppress all +# warnings, or a space delimited list of some subset of +# 'warning_categories' to display only the listed warnings. +opt_warning_types=all + + +## -------------------- ## +## Resource management. ## +## -------------------- ## + +# This section contains definitions for functions that each ensure a +# particular resource (a file, or a non-empty configuration variable for +# example) is available, and if appropriate to extract default values +# from pertinent package files. Call them using their associated +# 'require_*' variable to ensure that they are executed, at most, once. +# +# It's entirely deliberate that calling these functions can set +# variables that don't obey the namespace limitations obeyed by the rest +# of this file, in order that that they be as useful as possible to +# callers. + + +# require_term_colors +# ------------------- +# Allow display of bold text on terminals that support it. +require_term_colors=func_require_term_colors +func_require_term_colors () +{ + $debug_cmd + + test -t 1 && { + # COLORTERM and USE_ANSI_COLORS environment variables take + # precedence, because most terminfo databases neglect to describe + # whether color sequences are supported. + test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} + + if test 1 = "$USE_ANSI_COLORS"; then + # Standard ANSI escape sequences + tc_reset='' + tc_bold=''; tc_standout='' + tc_red=''; tc_green='' + tc_blue=''; tc_cyan='' + else + # Otherwise trust the terminfo database after all. + test -n "`tput sgr0 2>/dev/null`" && { + tc_reset=`tput sgr0` + test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` + tc_standout=$tc_bold + test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` + test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` + test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` + test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` + test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` + } + fi + } + + require_term_colors=: +} + + +## ----------------- ## +## Function library. ## +## ----------------- ## + +# This section contains a variety of useful functions to call in your +# scripts. Take note of the portable wrappers for features provided by +# some modern shells, which will fall back to slower equivalents on +# less featureful shells. + + +# func_append VAR VALUE +# --------------------- +# Append VALUE onto the existing contents of VAR. + + # We should try to minimise forks, especially on Windows where they are + # unreasonably slow, so skip the feature probes when bash or zsh are + # being used: + if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then + : ${_G_HAVE_ARITH_OP="yes"} + : ${_G_HAVE_XSI_OPS="yes"} + # The += operator was introduced in bash 3.1 + case $BASH_VERSION in + [12].* | 3.0 | 3.0*) ;; + *) + : ${_G_HAVE_PLUSEQ_OP="yes"} + ;; + esac + fi + + # _G_HAVE_PLUSEQ_OP + # Can be empty, in which case the shell is probed, "yes" if += is + # useable or anything else if it does not work. + test -z "$_G_HAVE_PLUSEQ_OP" \ + && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ + && _G_HAVE_PLUSEQ_OP=yes + +if test yes = "$_G_HAVE_PLUSEQ_OP" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_append () + { + $debug_cmd + + eval "$1+=\$2" + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_append () + { + $debug_cmd + + eval "$1=\$$1\$2" + } +fi + + +# func_append_quoted VAR VALUE +# ---------------------------- +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +if test yes = "$_G_HAVE_PLUSEQ_OP"; then + eval 'func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1+=\\ \$func_quote_for_eval_result" + }' +else + func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1=\$$1\\ \$func_quote_for_eval_result" + } +fi + + +# func_append_uniq VAR VALUE +# -------------------------- +# Append unique VALUE onto the existing contents of VAR, assuming +# entries are delimited by the first character of VALUE. For example: +# +# func_append_uniq options " --another-option option-argument" +# +# will only append to $options if " --another-option option-argument " +# is not already present somewhere in $options already (note spaces at +# each end implied by leading space in second argument). +func_append_uniq () +{ + $debug_cmd + + eval _G_current_value='`$ECHO $'$1'`' + _G_delim=`expr "$2" : '\(.\)'` + + case $_G_delim$_G_current_value$_G_delim in + *"$2$_G_delim"*) ;; + *) func_append "$@" ;; + esac +} + + +# func_arith TERM... +# ------------------ +# Set func_arith_result to the result of evaluating TERMs. + test -z "$_G_HAVE_ARITH_OP" \ + && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ + && _G_HAVE_ARITH_OP=yes + +if test yes = "$_G_HAVE_ARITH_OP"; then + eval 'func_arith () + { + $debug_cmd + + func_arith_result=$(( $* )) + }' +else + func_arith () + { + $debug_cmd + + func_arith_result=`expr "$@"` + } +fi + + +# func_basename FILE +# ------------------ +# Set func_basename_result to FILE with everything up to and including +# the last / stripped. +if test yes = "$_G_HAVE_XSI_OPS"; then + # If this shell supports suffix pattern removal, then use it to avoid + # forking. Hide the definitions single quotes in case the shell chokes + # on unsupported syntax... + _b='func_basename_result=${1##*/}' + _d='case $1 in + */*) func_dirname_result=${1%/*}$2 ;; + * ) func_dirname_result=$3 ;; + esac' + +else + # ...otherwise fall back to using sed. + _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' + _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` + if test "X$func_dirname_result" = "X$1"; then + func_dirname_result=$3 + else + func_append func_dirname_result "$2" + fi' +fi + +eval 'func_basename () +{ + $debug_cmd + + '"$_b"' +}' + + +# func_dirname FILE APPEND NONDIR_REPLACEMENT +# ------------------------------------------- +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +eval 'func_dirname () +{ + $debug_cmd + + '"$_d"' +}' + + +# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT +# -------------------------------------------------------- +# Perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# For efficiency, we do not delegate to the functions above but instead +# duplicate the functionality here. +eval 'func_dirname_and_basename () +{ + $debug_cmd + + '"$_b"' + '"$_d"' +}' + + +# func_echo ARG... +# ---------------- +# Echo program name prefixed message. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_echo_all ARG... +# -------------------- +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + + +# func_echo_infix_1 INFIX ARG... +# ------------------------------ +# Echo program name, followed by INFIX on the first line, with any +# additional lines not showing INFIX. +func_echo_infix_1 () +{ + $debug_cmd + + $require_term_colors + + _G_infix=$1; shift + _G_indent=$_G_infix + _G_prefix="$progname: $_G_infix: " + _G_message=$* + + # Strip color escape sequences before counting printable length + for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" + do + test -n "$_G_tc" && { + _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` + _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` + } + done + _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes + + func_echo_infix_1_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_infix_1_IFS + $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 + _G_prefix=$_G_indent + done + IFS=$func_echo_infix_1_IFS +} + + +# func_error ARG... +# ----------------- +# Echo program name prefixed message to standard error. +func_error () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 +} + + +# func_fatal_error ARG... +# ----------------------- +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + $debug_cmd + + func_error "$*" + exit $EXIT_FAILURE +} + + +# func_grep EXPRESSION FILENAME +# ----------------------------- +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $debug_cmd + + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_len STRING +# --------------- +# Set func_len_result to the length of STRING. STRING may not +# start with a hyphen. + test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_len () + { + $debug_cmd + + func_len_result=${#1} + }' +else + func_len () + { + $debug_cmd + + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` + } +fi + + +# func_mkdir_p DIRECTORY-PATH +# --------------------------- +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + $debug_cmd + + _G_directory_path=$1 + _G_dir_list= + + if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then + + # Protect directory names starting with '-' + case $_G_directory_path in + -*) _G_directory_path=./$_G_directory_path ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$_G_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + _G_dir_list=$_G_directory_path:$_G_dir_list + + # If the last portion added has no slash in it, the list is done + case $_G_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` + done + _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` + + func_mkdir_p_IFS=$IFS; IFS=: + for _G_dir in $_G_dir_list; do + IFS=$func_mkdir_p_IFS + # mkdir can fail with a 'File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$_G_dir" 2>/dev/null || : + done + IFS=$func_mkdir_p_IFS + + # Bail out if we (or some other process) failed to create a directory. + test -d "$_G_directory_path" || \ + func_fatal_error "Failed to create '$1'" + fi +} + + +# func_mktempdir [BASENAME] +# ------------------------- +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, BASENAME is the basename for that directory. +func_mktempdir () +{ + $debug_cmd + + _G_template=${TMPDIR-/tmp}/${1-$progname} + + if test : = "$opt_dry_run"; then + # Return a directory name, but don't create it in dry-run mode + _G_tmpdir=$_G_template-$$ + else + + # If mktemp works, use that first and foremost + _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` + + if test ! -d "$_G_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + _G_tmpdir=$_G_template-${RANDOM-0}$$ + + func_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$_G_tmpdir" + umask $func_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$_G_tmpdir" || \ + func_fatal_error "cannot create temporary directory '$_G_tmpdir'" + fi + + $ECHO "$_G_tmpdir" +} + + +# func_normal_abspath PATH +# ------------------------ +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +func_normal_abspath () +{ + $debug_cmd + + # These SED scripts presuppose an absolute path with a trailing slash. + _G_pathcar='s|^/\([^/]*\).*$|\1|' + _G_pathcdr='s|^/[^/]*||' + _G_removedotparts=':dotsl + s|/\./|/|g + t dotsl + s|/\.$|/|' + _G_collapseslashes='s|/\{1,\}|/|g' + _G_finalslash='s|/*$|/|' + + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` + while :; do + # Processed it all yet? + if test / = "$func_normal_abspath_tpath"; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result"; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + + +# func_notquiet ARG... +# -------------------- +# Echo program name prefixed message only when not in quiet mode. +func_notquiet () +{ + $debug_cmd + + $opt_quiet || func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + + +# func_relative_path SRCDIR DSTDIR +# -------------------------------- +# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. +func_relative_path () +{ + $debug_cmd + + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=$func_dirname_result + if test -z "$func_relative_path_tlibdir"; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test -n "$func_stripname_result"; then + func_append func_relative_path_result "/$func_stripname_result" + fi + + # Normalisation. If bindir is libdir, return '.' else relative path. + if test -n "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + fi + + test -n "$func_relative_path_result" || func_relative_path_result=. + + : +} + + +# func_quote_for_eval ARG... +# -------------------------- +# Aesthetically quote ARGs to be evaled later. +# This function returns two values: +# i) func_quote_for_eval_result +# double-quoted, suitable for a subsequent eval +# ii) func_quote_for_eval_unquoted_result +# has all characters that are still active within double +# quotes backslashified. +func_quote_for_eval () +{ + $debug_cmd + + func_quote_for_eval_unquoted_result= + func_quote_for_eval_result= + while test 0 -lt $#; do + case $1 in + *[\\\`\"\$]*) + _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; + *) + _G_unquoted_arg=$1 ;; + esac + if test -n "$func_quote_for_eval_unquoted_result"; then + func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" + else + func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg" + fi + + case $_G_unquoted_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and variable expansion + # for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_quoted_arg=\"$_G_unquoted_arg\" + ;; + *) + _G_quoted_arg=$_G_unquoted_arg + ;; + esac + + if test -n "$func_quote_for_eval_result"; then + func_append func_quote_for_eval_result " $_G_quoted_arg" + else + func_append func_quote_for_eval_result "$_G_quoted_arg" + fi + shift + done +} + + +# func_quote_for_expand ARG +# ------------------------- +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + $debug_cmd + + case $1 in + *[\\\`\"]*) + _G_arg=`$ECHO "$1" | $SED \ + -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;; + *) + _G_arg=$1 ;; + esac + + case $_G_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_arg=\"$_G_arg\" + ;; + esac + + func_quote_for_expand_result=$_G_arg +} + + +# func_stripname PREFIX SUFFIX NAME +# --------------------------------- +# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_stripname () + { + $debug_cmd + + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary variable first. + func_stripname_result=$3 + func_stripname_result=${func_stripname_result#"$1"} + func_stripname_result=${func_stripname_result%"$2"} + }' +else + func_stripname () + { + $debug_cmd + + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; + esac + } +fi + + +# func_show_eval CMD [FAIL_EXP] +# ----------------------------- +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + func_quote_for_expand "$_G_cmd" + eval "func_notquiet $func_quote_for_expand_result" + + $opt_dry_run || { + eval "$_G_cmd" + _G_status=$? + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_show_eval_locale CMD [FAIL_EXP] +# ------------------------------------ +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + $opt_quiet || { + func_quote_for_expand "$_G_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + $opt_dry_run || { + eval "$_G_user_locale + $_G_cmd" + _G_status=$? + eval "$_G_safe_locale" + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_tr_sh +# ---------- +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + $debug_cmd + + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_verbose ARG... +# ------------------- +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $debug_cmd + + $opt_verbose && func_echo "$*" + + : +} + + +# func_warn_and_continue ARG... +# ----------------------------- +# Echo program name prefixed warning message to standard error. +func_warn_and_continue () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 +} + + +# func_warning CATEGORY ARG... +# ---------------------------- +# Echo program name prefixed warning message to standard error. Warning +# messages can be filtered according to CATEGORY, where this function +# elides messages where CATEGORY is not listed in the global variable +# 'opt_warning_types'. +func_warning () +{ + $debug_cmd + + # CATEGORY must be in the warning_categories list! + case " $warning_categories " in + *" $1 "*) ;; + *) func_internal_error "invalid warning category '$1'" ;; + esac + + _G_category=$1 + shift + + case " $opt_warning_types " in + *" $_G_category "*) $warning_func ${1+"$@"} ;; + esac +} + + +# func_sort_ver VER1 VER2 +# ----------------------- +# 'sort -V' is not generally available. +# Note this deviates from the version comparison in automake +# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a +# but this should suffice as we won't be specifying old +# version formats or redundant trailing .0 in bootstrap.conf. +# If we did want full compatibility then we should probably +# use m4_version_compare from autoconf. +func_sort_ver () +{ + $debug_cmd + + printf '%s\n%s\n' "$1" "$2" \ + | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n +} + +# func_lt_ver PREV CURR +# --------------------- +# Return true if PREV and CURR are in the correct order according to +# func_sort_ver, otherwise false. Use it like this: +# +# func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." +func_lt_ver () +{ + $debug_cmd + + test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: +#! /bin/sh + +# Set a version string for this script. +scriptversion=2014-01-07.03; # UTC + +# A portable, pluggable option parser for Bourne shell. +# Written by Gary V. Vaughan, 2010 + +# Copyright (C) 2010-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# This file is a library for parsing options in your shell scripts along +# with assorted other useful supporting features that you can make use +# of too. +# +# For the simplest scripts you might need only: +# +# #!/bin/sh +# . relative/path/to/funclib.sh +# . relative/path/to/options-parser +# scriptversion=1.0 +# func_options ${1+"$@"} +# eval set dummy "$func_options_result"; shift +# ...rest of your script... +# +# In order for the '--version' option to work, you will need to have a +# suitably formatted comment like the one at the top of this file +# starting with '# Written by ' and ending with '# warranty; '. +# +# For '-h' and '--help' to work, you will also need a one line +# description of your script's purpose in a comment directly above the +# '# Written by ' line, like the one at the top of this file. +# +# The default options also support '--debug', which will turn on shell +# execution tracing (see the comment above debug_cmd below for another +# use), and '--verbose' and the func_verbose function to allow your script +# to display verbose messages only when your user has specified +# '--verbose'. +# +# After sourcing this file, you can plug processing for additional +# options by amending the variables from the 'Configuration' section +# below, and following the instructions in the 'Option parsing' +# section further down. + +## -------------- ## +## Configuration. ## +## -------------- ## + +# You should override these variables in your script after sourcing this +# file so that they reflect the customisations you have added to the +# option parser. + +# The usage line for option parsing errors and the start of '-h' and +# '--help' output messages. You can embed shell variables for delayed +# expansion at the time the message is displayed, but you will need to +# quote other shell meta-characters carefully to prevent them being +# expanded when the contents are evaled. +usage='$progpath [OPTION]...' + +# Short help message in response to '-h' and '--help'. Add to this or +# override it after sourcing this library to reflect the full set of +# options your script accepts. +usage_message="\ + --debug enable verbose shell tracing + -W, --warnings=CATEGORY + report the warnings falling in CATEGORY [all] + -v, --verbose verbosely report processing + --version print version information and exit + -h, --help print short or long help message and exit +" + +# Additional text appended to 'usage_message' in response to '--help'. +long_help_message=" +Warning categories include: + 'all' show all warnings + 'none' turn off all the warnings + 'error' warnings are treated as fatal errors" + +# Help message printed before fatal option parsing errors. +fatal_help="Try '\$progname --help' for more information." + + + +## ------------------------- ## +## Hook function management. ## +## ------------------------- ## + +# This section contains functions for adding, removing, and running hooks +# to the main code. A hook is just a named list of of function, that can +# be run in order later on. + +# func_hookable FUNC_NAME +# ----------------------- +# Declare that FUNC_NAME will run hooks added with +# 'func_add_hook FUNC_NAME ...'. +func_hookable () +{ + $debug_cmd + + func_append hookable_fns " $1" +} + + +# func_add_hook FUNC_NAME HOOK_FUNC +# --------------------------------- +# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must +# first have been declared "hookable" by a call to 'func_hookable'. +func_add_hook () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not accept hook functions." ;; + esac + + eval func_append ${1}_hooks '" $2"' +} + + +# func_remove_hook FUNC_NAME HOOK_FUNC +# ------------------------------------ +# Remove HOOK_FUNC from the list of functions called by FUNC_NAME. +func_remove_hook () +{ + $debug_cmd + + eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' +} + + +# func_run_hooks FUNC_NAME [ARG]... +# --------------------------------- +# Run all hook functions registered to FUNC_NAME. +# It is assumed that the list of hook functions contains nothing more +# than a whitespace-delimited list of legal shell function names, and +# no effort is wasted trying to catch shell meta-characters or preserve +# whitespace. +func_run_hooks () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not support hook funcions.n" ;; + esac + + eval _G_hook_fns=\$$1_hooks; shift + + for _G_hook in $_G_hook_fns; do + eval $_G_hook '"$@"' + + # store returned options list back into positional + # parameters for next 'cmd' execution. + eval _G_hook_result=\$${_G_hook}_result + eval set dummy "$_G_hook_result"; shift + done + + func_quote_for_eval ${1+"$@"} + func_run_hooks_result=$func_quote_for_eval_result +} + + + +## --------------- ## +## Option parsing. ## +## --------------- ## + +# In order to add your own option parsing hooks, you must accept the +# full positional parameter list in your hook function, remove any +# options that you action, and then pass back the remaining unprocessed +# options in '_result', escaped suitably for +# 'eval'. Like this: +# +# my_options_prep () +# { +# $debug_cmd +# +# # Extend the existing usage message. +# usage_message=$usage_message' +# -s, --silent don'\''t print informational messages +# ' +# +# func_quote_for_eval ${1+"$@"} +# my_options_prep_result=$func_quote_for_eval_result +# } +# func_add_hook func_options_prep my_options_prep +# +# +# my_silent_option () +# { +# $debug_cmd +# +# # Note that for efficiency, we parse as many options as we can +# # recognise in a loop before passing the remainder back to the +# # caller on the first unrecognised argument we encounter. +# while test $# -gt 0; do +# opt=$1; shift +# case $opt in +# --silent|-s) opt_silent=: ;; +# # Separate non-argument short options: +# -s*) func_split_short_opt "$_G_opt" +# set dummy "$func_split_short_opt_name" \ +# "-$func_split_short_opt_arg" ${1+"$@"} +# shift +# ;; +# *) set dummy "$_G_opt" "$*"; shift; break ;; +# esac +# done +# +# func_quote_for_eval ${1+"$@"} +# my_silent_option_result=$func_quote_for_eval_result +# } +# func_add_hook func_parse_options my_silent_option +# +# +# my_option_validation () +# { +# $debug_cmd +# +# $opt_silent && $opt_verbose && func_fatal_help "\ +# '--silent' and '--verbose' options are mutually exclusive." +# +# func_quote_for_eval ${1+"$@"} +# my_option_validation_result=$func_quote_for_eval_result +# } +# func_add_hook func_validate_options my_option_validation +# +# You'll alse need to manually amend $usage_message to reflect the extra +# options you parse. It's preferable to append if you can, so that +# multiple option parsing hooks can be added safely. + + +# func_options [ARG]... +# --------------------- +# All the functions called inside func_options are hookable. See the +# individual implementations for details. +func_hookable func_options +func_options () +{ + $debug_cmd + + func_options_prep ${1+"$@"} + eval func_parse_options \ + ${func_options_prep_result+"$func_options_prep_result"} + eval func_validate_options \ + ${func_parse_options_result+"$func_parse_options_result"} + + eval func_run_hooks func_options \ + ${func_validate_options_result+"$func_validate_options_result"} + + # save modified positional parameters for caller + func_options_result=$func_run_hooks_result +} + + +# func_options_prep [ARG]... +# -------------------------- +# All initialisations required before starting the option parse loop. +# Note that when calling hook functions, we pass through the list of +# positional parameters. If a hook function modifies that list, and +# needs to propogate that back to rest of this script, then the complete +# modified list must be put in 'func_run_hooks_result' before +# returning. +func_hookable func_options_prep +func_options_prep () +{ + $debug_cmd + + # Option defaults: + opt_verbose=false + opt_warning_types= + + func_run_hooks func_options_prep ${1+"$@"} + + # save modified positional parameters for caller + func_options_prep_result=$func_run_hooks_result +} + + +# func_parse_options [ARG]... +# --------------------------- +# The main option parsing loop. +func_hookable func_parse_options +func_parse_options () +{ + $debug_cmd + + func_parse_options_result= + + # this just eases exit handling + while test $# -gt 0; do + # Defer to hook functions for initial option parsing, so they + # get priority in the event of reusing an option name. + func_run_hooks func_parse_options ${1+"$@"} + + # Adjust func_parse_options positional parameters to match + eval set dummy "$func_run_hooks_result"; shift + + # Break out of the loop if we already parsed every option. + test $# -gt 0 || break + + _G_opt=$1 + shift + case $_G_opt in + --debug|-x) debug_cmd='set -x' + func_echo "enabling shell trace mode" + $debug_cmd + ;; + + --no-warnings|--no-warning|--no-warn) + set dummy --warnings none ${1+"$@"} + shift + ;; + + --warnings|--warning|-W) + test $# = 0 && func_missing_arg $_G_opt && break + case " $warning_categories $1" in + *" $1 "*) + # trailing space prevents matching last $1 above + func_append_uniq opt_warning_types " $1" + ;; + *all) + opt_warning_types=$warning_categories + ;; + *none) + opt_warning_types=none + warning_func=: + ;; + *error) + opt_warning_types=$warning_categories + warning_func=func_fatal_error + ;; + *) + func_fatal_error \ + "unsupported warning category: '$1'" + ;; + esac + shift + ;; + + --verbose|-v) opt_verbose=: ;; + --version) func_version ;; + -\?|-h) func_usage ;; + --help) func_help ;; + + # Separate optargs to long options (plugins may need this): + --*=*) func_split_equals "$_G_opt" + set dummy "$func_split_equals_lhs" \ + "$func_split_equals_rhs" ${1+"$@"} + shift + ;; + + # Separate optargs to short options: + -W*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-v*|-x*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) break ;; + -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + func_parse_options_result=$func_quote_for_eval_result +} + + +# func_validate_options [ARG]... +# ------------------------------ +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +func_hookable func_validate_options +func_validate_options () +{ + $debug_cmd + + # Display all warnings if -W was not given. + test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" + + func_run_hooks func_validate_options ${1+"$@"} + + # Bail if the options were screwed! + $exit_cmd $EXIT_FAILURE + + # save modified positional parameters for caller + func_validate_options_result=$func_run_hooks_result +} + + + +## ----------------- ## +## Helper functions. ## +## ----------------- ## + +# This section contains the helper functions used by the rest of the +# hookable option parser framework in ascii-betical order. + + +# func_fatal_help ARG... +# ---------------------- +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + eval \$ECHO \""$fatal_help"\" + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + + +# func_help +# --------- +# Echo long help message to standard output and exit. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message" + exit 0 +} + + +# func_missing_arg ARGNAME +# ------------------------ +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $debug_cmd + + func_error "Missing argument for '$1'." + exit_cmd=exit +} + + +# func_split_equals STRING +# ------------------------ +# Set func_split_equals_lhs and func_split_equals_rhs shell variables after +# splitting STRING at the '=' sign. +test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=${1%%=*} + func_split_equals_rhs=${1#*=} + test "x$func_split_equals_lhs" = "x$1" \ + && func_split_equals_rhs= + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` + func_split_equals_rhs= + test "x$func_split_equals_lhs" = "x$1" \ + || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` + } +fi #func_split_equals + + +# func_split_short_opt SHORTOPT +# ----------------------------- +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"} + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` + func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` + } +fi #func_split_short_opt + + +# func_usage +# ---------- +# Echo short help message to standard output and exit. +func_usage () +{ + $debug_cmd + + func_usage_message + $ECHO "Run '$progname --help |${PAGER-more}' for full usage" + exit 0 +} + + +# func_usage_message +# ------------------ +# Echo short help message to standard output. +func_usage_message () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + echo + $SED -n 's|^# || + /^Written by/{ + x;p;x + } + h + /^Written by/q' < "$progpath" + echo + eval \$ECHO \""$usage_message"\" +} + + +# func_version +# ------------ +# Echo version message to standard output and exit. +func_version () +{ + $debug_cmd + + printf '%s\n' "$progname $scriptversion" + $SED -n ' + /(C)/!b go + :more + /\./!{ + N + s|\n# | | + b more + } + :go + /^# Written by /,/# warranty; / { + s|^# || + s|^# *$|| + s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| + p + } + /^# Written by / { + s|^# || + p + } + /^warranty; /q' < "$progpath" + + exit $? +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: + +# Set a version string. +scriptversion='(GNU libtool) 2.4.6' + + +# func_echo ARG... +# ---------------- +# Libtool also displays the current mode in messages, so override +# funclib.sh func_echo with this custom definition. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_warning ARG... +# ------------------- +# Libtool warnings are not categorized, so override funclib.sh +# func_warning with this simpler definition. +func_warning () +{ + $debug_cmd + + $warning_func ${1+"$@"} +} + + +## ---------------- ## +## Options parsing. ## +## ---------------- ## + +# Hook in the functions to make sure our own options are parsed during +# the option parsing loop. + +usage='$progpath [OPTION]... [MODE-ARG]...' + +# Short help message in response to '-h'. +usage_message="Options: + --config show all configuration variables + --debug enable verbose shell tracing + -n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --mode=MODE use operation mode MODE + --no-warnings equivalent to '-Wnone' + --preserve-dup-deps don't remove duplicate dependency libraries + --quiet, --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + -v, --verbose print more informational messages than default + --version print version information + -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] + -h, --help, --help-all print short, long, or detailed help message +" + +# Additional text appended to 'usage_message' in response to '--help'. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message + +MODE must be one of the following: + + clean remove files from the build directory + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. When passed as first option, +'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. +Try '$progname --help --mode=MODE' for a more detailed description of MODE. + +When reporting a bug, please describe a test case to reproduce it and +include the following information: + + host-triplet: $host + shell: $SHELL + compiler: $LTCC + compiler flags: $LTCFLAGS + linker: $LD (gnu? $with_gnu_ld) + version: $progname (GNU libtool) 2.4.6 + automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` + autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` + +Report bugs to . +GNU libtool home page: . +General help using GNU software: ." + exit 0 +} + + +# func_lo2o OBJECT-NAME +# --------------------- +# Transform OBJECT-NAME from a '.lo' suffix to the platform specific +# object suffix. + +lo2o=s/\\.lo\$/.$objext/ +o2lo=s/\\.$objext\$/.lo/ + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_lo2o () + { + case $1 in + *.lo) func_lo2o_result=${1%.lo}.$objext ;; + * ) func_lo2o_result=$1 ;; + esac + }' + + # func_xform LIBOBJ-OR-SOURCE + # --------------------------- + # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) + # suffix to a '.lo' libtool-object suffix. + eval 'func_xform () + { + func_xform_result=${1%.*}.lo + }' +else + # ...otherwise fall back to using sed. + func_lo2o () + { + func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` + } + + func_xform () + { + func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` + } +fi + + +# func_fatal_configuration ARG... +# ------------------------------- +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func__fatal_error ${1+"$@"} \ + "See the $PACKAGE documentation for more information." \ + "Fatal configuration error." +} + + +# func_config +# ----------- +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + + +# func_features +# ------------- +# Display the features supported by this script. +func_features () +{ + echo "host: $host" + if test yes = "$build_libtool_libs"; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test yes = "$build_old_libs"; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + + exit $? +} + + +# func_enable_tag TAGNAME +# ----------------------- +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname=$1 + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf=/$re_begincf/,/$re_endcf/p + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + + +# func_check_version_match +# ------------------------ +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# libtool_options_prep [ARG]... +# ----------------------------- +# Preparation for options parsed by libtool. +libtool_options_prep () +{ + $debug_mode + + # Option defaults: + opt_config=false + opt_dlopen= + opt_dry_run=false + opt_help=false + opt_mode= + opt_preserve_dup_deps=false + opt_quiet=false + + nonopt= + preserve_args= + + # Shorthand for --mode=foo, only valid as the first argument + case $1 in + clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; + compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; + execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; + finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; + install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; + link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; + uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; + esac + + # Pass back the list of options. + func_quote_for_eval ${1+"$@"} + libtool_options_prep_result=$func_quote_for_eval_result +} +func_add_hook func_options_prep libtool_options_prep + + +# libtool_parse_options [ARG]... +# --------------------------------- +# Provide handling for libtool specific options. +libtool_parse_options () +{ + $debug_cmd + + # Perform our own loop to consume as many options as possible in + # each iteration. + while test $# -gt 0; do + _G_opt=$1 + shift + case $_G_opt in + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + + --config) func_config ;; + + --dlopen|-dlopen) + opt_dlopen="${opt_dlopen+$opt_dlopen +}$1" + shift + ;; + + --preserve-dup-deps) + opt_preserve_dup_deps=: ;; + + --features) func_features ;; + + --finish) set dummy --mode finish ${1+"$@"}; shift ;; + + --help) opt_help=: ;; + + --help-all) opt_help=': help-all' ;; + + --mode) test $# = 0 && func_missing_arg $_G_opt && break + opt_mode=$1 + case $1 in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $_G_opt" + exit_cmd=exit + break + ;; + esac + shift + ;; + + --no-silent|--no-quiet) + opt_quiet=false + func_append preserve_args " $_G_opt" + ;; + + --no-warnings|--no-warning|--no-warn) + opt_warning=false + func_append preserve_args " $_G_opt" + ;; + + --no-verbose) + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --silent|--quiet) + opt_quiet=: + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --tag) test $# = 0 && func_missing_arg $_G_opt && break + opt_tag=$1 + func_append preserve_args " $_G_opt $1" + func_enable_tag "$1" + shift + ;; + + --verbose|-v) opt_quiet=false + opt_verbose=: + func_append preserve_args " $_G_opt" + ;; + + # An option not handled by this hook function: + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + libtool_parse_options_result=$func_quote_for_eval_result +} +func_add_hook func_parse_options libtool_parse_options + + + +# libtool_validate_options [ARG]... +# --------------------------------- +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +libtool_validate_options () +{ + # save first non-option argument + if test 0 -lt $#; then + nonopt=$1 + shift + fi + + # preserve --debug + test : = "$debug_cmd" || func_append preserve_args " --debug" + + case $host in + # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 + # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 + *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac + + $opt_help || { + # Sanity checks first: + func_check_version_match + + test yes != "$build_libtool_libs" \ + && test yes != "$build_old_libs" \ + && func_fatal_configuration "not configured to build any kind of library" + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test execute != "$opt_mode"; then + func_error "unrecognized option '-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help=$help + help="Try '$progname --help --mode=$opt_mode' for more information." + } + + # Pass back the unparsed argument list + func_quote_for_eval ${1+"$@"} + libtool_validate_options_result=$func_quote_for_eval_result +} +func_add_hook func_validate_options libtool_validate_options + + +# Process options as early as possible so that --help and --version +# can return quickly. +func_options ${1+"$@"} +eval set dummy "$func_options_result"; shift + + + +## ----------- ## +## Main. ## +## ----------- ## + +magic='%%%MAGIC variable%%%' +magic_exe='%%%MAGIC EXE variable%%%' + +# Global variables. +extracted_archives= +extracted_serial=0 + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# func_generated_by_libtool +# True iff stdin has been generated by Libtool. This function is only +# a basic sanity check; it will hardly flush out determined imposters. +func_generated_by_libtool_p () +{ + $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if 'file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case $lalib_p_line in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test yes = "$lalib_p" +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + test -f "$1" && + $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $debug_cmd + + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# 'FILE.' does not work on cygwin managed mounts. +func_source () +{ + $debug_cmd + + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case $lt_sysroot:$1 in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result='='$func_stripname_result + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $debug_cmd + + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with '--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=$1 + if test yes = "$build_libtool_libs"; then + write_lobj=\'$2\' + else + write_lobj=none + fi + + if test yes = "$build_old_libs"; then + write_oldobj=\'$3\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T </dev/null` + if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $debug_cmd + + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result= + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result"; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $debug_cmd + + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $debug_cmd + + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $debug_cmd + + if test -z "$2" && test -n "$1"; then + func_error "Could not determine host file name corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result=$1 + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $debug_cmd + + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " '$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result=$3 + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $debug_cmd + + case $4 in + $1 ) func_to_host_path_result=$3$func_to_host_path_result + ;; + esac + case $4 in + $2 ) func_append func_to_host_path_result "$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via '$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $debug_cmd + + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $debug_cmd + + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result=$1 +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result=$func_convert_core_msys_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result=$func_convert_core_file_wine_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via '$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $debug_cmd + + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd=func_convert_path_$func_stripname_result + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $debug_cmd + + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result=$1 +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_msys_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_path_wine_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_dll_def_p FILE +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with _LT_DLL_DEF_P in libtool.m4 +func_dll_def_p () +{ + $debug_cmd + + func_dll_def_p_tmp=`$SED -n \ + -e 's/^[ ]*//' \ + -e '/^\(;.*\)*$/d' \ + -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ + -e q \ + "$1"` + test DEF = "$func_dll_def_p_tmp" +} + + +# func_mode_compile arg... +func_mode_compile () +{ + $debug_cmd + + # Get the compilation command and the source file. + base_compile= + srcfile=$nonopt # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg=$arg + arg_mode=normal + ;; + + target ) + libobj=$arg + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify '-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + func_append pie_flag " $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + func_append later " $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs=$IFS; IFS=, + for arg in $args; do + IFS=$save_ifs + func_append_quoted lastarg "$arg" + done + IFS=$save_ifs + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + func_append base_compile " $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg=$srcfile + srcfile=$arg + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with '-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj=$func_basename_result + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from '$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test yes = "$build_libtool_libs" \ + || func_fatal_configuration "cannot build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_for_eval "$libobj" + test "X$libobj" != "X$func_quote_for_eval_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name '$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname=$func_basename_result + xdir=$func_dirname_result + lobj=$xdir$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test yes = "$build_old_libs"; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test no = "$compiler_c_o"; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext + lockfile=$output_obj.lock + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test yes = "$need_locks"; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test warn = "$need_locks"; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + func_append removelist " $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + func_append removelist " $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test yes = "$build_libtool_libs"; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test no != "$pic_mode"; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + func_append command " -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test yes = "$suppress_opt"; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test yes = "$build_old_libs"; then + if test yes != "$pic_mode"; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test yes = "$compiler_c_o"; then + func_append command " -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + func_append command "$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test no != "$need_locks"; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test compile = "$opt_mode" && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a '.o' file suitable for static linking + -static only build a '.o' file suitable for static linking + -Wc,FLAG pass FLAG directly to the compiler + +COMPILE-COMMAND is a command to be used in creating a 'standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix '.c' with the +library object suffix, '.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to '-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the '--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the 'install' or 'cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE use a list of object files found in FILE to specify objects + -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +All other options (arguments beginning with '-') are ignored. + +Every other argument is treated as a filename. Files ending in '.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in '.la', then a libtool library is created, +only library objects ('.lo' files) may be specified, and '-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created +using 'ar' and 'ranlib', or on Windows using 'lib'. + +If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode '$opt_mode'" + ;; + esac + + echo + $ECHO "Try '$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test : = "$opt_help"; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | $SED -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + $SED '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $debug_cmd + + # The first argument is the command name. + cmd=$nonopt + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "'$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "'$file' was not linked with '-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir=$func_dirname_result + + if test -f "$dir/$objdir/$dlname"; then + func_append dir "/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir=$func_dirname_result + ;; + + *) + func_warning "'-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir=$absdir + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic=$magic + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file=$progdir/$program + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file=$progdir/$program + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if $opt_dry_run; then + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + echo "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + else + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd=\$cmd$args + fi +} + +test execute = "$opt_mode" && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $debug_cmd + + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + func_append libdirs " $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + func_append libs " $opt" + else + func_warning "'$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument '$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and '=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || func_append admincmds " + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_quiet && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the '-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the '$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the '$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the '$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" + fi + echo + + echo "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test finish = "$opt_mode" && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $debug_cmd + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac + then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + func_append install_prog "$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=false + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + func_append files " $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=: ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test X-m = "X$prev" && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + func_append install_prog " $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + func_append install_shared_prog " $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the '$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + func_append install_shared_prog " -m $func_quote_for_eval_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=: + if $isdir; then + destdir=$dest + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir=$func_dirname_result + destname=$func_basename_result + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "'$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "'$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + func_append staticlibs " $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) func_append current_libdirs " $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) func_append future_libdirs " $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir=$func_dirname_result + func_append dir "$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking '$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname=$1 + shift + + srcname=$realname + test -n "$relink_command" && srcname=${realname}T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme=$stripme + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme= + ;; + esac + ;; + os2*) + case $realname in + *_dll.a) + tstripme= + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try 'ln -sf' first, because the 'ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib=$destdir/$realname + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name=$func_basename_result + instname=$dir/${name}i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && func_append staticlibs " $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest=$destfile + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to '$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test yes = "$build_old_libs"; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext= + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=.exe + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script '$wrapper'" + + finalize=: + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "'$lib' has not been installed in '$libdir'" + finalize=false + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test no = "$fast_install" && test -n "$relink_command"; then + $opt_dry_run || { + if $finalize; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file=$func_basename_result + outputname=$tmpdir/$file + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_quiet || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink '$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file=$outputname + else + func_warning "cannot relink '$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name=$func_basename_result + + # Set up the ranlib parameters. + oldlib=$destdir/$name + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $tool_oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run '$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test install = "$opt_mode" && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $debug_cmd + + my_outputname=$1 + my_originator=$2 + my_pic_p=${3-false} + my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms=${my_outputname}S.c + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist=$output_objdir/$my_outputname.nm + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* External symbol declarations for the compiler. */\ +" + + if test yes = "$dlself"; then + func_verbose "generating symbol list for '$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from '$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols=$output_objdir/$outputname.exp + $opt_dry_run || { + $RM $export_symbols + eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from '$dlprefile'" + func_basename "$dlprefile" + name=$func_basename_result + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename= + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname"; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename=$func_basename_result + else + # no lafile. user explicitly requested -dlpreopen . + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename"; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + func_show_eval '$RM "${nlist}I"' + if test -n "$global_symbol_to_import"; then + eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[];\ +" + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ +static void lt_syminit(void) +{ + LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; + for (; symbol->name; ++symbol) + {" + $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" + echo >> "$output_objdir/$my_dlsyms" "\ + } +}" + fi + echo >> "$output_objdir/$my_dlsyms" "\ +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{ {\"$my_originator\", (void *) 0}," + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ + {\"@INIT@\", (void *) <_syminit}," + fi + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + $my_pic_p && pic_flag_for_symtable=" $pic_flag" + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) func_append symtab_cflags " $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' + + # Transform the symbol file into the correct name. + symfileobj=$output_objdir/${my_outputname}S.$objext + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for '$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $debug_cmd + + win32_libid_type=unknown + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + case $nm_interface in + "MS dumpbin") + if func_cygming_ms_implib_p "$1" || + func_cygming_gnu_implib_p "$1" + then + win32_nmres=import + else + win32_nmres= + fi + ;; + *) + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s|.*|import| + p + q + } + }'` + ;; + esac + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $debug_cmd + + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $debug_cmd + + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive that possess that section. Heuristic: eliminate + # all those that have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $debug_cmd + + if func_cygming_gnu_implib_p "$1"; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1"; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result= + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $debug_cmd + + f_ex_an_ar_dir=$1; shift + f_ex_an_ar_oldlib=$1 + if test yes = "$lock_old_archive_extraction"; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test yes = "$lock_old_archive_extraction"; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $debug_cmd + + my_gentop=$1; shift + my_oldlibs=${1+"$@"} + my_oldobjs= + my_xlib= + my_xabs= + my_xdir= + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib=$func_basename_result + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir=$my_gentop/$my_xlib_u + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + func_basename "$darwin_archive" + darwin_base_archive=$func_basename_result + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches; do + func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" + $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" + cd "unfat-$$/$darwin_base_archive-$darwin_arch" + func_extract_an_archive "`pwd`" "$darwin_base_archive" + cd "$darwin_curdir" + $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result=$my_oldobjs +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory where it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + file=\"\$0\"" + + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ that is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options that match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + case \" \$* \" in + *\\ --lt-*) + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done ;; + esac + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test yes = "$fast_install"; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + \$ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${1+\"\$@\"} + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +#else +# include +# include +# ifdef __CYGWIN__ +# include +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* declarations of non-ANSI functions */ +#if defined __MINGW32__ +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined __CYGWIN__ +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined other_platform || defined ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined _MSC_VER +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +#elif defined __MINGW32__ +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined __CYGWIN__ +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined other platforms ... */ +#endif + +#if defined PATH_MAX +# define LT_PATHMAX PATH_MAX +#elif defined MAXPATHLEN +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ + defined __OS2__ +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free (stale); stale = 0; } \ +} while (0) + +#if defined LT_DEBUGWRAPPER +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + size_t tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined HAVE_DOS_BASED_FILE_SYSTEM + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined HAVE_DOS_BASED_FILE_SYSTEM + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = (size_t) (q - p); + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (STREQ (str, pat)) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + size_t len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + size_t orig_value_len = strlen (orig_value); + size_t add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + size_t len = strlen (new_value); + while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[--len] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -n -e ' +s/^\(.\{79\}\)\(..*\)/\1\ +\2/ +h +s/\([\\"]\)/\\\1/g +s/$/\\n/ +s/\([^\n]*\).*/ fputs ("\1", f);/p +g +D' + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $debug_cmd + + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_suncc_cstd_abi +# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! +# Several compiler flags select an ABI that is incompatible with the +# Cstd library. Avoid specifying it if any are in CXXFLAGS. +func_suncc_cstd_abi () +{ + $debug_cmd + + case " $compile_command " in + *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) + suncc_use_cstd_abi=no + ;; + *) + suncc_use_cstd_abi=yes + ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $debug_cmd + + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # what system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll that has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + os2dllname= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=false + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module=$wl-single_module + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test yes != "$build_libtool_libs" \ + && func_fatal_configuration "cannot build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg=$1 + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir=$arg + prev= + continue + ;; + dlfiles|dlprefiles) + $preload || { + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=: + } + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test no = "$dlself"; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test dlprefiles = "$prev"; then + dlself=yes + elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test dlfiles = "$prev"; then + func_append dlfiles " $arg" + else + func_append dlprefiles " $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols=$arg + test -f "$arg" \ + || func_fatal_error "symbol file '$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex=$arg + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) func_append deplibs " $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir=$arg + prev= + continue + ;; + mllvm) + # Clang does not use LLVM to link, so we can simply discard any + # '-mllvm $arg' options when doing the link step. + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# func_append moreargs " $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + if test none != "$pic_object"; then + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + fi + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file '$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + os2dllname) + os2dllname=$arg + prev= + continue + ;; + precious_regex) + precious_files_regex=$arg + prev= + continue + ;; + release) + release=-$arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test rpath = "$prev"; then + case "$rpath " in + *" $arg "*) ;; + *) func_append rpath " $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) func_append xrpath " $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds=$arg + prev= + continue + ;; + weak) + func_append weak_libs " $arg" + prev= + continue + ;; + xcclinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg=$arg + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "'-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test X-export-symbols = "X$arg"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between '-L' and '$1'" + else + func_fatal_error "need path for '-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of '$dir'" + dir=$absdir + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; + *) func_append deplibs " -L$dir" ;; + esac + func_append lib_search_path " $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) func_append dllsearchpath ":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test X-lc = "X$arg" || test X-lm = "X$arg"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test X-lc = "X$arg" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc due to us having libc/libc_r. + test X-lc = "X$arg" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + func_append deplibs " System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test X-lc = "X$arg" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test X-lc = "X$arg" && continue + ;; + esac + elif test X-lc_r = "X$arg"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + func_append deplibs " $arg" + continue + ;; + + -mllvm) + prev=mllvm + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot|--sysroot) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append new_inherited_linker_flags " $arg" ;; + esac + continue + ;; + + -multi_module) + single_module=$wl-multi_module + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "'-no-install' is ignored for $host" + func_warning "assuming '-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -os2dllname) + prev=os2dllname + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $func_quote_for_eval_result" + func_append compiler_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $wl$func_quote_for_eval_result" + func_append compiler_flags " $wl$func_quote_for_eval_result" + func_append linker_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # -fstack-protector* stack protector flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + # -stdlib=* select c++ std lib with clang + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + func_append compile_command " $arg" + func_append finalize_command " $arg" + func_append compiler_flags " $arg" + continue + ;; + + -Z*) + if test os2 = "`expr $host : '.*\(os2\)'`"; then + # OS/2 uses -Zxxx to specify OS/2-specific options + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case $arg in + -Zlinker | -Zstack) + prev=xcompiler + ;; + esac + continue + else + # Otherwise treat like 'Some other compiler flag' below + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + fi + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + *.$objext) + # A standard object. + func_append objs " $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + test none = "$pic_object" || { + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + } + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + func_append deplibs " $arg" + func_append old_deplibs " $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test dlfiles = "$prev"; then + # This library was specified with -dlopen. + func_append dlfiles " $func_resolve_sysroot_result" + prev= + elif test dlprefiles = "$prev"; then + # The library was specified with -dlpreopen. + func_append dlprefiles " $func_resolve_sysroot_result" + prev= + else + func_append deplibs " $func_resolve_sysroot_result" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the '$prevarg' option requires an argument" + + if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname=$func_basename_result + libobjs_save=$libobjs + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + # Definition is injected by LT_CONFIG during libtool generation. + func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" + + func_dirname "$output" "/" "" + output_objdir=$func_dirname_result$objdir + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_preserve_dup_deps; then + case "$libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append libs " $deplib" + done + + if test lib = "$linkmode"; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; + esac + func_append pre_post_deps " $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=false + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test lib,link = "$linkmode,$pass"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs=$tmp_deplibs + fi + + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass"; then + libs=$deplibs + deplibs= + fi + if test prog = "$linkmode"; then + case $pass in + dlopen) libs=$dlfiles ;; + dlpreopen) libs=$dlprefiles ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test lib,dlpreopen = "$linkmode,$pass"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) func_append deplibs " $deplib" ;; + esac + done + done + libs=$dlprefiles + fi + if test dlopen = "$pass"; then + # Collect dlpreopened libraries + save_deplibs=$deplibs + deplibs= + fi + + for deplib in $libs; do + lib= + found=false + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append compiler_flags " $deplib" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test lib != "$linkmode" && test prog != "$linkmode"; then + func_warning "'-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test lib = "$linkmode"; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib=$searchdir/lib$name$search_ext + if test -f "$lib"; then + if test .la = "$search_ext"; then + found=: + else + found=false + fi + break 2 + fi + done + done + if $found; then + # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll=$l + done + if test "X$ll" = "X$old_library"; then # only static version available + found=false + func_dirname "$lib" "" "." + ladir=$func_dirname_result + lib=$ladir/$old_library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + else + # deplib doesn't seem to be a libtool library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + ;; # -l + *.ltframework) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test conv = "$pass" && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + prog) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + if test scan = "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + *) + func_warning "'-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test link = "$pass"; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=false + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=: + fi + ;; + pass_all) + valid_a_lib=: + ;; + esac + if $valid_a_lib; then + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + else + echo + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not use here." + fi + ;; + esac + continue + ;; + prog) + if test link != "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + elif test prog = "$linkmode"; then + if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + func_append newdlprefiles " $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append newdlfiles " $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=: + continue + ;; + esac # case $deplib + + $found || test -f "$lib" \ + || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "'$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir=$func_dirname_result + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass" || + { test prog != "$linkmode" && test lib != "$linkmode"; }; then + test -n "$dlopen" && func_append dlfiles " $dlopen" + test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" + fi + + if test conv = "$pass"; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + # It is a libtool convenience library, so add in its objects. + func_append convenience " $ladir/$objdir/$old_library" + func_append old_convenience " $ladir/$objdir/$old_library" + elif test prog != "$linkmode" && test lib != "$linkmode"; then + func_fatal_error "'$lib' is not a convenience library" + fi + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + if test -n "$old_library" && + { test yes = "$prefer_static_libs" || + test built,no = "$prefer_static_libs,$installed"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib=$l + done + fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + + # This library was specified with -dlopen. + if test dlopen = "$pass"; then + test -z "$libdir" \ + && func_fatal_error "cannot -dlopen a convenience library: '$lib'" + if test -z "$dlname" || + test yes != "$dlopen_support" || + test no = "$build_libtool_libs" + then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + func_append dlprefiles " $lib $dependency_libs" + else + func_append newdlfiles " $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of '$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir=$ladir + fi + ;; + esac + func_basename "$lib" + laname=$func_basename_result + + # Find the relevant object directory and library name. + if test yes = "$installed"; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library '$lib' was moved." + dir=$ladir + absdir=$abs_ladir + libdir=$abs_ladir + else + dir=$lt_sysroot$libdir + absdir=$lt_sysroot$libdir + fi + test yes = "$hardcode_automatic" && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir=$ladir + absdir=$abs_ladir + # Remove this search path later + func_append notinst_path " $abs_ladir" + else + dir=$ladir/$objdir + absdir=$abs_ladir/$objdir + # Remove this search path later + func_append notinst_path " $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test dlpreopen = "$pass"; then + if test -z "$libdir" && test prog = "$linkmode"; then + func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" + fi + case $host in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + func_append newdlprefiles " $dir/$linklib" + else + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + func_append newdlprefiles " $dir/$dlname" + else + func_append newdlprefiles " $dir/$linklib" + fi + ;; + esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test lib = "$linkmode"; then + deplibs="$dir/$old_library $deplibs" + elif test prog,link = "$linkmode,$pass"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test prog = "$linkmode" && test link != "$pass"; then + func_append newlib_search_path " $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=false + if test no != "$link_all_deplibs" || test -z "$library_names" || + test no = "$build_libtool_libs"; then + linkalldeplibs=: + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if $linkalldeplibs; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test prog,link = "$linkmode,$pass"; then + if test -n "$library_names" && + { { test no = "$prefer_static_libs" || + test built,yes = "$prefer_static_libs,$installed"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then + # Make sure the rpath contains only unique directories. + case $temp_rpath: in + *"$absdir:"*) ;; + *) func_append temp_rpath "$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if $alldeplibs && + { test pass_all = "$deplibs_check_method" || + { test yes = "$build_libtool_libs" && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test built = "$use_static_libs" && test yes = "$installed"; then + use_static_libs=no + fi + if test -n "$library_names" && + { test no = "$use_static_libs" || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc* | *os2*) + # No point in relinking DLLs because paths are not encoded + func_append notinst_deplibs " $lib" + need_relink=no + ;; + *) + if test no = "$installed"; then + func_append notinst_deplibs " $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule= + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule=$dlpremoduletest + break + fi + done + if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then + echo + if test prog = "$linkmode"; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test lib = "$linkmode" && + test yes = "$hardcode_into_libs"; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname=$1 + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname=$dlname + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc* | *os2*) + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + esac + eval soname=\"$soname_spec\" + else + soname=$realname + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot=$soname + func_basename "$soroot" + soname=$func_basename_result + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from '$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for '$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test prog = "$linkmode" || test relink != "$opt_mode"; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test no = "$hardcode_direct"; then + add=$dir/$linklib + case $host in + *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; + *-*-sysv4*uw2*) add_dir=-L$dir ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir=-L$dir ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we cannot + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library"; then + echo + echo "*** And there doesn't seem to be a static archive available" + echo "*** The link will probably fail, sorry" + else + add=$dir/$old_library + fi + elif test -n "$old_library"; then + add=$dir/$old_library + fi + fi + esac + elif test no = "$hardcode_minus_L"; then + case $host in + *-*-sunos*) add_shlibpath=$dir ;; + esac + add_dir=-L$dir + add=-l$name + elif test no = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + relink) + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$dir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$absdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test yes != "$lib_linked"; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) func_append compile_shlibpath "$add_shlibpath:" ;; + esac + fi + if test prog = "$linkmode"; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test yes != "$hardcode_direct" && + test yes != "$hardcode_minus_L" && + test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + fi + fi + fi + + if test prog = "$linkmode" || test relink = "$opt_mode"; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$libdir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$libdir + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + add=-l$name + elif test yes = "$hardcode_automatic"; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib"; then + add=$inst_prefix_dir$libdir/$linklib + else + add=$libdir/$linklib + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir=-L$libdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + fi + + if test prog = "$linkmode"; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test prog = "$linkmode"; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test unsupported != "$hardcode_direct"; then + test -n "$old_library" && linklib=$old_library + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test yes = "$build_libtool_libs"; then + # Not a shared library + if test pass_all != "$deplibs_check_method"; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + echo + $ECHO "*** Warning: This system cannot link to static lib archive $lib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + if test yes = "$module"; then + echo "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test lib = "$linkmode"; then + if test -n "$dependency_libs" && + { test yes != "$hardcode_into_libs" || + test yes = "$build_old_libs" || + test yes = "$link_static"; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) func_append xrpath " $temp_xrpath";; + esac;; + *) func_append temp_deplibs " $libdir";; + esac + done + dependency_libs=$temp_deplibs + fi + + func_append newlib_search_path " $absdir" + # Link against this library + test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + func_append specialdeplibs " $func_resolve_sysroot_result" ;; + esac + fi + func_append tmp_libs " $func_resolve_sysroot_result" + done + + if test no != "$link_all_deplibs"; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path=$deplib ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." + dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of '$dir'" + absdir=$dir + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names"; then + for tmp in $deplibrary_names; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl"; then + depdepl=$absdir/$objdir/$depdepl + darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" + func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" + path= + fi + fi + ;; + *) + path=-L$absdir/$objdir + ;; + esac + else + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "'$deplib' seems to be moved" + + path=-L$absdir + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test link = "$pass"; then + if test prog = "$linkmode"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs=$newdependency_libs + if test dlpreopen = "$pass"; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test dlopen != "$pass"; then + test conv = "$pass" || { + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) func_append lib_search_path " $dir" ;; + esac + done + newlib_search_path= + } + + if test prog,link = "$linkmode,$pass"; then + vars="compile_deplibs finalize_deplibs" + else + vars=deplibs + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) func_append tmp_libs " $deplib" ;; + esac + ;; + *) func_append tmp_libs " $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + + # Add Sun CC postdeps if required: + test CXX = "$tagname" && { + case $host_os in + linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C++ 5.9 + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + + solaris*) + func_cc_basename "$CC" + case $func_cc_basename_result in + CC* | sunCC*) + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + esac + } + + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i= + ;; + esac + if test -n "$i"; then + func_append tmp_libs " $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test prog = "$linkmode"; then + dlfiles=$newdlfiles + fi + if test prog = "$linkmode" || test lib = "$linkmode"; then + dlprefiles=$newdlprefiles + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "'-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "'-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs=$output + func_append objs "$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form 'libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test no = "$module" \ + && func_fatal_help "libtool library '$output' must begin with 'lib'" + + if test no != "$need_lib_prefix"; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test pass_all != "$deplibs_check_method"; then + func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" + else + echo + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + func_append libobjs " $objs" + fi + fi + + test no = "$dlself" \ + || func_warning "'-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test 1 -lt "$#" \ + && func_warning "ignoring multiple '-rpath's for a libtool library" + + install_libdir=$1 + + oldlibs= + if test -z "$rpath"; then + if test yes = "$build_libtool_libs"; then + # Building a libtool convenience library. + # Some compilers have problems with a '.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "'-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs=$IFS; IFS=: + set dummy $vinfo 0 0 0 + shift + IFS=$save_ifs + + test -n "$7" && \ + func_fatal_help "too many parameters to '-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major=$1 + number_minor=$2 + number_revision=$3 + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # that has an extra 1 added just for fun + # + case $version_type in + # correct linux to gnu/linux during the next big refactor + darwin|freebsd-elf|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_revision + ;; + freebsd-aout|qnx|sunos) + current=$number_major + revision=$number_minor + age=0 + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_minor + lt_irix_increment=no + ;; + esac + ;; + no) + current=$1 + revision=$2 + age=$3 + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT '$current' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION '$revision' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE '$age' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE '$age' is greater than the current interface number '$current'" + func_fatal_error "'$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + # On Darwin other compilers + case $CC in + nagfor*) + verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + ;; + *) + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + esac + ;; + + freebsd-aout) + major=.$current + versuffix=.$current.$revision + ;; + + freebsd-elf) + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + irix | nonstopux) + if test no = "$lt_irix_increment"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring=$verstring_prefix$major.$revision + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test 0 -ne "$loop"; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring_prefix$major.$iface:$verstring + done + + # Before this point, $major must not contain '.'. + major=.$major + versuffix=$major.$revision + ;; + + linux) # correct to gnu/linux during the next big refactor + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=.$current.$age.$revision + verstring=$current.$age.$revision + + # Add in all the interfaces that we are compatible with. + loop=$age + while test 0 -ne "$loop"; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring:$iface.0 + done + + # Make executables depend on our current version. + func_append verstring ":$current.0" + ;; + + qnx) + major=.$current + versuffix=.$current + ;; + + sco) + major=.$current + versuffix=.$current + ;; + + sunos) + major=.$current + versuffix=.$current.$revision + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 file systems. + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + + *) + func_fatal_configuration "unknown library version type '$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring=0.0 + ;; + esac + if test no = "$need_version"; then + versuffix= + else + versuffix=.0.0 + fi + fi + + # Remove version info from name if versioning should be avoided + if test yes,no = "$avoid_version,$need_version"; then + major= + versuffix= + verstring= + fi + + # Check to see if the archive will have undefined symbols. + if test yes = "$allow_undefined"; then + if test unsupported = "$allow_undefined_flag"; then + if test yes = "$build_old_libs"; then + func_warning "undefined symbols not allowed in $host shared libraries; building static only" + build_libtool_libs=no + else + func_fatal_error "can't build $host shared library unless -no-undefined is specified" + fi + fi + else + # Don't allow undefined symbols. + allow_undefined_flag=$no_undefined_flag + fi + + fi + + func_generate_dlsyms "$libname" "$libname" : + func_append libobjs " $symfileobj" + test " " = "$libobjs" && libobjs= + + if test relink != "$opt_mode"; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) + if test -n "$precious_files_regex"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + func_append removelist " $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then + func_append oldlibs " $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + func_replace_sysroot "$libdir" + func_append temp_xrpath " -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles=$dlfiles + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) func_append dlfiles " $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles=$dlprefiles + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) func_append dlprefiles " $lib" ;; + esac + done + + if test yes = "$build_libtool_libs"; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + func_append deplibs " System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test yes = "$build_libtool_need_lc"; then + func_append deplibs " -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release= + versuffix= + major= + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib=$potent_lib + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | $SED 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;; + *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append newdeplibs " $a_deplib" + a_deplib= + ;; + esac + fi + if test -n "$a_deplib"; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib=$potent_lib # see symlink-check above in file_magic test + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs= + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + for i in $predeps $postdeps; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + echo + if test none = "$deplibs_check_method"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + ;; + esac + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test yes = "$droppeddeps"; then + if test yes = "$module"; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + + if test no = "$allow_undefined"; then + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + deplibs=$new_libs + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test yes = "$build_libtool_libs"; then + # Remove $wl instances when linking with ld. + # FIXME: should test the right _cmds variable. + case $archive_cmds in + *\$LD\ *) wl= ;; + esac + if test yes = "$hardcode_into_libs"; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath=$finalize_rpath + test relink = "$opt_mode" || rpath=$compile_rpath$rpath + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append dep_rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath=$finalize_shlibpath + test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname=$1 + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname=$realname + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib=$output_objdir/$realname + linknames= + for link + do + func_append linknames " $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols=$output_objdir/$libname.uexp + func_append delfiles " $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + func_dll_def_p "$export_symbols" || { + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols=$export_symbols + export_symbols= + always_export_symbols=yes + } + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs=$IFS; IFS='~' + for cmd1 in $cmds; do + IFS=$save_ifs + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test yes = "$try_normal_branch" \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=$output_objdir/$output_la.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + func_append delfiles " $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS=$save_ifs + if test -n "$export_symbols_regex" && test : != "$skipped_export"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test : != "$skipped_export" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + func_append tmp_deplibs " $test_deplib" + ;; + esac + done + deplibs=$tmp_deplibs + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test yes = "$compiler_needs_object" && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + func_append linker_flags " $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test : != "$skipped_export" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + func_basename "$output" + output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then + output=$output_objdir/$output_la.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + func_append delfiles " $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then + output=$output_objdir/$output_la.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test yes = "$compiler_needs_object"; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + func_append delfiles " $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-$k.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test -z "$objlist" || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test 1 -eq "$k"; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-$k.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-$k.$objext + objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + func_append delfiles " $output" + + else + output= + fi + + ${skipped_export-false} && { + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + } + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs=$IFS; IFS='~' + for cmd in $concat_cmds; do + IFS=$save_ifs + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + ${skipped_export-false} && { + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + } + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs=$IFS; IFS='~' + for cmd in $cmds; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test yes = "$module" || test yes = "$export_dynamic"; then + # On all known operating systems, these are identical. + dlname=$soname + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "'-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object '$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj=$output + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # if reload_cmds runs $LD directly, get rid of -Wl from + # whole_archive_flag_spec and hope we can get by with turning comma + # into space. + case $reload_cmds in + *\$LD[\ \$]*) wl= ;; + esac + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags + else + gentop=$output_objdir/${obj}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test yes = "$build_libtool_libs" || libobjs=$non_pic_objects + + # Create the old-style object. + reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs + + output=$obj + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + test yes = "$build_libtool_libs" || { + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + } + + if test -n "$pic_flag" || test default != "$pic_mode"; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output=$libobj + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "'-release' is ignored for programs" + + $preload \ + && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ + && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test CXX = "$tagname"; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + func_append compile_command " $wl-bind_at_load" + func_append finalize_command " $wl-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + compile_deplibs=$new_libs + + + func_append compile_command " $compile_deplibs" + func_append finalize_command " $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) func_append dllsearchpath ":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath=$rpath + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) func_append finalize_perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath=$rpath + + if test -n "$libobjs" && test yes = "$build_old_libs"; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" false + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=: + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=false + ;; + *cygwin* | *mingw* ) + test yes = "$build_libtool_libs" || wrappers_required=false + ;; + *) + if test no = "$need_relink" || test yes != "$build_libtool_libs"; then + wrappers_required=false + fi + ;; + esac + $wrappers_required || { + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command=$compile_command$compile_rpath + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.$objext"; then + func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' + fi + + exit $exit_status + } + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + func_append rpath "$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test yes = "$no_install"; then + # We don't need to create a wrapper script. + link_command=$compile_var$compile_command$compile_rpath + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + fi + + case $hardcode_action,$fast_install in + relink,*) + # Fast installation is not supported + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "'$output' will be relinked during installation" + ;; + *,yes) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + ;; + *,no) + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + ;; + *,needless) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command= + ;; + esac + + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource=$output_path/$objdir/lt-$output_name.c + cwrapper=$output_path/$output_name.exe + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host"; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + case $build_libtool_libs in + convenience) + oldobjs="$libobjs_save $symfileobj" + addlibs=$convenience + build_libtool_libs=no + ;; + module) + oldobjs=$libobjs_save + addlibs=$old_convenience + build_libtool_libs=no + ;; + *) + oldobjs="$old_deplibs $non_pic_objects" + $preload && test -f "$symfileobj" \ + && func_append oldobjs " $symfileobj" + addlibs=$old_convenience + ;; + esac + + if test -n "$addlibs"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $addlibs + func_append oldobjs " $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append oldobjs " $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + echo "copying selected object files to avoid basename conflicts..." + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase=$func_basename_result + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + func_append oldobjs " $gentop/$newobj" + ;; + *) func_append oldobjs " $obj" ;; + esac + done + fi + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj"; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test -z "$oldobjs"; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test yes = "$build_old_libs" && old_library=$libname.$libext + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + if test yes = "$hardcode_automatic"; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test yes = "$installed"; then + if test -z "$install_libdir"; then + break + fi + output=$output_objdir/${outputname}i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name=$func_basename_result + func_resolve_sysroot "$deplib" + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -R$func_replace_sysroot_result" + ;; + *) func_append newdependency_libs " $deplib" ;; + esac + done + dependency_libs=$newdependency_libs + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" + ;; + *) func_append newdlfiles " $lib" ;; + esac + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles=$newdlprefiles + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlfiles " $abs" + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlprefiles " $abs" + done + dlprefiles=$newdlprefiles + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test -n "$bindir"; then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result/$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that cannot go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test no,yes = "$installed,$need_relink"; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +if test link = "$opt_mode" || test relink = "$opt_mode"; then + func_mode_link ${1+"$@"} +fi + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $debug_cmd + + RM=$nonopt + files= + rmforce=false + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + for arg + do + case $arg in + -f) func_append RM " $arg"; rmforce=: ;; + -*) func_append RM " $arg" ;; + *) func_append files " $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir=$func_dirname_result + if test . = "$dir"; then + odir=$objdir + else + odir=$dir/$objdir + fi + func_basename "$file" + name=$func_basename_result + test uninstall = "$opt_mode" && odir=$dir + + # Remember odir for removal later, being careful to avoid duplicates + if test clean = "$opt_mode"; then + case " $rmdirs " in + *" $odir "*) ;; + *) func_append rmdirs " $odir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif $rmforce; then + continue + fi + + rmfiles=$file + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + func_append rmfiles " $odir/$n" + done + test -n "$old_library" && func_append rmfiles " $odir/$old_library" + + case $opt_mode in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + esac + test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && test none != "$pic_object"; then + func_append rmfiles " $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && test none != "$non_pic_object"; then + func_append rmfiles " $dir/$non_pic_object" + fi + fi + ;; + + *) + if test clean = "$opt_mode"; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + func_append rmfiles " $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + func_append rmfiles " $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + func_append rmfiles " $odir/$name $odir/${name}S.$objext" + if test yes = "$fast_install" && test -n "$relink_command"; then + func_append rmfiles " $odir/lt-$name" + fi + if test "X$noexename" != "X$name"; then + func_append rmfiles " $odir/lt-$noexename.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + + # Try to remove the $objdir's in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then + func_mode_uninstall ${1+"$@"} +fi + +test -z "$opt_mode" && { + help=$generic_help + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode '$opt_mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# where we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff -Nru gmime-2.6.22+dfsg2/m4/gpgme.m4 gmime-3.0.1/m4/gpgme.m4 --- gmime-2.6.22+dfsg2/m4/gpgme.m4 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/m4/gpgme.m4 2017-04-08 17:01:10.000000000 +0000 @@ -0,0 +1,283 @@ +# gpgme.m4 - autoconf macro to detect GPGME. +# Copyright (C) 2002, 2003, 2004, 2014 g10 Code GmbH +# +# This file is free software; as a special exception the author gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. +# +# This file is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# +# Last-changed: 2014-10-02 + + +AC_DEFUN([_AM_PATH_GPGME_CONFIG], +[ AC_ARG_WITH(gpgme-prefix, + AC_HELP_STRING([--with-gpgme-prefix=PFX], + [prefix where GPGME is installed (optional)]), + gpgme_config_prefix="$withval", gpgme_config_prefix="") + if test x"${GPGME_CONFIG}" = x ; then + if test x"${gpgme_config_prefix}" != x ; then + GPGME_CONFIG="${gpgme_config_prefix}/bin/gpgme-config" + else + case "${SYSROOT}" in + /*) + if test -x "${SYSROOT}/bin/gpgme-config" ; then + GPGME_CONFIG="${SYSROOT}/bin/gpgme-config" + fi + ;; + '') + ;; + *) + AC_MSG_WARN([Ignoring \$SYSROOT as it is not an absolute path.]) + ;; + esac + fi + fi + + AC_PATH_PROG(GPGME_CONFIG, gpgme-config, no) + + if test "$GPGME_CONFIG" != "no" ; then + gpgme_version=`$GPGME_CONFIG --version` + fi + gpgme_version_major=`echo $gpgme_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\1/'` + gpgme_version_minor=`echo $gpgme_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\2/'` + gpgme_version_micro=`echo $gpgme_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\3/'` +]) + + +AC_DEFUN([_AM_PATH_GPGME_CONFIG_HOST_CHECK], +[ + gpgme_config_host=`$GPGME_CONFIG --host 2>/dev/null || echo none` + if test x"$gpgme_config_host" != xnone ; then + if test x"$gpgme_config_host" != x"$host" ; then + AC_MSG_WARN([[ +*** +*** The config script $GPGME_CONFIG was +*** built for $gpgme_config_host and thus may not match the +*** used host $host. +*** You may want to use the configure option --with-gpgme-prefix +*** to specify a matching config script or use \$SYSROOT. +***]]) + gpg_config_script_warn="$gpg_config_script_warn gpgme" + fi + fi +]) + + +dnl AM_PATH_GPGME([MINIMUM-VERSION, +dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]]) +dnl Test for libgpgme and define GPGME_CFLAGS and GPGME_LIBS. +dnl +dnl If a prefix option is not used, the config script is first +dnl searched in $SYSROOT/bin and then along $PATH. If the used +dnl config script does not match the host specification the script +dnl is added to the gpg_config_script_warn variable. +dnl +AC_DEFUN([AM_PATH_GPGME], +[ AC_REQUIRE([_AM_PATH_GPGME_CONFIG])dnl + tmp=ifelse([$1], ,1:0.4.2,$1) + if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then + req_gpgme_api=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\1/'` + min_gpgme_version=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\2/'` + else + req_gpgme_api=0 + min_gpgme_version="$tmp" + fi + + AC_MSG_CHECKING(for GPGME - version >= $min_gpgme_version) + ok=no + if test "$GPGME_CONFIG" != "no" ; then + req_major=`echo $min_gpgme_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\1/'` + req_minor=`echo $min_gpgme_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\2/'` + req_micro=`echo $min_gpgme_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'` + if test "$gpgme_version_major" -gt "$req_major"; then + ok=yes + else + if test "$gpgme_version_major" -eq "$req_major"; then + if test "$gpgme_version_minor" -gt "$req_minor"; then + ok=yes + else + if test "$gpgme_version_minor" -eq "$req_minor"; then + if test "$gpgme_version_micro" -ge "$req_micro"; then + ok=yes + fi + fi + fi + fi + fi + fi + if test $ok = yes; then + # If we have a recent GPGME, we should also check that the + # API is compatible. + if test "$req_gpgme_api" -gt 0 ; then + tmp=`$GPGME_CONFIG --api-version 2>/dev/null || echo 0` + if test "$tmp" -gt 0 ; then + if test "$req_gpgme_api" -ne "$tmp" ; then + ok=no + fi + fi + fi + fi + if test $ok = yes; then + GPGME_CFLAGS=`$GPGME_CONFIG --cflags` + GPGME_LIBS=`$GPGME_CONFIG --libs` + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + _AM_PATH_GPGME_CONFIG_HOST_CHECK + else + GPGME_CFLAGS="" + GPGME_LIBS="" + AC_MSG_RESULT(no) + ifelse([$3], , :, [$3]) + fi + AC_SUBST(GPGME_CFLAGS) + AC_SUBST(GPGME_LIBS) +]) + +dnl AM_PATH_GPGME_PTHREAD([MINIMUM-VERSION, +dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]]) +dnl Test for libgpgme and define GPGME_PTHREAD_CFLAGS +dnl and GPGME_PTHREAD_LIBS. +dnl +AC_DEFUN([AM_PATH_GPGME_PTHREAD], +[ AC_REQUIRE([_AM_PATH_GPGME_CONFIG])dnl + tmp=ifelse([$1], ,1:0.4.2,$1) + if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then + req_gpgme_api=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\1/'` + min_gpgme_version=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\2/'` + else + req_gpgme_api=0 + min_gpgme_version="$tmp" + fi + + AC_MSG_CHECKING(for GPGME pthread - version >= $min_gpgme_version) + ok=no + if test "$GPGME_CONFIG" != "no" ; then + if `$GPGME_CONFIG --thread=pthread 2> /dev/null` ; then + req_major=`echo $min_gpgme_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\1/'` + req_minor=`echo $min_gpgme_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\2/'` + req_micro=`echo $min_gpgme_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'` + if test "$gpgme_version_major" -gt "$req_major"; then + ok=yes + else + if test "$gpgme_version_major" -eq "$req_major"; then + if test "$gpgme_version_minor" -gt "$req_minor"; then + ok=yes + else + if test "$gpgme_version_minor" -eq "$req_minor"; then + if test "$gpgme_version_micro" -ge "$req_micro"; then + ok=yes + fi + fi + fi + fi + fi + fi + fi + if test $ok = yes; then + # If we have a recent GPGME, we should also check that the + # API is compatible. + if test "$req_gpgme_api" -gt 0 ; then + tmp=`$GPGME_CONFIG --api-version 2>/dev/null || echo 0` + if test "$tmp" -gt 0 ; then + if test "$req_gpgme_api" -ne "$tmp" ; then + ok=no + fi + fi + fi + fi + if test $ok = yes; then + GPGME_PTHREAD_CFLAGS=`$GPGME_CONFIG --thread=pthread --cflags` + GPGME_PTHREAD_LIBS=`$GPGME_CONFIG --thread=pthread --libs` + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + _AM_PATH_GPGME_CONFIG_HOST_CHECK + else + GPGME_PTHREAD_CFLAGS="" + GPGME_PTHREAD_LIBS="" + AC_MSG_RESULT(no) + ifelse([$3], , :, [$3]) + fi + AC_SUBST(GPGME_PTHREAD_CFLAGS) + AC_SUBST(GPGME_PTHREAD_LIBS) +]) + + +dnl AM_PATH_GPGME_GLIB([MINIMUM-VERSION, +dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]]) +dnl Test for libgpgme-glib and define GPGME_GLIB_CFLAGS and GPGME_GLIB_LIBS. +dnl +AC_DEFUN([AM_PATH_GPGME_GLIB], +[ AC_REQUIRE([_AM_PATH_GPGME_CONFIG])dnl + tmp=ifelse([$1], ,1:0.4.2,$1) + if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then + req_gpgme_api=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\1/'` + min_gpgme_version=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\2/'` + else + req_gpgme_api=0 + min_gpgme_version="$tmp" + fi + + AC_MSG_CHECKING(for GPGME - version >= $min_gpgme_version) + ok=no + if test "$GPGME_CONFIG" != "no" ; then + req_major=`echo $min_gpgme_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\1/'` + req_minor=`echo $min_gpgme_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\2/'` + req_micro=`echo $min_gpgme_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'` + if test "$gpgme_version_major" -gt "$req_major"; then + ok=yes + else + if test "$gpgme_version_major" -eq "$req_major"; then + if test "$gpgme_version_minor" -gt "$req_minor"; then + ok=yes + else + if test "$gpgme_version_minor" -eq "$req_minor"; then + if test "$gpgme_version_micro" -ge "$req_micro"; then + ok=yes + fi + fi + fi + fi + fi + fi + if test $ok = yes; then + # If we have a recent GPGME, we should also check that the + # API is compatible. + if test "$req_gpgme_api" -gt 0 ; then + tmp=`$GPGME_CONFIG --api-version 2>/dev/null || echo 0` + if test "$tmp" -gt 0 ; then + if test "$req_gpgme_api" -ne "$tmp" ; then + ok=no + fi + fi + fi + fi + if test $ok = yes; then + GPGME_GLIB_CFLAGS=`$GPGME_CONFIG --glib --cflags` + GPGME_GLIB_LIBS=`$GPGME_CONFIG --glib --libs` + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + _AM_PATH_GPGME_CONFIG_HOST_CHECK + else + GPGME_GLIB_CFLAGS="" + GPGME_GLIB_LIBS="" + AC_MSG_RESULT(no) + ifelse([$3], , :, [$3]) + fi + AC_SUBST(GPGME_GLIB_CFLAGS) + AC_SUBST(GPGME_GLIB_LIBS) +]) diff -Nru gmime-2.6.22+dfsg2/m4/libtool.m4 gmime-3.0.1/m4/libtool.m4 --- gmime-2.6.22+dfsg2/m4/libtool.m4 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/m4/libtool.m4 2016-12-22 14:07:52.000000000 +0000 @@ -0,0 +1,8372 @@ +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +m4_define([_LT_COPYING], [dnl +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +]) + +# serial 58 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK +AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_PREPARE_CC_BASENAME +# ----------------------- +m4_defun([_LT_PREPARE_CC_BASENAME], [ +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in @S|@*""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} +])# _LT_PREPARE_CC_BASENAME + + +# _LT_CC_BASENAME(CC) +# ------------------- +# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, +# but that macro is also expanded into generated libtool script, which +# arranges for $SED and $ECHO to be set by different means. +m4_defun([_LT_CC_BASENAME], +[m4_require([_LT_PREPARE_CC_BASENAME])dnl +AC_REQUIRE([_LT_DECL_SED])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl +func_cc_basename $1 +cc_basename=$func_cc_basename_result +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl + +_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl +dnl +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_WITH_SYSROOT])dnl +m4_require([_LT_CMD_TRUNCATE])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options that allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a '.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld=$lt_cv_prog_gnu_ld + +old_CC=$CC +old_CFLAGS=$CFLAGS + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PREPARE_SED_QUOTE_VARS +# -------------------------- +# Define a few sed substitution that help us do robust quoting. +m4_defun([_LT_PREPARE_SED_QUOTE_VARS], +[# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([["`\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' +]) + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from 'configure', and 'config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# 'config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain=$ac_aux_dir/ltmain.sh +])# _LT_PROG_LTMAIN + + +## ------------------------------------- ## +## Accumulate code for creating libtool. ## +## ------------------------------------- ## + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the 'libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + +## ------------------------ ## +## FIXME: Eliminate VARNAME ## +## ------------------------ ## + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to 'config.status' so that its +# declaration there will have the same value as in 'configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags='_LT_TAGS'dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the 'libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into 'config.status', and then the shell code to quote escape them in +# for loops in 'config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$[]1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +_LT_OUTPUT_LIBTOOL_INIT +]) + +# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) +# ------------------------------------ +# Generate a child script FILE with all initialization necessary to +# reuse the environment learned by the parent script, and make the +# file executable. If COMMENT is supplied, it is inserted after the +# '#!' sequence but before initialization text begins. After this +# macro, additional text can be appended to FILE to form the body of +# the child script. The macro ends with non-zero status if the +# file could not be fully written (such as if the disk is full). +m4_ifdef([AS_INIT_GENERATED], +[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], +[m4_defun([_LT_GENERATED_FILE_INIT], +[m4_require([AS_PREPARE])]dnl +[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl +[lt_write_fail=0 +cat >$1 <<_ASEOF || lt_write_fail=1 +#! $SHELL +# Generated by $as_me. +$2 +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$1 <<\_ASEOF || lt_write_fail=1 +AS_SHELL_SANITIZE +_AS_PREPARE +exec AS_MESSAGE_FD>&1 +_ASEOF +test 0 = "$lt_write_fail" && chmod +x $1[]dnl +m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], +[# Run this file to recreate a libtool stub with the current configuration.]) + +cat >>"$CONFIG_LT" <<\_LTEOF +lt_cl_silent=false +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +'$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2011 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test 0 != $[#] +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try '$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try '$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +lt_cl_success=: +test yes = "$silent" && + lt_config_lt_args="$lt_config_lt_args --quiet" +exec AS_MESSAGE_LOG_FD>/dev/null +$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +exec AS_MESSAGE_LOG_FD>>config.log +$lt_cl_success || AS_EXIT(1) +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options that allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST + fi + + cfgfile=${ofile}T + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL +# Generated automatically by $as_me ($PACKAGE) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +_LT_COPYING +_LT_LIBTOOL_TAGS + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +_LT_PREPARE_MUNGE_PATH_LIST +_LT_PREPARE_CC_BASENAME + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Go], [_LT_LANG(GO)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +m4_ifndef([AC_PROG_GO], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_GO. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ +m4_defun([AC_PROG_GO], +[AC_LANG_PUSH(Go)dnl +AC_ARG_VAR([GOC], [Go compiler command])dnl +AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl +_AC_ARG_VAR_LDFLAGS()dnl +AC_CHECK_TOOL(GOC, gccgo) +if test -z "$GOC"; then + if test -n "$ac_tool_prefix"; then + AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) + fi +fi +if test -z "$GOC"; then + AC_CHECK_PROG(GOC, gccgo, gccgo, false) +fi +])#m4_defun +])#m4_ifndef + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([AC_PROG_GO], + [LT_LANG(GO)], + [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) +dnl AC_DEFUN([AC_LIBTOOL_RC], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS=$save_LDFLAGS + ]) + + AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], + [lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD + echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD + echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD + $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + 10.[[012]][[,.]]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES([TAG]) +# --------------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + if test yes = "$lt_cv_ld_force_load"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], + [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + m4_if([$1], [CXX], +[ if test yes != "$lt_cv_apple_cc_single_mod"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) +# ---------------------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +# Store the results from the different compilers for each TAGNAME. +# Allow to override them for all tags through lt_cv_aix_libpath. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], + [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ + lt_aix_libpath_sed='[ + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }]' + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi],[]) + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib + fi + ]) + aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) +fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[m4_divert_text([M4SH-INIT], [$1 +])])# _LT_SHELL_INIT + + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Find how we can fake an echo command that does not interpret backslash. +# In particular, with Autoconf 2.60 or later we add some code to the start +# of the generated configure script that will find a shell with a builtin +# printf (that we can use as an echo command). +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +AC_MSG_CHECKING([how to print strings]) +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$[]1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +case $ECHO in + printf*) AC_MSG_RESULT([printf]) ;; + print*) AC_MSG_RESULT([print -r]) ;; + *) AC_MSG_RESULT([cat]) ;; +esac + +m4_ifdef([_AS_DETECT_SUGGESTED], +[_AS_DETECT_SUGGESTED([ + test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test "X`printf %s $ECHO`" = "X$ECHO" \ + || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) + +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_WITH_SYSROOT +# ---------------- +AC_DEFUN([_LT_WITH_SYSROOT], +[AC_MSG_CHECKING([for sysroot]) +AC_ARG_WITH([sysroot], +[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], + [Search for dependent libraries within DIR (or the compiler's sysroot + if not specified).])], +[], [with_sysroot=no]) + +dnl lt_sysroot will always be passed unquoted. We quote it here +dnl in case the user passed a directory name. +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + AC_MSG_RESULT([$with_sysroot]) + AC_MSG_ERROR([The sysroot must be an absolute path.]) + ;; +esac + + AC_MSG_RESULT([${lt_sysroot:-no}]) +_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl +[dependent libraries, and where our libraries should be installed.])]) + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test no = "$enable_libtool_lock" || enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks=$enable_libtool_lock +])# _LT_ENABLE_LOCK + + +# _LT_PROG_AR +# ----------- +m4_defun([_LT_PROG_AR], +[AC_CHECK_TOOLS(AR, [ar], false) +: ${AR=ar} +: ${AR_FLAGS=cru} +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) + +AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], + [lt_cv_ar_at_file=no + AC_COMPILE_IFELSE([AC_LANG_PROGRAM], + [echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([lt_ar_try]) + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + AC_TRY_EVAL([lt_ar_try]) + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + ]) + ]) + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi +_LT_DECL([], [archiver_list_spec], [1], + [How to feed a file listing to the archiver]) +])# _LT_PROG_AR + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[_LT_PROG_AR + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +_LT_DECL([], [lock_old_archive_extraction], [0], + [Whether to use a lock for old archive extraction]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test yes = "[$]$2"; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS +]) + +if test yes = "[$]$2"; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring=ABCD + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n "$lt_cv_sys_max_cmd_len"; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test yes = "$cross_compiling"; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +[#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test yes != "$enable_dlopen"; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen=load_add_on + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen=LoadLibrary + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[ + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen=shl_load], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen=dlopen], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS=$LDFLAGS + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS=$LIBS + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links=nottested +if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test no = "$hard_links"; then + AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/", + [Define to the sub-directory where libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then + + # We can hardcode non-existent directories. + if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && + test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test relink = "$_LT_TAGVAR(hardcode_action, $1)" || + test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP"; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_PREPARE_MUNGE_PATH_LIST +# --------------------------- +# Make sure func_munge_path_list() is defined correctly. +m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], +[[# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x@S|@2 in + x) + ;; + *:) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" + ;; + x:*) + eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" + ;; + *) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + esac +} +]])# _LT_PREPARE_PATH_LIST + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary... + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo = "/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +AC_ARG_VAR([LT_SYS_LIBRARY_PATH], +[User-defined run-time library search path.]) + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[[4-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a[(]lib.so.V[)]' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[23]].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[[3-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], + [lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [lt_cv_shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + ]) + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Add ABI-specific directories to the system library path. + sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[List of archive names. First name is the real one, the rest are links. + The last name is the one that the linker finds with -lNAME]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [install_override_mode], [1], + [Permission mode override for installation of shared libraries]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], + [Detected run-time system search path for libraries]) +_LT_DECL([], [configure_time_lt_sys_library_path], [2], + [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program that can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$1"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac]) +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program that can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PROG_ECHO_BACKSLASH])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test no = "$withval" || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], +[if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi]) +rm -f conftest.i conftest2.i conftest.out]) +])# _LT_PATH_DD + + +# _LT_CMD_TRUNCATE +# ---------------- +# find command to truncate a binary pipe +m4_defun([_LT_CMD_TRUNCATE], +[m4_require([_LT_PATH_DD]) +AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], +[printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) +_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], + [Command to truncate a binary pipe]) +])# _LT_CMD_TRUNCATE + + +# _LT_CHECK_MAGIC_METHOD +# ---------------------- +# how to check for library dependencies +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_MAGIC_METHOD], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +AC_CACHE_CHECK([how to recognize dependent libraries], +lt_cv_deplibs_check_method, +[lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# 'unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[[4-9]]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[[45]]*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method = "file_magic"]) +_LT_DECL([], [file_magic_glob], [1], + [How to find potential files when deplibs_check_method = "file_magic"]) +_LT_DECL([], [want_nocaseglob], [1], + [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM=$NM +else + lt_nm_to_check=${ac_tool_prefix}nm + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS=$lt_save_ifs + done + : ${lt_cv_path_NM=no} +fi]) +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + AC_SUBST([DUMPBIN]) + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + +# _LT_CHECK_SHAREDLIB_FROM_LINKLIB +# -------------------------------- +# how to determine the name of the shared library +# associated with a specific link library. +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +m4_require([_LT_DECL_DLLTOOL]) +AC_CACHE_CHECK([how to associate runtime and link libraries], +lt_cv_sharedlib_from_linklib_cmd, +[lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac +]) +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + +_LT_DECL([], [sharedlib_from_linklib_cmd], [1], + [Command to associate shared and link libraries]) +])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB + + +# _LT_PATH_MANIFEST_TOOL +# ---------------------- +# locate the manifest tool +m4_defun([_LT_PATH_MANIFEST_TOOL], +[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], + [lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&AS_MESSAGE_LOG_FD + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest*]) +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi +_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl +])# _LT_PATH_MANIFEST_TOOL + + +# _LT_DLL_DEF_P([FILE]) +# --------------------- +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with func_dll_def_p in the libtool script +AC_DEFUN([_LT_DLL_DEF_P], +[dnl + test DEF = "`$SED -n dnl + -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace + -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments + -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl + -e q dnl Only consider the first "real" line + $1`" dnl +])# _LT_DLL_DEF_P + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw) + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM=-lm) + ;; +esac +AC_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; + *) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; + esac + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) + if test ia64 = "$host_cpu"; then + symcode='[[ABCDEGRST]]' + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT@&t@_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1], + [Transform the output of nm into a list of symbols to manually relocate]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +_LT_DECL([nm_interface], [lt_cv_nm_interface], [1], + [The name lister interface]) +_LT_DECL([], [nm_file_list_spec], [1], + [Specify filename containing input files for $NM]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test yes = "$GXX"; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + if test ia64 != "$host_cpu"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64, which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test yes = "$GCC"; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' + if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + *Sun\ F* | *Sun*Fortran*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Intel*\ [[CF]]*Compiler*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + *Portland\ Group*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +AC_CACHE_CHECK([for $compiler option to produce PIC], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + ;; + esac + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; + *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GCC"; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + esac + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + m4_if($1, [], [ + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + _LT_LINKER_OPTION([if $CC understands -b], + _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], + [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) + ;; + esac + fi + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], + [lt_cv_irix_exported_symbol], + [save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + AC_LINK_IFELSE( + [AC_LANG_SOURCE( + [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], + [C++], [[int foo (void) { return 0; }]], + [Fortran 77], [[ + subroutine foo + end]], + [Fortran], [[ + subroutine foo + end]])])], + [lt_cv_irix_exported_symbol=yes], + [lt_cv_irix_exported_symbol=no]) + LDFLAGS=$save_LDFLAGS]) + if test yes = "$lt_cv_irix_exported_symbol"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(ld_shlibs, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + osf3*) + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $_LT_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_CACHE_CHECK([whether -lc should be explicitly linked in], + [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), + [$RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + ]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes + DIR into the resulting binary and the resulting library dependency is + "absolute", i.e impossible to change by setting $shlibpath_var if the + library is relocated]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [postlink_cmds], [2], + [Commands necessary for finishing linking programs]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +lt_save_CC=$CC +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_TAG_COMPILER +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report what library types will actually be built + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC=$lt_save_CC +])# _LT_LANG_C_CONFIG + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +if test -n "$CXX" && ( test no != "$CXX" && + ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || + (test g++ != "$CXX"))); then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_caught_CXX_error"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test yes = "$GXX"; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test yes = "$GXX"; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test yes = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='$wl' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + _LT_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GXX"; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag=$shared_flag' $wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + # The "-G" linker flag allows undefined symbols. + _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared + # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + case $host in + osf3*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require '-G' NOT '-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ + '"$_LT_TAGVAR(old_archive_cmds, $1)" + _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ + '"$_LT_TAGVAR(reload_cmds, $1)" + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no + + _LT_TAGVAR(GCC, $1)=$GXX + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test yes != "$_lt_caught_CXX_error" + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_FUNC_STRIPNAME_CNF +# ---------------------- +# func_stripname_cnf prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# +# This function is identical to the (non-XSI) version of func_stripname, +# except this one can be used by m4 code that may be executed by configure, +# rather than the libtool script. +m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl +AC_REQUIRE([_LT_DECL_SED]) +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) +func_stripname_cnf () +{ + case @S|@2 in + .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; + *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; + esac +} # func_stripname_cnf +])# _LT_FUNC_STRIPNAME_CNF + + +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +# --------------------------------- +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF +package foo +func foo() { +} +_LT_EOF +]) + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $prev$p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test x-L = "$p" || + test x-R = "$p"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test no = "$pre_test_object_deps_done"; then + case $prev in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)=$prev$p + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test no = "$pre_test_object_deps_done"; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)=$p + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)=$p + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_LANG_PUSH(Fortran 77) +if test -z "$F77" || test no = "$F77"; then + _lt_disable_F77=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_disable_F77"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${F77-"f77"} + CFLAGS=$FFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)=$G77 + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_F77" + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_LANG_PUSH(Fortran) + +if test -z "$FC" || test no = "$FC"; then + _lt_disable_FC=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_disable_FC"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${FC-"f95"} + CFLAGS=$FCFLAGS + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_FC" + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +CFLAGS=$GCJFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)=$LD +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_GO_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Go compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_GO_CONFIG], +[AC_REQUIRE([LT_PROG_GO])dnl +AC_LANG_SAVE + +# Source file extension for Go test sources. +ac_ext=go + +# Object file extension for compiled Go test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="package main; func main() { }" + +# Code to be used in simple link tests +lt_simple_link_test_code='package main; func main() { }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GOC-"gccgo"} +CFLAGS=$GOFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)=$LD +_LT_CC_BASENAME([$compiler]) + +# Go did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GO_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code=$lt_simple_compile_test_code + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +CFLAGS= +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_GO +# ---------- +AC_DEFUN([LT_PROG_GO], +[AC_CHECK_TOOL(GOC, gccgo,) +]) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + +# _LT_DECL_DLLTOOL +# ---------------- +# Ensure DLLTOOL variable is set. +m4_defun([_LT_DECL_DLLTOOL], +[AC_CHECK_TOOL(DLLTOOL, dlltool, false) +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) +AC_SUBST([DLLTOOL]) +]) + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ + +m4_defun([AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f "$lt_ac_sed" && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test 10 -lt "$lt_ac_count" && break + lt_ac_count=`expr $lt_ac_count + 1` + if test "$lt_ac_count" -gt "$lt_ac_max"; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PATH_CONVERSION_FUNCTIONS +# ----------------------------- +# Determine what file name conversion functions should be used by +# func_to_host_file (and, implicitly, by func_to_host_path). These are needed +# for certain cross-compile configurations and native mingw. +m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_MSG_CHECKING([how to convert $build file names to $host format]) +AC_CACHE_VAL(lt_cv_to_host_file_cmd, +[case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac +]) +to_host_file_cmd=$lt_cv_to_host_file_cmd +AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) +_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], + [0], [convert $build file names to $host format])dnl + +AC_MSG_CHECKING([how to convert $build file names to toolchain format]) +AC_CACHE_VAL(lt_cv_to_tool_file_cmd, +[#assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac +]) +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) +_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], + [0], [convert $build files to toolchain format])dnl +])# _LT_PATH_CONVERSION_FUNCTIONS diff -Nru gmime-2.6.22+dfsg2/m4/Makefile.in gmime-3.0.1/m4/Makefile.in --- gmime-2.6.22+dfsg2/m4/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/m4/Makefile.in 2017-05-21 16:38:03.000000000 +0000 @@ -0,0 +1,509 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = m4 +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gpgme.m4 \ + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/introspection.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/vapigen.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DB2HTML = @DB2HTML@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DOLT_BASH = @DOLT_BASH@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMIME_API_VERSION = @GMIME_API_VERSION@ +GMIME_BINARY_AGE = @GMIME_BINARY_AGE@ +GMIME_CFLAGS = @GMIME_CFLAGS@ +GMIME_INCLUDEDIR = @GMIME_INCLUDEDIR@ +GMIME_INTERFACE_AGE = @GMIME_INTERFACE_AGE@ +GMIME_LIBDIR = @GMIME_LIBDIR@ +GMIME_LIBS = @GMIME_LIBS@ +GMIME_LIBS_PRIVATE = @GMIME_LIBS_PRIVATE@ +GMIME_MAJOR_VERSION = @GMIME_MAJOR_VERSION@ +GMIME_MICRO_VERSION = @GMIME_MICRO_VERSION@ +GMIME_MINOR_VERSION = @GMIME_MINOR_VERSION@ +GMIME_VERSION = @GMIME_VERSION@ +GOBJECT_QUERY = @GOBJECT_QUERY@ +GPGME_CONFIG = @GPGME_CONFIG@ +GPGME_PTHREAD_CFLAGS = @GPGME_PTHREAD_CFLAGS@ +GPGME_PTHREAD_LIBS = @GPGME_PTHREAD_LIBS@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBIDN_CFLAGS = @LIBIDN_CFLAGS@ +LIBIDN_LIBS = @LIBIDN_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTCOMPILE = @LTCOMPILE@ +LTCXXCOMPILE = @LTCXXCOMPILE@ +LTLIBOBJS = @LTLIBOBJS@ +LTP = @LTP@ +LTP_GENHTML = @LTP_GENHTML@ +LT_AGE = @LT_AGE@ +LT_CURRENT = @LT_CURRENT@ +LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@ +LT_RELEASE = @LT_RELEASE@ +LT_REVISION = @LT_REVISION@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MV = @MV@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM = @RM@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHTOOL = @SHTOOL@ +STRIP = @STRIP@ +TAR = @TAR@ +VAPIGEN = @VAPIGEN@ +VAPIGEN_MAKEFILE = @VAPIGEN_MAKEFILE@ +VAPIGEN_VAPIDIR = @VAPIGEN_VAPIDIR@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +EXTRA_DIST = $(wildcard *.m4) +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu m4/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu m4/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff -Nru gmime-2.6.22+dfsg2/Makefile.am gmime-3.0.1/Makefile.am --- gmime-2.6.22+dfsg2/Makefile.am 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/Makefile.am 2017-04-08 17:01:14.000000000 +0000 @@ -2,13 +2,7 @@ ACLOCAL_AMFLAGS = -I m4 -SUBDIRS = m4 build util gmime - -if ENABLE_MONO -SUBDIRS += mono -endif - -SUBDIRS += tests docs +SUBDIRS = m4 build util gmime tests docs if !PLATFORM_WIN32 SUBDIRS += examples @@ -22,6 +16,7 @@ DISTCLEANFILES = iconv-detect.h gmime-$(GMIME_API_VERSION).pc config.lt doltcompile doltlibtool EXTRA_DIST = \ + README.md \ PORTING \ gmime.pc.in \ gmime.spec.in \ diff -Nru gmime-2.6.22+dfsg2/Makefile.in gmime-3.0.1/Makefile.in --- gmime-2.6.22+dfsg2/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/Makefile.in 2017-05-21 16:38:02.000000000 +0000 @@ -0,0 +1,976 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +@PLATFORM_WIN32_FALSE@am__append_1 = examples +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gpgme.m4 \ + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/introspection.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/vapigen.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(am__DIST_COMMON) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = gmime.spec gmime.pc +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(pkgconfigdir)" +DATA = $(pkgconfig_DATA) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + cscope distdir dist dist-all distcheck +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ + $(LISP)config.h.in +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +CSCOPE = cscope +DIST_SUBDIRS = m4 build util gmime tests docs examples tools . +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ + $(srcdir)/gmime.pc.in $(srcdir)/gmime.spec.in AUTHORS COPYING \ + ChangeLog INSTALL NEWS README TODO compile config.guess \ + config.rpath config.sub install-sh ltmain.sh missing +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__post_remove_distdir = $(am__remove_distdir) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +GZIP_ENV = --best +DIST_ARCHIVES = $(distdir).tar.xz +DIST_TARGETS = dist-xz +distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = -I m4 +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DB2HTML = @DB2HTML@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DOLT_BASH = @DOLT_BASH@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMIME_API_VERSION = @GMIME_API_VERSION@ +GMIME_BINARY_AGE = @GMIME_BINARY_AGE@ +GMIME_CFLAGS = @GMIME_CFLAGS@ +GMIME_INCLUDEDIR = @GMIME_INCLUDEDIR@ +GMIME_INTERFACE_AGE = @GMIME_INTERFACE_AGE@ +GMIME_LIBDIR = @GMIME_LIBDIR@ +GMIME_LIBS = @GMIME_LIBS@ +GMIME_LIBS_PRIVATE = @GMIME_LIBS_PRIVATE@ +GMIME_MAJOR_VERSION = @GMIME_MAJOR_VERSION@ +GMIME_MICRO_VERSION = @GMIME_MICRO_VERSION@ +GMIME_MINOR_VERSION = @GMIME_MINOR_VERSION@ +GMIME_VERSION = @GMIME_VERSION@ +GOBJECT_QUERY = @GOBJECT_QUERY@ +GPGME_CONFIG = @GPGME_CONFIG@ +GPGME_PTHREAD_CFLAGS = @GPGME_PTHREAD_CFLAGS@ +GPGME_PTHREAD_LIBS = @GPGME_PTHREAD_LIBS@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBIDN_CFLAGS = @LIBIDN_CFLAGS@ +LIBIDN_LIBS = @LIBIDN_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTCOMPILE = @LTCOMPILE@ +LTCXXCOMPILE = @LTCXXCOMPILE@ +LTLIBOBJS = @LTLIBOBJS@ +LTP = @LTP@ +LTP_GENHTML = @LTP_GENHTML@ +LT_AGE = @LT_AGE@ +LT_CURRENT = @LT_CURRENT@ +LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@ +LT_RELEASE = @LT_RELEASE@ +LT_REVISION = @LT_REVISION@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MV = @MV@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM = @RM@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHTOOL = @SHTOOL@ +STRIP = @STRIP@ +TAR = @TAR@ +VAPIGEN = @VAPIGEN@ +VAPIGEN_MAKEFILE = @VAPIGEN_MAKEFILE@ +VAPIGEN_VAPIDIR = @VAPIGEN_VAPIDIR@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = m4 build util gmime tests docs $(am__append_1) tools . + +# build documentation when doing distcheck +DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --enable-introspection +DISTCLEANFILES = iconv-detect.h gmime-$(GMIME_API_VERSION).pc config.lt doltcompile doltlibtool +EXTRA_DIST = \ + README.md \ + PORTING \ + gmime.pc.in \ + gmime.spec.in \ + iconv-detect.c \ + zentimer.h \ + gtk-doc.make + +BUILD_EXTRA_DIST = \ + gmime.spec + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = gmime-$(GMIME_API_VERSION).pc +all: config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +config.h: stamp-h1 + @test -f $@ || rm -f stamp-h1 + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 +gmime.spec: $(top_builddir)/config.status $(srcdir)/gmime.spec.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +gmime.pc: $(top_builddir)/config.status $(srcdir)/gmime.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool config.lt +install-pkgconfigDATA: $(pkgconfig_DATA) + @$(NORMAL_INSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ + done + +uninstall-pkgconfigDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files + +distdir: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz + $(am__post_remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__post_remove_distdir) + +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__post_remove_distdir) +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) + +dist-tarZ: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__post_remove_distdir) + +dist-shar: distdir + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz + $(am__post_remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__post_remove_distdir) + +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=../.. --prefix="$$dc_install_base" \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__post_remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-recursive +all-am: Makefile $(DATA) config.h +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(pkgconfigdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-hdr \ + distclean-libtool distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-pkgconfigDATA + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-pkgconfigDATA + +.MAKE: $(am__recursive_targets) all install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ + am--refresh check check-am clean clean-cscope clean-generic \ + clean-libtool cscope cscopelist-am ctags ctags-am dist \ + dist-all dist-bzip2 dist-gzip dist-hook dist-lzip dist-shar \ + dist-tarZ dist-xz dist-zip distcheck distclean \ + distclean-generic distclean-hdr distclean-libtool \ + distclean-tags distcleancheck distdir distuninstallcheck dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-pkgconfigDATA install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags tags-am uninstall uninstall-am \ + uninstall-pkgconfigDATA + +.PRECIOUS: Makefile + + +$(pkgconfig_DATA): config.status + +dist-hook: $(BUILD_EXTRA_DIST) + files='$(BUILD_EXTRA_DIST)'; \ + for f in $$files; do \ + if test -f $$f; then d=.; else d=$(srcdir); fi; \ + rm -f $(distdir)/$$f && cp $$d/$$f $(distdir) || exit 1; done + +gmime-$(GMIME_API_VERSION).pc: gmime.pc + -cp gmime.pc gmime-$(GMIME_API_VERSION).pc + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff -Nru gmime-2.6.22+dfsg2/missing gmime-3.0.1/missing --- gmime-2.6.22+dfsg2/missing 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/missing 2016-06-28 13:40:13.000000000 +0000 @@ -0,0 +1,215 @@ +#! /bin/sh +# Common wrapper for a few potentially missing GNU programs. + +scriptversion=2013-10-28.13; # UTC + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Originally written by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try '$0 --help' for more information" + exit 1 +fi + +case $1 in + + --is-lightweight) + # Used by our autoconf macros to check whether the available missing + # script is modern enough. + exit 0 + ;; + + --run) + # Back-compat with the calling convention used by older automake. + shift + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due +to PROGRAM being missing or too old. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal autoconf autoheader autom4te automake makeinfo + bison yacc flex lex help2man + +Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and +'g' are ignored when checking the name. + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: unknown '$1' option" + echo 1>&2 "Try '$0 --help' for more information" + exit 1 + ;; + +esac + +# Run the given program, remember its exit status. +"$@"; st=$? + +# If it succeeded, we are done. +test $st -eq 0 && exit 0 + +# Also exit now if we it failed (or wasn't found), and '--version' was +# passed; such an option is passed most likely to detect whether the +# program is present and works. +case $2 in --version|--help) exit $st;; esac + +# Exit code 63 means version mismatch. This often happens when the user +# tries to use an ancient version of a tool on a file that requires a +# minimum version. +if test $st -eq 63; then + msg="probably too old" +elif test $st -eq 127; then + # Program was missing. + msg="missing on your system" +else + # Program was found and executed, but failed. Give up. + exit $st +fi + +perl_URL=http://www.perl.org/ +flex_URL=http://flex.sourceforge.net/ +gnu_software_URL=http://www.gnu.org/software + +program_details () +{ + case $1 in + aclocal|automake) + echo "The '$1' program is part of the GNU Automake package:" + echo "<$gnu_software_URL/automake>" + echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/autoconf>" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + autoconf|autom4te|autoheader) + echo "The '$1' program is part of the GNU Autoconf package:" + echo "<$gnu_software_URL/autoconf/>" + echo "It also requires GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + esac +} + +give_advice () +{ + # Normalize program name to check for. + normalized_program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + + printf '%s\n' "'$1' is $msg." + + configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + case $normalized_program in + autoconf*) + echo "You should only need it if you modified 'configure.ac'," + echo "or m4 files included by it." + program_details 'autoconf' + ;; + autoheader*) + echo "You should only need it if you modified 'acconfig.h' or" + echo "$configure_deps." + program_details 'autoheader' + ;; + automake*) + echo "You should only need it if you modified 'Makefile.am' or" + echo "$configure_deps." + program_details 'automake' + ;; + aclocal*) + echo "You should only need it if you modified 'acinclude.m4' or" + echo "$configure_deps." + program_details 'aclocal' + ;; + autom4te*) + echo "You might have modified some maintainer files that require" + echo "the 'autom4te' program to be rebuilt." + program_details 'autom4te' + ;; + bison*|yacc*) + echo "You should only need it if you modified a '.y' file." + echo "You may want to install the GNU Bison package:" + echo "<$gnu_software_URL/bison/>" + ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; + help2man*) + echo "You should only need it if you modified a dependency" \ + "of a man page." + echo "You may want to install the GNU Help2man package:" + echo "<$gnu_software_URL/help2man/>" + ;; + makeinfo*) + echo "You should only need it if you modified a '.texi' file, or" + echo "any other file indirectly affecting the aspect of the manual." + echo "You might want to install the Texinfo package:" + echo "<$gnu_software_URL/texinfo/>" + echo "The spurious makeinfo call might also be the consequence of" + echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" + echo "want to install GNU make:" + echo "<$gnu_software_URL/make/>" + ;; + *) + echo "You might have modified some files without having the proper" + echo "tools for further handling them. Check the 'README' file, it" + echo "often tells you about the needed prerequisites for installing" + echo "this package. You may also peek at any GNU archive site, in" + echo "case some other package contains this missing '$1' program." + ;; + esac +} + +give_advice "$1" | sed -e '1s/^/WARNING: /' \ + -e '2,$s/^/ /' >&2 + +# Propagate the correct exit status (expected to be 127 for a program +# not found, 63 for a program that failed due to version mismatch). +exit $st + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff -Nru gmime-2.6.22+dfsg2/mono/AssemblyInfo.cs.in gmime-3.0.1/mono/AssemblyInfo.cs.in --- gmime-2.6.22+dfsg2/mono/AssemblyInfo.cs.in 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/mono/AssemblyInfo.cs.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; - -[assembly:AssemblyVersion("@API_VERSION@")] diff -Nru gmime-2.6.22+dfsg2/mono/CertificateCollection.custom gmime-3.0.1/mono/CertificateCollection.custom --- gmime-2.6.22+dfsg2/mono/CertificateCollection.custom 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/mono/CertificateCollection.custom 1970-01-01 00:00:00.000000000 +0000 @@ -1,243 +0,0 @@ -#region Native Methods - [DllImport("gmime")] - static extern int g_mime_certificate_list_length (IntPtr list); - - [DllImport("gmime")] - static extern void g_mime_certificate_list_clear (IntPtr list); - - [DllImport("gmime")] - static extern int g_mime_certificate_list_add (IntPtr list, IntPtr ia); - - [DllImport("gmime")] - static extern void g_mime_certificate_list_insert (IntPtr list, int index, IntPtr ia); - - [DllImport("gmime")] - static extern bool g_mime_certificate_list_remove (IntPtr list, IntPtr ia); - - [DllImport("gmime")] - static extern bool g_mime_certificate_list_remove_at (IntPtr list, int index); - - [DllImport("gmime")] - static extern bool g_mime_certificate_list_contains (IntPtr list, IntPtr ia); - - [DllImport("gmime")] - static extern int g_mime_certificate_list_index_of (IntPtr list, IntPtr ia); - - [DllImport("gmime")] - static extern IntPtr g_mime_certificate_list_get_certificate (IntPtr list, int index); - - [DllImport("gmime")] - static extern void g_mime_certificate_list_set_certificate (IntPtr list, int index, IntPtr ia); -#endregion - - Exception CannotAdd (object value) - { - if (value == null) - return new ArgumentNullException ("value"); - - string message = String.Format ("Cannot add objects of type '{0}' to a CertificateCollection.", - value.GetType ().ToString ()); - - return new InvalidOperationException (message); - } - - Exception CannotInsert (object value) - { - if (value == null) - return new ArgumentNullException ("value"); - - string message = String.Format ("Cannot insert objects of type '{0}' into a CertificateCollection.", - value.GetType ().ToString ()); - - return new InvalidOperationException (message); - } - - Exception CannotRemove (object value) - { - if (value == null) - return new ArgumentNullException ("value"); - - string message = String.Format ("Cannot remove objects of type '{0}' from a CertificateCollection.", - value.GetType ().ToString ()); - - return new InvalidOperationException (message); - } - - Exception CannotSet (object value) - { - if (value == null) - return new ArgumentNullException ("value"); - - string message = String.Format ("Cannot set objects of type '{0}' on an CertificateCollection.", - value.GetType ().ToString ()); - - return new InvalidOperationException (message); - } - - public int Count { - get { return g_mime_certificate_list_length (Handle); } - } - - public bool IsFixedSize { - get { return false; } - } - - public bool IsReadOnly { - get { return false; } - } - - public bool IsSynchronized { - get { return false; } - } - - public object SyncRoot { - get { return this; } - } - - public int Add (Certificate cert) - { - if (cert == null) - throw CannotAdd (cert); - - return g_mime_certificate_list_add (Handle, cert.Handle); - } - - int IList.Add (object value) - { - Certificate cert = value as Certificate; - - if (cert == null) - throw CannotAdd (value); - - return Add (cert); - } - - public void Clear () - { - g_mime_certificate_list_clear (Handle); - } - - public bool Contains (Certificate cert) - { - if (cert == null) - return false; - - return g_mime_certificate_list_contains (Handle, cert.Handle); - } - - bool IList.Contains (object value) - { - return Contains (value as Certificate); - } - - public void CopyTo (Array array, int index) - { - if (array == null) - throw new ArgumentNullException ("array"); - - if (index < 0) - throw new ArgumentOutOfRangeException ("index"); - - int n = Count; - - for (int i = 0; i < n; i++) - array.SetValue (((IList) this)[i], index + i); - } - - public IEnumerator GetEnumerator () - { - int n = Count; - - for (int i = 0; i < n; i++) - yield return this[i]; - - yield break; - } - - public int IndexOf (Certificate cert) - { - if (cert == null) - return -1; - - return g_mime_certificate_list_index_of (Handle, cert.Handle); - } - - int IList.IndexOf (object value) - { - return IndexOf (value as Certificate); - } - - public void Insert (int index, Certificate cert) - { - if (cert == null) - throw CannotInsert (cert); - - if (index < 0) - throw new ArgumentOutOfRangeException ("index"); - - g_mime_certificate_list_insert (Handle, index, cert.Handle); - } - - void IList.Insert (int index, object value) - { - Certificate cert = value as Certificate; - - if (cert == null) - throw CannotInsert (value); - - Insert (index, cert); - } - - public void Remove (Certificate cert) - { - if (cert == null) - throw CannotRemove (cert); - - g_mime_certificate_list_remove (Handle, cert.Handle); - } - - void IList.Remove (object value) - { - Certificate cert = value as Certificate; - - if (cert == null) - throw CannotRemove (value); - - Remove (cert); - } - - public void RemoveAt (int index) - { - if (index < 0 || index >= Count) - throw new ArgumentOutOfRangeException ("index"); - - g_mime_certificate_list_remove_at (Handle, index); - } - - public Certificate this[int index] { - get { - IntPtr raw = g_mime_certificate_list_get_certificate (Handle, index); - - if (raw == IntPtr.Zero) - return null; - - return GLib.Object.GetObject (raw) as Certificate; - } - - set { - if (value == null) - throw CannotSet (value); - - g_mime_certificate_list_set_certificate (Handle, index, value.Handle); - } - } - - object IList.this[int index] { - get { - return this[index]; - } - - set { - this[index] = value as Certificate; - } - } diff -Nru gmime-2.6.22+dfsg2/mono/DataWrapper.custom gmime-3.0.1/mono/DataWrapper.custom --- gmime-2.6.22+dfsg2/mono/DataWrapper.custom 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/mono/DataWrapper.custom 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -public StreamWrapper Stream { - get { - GMime.Stream gmime_stream = GMimeStream; - GMime.StreamFilter filtered_stream; - FilterBasic filter; - - switch (Encoding) { - case ContentEncoding.QuotedPrintable: - case ContentEncoding.UuEncode: - case ContentEncoding.Base64: - filtered_stream = new GMime.StreamFilter (gmime_stream); - filter = new FilterBasic (Encoding, false); - filtered_stream.Add (filter); - gmime_stream.Dispose (); - filter.Dispose (); - - gmime_stream = filtered_stream; - break; - default: - break; - } - - return new StreamWrapper (gmime_stream); - } -} diff -Nru gmime-2.6.22+dfsg2/mono/Global.custom gmime-3.0.1/mono/Global.custom --- gmime-2.6.22+dfsg2/mono/Global.custom 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/mono/Global.custom 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ - public enum InitFlags { - None = 0, - EnableRfc2047Workarounds = (1 << 0), - } - - [DllImport("gmime")] - static extern void g_mime_init (int flags); - - public static void Init () - { - g_mime_init (0); - } - - public static void Init (InitFlags flags) - { - g_mime_init ((int) flags); - } - - [DllImport("gmime")] - static extern void g_mime_shutdown (); - - public static void Shutdown () - { - g_mime_shutdown (); - } diff -Nru gmime-2.6.22+dfsg2/mono/gmime-api.raw gmime-3.0.1/mono/gmime-api.raw --- gmime-2.6.22+dfsg2/mono/gmime-api.raw 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/mono/gmime-api.raw 1970-01-01 00:00:00.000000000 +0000 @@ -1,3357 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru gmime-2.6.22+dfsg2/mono/GMime.metadata gmime-3.0.1/mono/GMime.metadata --- gmime-2.6.22+dfsg2/mono/GMime.metadata 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/mono/GMime.metadata 1970-01-01 00:00:00.000000000 +0000 @@ -1,396 +0,0 @@ - - - - guint32 - guint32 - guint32 - guint32* - - - gint32 - - - - - GetUserCharsets - GetCharset - GetLanguage - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GetCreationDate - SetCreationDate - GetExpirationDate - SetExpirationDate - - - - CertificateCollection - - - - - - - - - - - - - - - - - - - - GetCreationDate - SetCreationDate - GetExpirationDate - SetExpirationDate - - - - SignatureCollection - - - - - - - - - - - - - - - - - - - - - - - GetGMimeStream - SetGMimeStream - - - const-guint8* - true - n_inbuf - guint8* - true - guint8* - true - ref - ref - yEncodeClose - yEncodeStep - yDecodeStep - const-guint8* - true - n_inbuf - guint8* - true - ref - ref - ref - const-guint8* - true - n_inbuf - guint8* - true - ref - ref - ref - /api/namespace/struct[@name='Encoding'] - /api/namespace/struct[@name='Encoding'] - /api/namespace/struct[@name='Encoding'] - - - SevenBit - EightBit - - Default - SevenBit - EightBit - Binary - Base64 - QuotedPrintable - UuEncode - - 0 - 1 - 2 - - None - ExpiredSignature - NoPublicKey - ExpiredSignatureKey - RevokedSignatureKey - UnsupportedAlgorithm - - - 1 - ApplyFilter - const-guint8* - true - n_inbuf - guint8** - true - buf - const-guint8* - true - n_buf - - - GetBestCharset - GetBestEncoding - - - call - - - call - - - - - - - - - - - - - true - true - - - - call - - - - void - MoveFirst - MoveLast - MoveNext - MovePrev - true - - - - - - - - - - - - - - LocaleToUtf8 - Utf8ToLocale - - - 1 - - - - - - - GetAddress - SetAddress - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - - - - - - true - n_partials - - - - - - - - - - - - - - - - - - - - - - - out - - - - - Entity - - - - - - - - - - - - - - - - - - - - - - call - true - true - - - - - - - - - - - - - true - Parse - - - - - - - - 1 - GetLength - const-guint8* - true - const-guint8* - true - Write - - - - true - - - - - - true - - - - - - const-guint8* - true - n_text - - - - true - - diff -Nru gmime-2.6.22+dfsg2/mono/gmime-sharp.dll.config.in gmime-3.0.1/mono/gmime-sharp.dll.config.in --- gmime-2.6.22+dfsg2/mono/gmime-sharp.dll.config.in 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/mono/gmime-sharp.dll.config.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru gmime-2.6.22+dfsg2/mono/gmime-sharp.pc.in gmime-3.0.1/mono/gmime-sharp.pc.in --- gmime-2.6.22+dfsg2/mono/gmime-sharp.pc.in 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/mono/gmime-sharp.pc.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -prefix=${pcfiledir}/../.. -exec_prefix=${prefix} -libdir=${exec_prefix}/lib -gapidir=${prefix}/share/gapi-2.0 - -Name: gmime-sharp -Version: @VERSION@ -Description: .NET bindings for GMime -Cflags: -I:${gapidir}/gmime-api.xml -Libs: -r:${libdir}/mono/gmime-sharp-@GMIME_API_VERSION@/gmime-sharp.dll -Requires: glib-sharp-2.0 Binary files /tmp/tmpIS_RQQ/UDbh1D_L26/gmime-2.6.22+dfsg2/mono/gmime-sharp.snk and /tmp/tmpIS_RQQ/lUbmpdA4HT/gmime-3.0.1/mono/gmime-sharp.snk differ diff -Nru gmime-2.6.22+dfsg2/mono/Header.cs gmime-3.0.1/mono/Header.cs --- gmime-2.6.22+dfsg2/mono/Header.cs 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/mono/Header.cs 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -using System; - -namespace GMime { - public class Header { - public Header () { } - - public Header (string name, string value) - { - Value = value; - Name = name; - } - - public string Name { - get; set; - } - - public string Value { - get; set; - } - } -} diff -Nru gmime-2.6.22+dfsg2/mono/HeaderEnumerator.cs gmime-3.0.1/mono/HeaderEnumerator.cs --- gmime-2.6.22+dfsg2/mono/HeaderEnumerator.cs 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/mono/HeaderEnumerator.cs 1970-01-01 00:00:00.000000000 +0000 @@ -1,113 +0,0 @@ -using System; -using System.Collections; - -namespace GMime { - public class HeaderEnumerator : IEnumerator, IDisposable { - bool premove = true; - HeaderList headers; - HeaderIter iter; - - public HeaderEnumerator (HeaderList headers) - { - if (headers == null) - throw new ArgumentNullException ("headers"); - - iter = headers.GetIter (); - this.headers = headers; - } - - public Header Current { - get { - CheckDisposed (); - return new Header (iter.Name, iter.Value); - } - } - - object IEnumerator.Current { - get { return Current; } - } - - public string Name { - get { - CheckDisposed (); - return iter.Name; - } - } - - public string Value { - set { - CheckDisposed (); - iter.Value = value; - } - - get { - CheckDisposed (); - return iter.Value; - } - } - - public bool MoveFirst () - { - CheckDisposed (); - - premove = false; - return iter.MoveFirst (); - } - - public bool MoveLast () - { - CheckDisposed (); - - premove = false; - return iter.MoveLast (); - } - - public bool MoveNext () - { - CheckDisposed (); - - if (premove) { - premove = false; - return iter.MoveFirst (); - } - - return iter.MoveNext (); - } - - public bool MovePrev () - { - CheckDisposed (); - - if (premove) - return false; - - premove = false; - return iter.MovePrev (); - } - - public bool Remove () - { - CheckDisposed (); - return iter.Remove (); - } - - public void Reset () - { - CheckDisposed (); - iter.MoveFirst (); - premove = true; - } - - void CheckDisposed () - { - if (headers == null) - throw new ObjectDisposedException ("The HeaderEnumerator has been disposed."); - } - - public void Dispose () - { - headers = null; - iter = null; - } - } -} diff -Nru gmime-2.6.22+dfsg2/mono/HeaderList.custom gmime-3.0.1/mono/HeaderList.custom --- gmime-2.6.22+dfsg2/mono/HeaderList.custom 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/mono/HeaderList.custom 1970-01-01 00:00:00.000000000 +0000 @@ -1,56 +0,0 @@ - [DllImport ("gmime")] - static extern IntPtr g_mime_header_list_set (IntPtr raw, IntPtr name, IntPtr value); - - [DllImport ("gmime")] - static extern IntPtr g_mime_header_list_get (IntPtr raw, IntPtr name); - - public string this[string name] { - get { - if (name == null) - throw new ArgumentNullException ("name"); - - IntPtr native_name = GLib.Marshaller.StringToPtrGStrdup (name); - IntPtr raw_ret = g_mime_header_list_get (Handle, native_name); - string ret = GLib.Marshaller.Utf8PtrToString (raw_ret); - GLib.Marshaller.Free (native_name); - - return ret; - } - - set { - if (name == null) - throw new ArgumentNullException ("name"); - - IntPtr native_name = GLib.Marshaller.StringToPtrGStrdup (name); - IntPtr native_value = GLib.Marshaller.StringToPtrGStrdup (value); - g_mime_header_list_set (Handle, native_name, native_value); - GLib.Marshaller.Free (native_value); - GLib.Marshaller.Free (native_name); - } - } - - [DllImport ("gmime")] - static extern bool g_mime_header_list_get_iter (IntPtr raw, IntPtr iter); - - internal HeaderIter GetIter () - { - HeaderIter iter = new HeaderIter (); - - g_mime_header_list_get_iter (Handle, iter.Handle); - - return iter; - } - - public IEnumerator GetEnumerator () - { - return new HeaderEnumerator (this); - } - - public StreamWrapper Stream { - get { - GMime.StreamMem mem_stream = new GMime.StreamMem (); - this.WriteToStream (mem_stream); - mem_stream.Seek (0); - return new StreamWrapper (mem_stream); - } - } diff -Nru gmime-2.6.22+dfsg2/mono/InternetAddress.custom gmime-3.0.1/mono/InternetAddress.custom --- gmime-2.6.22+dfsg2/mono/InternetAddress.custom 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/mono/InternetAddress.custom 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ - public override string ToString () - { - return ToString (false); - } diff -Nru gmime-2.6.22+dfsg2/mono/InternetAddressList.custom gmime-3.0.1/mono/InternetAddressList.custom --- gmime-2.6.22+dfsg2/mono/InternetAddressList.custom 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/mono/InternetAddressList.custom 1970-01-01 00:00:00.000000000 +0000 @@ -1,281 +0,0 @@ -#region Native Methods - [DllImport("gmime")] - static extern int internet_address_list_length (IntPtr list); - - [DllImport("gmime")] - static extern void internet_address_list_clear (IntPtr list); - - [DllImport("gmime")] - static extern int internet_address_list_add (IntPtr list, IntPtr ia); - - //[DllImport("gmime")] - //static extern void internet_address_list_concat (IntPtr list, IntPtr concat); - - [DllImport("gmime")] - static extern void internet_address_list_insert (IntPtr list, int index, IntPtr ia); - - [DllImport("gmime")] - static extern bool internet_address_list_remove (IntPtr list, IntPtr ia); - - [DllImport("gmime")] - static extern bool internet_address_list_remove_at (IntPtr list, int index); - - [DllImport("gmime")] - static extern bool internet_address_list_contains (IntPtr list, IntPtr ia); - - [DllImport("gmime")] - static extern int internet_address_list_index_of (IntPtr list, IntPtr ia); - - [DllImport("gmime")] - static extern IntPtr internet_address_list_get_address (IntPtr list, int index); - - [DllImport("gmime")] - static extern void internet_address_list_set_address (IntPtr list, int index, IntPtr ia); - - [DllImport("gmime")] - static extern IntPtr internet_address_list_to_string (IntPtr list, bool encode); - - [DllImport("gmime")] - static extern IntPtr internet_address_list_parse_string (IntPtr str); -#endregion - - Exception CannotAdd (object value) - { - if (value == null) - return new ArgumentNullException ("value"); - - string message = String.Format ("Cannot add objects of type '{0}' to an InternetAddressList.", - value.GetType ().ToString ()); - - return new InvalidOperationException (message); - } - - Exception CannotInsert (object value) - { - if (value == null) - return new ArgumentNullException ("value"); - - string message = String.Format ("Cannot insert objects of type '{0}' into an InternetAddressList.", - value.GetType ().ToString ()); - - return new InvalidOperationException (message); - } - - Exception CannotRemove (object value) - { - if (value == null) - return new ArgumentNullException ("value"); - - string message = String.Format ("Cannot remove objects of type '{0}' from an InternetAddressList.", - value.GetType ().ToString ()); - - return new InvalidOperationException (message); - } - - Exception CannotSet (object value) - { - if (value == null) - return new ArgumentNullException ("value"); - - string message = String.Format ("Cannot set objects of type '{0}' on an InternetAddressList.", - value.GetType ().ToString ()); - - return new InvalidOperationException (message); - } - - public int Count { - get { return internet_address_list_length (Handle); } - } - - public bool IsFixedSize { - get { return false; } - } - - public bool IsReadOnly { - get { return false; } - } - - public bool IsSynchronized { - get { return false; } - } - - public object SyncRoot { - get { return this; } - } - - public int Add (InternetAddress addr) - { - if (addr == null) - throw CannotAdd (addr); - - return internet_address_list_add (Handle, addr.Handle); - } - - int IList.Add (object value) - { - InternetAddress addr = value as InternetAddress; - - if (addr == null) - throw CannotAdd (value); - - return Add (addr); - } - - public void Clear () - { - internet_address_list_clear (Handle); - } - - public bool Contains (InternetAddress addr) - { - if (addr == null) - return false; - - return internet_address_list_contains (Handle, addr.Handle); - } - - bool IList.Contains (object value) - { - return Contains (value as InternetAddress); - } - - public void CopyTo (Array array, int index) - { - if (array == null) - throw new ArgumentNullException ("array"); - - if (index < 0) - throw new ArgumentOutOfRangeException ("index"); - - int n = Count; - - for (int i = 0; i < n; i++) - array.SetValue (((IList) this)[i], index + i); - } - - public IEnumerator GetEnumerator () - { - int n = Count; - - for (int i = 0; i < n; i++) - yield return this[i]; - - yield break; - } - - public int IndexOf (InternetAddress addr) - { - if (addr == null) - return -1; - - return internet_address_list_index_of (Handle, addr.Handle); - } - - int IList.IndexOf (object value) - { - return IndexOf (value as InternetAddress); - } - - public void Insert (int index, InternetAddress addr) - { - if (addr == null) - throw CannotInsert (addr); - - if (index < 0) - throw new ArgumentOutOfRangeException ("index"); - - internet_address_list_insert (Handle, index, addr.Handle); - } - - void IList.Insert (int index, object value) - { - InternetAddress addr = value as InternetAddress; - - if (addr == null) - throw CannotInsert (value); - - Insert (index, addr); - } - - public void Remove (InternetAddress addr) - { - if (addr == null) - throw CannotRemove (addr); - - internet_address_list_remove (Handle, addr.Handle); - } - - void IList.Remove (object value) - { - InternetAddress addr = value as InternetAddress; - - if (addr == null) - throw CannotRemove (value); - - Remove (addr); - } - - public void RemoveAt (int index) - { - if (index < 0 || index >= Count) - throw new ArgumentOutOfRangeException ("index"); - - internet_address_list_remove_at (Handle, index); - } - - public InternetAddress this[int index] { - get { - IntPtr raw = internet_address_list_get_address (Handle, index); - - if (raw == IntPtr.Zero) - return null; - - return GLib.Object.GetObject (raw) as InternetAddress; - } - - set { - if (value == null) - throw CannotSet (value); - - internet_address_list_set_address (Handle, index, value.Handle); - } - } - - object IList.this[int index] { - get { - return this[index]; - } - - set { - this[index] = value as InternetAddress; - } - } - - public static InternetAddressList Parse (string str) - { - IntPtr native_str = GLib.Marshaller.StringToPtrGStrdup (str); - IntPtr raw = internet_address_list_parse_string (native_str); - InternetAddressList list = null; - - if (raw != IntPtr.Zero) - list = new InternetAddressList (raw); - - GLib.Marshaller.Free (native_str); - - return list; - } - - public string ToString (bool encode) - { - IntPtr raw = internet_address_list_to_string (Handle, encode); - - if (raw == IntPtr.Zero) - return String.Empty; - - return GLib.Marshaller.PtrToStringGFree (raw); - } - - public override string ToString () - { - return ToString (false); - } diff -Nru gmime-2.6.22+dfsg2/mono/Makefile.am gmime-3.0.1/mono/Makefile.am --- gmime-2.6.22+dfsg2/mono/Makefile.am 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/mono/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,120 +0,0 @@ -API = gmime-api.xml -SNK = gmime-sharp.snk -RAW_API = gmime-api.raw -METADATA = GMime.metadata -ASSEMBLY_NAME = gmime-sharp -references = $(GLIB_SHARP_LIBS) -SOURCES_XML = sources.xml - -PACKAGE_SHARP = $(PACKAGE)-sharp-$(GMIME_API_VERSION) -ASSEMBLY = $(ASSEMBLY_NAME).dll -TARGET = $(ASSEMBLY) $(ASSEMBLY).config -TARGET_API = $(API) -noinst_DATA = $(API) $(ASSEMBLY) $(ASSEMBLY).config -CLEANFILES = $(ASSEMBLY) generated-stamp generated/*.cs $(API) -DISTCLEANFILES = $(ASSEMBLY).config AssemblyInfo.cs gmime-sharp-$(GMIME_API_VERSION).pc -GACUTIL_DESTDIR_FLAGS = -package $(PACKAGE_SHARP) -root $(DESTDIR)$(gacdir) -GACUTIL_FLAGS = -package $(PACKAGE_SHARP) -gacdir $(gacdir) - -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = $(PACKAGE_SHARP).pc -gapidir = $(datadir)/gapi-2.0 -gapi_DATA = $(TARGET_API) - -sources = \ - StreamWrapper.cs \ - HeaderEnumerator.cs \ - Header.cs - -build_sources = \ - $(srcdir)/StreamWrapper.cs \ - $(srcdir)/HeaderEnumerator.cs \ - $(srcdir)/Header.cs \ - AssemblyInfo.cs - -customs = \ - CertificateCollection.custom \ - DataWrapper.custom \ - Global.custom \ - HeaderList.custom \ - InternetAddress.custom \ - InternetAddressList.custom \ - Message.custom \ - Multipart.custom \ - Object.custom \ - SignatureCollection.custom \ - Stream.custom - -build_customs = \ - $(srcdir)/CertificateCollection.custom \ - $(srcdir)/DataWrapper.custom \ - $(srcdir)/Global.custom \ - $(srcdir)/HeaderList.custom \ - $(srcdir)/InternetAddress.custom \ - $(srcdir)/InternetAddressList.custom \ - $(srcdir)/Message.custom \ - $(srcdir)/Multipart.custom \ - $(srcdir)/Object.custom \ - $(srcdir)/SignatureCollection.custom \ - $(srcdir)/Stream.custom - -EXTRA_DIST = \ - $(ASSEMBLY).config.in \ - AssemblyInfo.cs.in \ - $(SNK) \ - $(METADATA) \ - $(RAW_API) \ - $(customs) \ - $(sources) \ - $(SOURCES_XML) \ - gmime-sharp.pc.in - -$(PACKAGE_SHARP).pc: gmime-sharp.pc - -cp gmime-sharp.pc $(PACKAGE_SHARP).pc - -$(API): $(srcdir)/$(RAW_API) $(srcdir)/$(METADATA) - cp $(srcdir)/$(RAW_API) $(API) - chmod u+w $(API) - $(GAPI_FIXUP) --api=$(API) --metadata=$(srcdir)/$(METADATA) - -generated-stamp: $(API) $(build_customs) - rm -f generated/* && \ - $(GAPI_CODEGEN) --generate $(API) --outdir=generated --customdir=$(srcdir) --assembly-name=$(ASSEMBLY_NAME) \ - && touch generated-stamp - -if PLATFORM_WIN32 -GAPI_CDECL_INSERT=$(top_srcdir)/gapi-cdecl-insert --keyfile=$(SNK) $(ASSEMBLY) -else -GAPI_CDECL_INSERT= -endif - -$(ASSEMBLY): $(build_sources) generated-stamp $(srcdir)/$(ASSEMBLY_NAME).snk - $(CSC) -unsafe /out:$(ASSEMBLY) /target:library $(references) \ - -keyfile:$(srcdir)/$(ASSEMBLY_NAME).snk $(build_sources) generated/*.cs - $(GAPI_CDECL_INSERT) - sn -q -R $(ASSEMBLY) $(srcdir)/$(SNK) - -install-data-local: - @if test -n '$(TARGET)'; then \ - if test -n '$(DESTDIR)'; then \ - echo "$(GACUTIL) -i $(ASSEMBLY) -f $(GACUTIL_DESTDIR_FLAGS)"; \ - $(GACUTIL) -i $(ASSEMBLY) -f $(GACUTIL_DESTDIR_FLAGS) || exit 1; \ - else \ - echo "$(GACUTIL) -i $(ASSEMBLY) -f $(GACUTIL_FLAGS)"; \ - $(GACUTIL) -i $(ASSEMBLY) -f $(GACUTIL_FLAGS) || exit 1; \ - fi; \ - fi - -uninstall-local: - @if test -n '$(TARGET)'; then \ - if test -n '$(DESTDIR)'; then \ - echo "$(GACUTIL) -u $(ASSEMBLY_NAME) $(GACUTIL_DESTDIR_FLAGS)"; \ - $(GACUTIL) -u $(ASSEMBLY_NAME) $(GACUTIL_DESTDIR_FLAGS) || exit 1; \ - else \ - echo "$(GACUTIL) -u $(ASSEMBLY_NAME) $(GACUTIL_FLAGS)"; \ - $(GACUTIL) -u $(ASSEMBLY_NAME) $(GACUTIL_FLAGS) || exit 1; \ - fi; \ - fi - -parse: - $(GAPI_PARSER) $(SOURCES_XML) diff -Nru gmime-2.6.22+dfsg2/mono/Message.custom gmime-3.0.1/mono/Message.custom --- gmime-2.6.22+dfsg2/mono/Message.custom 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/mono/Message.custom 1970-01-01 00:00:00.000000000 +0000 @@ -1,87 +0,0 @@ - [DllImport ("gmime")] - static extern IntPtr g_mime_message_get_recipients (IntPtr message, int type); - - public InternetAddressList GetRecipients (GMime.RecipientType type) - { - IntPtr list = g_mime_message_get_recipients (Handle, (int) type); - - return new InternetAddressList (list); - } - - public InternetAddressList To { - get { return GetRecipients (RecipientType.To); } - } - - public InternetAddressList Cc { - get { return GetRecipients (RecipientType.Cc); } - } - - public InternetAddressList Bcc { - get { return GetRecipients (RecipientType.Bcc); } - } - - public System.Collections.IEnumerable References { - get { - GMime.HeaderList headers = HeaderList; - - if (headers == null) - yield break; - - string references = headers["References"]; - - if (references == null) - yield break; - - GMime.References refs = GMime.References.Parse (references); - GMime.References iter = refs; - - while (iter != null) { - yield return iter; - iter = iter.Next; - } - - yield break; - } - } - - [DllImport("gmime")] - static extern IntPtr internet_address_list_to_string (IntPtr list, bool encode); - - public string GetRecipientsAsString (GMime.RecipientType type, bool encode) - { - IntPtr list = g_mime_message_get_recipients (Handle, (int) type); - IntPtr str; - - if (list == IntPtr.Zero) - return null; - - str = internet_address_list_to_string (list, encode); - - return GLib.Marshaller.PtrToStringGFree (str); - } - - public string GetRecipientsAsString (GMime.RecipientType type) - { - return GetRecipientsAsString (type, false); - } - - [DllImport("gmime")] - static extern void g_mime_message_get_date (IntPtr message, out IntPtr date, out int gmt_offset); - - [DllImport("gmime")] - static extern void g_mime_message_set_date (IntPtr message, IntPtr date, int gmt_offset); - - public DateTime Date { - get { - int tz_offset; - IntPtr date; - - g_mime_message_get_date (Handle, out date, out tz_offset); - - return GLib.Marshaller.time_tToDateTime (date); - } - - set { - g_mime_message_set_date (Handle, GLib.Marshaller.DateTimeTotime_t (value), 0); - } - } diff -Nru gmime-2.6.22+dfsg2/mono/Multipart.custom gmime-3.0.1/mono/Multipart.custom --- gmime-2.6.22+dfsg2/mono/Multipart.custom 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/mono/Multipart.custom 1970-01-01 00:00:00.000000000 +0000 @@ -1,248 +0,0 @@ -#region Native Methods - [DllImport("gmime")] - static extern int g_mime_multipart_get_count (IntPtr multipart); - - [DllImport("gmime")] - static extern void g_mime_multipart_clear (IntPtr multipart); - - [DllImport("gmime")] - static extern int g_mime_multipart_add (IntPtr multipart, IntPtr part); - - [DllImport("gmime")] - static extern void g_mime_multipart_insert (IntPtr multipart, int index, IntPtr part); - - [DllImport("gmime")] - static extern bool g_mime_multipart_remove (IntPtr multipart, IntPtr part); - - [DllImport("gmime")] - static extern bool g_mime_multipart_remove_at (IntPtr multipart, int index); - - [DllImport("gmime")] - static extern bool g_mime_multipart_contains (IntPtr multipart, IntPtr part); - - [DllImport("gmime")] - static extern int g_mime_multipart_index_of (IntPtr multipart, IntPtr part); - - [DllImport("gmime")] - static extern IntPtr g_mime_multipart_get_part (IntPtr multipart, int index); -#endregion - - Exception CannotAdd (object value) - { - if (value == null) - return new ArgumentNullException ("value"); - - string message = String.Format ("Cannot add objects of type '{0}' to a GMime.Multipart.", - value.GetType ().ToString ()); - - return new InvalidOperationException (message); - } - - Exception CannotInsert (object value) - { - if (value == null) - return new ArgumentNullException ("value"); - - string message = String.Format ("Cannot insert objects of type '{0}' into a GMime.Multipart.", - value.GetType ().ToString ()); - - return new InvalidOperationException (message); - } - - Exception CannotRemove (object value) - { - if (value == null) - return new ArgumentNullException ("value"); - - string message = String.Format ("Cannot remove objects of type '{0}' from a GMime.Multipart.", - value.GetType ().ToString ()); - - return new InvalidOperationException (message); - } - - Exception CannotSet (object value) - { - if (value == null) - return new ArgumentNullException ("value"); - - string message = String.Format ("Cannot set objects of type '{0}' on a GMime.Multipart.", - value.GetType ().ToString ()); - - return new InvalidOperationException (message); - } - - public int Count { - get { return g_mime_multipart_get_count (Handle); } - } - - public bool IsFixedSize { - get { return false; } - } - - public bool IsReadOnly { - get { return false; } - } - - public bool IsSynchronized { - get { return false; } - } - - public object SyncRoot { - get { return this; } - } - - public int Add (GMime.Entity part) - { - if (part == null) - throw CannotAdd (part); - - return g_mime_multipart_add (Handle, part.Handle); - } - - int IList.Add (object value) - { - GMime.Entity part = value as GMime.Entity; - - if (part == null) - throw CannotAdd (value); - - return Add (part); - } - - public void Clear () - { - g_mime_multipart_clear (Handle); - } - - public bool Contains (GMime.Entity part) - { - if (part == null) - return false; - - return g_mime_multipart_contains (Handle, part.Handle); - } - - bool IList.Contains (object value) - { - return Contains (value as GMime.Entity); - } - - public void CopyTo (Array array, int index) - { - if (array == null) - throw new ArgumentNullException ("array"); - - if (index < 0) - throw new ArgumentOutOfRangeException ("index"); - - int n = Count; - - for (int i = 0; i < n; i++) - array.SetValue (((IList) this)[i], index + i); - } - - public IEnumerator GetEnumerator () - { - int n = Count; - - for (int i = 0; i < n; i++) - yield return this[i]; - - yield break; - } - - public int IndexOf (GMime.Entity part) - { - if (part == null) - return -1; - - return g_mime_multipart_index_of (Handle, part.Handle); - } - - int IList.IndexOf (object value) - { - return IndexOf (value as GMime.Entity); - } - - public void Insert (int index, GMime.Entity part) - { - if (part == null) - throw CannotInsert (part); - - if (index < 0) - throw new ArgumentOutOfRangeException ("index"); - - g_mime_multipart_insert (Handle, index, part.Handle); - } - - void IList.Insert (int index, object value) - { - GMime.Entity part = value as GMime.Entity; - - if (part == null) - throw CannotInsert (value); - - Insert (index, part); - } - - public void Remove (GMime.Entity part) - { - if (part == null) - throw CannotRemove (part); - - g_mime_multipart_remove (Handle, part.Handle); - } - - void IList.Remove (object value) - { - GMime.Entity part = value as GMime.Entity; - - if (part == null) - throw CannotRemove (value); - - Remove (part); - } - - public void RemoveAt (int index) - { - if (index < 0 || index >= Count) - throw new ArgumentOutOfRangeException ("index"); - - g_mime_multipart_remove_at (Handle, index); - } - - public GMime.Entity this[int index] { - get { - IntPtr raw = g_mime_multipart_get_part (Handle, index); - - if (raw == IntPtr.Zero) - return null; - - return GLib.Object.GetObject (raw) as GMime.Entity; - } - - set { - if (value == null) - throw CannotSet (value); - - if (index > Count || index < Count) - throw new ArgumentOutOfRangeException ("index"); - - if (index < Count) { - RemoveAt (index); - Insert (index, value); - } else { - Add (value); - } - } - } - - object IList.this[int index] { - get { - return this[index]; - } - - set { - this[index] = value as GMime.Entity; - } - } diff -Nru gmime-2.6.22+dfsg2/mono/Object.custom gmime-3.0.1/mono/Object.custom --- gmime-2.6.22+dfsg2/mono/Object.custom 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/mono/Object.custom 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ -public StreamWrapper Stream { - get { - GMime.StreamMem mem_stream = new GMime.StreamMem (); - this.WriteToStream (mem_stream); - mem_stream.Seek (0); - return new StreamWrapper (mem_stream); - } -} diff -Nru gmime-2.6.22+dfsg2/mono/SignatureCollection.custom gmime-3.0.1/mono/SignatureCollection.custom --- gmime-2.6.22+dfsg2/mono/SignatureCollection.custom 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/mono/SignatureCollection.custom 1970-01-01 00:00:00.000000000 +0000 @@ -1,243 +0,0 @@ -#region Native Methods - [DllImport("gmime")] - static extern int g_mime_signature_list_length (IntPtr list); - - [DllImport("gmime")] - static extern void g_mime_signature_list_clear (IntPtr list); - - [DllImport("gmime")] - static extern int g_mime_signature_list_add (IntPtr list, IntPtr ia); - - [DllImport("gmime")] - static extern void g_mime_signature_list_insert (IntPtr list, int index, IntPtr ia); - - [DllImport("gmime")] - static extern bool g_mime_signature_list_remove (IntPtr list, IntPtr ia); - - [DllImport("gmime")] - static extern bool g_mime_signature_list_remove_at (IntPtr list, int index); - - [DllImport("gmime")] - static extern bool g_mime_signature_list_contains (IntPtr list, IntPtr ia); - - [DllImport("gmime")] - static extern int g_mime_signature_list_index_of (IntPtr list, IntPtr ia); - - [DllImport("gmime")] - static extern IntPtr g_mime_signature_list_get_signature (IntPtr list, int index); - - [DllImport("gmime")] - static extern void g_mime_signature_list_set_signature (IntPtr list, int index, IntPtr ia); -#endregion - - Exception CannotAdd (object value) - { - if (value == null) - return new ArgumentNullException ("value"); - - string message = String.Format ("Cannot add objects of type '{0}' to a SignatureCollection.", - value.GetType ().ToString ()); - - return new InvalidOperationException (message); - } - - Exception CannotInsert (object value) - { - if (value == null) - return new ArgumentNullException ("value"); - - string message = String.Format ("Cannot insert objects of type '{0}' into a SignatureCollection.", - value.GetType ().ToString ()); - - return new InvalidOperationException (message); - } - - Exception CannotRemove (object value) - { - if (value == null) - return new ArgumentNullException ("value"); - - string message = String.Format ("Cannot remove objects of type '{0}' from a SignatureCollection.", - value.GetType ().ToString ()); - - return new InvalidOperationException (message); - } - - Exception CannotSet (object value) - { - if (value == null) - return new ArgumentNullException ("value"); - - string message = String.Format ("Cannot set objects of type '{0}' on an SignatureCollection.", - value.GetType ().ToString ()); - - return new InvalidOperationException (message); - } - - public int Count { - get { return g_mime_signature_list_length (Handle); } - } - - public bool IsFixedSize { - get { return false; } - } - - public bool IsReadOnly { - get { return false; } - } - - public bool IsSynchronized { - get { return false; } - } - - public object SyncRoot { - get { return this; } - } - - public int Add (Signature signature) - { - if (signature == null) - throw CannotAdd (signature); - - return g_mime_signature_list_add (Handle, signature.Handle); - } - - int IList.Add (object value) - { - Signature signature = value as Signature; - - if (signature == null) - throw CannotAdd (value); - - return Add (signature); - } - - public void Clear () - { - g_mime_signature_list_clear (Handle); - } - - public bool Contains (Signature signature) - { - if (signature == null) - return false; - - return g_mime_signature_list_contains (Handle, signature.Handle); - } - - bool IList.Contains (object value) - { - return Contains (value as Signature); - } - - public void CopyTo (Array array, int index) - { - if (array == null) - throw new ArgumentNullException ("array"); - - if (index < 0) - throw new ArgumentOutOfRangeException ("index"); - - int n = Count; - - for (int i = 0; i < n; i++) - array.SetValue (((IList) this)[i], index + i); - } - - public IEnumerator GetEnumerator () - { - int n = Count; - - for (int i = 0; i < n; i++) - yield return this[i]; - - yield break; - } - - public int IndexOf (Signature signature) - { - if (signature == null) - return -1; - - return g_mime_signature_list_index_of (Handle, signature.Handle); - } - - int IList.IndexOf (object value) - { - return IndexOf (value as Signature); - } - - public void Insert (int index, Signature signature) - { - if (signature == null) - throw CannotInsert (signature); - - if (index < 0) - throw new ArgumentOutOfRangeException ("index"); - - g_mime_signature_list_insert (Handle, index, signature.Handle); - } - - void IList.Insert (int index, object value) - { - Signature signature = value as Signature; - - if (signature == null) - throw CannotInsert (value); - - Insert (index, signature); - } - - public void Remove (Signature signature) - { - if (signature == null) - throw CannotRemove (signature); - - g_mime_signature_list_remove (Handle, signature.Handle); - } - - void IList.Remove (object value) - { - Signature signature = value as Signature; - - if (signature == null) - throw CannotRemove (value); - - Remove (signature); - } - - public void RemoveAt (int index) - { - if (index < 0 || index >= Count) - throw new ArgumentOutOfRangeException ("index"); - - g_mime_signature_list_remove_at (Handle, index); - } - - public Signature this[int index] { - get { - IntPtr raw = g_mime_signature_list_get_signature (Handle, index); - - if (raw == IntPtr.Zero) - return null; - - return GLib.Object.GetObject (raw) as Signature; - } - - set { - if (value == null) - throw CannotSet (value); - - g_mime_signature_list_set_signature (Handle, index, value.Handle); - } - } - - object IList.this[int index] { - get { - return this[index]; - } - - set { - this[index] = value as Signature; - } - } diff -Nru gmime-2.6.22+dfsg2/mono/sources.xml gmime-3.0.1/mono/sources.xml --- gmime-2.6.22+dfsg2/mono/sources.xml 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/mono/sources.xml 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ - - - - - ../gmime - - - - diff -Nru gmime-2.6.22+dfsg2/mono/Stream.custom gmime-3.0.1/mono/Stream.custom --- gmime-2.6.22+dfsg2/mono/Stream.custom 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/mono/Stream.custom 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -public long Seek (long offset) -{ - return this.Seek (offset, GMime.SeekWhence.Set); -} diff -Nru gmime-2.6.22+dfsg2/mono/StreamWrapper.cs gmime-3.0.1/mono/StreamWrapper.cs --- gmime-2.6.22+dfsg2/mono/StreamWrapper.cs 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/mono/StreamWrapper.cs 1970-01-01 00:00:00.000000000 +0000 @@ -1,187 +0,0 @@ -using System; -using System.IO; - -namespace GMime { - public class StreamWrapper : System.IO.Stream, IDisposable { - GMime.Stream stream; - - public StreamWrapper (GMime.Stream stream) - { - if (stream == null) - throw new ArgumentNullException (); - - this.stream = stream; - } - - ~StreamWrapper () - { - Close (); - } - - public new void Dispose () - { - Close (); - } - - public GMime.Stream GMimeStream { - get { return stream; } - set { - if (value == null) - throw new ArgumentNullException (); - - stream = value; - } - } - - public override bool CanRead { - get { return stream == null ? false : true; } - } - - public override bool CanSeek { - get { return stream == null || stream is StreamFilter ? false : true; } - } - - public override bool CanWrite { - get { return stream == null ? false : true; } - } - - public override long Length { - get { - if (stream == null) - throw new ObjectDisposedException ("GMimeStream", "The stream has been closed"); - - return stream.Length; - } - } - - public override long Position { - get { - if (stream == null) - throw new ObjectDisposedException ("GMimeStream", "The stream has been closed"); - - return stream.Tell (); - } - - set { - if (Seek (value, SeekOrigin.Begin) == -1) - throw new IOException (); - } - } - - public override void Close () - { - if (stream == null) - throw new ObjectDisposedException ("GMimeStream", "The stream has been closed"); - - stream.Dispose (); - stream = null; - } - - public override void Flush () - { - stream.Flush (); - } - - public override int Read (byte[] buffer, int offset, int count) - { - byte[] buf; - int nread; - - if (stream == null) - throw new ObjectDisposedException ("GMimeStream", "The backing stream has been closed."); - - if (offset > buffer.Length) - throw new ArgumentOutOfRangeException ("offset"); - - if (offset + count > buffer.Length) - throw new ArgumentOutOfRangeException ("count"); - - if (offset != 0) - buf = new byte [count]; - else - buf = buffer; - - nread = (int) stream.Read (buf, (uint) count); - - if (nread < 0) - throw new IOException (); - - if (buf != buffer && nread > 0) - Array.Copy (buf, 0, buffer, offset, nread); - - return nread; - } - - public override void Write (byte[] buffer, int offset, int count) - { - int nwritten; - byte[] buf; - - if (stream == null) - throw new ObjectDisposedException ("GMimeStream", "The backing stream has been closed."); - - if (offset > buffer.Length) - throw new ArgumentOutOfRangeException ("offset"); - - if (offset + count > buffer.Length) - throw new ArgumentOutOfRangeException ("count"); - - if (offset != 0) { - buf = new byte [count]; - Array.Copy (buffer, offset, buf, 0, count); - } else { - buf = buffer; - } - - nwritten = (int) stream.Write (buf, (uint) count); - - if (nwritten < 0) - throw new IOException (); - } - - public override long Seek (long offset, SeekOrigin origin) - { - if (stream == null) - throw new ObjectDisposedException ("GMimeStream", "The backing stream has been closed."); - - if (stream is StreamFilter) { - if (offset != 0 || origin != SeekOrigin.Begin) - throw new NotSupportedException (); - - // offset = 0 is a special case and means reset the streamfilter - ((StreamFilter) stream).Reset (); - return 0; - } - - long ret = -1; - - switch (origin) { - case SeekOrigin.Begin: - if (offset < 0) - throw new ArgumentOutOfRangeException (); - - ret = stream.Seek (offset, GMime.SeekWhence.Set); - break; - case SeekOrigin.Current: - ret = stream.Seek (offset, GMime.SeekWhence.Cur); - break; - case SeekOrigin.End: - if (offset > 0) - throw new ArgumentOutOfRangeException (); - - ret = stream.Seek (offset, GMime.SeekWhence.End); - break; - } - - if (ret == -1) - throw new IOException (); - - return ret; - } - - public override void SetLength (long value) - { - throw new NotSupportedException (); - } - } -} diff -Nru gmime-2.6.22+dfsg2/PORTING gmime-3.0.1/PORTING --- gmime-2.6.22+dfsg2/PORTING 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/PORTING 2017-05-21 16:29:14.000000000 +0000 @@ -9,6 +9,157 @@ to the new release from the prior version. +Porting from GMime 2.6 to GMime 3.0 +----------------------------------- + +- g_mime_message_get_sender() no longer returns the value of the From header, + it now returns an InternetAddressList* containing the parsed address(es) + from the Sender header. For the From addresses, use g_mime_message_get_from(). + +- g_mime_message_get_reply_to() no longer returns a const char*, instead it + returns an InternetAddressList* for easier use. + +- g_mime_message_set_sender() and g_mime_message_set_reply_to() have been + removed. You will either need to use the appropriate getter method and + then internet_address_list_add() to add a new InternetAddressMailbox + or, alternatively, you can use g_mime_message_add_mailbox(). + +- GMimeRecipientType has been replaced by GMimeAddressType because it now + contains non-recipient-based enum values (SENDER, FROM, and REPLY_TO). + +- g_mime_message_get_recipients() has been replaced by g_mime_message_get_addresses() + which allows you to access the address lists of any address header. + +- g_mime_message_add_recipient() has been renamed to g_mime_message_add_mailbox() + due to the fact that it can now be used to add mailbox addresses to the + Sender, From, and Reply-To headers as well. + +- g_mime_message_set_subject() now takes a charset argument used when encoding + the subject into rfc2047 encoded-word tokens (if needed). Use `NULL` to + get the old behavior of using a best-fit charset. + +- Removed g_mime_message_[get,set]_date_as_string(). This is unnecessary since + this can be done using g_mime_object_[get,set]_header(). + +- g_mime_set_user_charsets() and g_mime_user_charsets() have been removed. + All encoding API's now have a way to specify a charset to use and all + decoder API's take a GMimeParserOptions argument that allows for + specifying fallback charsets. + +- GMimeObject's prepend_header(), append_header(), set_header(), get_header(), + and remove_header() virtual methods have all been removed. They have been + replaced by the header_added(), header_changed(), header_removed(), and + headers_cleared() virtual methods to allow users to set headers on the + GMimeHeaderList directly and still get notifications of those changes. + +- g_mime_object_new() and g_mime_object_new_with_type() both now take a + GMimeParserOptions argument. + +- g_mime_param_new_from_string() has been replaced by g_mime_param_list_parse() + and now takes a GMimeParserOptions argument. + +- g_mime_content_type_new_from_string() has been replaced by + g_mime_content_type_parse() and now takes a GMimeParserOptions argument. + +- g_mime_content_type_to_string() has been renamed to g_mime_content_type_get_mime_type(). + +- g_mime_content_type_get_params() has been renamed to g_mime_content_type_get_parameters(). + +- g_mime_content_disposition_new_from_string() has been replaced by + g_mime_content_disposition_parse() and now takes a GMimeParserOptions argument. + +- g_mime_content_disposition_to_string() has been replaced by g_mime_content_disposition_encode(). + +- g_mime_content_disposition_get_params() has been renamed to g_mime_content_disposition_get_parameters(). + +- internet_address_list_parse_string() has been replaced by + internet_address_list_parse() and now takes a GMimeParserOptions argument. + +- GMimeHeaderIter has been dropped in favour of a more direct way of + iterating over a GMimeHeaderList using int indexes. + +- g_mime_stream_write_to_stream(), g_mime_stream_writev(), and g_mime_stream_printf() + now return a gint64. + +- Renamed GMimeCertificateTrust to GMimeTrust. GMIME_CERTIFICATE_TRUST_NONE + has been renamed to GMIME_TRUST_UNKNOWN and GMIME_CERTIFICATE_TRUST_FULLY has been + renamed to GMIME_TRUST_FULL. + +- Removed g_mime_gpg_context_[get,set]_always_trust(). This can now be accomplished + by passing GMIME_ENCRYPT_ALWAYS_TRUST to g_mime_crypto_context_encrypt(). + +- Removed g_mime_gpg_context_[get,set]_use_agent(). This should no longer be needed. + +- Removed g_mime_gpg_context_[get,set]_auto_key_retrieve(). + +- Removed g_mime_crypto_context_[get,set]_retrieve_session_key(). This is now handled by + passing GMIME_DECRYPT_EXPORT_SESSION_KEY to the g_mime_crypto_context_decrypt() + method. + +- GMimeCryptoContext's encrypt, decrypt, and verify methods now all take a flags argument + that can enable additional features (see above examples). + +- g_mime_crypto_context_sign() now takes a boolean 'detach' argument that specifies whether + or not to generate a detached signature. To get the old behavior, pass TRUE as the + detach argument. + +- g_mime_crypto_context_decrypt_session() has been merged with + g_mime_crypto_context_decrypt() and so the decryot method now takes a session_key + argument that is allowed to be NULL. + +- g_mime_crypto_context_verify() no longer takes a 'digest' argument. + +- g_mime_multipart_signed_verify() and g_mime_multipart_encrypted_decrypt() no longer + take GMimeCryptoContext arguments. Instead, they instantiate their own contexts + based on the protocol specified in the Content-Type header. These methods now also + take a flags argument and in the case of the decrypt() method, it now also takes a + session_key argument. + +- GMimeSignatureStatus and GMimeSignatureErrors have been merged into a + single bitfield (GMimeSignatureStatus) which mirrors gpgme_sigsum_t. + +- g_mime_stream_file_new_for_path() has been renamed to + g_mime_stream_file_open() and now also takes a GError argument. + +- g_mime_stream_fs_new_for_path() has been renamed to + g_mime_stream_fs_open() and now also takes a GError argument. + +- g_mime_part_new() now returns a GMimePart with a Content-Type of + "application/octet-stream" instead of "text/plain" since there is + now a GMimeTextPart who's g_mime_text_part_new() returns a + GMimeTextPart with a Content-Type of "text/plain". + +- g_mime_part_[get,set]_content_object() have been renamed to + g_mime_part_[get,set]_content(). + +- g_mime_multipart_encrypted_encrypt() no longer takes a GMimeMultipartEncrypted + argument nor does it return int. Instead, this function now returns a newly + allocated GMimeMultipartEncrypted. + +- g_mime_multipart_signed_sign() no longer takes a GMimeMultipartSigned + argument nor does it return int. Instead, this function now returns a newly + allocated GMimeMultipartSigned. + +- g_mime_parser_[get,set]_scan_from() have been replaced by + g_mime_parser_[get,set]_format() which takes a GMimeFormat argument. + +- g_mime_parser_get_from() has been renamed to g_mime_parser_get_mbox_marker(). + +- g_mime_parser_get_from_offset() has been renamed to g_mime_parser_get_mbox_marker_offset(). + +- g_mime_parser_construct_[part,message]() now take a GMimeParserOptions argument. + +- Renamed GMimeFilterMd5 to GMimeFilterChecksum. + +- Renamed g_mime_multipart_[get,set]_preface() to g_mime_multipart_[get,set]_prologue(). + +- Renamed g_mime_multipart_[get,set]_postface() to g_mime_multipart_[get,set]_epilogue(). + +- Modified g_mime_object_write_to_stream() to take a GMimeFormatOptions argument. + +- Split GMimeFilterCRLF into GMimeFilterUnix2Dos, GMimeFilterDos2Unix and GMimeFilterSmtpData. + + Porting from GMime 2.4 to GMime 2.6 ----------------------------------- diff -Nru gmime-2.6.22+dfsg2/README gmime-3.0.1/README --- gmime-2.6.22+dfsg2/README 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/README 2017-04-23 16:04:05.000000000 +0000 @@ -1,101 +1,20 @@ - GMime, version 2.6.22 - by Jeffrey Stedfast +# GMime +[![Build Status](https://travis-ci.org/jstedfast/gmime.svg)](https://travis-ci.org/jstedfast/gmime)[![Coverity Scan Build Status](https://scan.coverity.com/projects/11948/badge.svg)](https://scan.coverity.com/projects/jstedfast-gmime)[![Coverage Status](https://coveralls.io/repos/github/jstedfast/gmime/badge.svg?branch=master)](https://coveralls.io/github/jstedfast/gmime?branch=master) -WHAT IS GMIME -------------- +## What is GMime? -GMime is a C/C++ library for parsing and creating messages using -the Multipurpose Internet Mail Extension (MIME) as defined by the -following RFCs: - - * 0822: Standard for the Format of Arpa Internet Text Messages - * 1341: MIME (Multipurpose Internet Mail Extensions): Mechanisms for - Specifying and Describing the Format of Internet Message Bodies - * 1342: Representation of Non-ASCII Text in Internet Message Headers - * 1521: MIME (Multipurpose Internet Mail Extensions) Part One: - Mechanisms for Specifying and Describing the Format of - Internet Message Bodies (Obsoletes rfc1341) - * 1522: MIME (Multipurpose Internet Mail Extensions) Part Two: Message - Header Extensions for Non-ASCII Text (Obsoletes rfc1342) - * 1544: The Content-MD5 Header Field - * 1847: Security Multiparts for MIME: Multipart/Signed and - Multipart/Encrypted - * 1864: The Content-MD5 Header Field (Obsoletes rfc1544) - * 2015: MIME Security with Pretty Good Privacy (PGP) - * 2045: Multipurpose Internet Mail Extensions (MIME) Part One: - Format of Internet Message Bodies - * 2046: Multipurpose Internet Mail Extensions (MIME) Part Two: - Media Types - * 2047: Multipurpose Internet Mail Extensions (MIME) Part Three: - Message Header Extensions for Non-ASCII Text - * 2048: Multipurpose Internet Mail Extensions (MIME) Part Four: - Registration Procedures - * 2049: Multipurpose Internet Mail Extensions (MIME) Part Five: - Conformance Criteria and Examples - * 2183: Communicating Presentation Information in Internet Messages: - The Content-Disposition Header Field - * 2184: MIME Parameter Value and Encoded Word Extensions: Character - Sets, Languages, and Continuations - * 2231: MIME Parameter Value and Encoded Word Extensions: Character - Sets, Languages, and Continuations (Obsoletes rfc2184) - * 2311: S/MIME Version 2 Message Specification - * 2312: S/MIME Version 2 Certificate Handling - * 2315: PKCS #7: Cryptographic Message Syntax - * 2630: Cryptographic Message Syntax - * 2632: S/MIME Version 3 Certificate Handling (Obsoletes rfc2311) - * 2633: S/MIME Version 3 Message Specification (Obsoletes rfc2312) - * 2634: Enhanced Security Services for S/MIME - * 2822: Internet Message Format (Obsoletes rfc822) - * 3156: MIME Security with OpenPGP (Updates rfc2015) - * 3850: S/MIME Version 3.1 Certificate Handling (Obsoletes rfc2632) - * 3851: S/MIME Version 3.1 Message Specification (Obsoletes rfc2633) - * 5322: Internet Message Format (Obsoletes rfc2822) - * 5750: S/MIME Version 3.2 Certificate Handling (Obsoletes rfc3850) - * 5751: S/MIME Version 3.2 Message Specification (Obsoletes rfc3851) - -Other RFCs of interest: - - * 1872: The MIME Multipart/Related Content-type - * 1927: Suggested Additional MIME Types for Associating Documents - * 2110: MIME E-mail Encapsulation of Aggregate Documents, such as HTML (MHTML) - * 2111: Content-ID and Message-ID Uniform Resource Locators - * 2387: The Multipart/Related Content-Type. - * 2388: Returning Values from Forms: multipart/form-data - * 2424: Content Duration MIME Header Definition - * 3280: Internet X.509 Public Key Infrastructure certificate and - Certificate Revocation List (CRL) Profile - -Cryptography related RFCs: - - * 2268: A Description of the RC2(r) Encryption Algorithm - * 2313: PKCS #1: RSA Encryption - * 2314: PKCS #10: Certification Request Syntax - * 2631: Diffie-Hellman Key Agreement Method - - -LICENSE INFORMATION -------------------- - -The GMime library is Copyright (C) 2000-2014 Jeffrey Stedfast. - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +GMime is a C/C++ library which may be used for the creation and parsing of messages using the Multipurpose +Internet Mail Extension (MIME) as defined by [numerous IETF specifications](https://github.com/jstedfast/gmime/blob/master/RFCs.md). +GMime features an extremely robust high-performance parser designed to be able to preserve byte-for-byte information +allowing developers to re-seralize the parsed messages back to a stream exactly as the parser found them. It also features +integrated GnuPG and S/MIME v3.2 support. -HISTORY -------- +Built on top of GObject (the object system used by the [GNOME desktop](https://www.gnome.org)), many developers should find +its API design and memory management very familiar. + +## History As a developer and user of Electronic Mail clients, I had come to realize that the vast majority of E-Mail client (and server) software @@ -107,103 +26,757 @@ while also providing programmers with an extremely easy to use high-level application programming interface (API). +## License Information -OBTAINING GMIME ---------------- +The GMime library is Copyright (C) 2000-2017 Jeffrey Stedfast and is licensed under the LGPL v2.1 -Sources to GMime may be obtained from: - http://download.gnome.org/pub/GNOME/sources/gmime/ -or - ftp://ftp.gnome.org/pub/GNOME/sources/gmime/ + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +## Getting the Source Code -Information regarding GMime may be obtained from the Spruce home page: - http://spruce.sourceforge.net/gmime/ +You can download official public release tarballs of GMime at +[https://download.gnome.org/sources/gmime/](https://download.gnome.org/sources/gmime/) +or +[ftp://ftp.gnome.org/pub/GNOME/sources/gmime/](ftp://ftp.gnome.org/pub/GNOME/sources/gmime/). -Experimental versions of GMime may be obtained by following the -directions at http://developer.gnome.org/tools/svn.html +If you would like to contribute to the GMime project, it is recommended that you grab the +source code from the official GitHub repository at +[http://github.com/jstedfast/gmime](https://github.com/jstedfast/gmime). Cloning this repository +can be done using the following command: - git clone git://git.gnome.org/gmime + git clone https://github.com/jstedfast/gmime.git -REQUIREMENTS ------------- +## Requirements For proper compilation and functionality of GMime, the following packages are REQUIRED: - - Glib version >= 2.18.0 + - Glib version >= 2.32.0 Glib provides a number of portability-enhancing functions and types. Glib is included in most GMime-supported operating system distributions. Glib sources may be obtained from: ftp://ftp.gtk.org/pub/glib +The following packages are RECOMMENDED: -DOCUMENTATION -------------- - -This is the README file for GMime. Additional documentation related to -development using GMime has been included within the source release -of GMime. - - docs/reference/ Contains SGML and HTML versions of the GMime - reference manual - - docs/tutorial/ Contains SGML and HTML versions of the GMime - tutorial + - Libidn - AUTHORS List of primary authors (source code developers) + Libidn provides APIs needed for encoding and decoding Internationalized + Domain Names. Libidn sources may be obtained from: + https://www.gnu.org/software/libidn/#downloading + + - GPGME >= 1.8.0 (will build with 1.2.0, but will be missing some functionality) + + GPGME (GnuPG Made Easy) provides high-level crypto APIs needed for + encryption, decryption, signing and signature verification for both + OpenPGP and S/MIME. GPGME sources may be obtained from: + https://www.gnupg.org/download/index.html#gpgme + +## Using GMime + +### Parsing Messages + +One of the more common operations that GMime is meant for is parsing email messages from arbitrary streams. +To do this, you will need to use a `GMimeParser`: + +```c +/* load a GMimeMessage from a stream */ +GMimeMessage *message; +GMimeStream *stream; +GMimeParser *parser; + +stream = g_mime_stream_file_open ("message.eml", "r"); +parser = g_mime_parser_new_with_stream (stream); + +/* Note: we can unref the stream now since the GMimeParser has a reference to it... */ +g_object_unref (stream); + +message = g_mime_parser_construct_message (parser); + +/* unref the parser since we no longer need it */ +g_object_unref (parser); +``` + +If you are planning to parse messages from an mbox stream, you can do something like this: + +```c +GMimeMessage *message; +GMimeStream *stream; +GMimeParser *parser; +gint64 offset; +char *marker; + +stream = g_mime_stream_file_open ("Inbox.mbox", "r"); +parser = g_mime_parser_new_with_stream (stream); + +/* tell the parser to scan mbox-style "From " markers */ +g_mime_parser_set_scan_from (parser, TRUE); + +/* Note: we can unref the stream now since the GMimeParser has a reference to it... */ +g_object_unref (stream); + +while (!g_mime_parser_eos (parser)) { + /* load the next message from the mbox */ + if ((message = g_mime_parser_construct_message (parser)) != NULL) + g_object_unref (message); + + /* get information about the mbox "From " marker... */ + offset = g_mime_parser_get_from_offset (parser); + marker = g_mime_parser_get_from (parser); +} + +g_object_unref (parser); +``` + +### Getting the Body of a Message + +A common misunderstanding about email is that there is a well-defined message body and then a list +of attachments. This is not really the case. The reality is that MIME is a tree structure of content, +much like a file system. + +Luckily, MIME does define a set of general rules for how mail clients should interpret this tree +structure of MIME parts. The `Content-Disposition` header is meant to provide hints to the receiving +client as to which parts are meant to be displayed as part of the message body and which are meant +to be interpreted as attachments. + +The `Content-Disposition` header will generally have one of two values: `inline` or `attachment`. + +The meaning of these value should be fairly obvious. If the value is `attachment`, then the content +of said MIME part is meant to be presented as a file attachment separate from the core message. +However, if the value is `inline`, then the content of that MIME part is meant to be displayed inline +within the mail client's rendering of the core message body. If the `Content-Disposition` header does +not exist, then it should be treated as if the value were `inline`. + +Technically, every part that lacks a `Content-Disposition` header or that is marked as `inline`, then, +is part of the core message body. + +There's a bit more to it than that, though. + +Modern MIME messages will often contain a `multipart/alternative` MIME container which will generally contain +a `text/plain` and `text/html` version of the text that the sender wrote. The `text/html` version is typically +formatted much closer to what the sender saw in his or her WYSIWYG editor than the `text/plain` version. + +The reason for sending the message text in both formats is that not all mail clients are capable of displaying +HTML. + +The receiving client should only display one of the alternative views contained within the `multipart/alternative` +container. Since alternative views are listed in order of least faithful to most faithful with what the sender +saw in his or her WYSIWYG editor, the receiving client *should* walk over the list of alternative views starting +at the end and working backwards until it finds a part that it is capable of displaying. + +Example: +``` +multipart/alternative + text/plain + text/html +``` + +As seen in the example above, the `text/html` part is listed last because it is the most faithful to +what the sender saw in his or her WYSIWYG editor when writing the message. + +To make matters even more complicated, sometimes modern mail clients will use a `multipart/related` +MIME container instead of a simple `text/html` part in order to embed images and other content +within the HTML. + +Example: +``` +multipart/alternative + text/plain + multipart/related + text/html + image/jpeg + video/mp4 + image/png +``` + +In the example above, one of the alternative views is a `multipart/related` container which contains +an HTML version of the message body that references the sibling video and images. + +Now that you have a rough idea of how a message is structured and how to interpret various MIME entities, +the next step is learning how to traverse the MIME tree using GMime. + +### Traversing a MimeMessage + +The top-level MIME entity of the message will generally either be a `GMimePart` or a `GMimeMultipart`. + +As an example, if you wanted to rip out all of the attachments of a message, your code might look +something like this: + +```c +GMimePartIter *iter = g_mime_part_iter_new (message); +GPtrArray *attachments = g_ptr_array_new (); +GPtrArray *multiparts = g_ptr_array_new (); + +/* collect our list of attachments and their parent multiparts */ +while (g_mime_part_iter_next (iter)) { + GMimeObject *current = g_mime_part_iter_get_current (iter); + GMimeObject *parent = g_mime_part_iter_get_parent (iter); + + if (GMIME_IS_MULTIPART (parent) && GMIME_IS_PART (current)) { + GMimePart *part = (GMimePart *) current; + + if (g_mime_part_is_attachment (part)) { + /* keep track of each attachment's parent multipart */ + g_ptr_array_append (multiparts, parent); + g_ptr_array_append (attachments, part); + } + } +} + +/* now remove each attachment from its parent multipart... */ +for (int i = 0; i < attachments->len; i++) { + GMimeMultipart *multipart = (GMimeMultipart *) multiparts->pdata[i]; + GMimeObject *attachment = (GMimeObject *) attachments->pdata[i]; + + g_mime_multipart_remove (multipart, attachment); +} +``` + +### Creating a Simple Message + +Creating MIME messages using GMime is really trivial. + +```csharp +GMimeMessage *message; +GMimePart *body; + +message = g_mime_message_new (TRUE); + +g_mime_message_add_mailbox (message, GMIME_ADDRESS_TYPE_FROM, "Joey", "joey@friends.com"); +g_mime_message_add_mailbox (message, GMIME_ADDRESS_TYPE_TO, "Alice", "alice@wonderland.com"); +g_mime_message_set_subject (message, "How you doin?", NULL); + +body = g_mime_text_part_new_with_subtype ("plain"); +g_mime_text_part_set_text (body, "Hey Alice,\n\n" + "What are you up to this weekend? Monica is throwing one of her parties on\n" + "Saturday and I was hoping you could make it.\n\n" + "Will you be my +1?\n\n" + "-- Joey\n"); + +g_mime_message_set_mime_part (message, (GMimeObject *) body); +g_object_unref (body); +``` + +### Creating a Message with Attachments + +Attachments are just like any other `GMimePart`, the only difference is that they typically have +a `Content-Disposition` header with a value of "attachment" instead of "inline" or no +`Content-Disposition` header at all. + +Typically, when a mail client adds attachments to a message, it will create a `multipart/mixed` +part and add the text body part and all of the file attachments to the `multipart/mixed`. + +Here's how you can do that with GMime: + +```c +GMimeMultipart *multipart; +GMimeDataWrapper *content; +GMimeMessage *message; +GMimePart *attachment; +GMimeTextPart *body; +GMimeStream *stream; + +message = g_mime_message_new (TRUE); +g_mime_message_add_mailbox (message, GMIME_ADDRESS_TYPE_FROM, "Joey", "joey@friends.com"); +g_mime_message_add_mailbox (message, GMIME_ADDRESS_TYPE_TO, "Alice", "alice@wonderland.com"); +g_mime_message_set_subject (message, "How you doin?", NULL); + +/* create our message text, just like before... */ +body = g_mime_text_part_new_with_subtype ("plain"); +g_mime_text_part_set_text (body, "Hey Alice,\n\n" + "What are you up to this weekend? Monica is throwing one of her parties on\n" + "Saturday and I was hoping you could make it.\n\n" + "Will you be my +1?\n\n" + "-- Joey\n"); + +/* create an image attachment for the file located at path */ +attachment = g_mime_part_new_with_type ("image", "gif"); +g_mime_part_set_filename (attachment, basename (path)); + +/* create the content for the image attachment */ +stream = g_mime_stream_fs_open (path, O_RDONLY); +content = g_mime_data_wrapper_new_with_stream (stream, GMIME_CONTENT_ENCODING_DEFAULT); +g_object_unref (stream); + +/* set the content of the attachment */ +g_mime_part_set_content (attachment, content); +g_object_unref (content); + +/* set the Content-Transfer-Encoding to base64 */ +g_mime_part_set_content_encoding (attachment, GMIME_CONTENT_ENCODING_BASE64); + +/* now create the multipart/mixed container to hold the message text and the image attachment */ +multipart = g_mime_multipart_new_with_subtype ("mixed"); + +/* add the text body first */ +g_mime_multipart_add (multipart, (GMimeObject *) body); +g_object_unref (body); + +/* now add the attachment(s) */ +g_mime_multipart_add (multipart, (GMimeObject *) attachment); +g_object_unref (attachment); + +/* set the multipart/mixed as the message body */ +g_mime_message_set_mime_part (message, (GMimeObject *) multipart); +g_object_unref (multipart); +``` + +Of course, that is just a simple example. A lot of modern mail clients such as Outlook or Thunderbird will +send out both a `text/html` and a `text/plain` version of the message text. To do this, you'd create a +`GMimeTextPart` for the `text/plain` part and another `GMimeTextPart` for the `text/html` part and then add +them to a `multipart/alternative` like so: + +```c +GMimeMultipart *mixed, *alternative; +GMimeTextPart *plain, *html; +GMimePart *attachment; + +/* see above for how to create each of these... */ +attachment = CreateAttachment (); +plain = CreateTextPlainPart (); +html = CreateTextHtmlPart (); + +/* Note: it is important that the text/html part is added second, because it is the + * most expressive version and (probably) the most faithful to the sender's WYSIWYG + * editor. */ +alternative = g_mime_multipart_with_subtype ("alternative"); + +g_mime_multipart_add (alternative, (GMimeObject *) plain); +g_object_unref (plain); + +g_mime_multipart_add (alternative, (GMimeObject *) html); +g_object_unref (html); + +/* now create the multipart/mixed container to hold the multipart/alternative + * and the image attachment */ +mixed = g_mime_multipart_new_with_subtype ("mixed"); + +g_mime_multipart_add (mixed, (GMimeObject *) alternative); +g_object_unref (alternative); + +g_mime_multipart_add (mixed, (GMimeObject *) attachment); +g_object_unref (attachment); + +/* now set the multipart/mixed as the message body */ +g_mime_message_set_mime_part (message, (GMimeObject *) mixed); +g_object_unref (mixed); +``` + +### Encrypting Messages with S/MIME + +S/MIME uses an `application/pkcs7-mime` MIME part to encapsulate encrypted content (as well as other things). + +```c +GMimeApplicationPkcs7Mime *encrypted; +GMimeMessage *message; +GError *err = NULL; +GMimeObject *body; +GPtrArray *rcpts; + +message = g_mime_message_new (TRUE); +g_mime_message_add_mailbox (message, GMIME_ADDRESS_TYPE_FROM, "Joey", "joey@friends.com"); +g_mime_message_add_mailbox (message, GMIME_ADDRESS_TYPE_TO, "Alice", "alice@wonderland.com"); +g_mime_message_set_subject (message, "How you doin?", NULL); + +/* create our message body (perhaps a multipart/mixed with the message text and some + * image attachments, for example) */ +body = CreateMessageBody (); + +/* create a list of key ids to encrypt to */ +rcpts = g_ptr_array_new (); +g_ptr_array_add (rcpts, "alice@wonderland.com"); // or use her fingerprint + +/* now to encrypt our message body */ +if (!(encrypted = g_mime_application_pkcs7_mime_encrypt (body, GMIME_ENCRYPT_FLAGS_NONE, rcpts, &err))) { + fprintf (stderr, "encrypt failed: %s\n", err->message); + g_object_unref (body); + g_error_free (err); + return; +} + +g_object_unref (body); + +g_mime_message_set_mime_part (message, encrypted); +g_object_unref (encrypted); +``` + +### Decrypting S/MIME Messages + +As mentioned earlier, S/MIME uses an `application/pkcs7-mime` part with an "smime-type" parameter with a value of +"enveloped-data" to encapsulate the encrypted content. + +The first thing you must do is find the `GMimeApplicationPkcs7Mime` part (see the section on traversing MIME parts). + +```c +if (GMIME_IS_APPLICATION_PKCS7_MIME (entity)) { + GMimeApplicationPkcs7Mime *pkcs7 = (GMimeApplicationPkcs7Mime *) entity; + GMimeSecureMimeType smime_type; + + smime_type = g_mime_application_pkcs7_mime_get_smime_type (pkcs7_mime); + if (smime_type == GMIME_SECURE_MIME_TYPE_ENVELOPED_DATA) + return g_mime_application_pkcs7_mime_decrypt (pkcs7, 0, NULL, NULL, &err); +} +``` + +### Encrypting Messages with PGP/MIME + +Unlike S/MIME, PGP/MIME uses `multipart/encrypted` to encapsulate its encrypted data. + +```c +GMimeMultipartEncrypted *encrypted; +GMimeCryptoContext *ctx; +GMimeMessage *message; +GError *err = NULL; +GMimeObject *body; +GPtrArray *rcpts; + +message = g_mime_message_new (TRUE); +g_mime_message_add_mailbox (message, GMIME_ADDRESS_TYPE_FROM, "Joey", "joey@friends.com"); +g_mime_message_add_mailbox (message, GMIME_ADDRESS_TYPE_TO, "Alice", "alice@wonderland.com"); +g_mime_message_set_subject (message, "How you doin?", NULL); + +/* create our message body (perhaps a multipart/mixed with the message text and some + * image attachments, for example) */ +body = CreateMessageBody (); + +/* create a list of key ids to encrypt to */ +rcpts = g_ptr_array_new (); +g_ptr_array_add (rcpts, "alice@wonderland.com"); // or use her fingerprint + +/* now to encrypt our message body */ +ctx = g_mime_gpg_context_new (); + +encrypted = g_mime_multipart_encrypted_encrypt (ctx, body, FALSE, NULL, 0, 0, rcpts, &err); +g_ptr_array_free (rcpts, TRUE); +g_object_unref (body); +g_object_unref (ctx); + +if (encrypted == NULL) { + fprintf (stderr, "encrypt failed: %s\n", err->message); + g_error_free (err); + return; +} + +g_mime_message_set_mime_part (message, encrypted); +g_object_unref (encrypted); +``` + +### Decrypting PGP/MIME Messages + +As mentioned earlier, PGP/MIME uses a `multipart/encrypted` part to encapsulate the encrypted content. + +A `multipart/encrypted` contains exactly 2 parts: the first `GMimeObject` is the version information while the +second `GMimeObject` is the actual encrypted content and will typically be an `application/octet-stream`. + +The first thing you must do is find the `GMimeMultipartEncrypted` part (see the section on traversing MIME parts). + +```c +if (GMIME_IS_MULTIPART_ENCRYPTED (entity)) { + GMimeMultipartEncrypted *encrypted = (GMimeMultipartEncrypted *) entity; + + return g_mime_multipart_encrypted_decrypt (encrypted, 0, NULL, NULL, &err); +} +``` + +### Digitally Signing Messages with S/MIME or PGP/MIME + +Both S/MIME and PGP/MIME use a `multipart/signed` to contain the signed content and the detached signature data. + +Here's how you might digitally sign a message using S/MIME: + +```c +GMimeApplicationPkcs7Mime *pkcs7; +GMimeMessage *message; +GError *err = NULL; +GMimeObject *body; + +message = g_mime_message_new (TRUE); +g_mime_message_add_mailbox (message, GMIME_ADDRESS_TYPE_FROM, "Joey", "joey@friends.com"); +g_mime_message_add_mailbox (message, GMIME_ADDRESS_TYPE_TO, "Alice", "alice@wonderland.com"); +g_mime_message_set_subject (message, "How you doin?", NULL); + +/* create our message body (perhaps a multipart/mixed with the message text and some + * image attachments, for example) */ +body = CreateMessageBody (); + +/* now to sign our message body */ +if (!(pkcs7 = g_mime_application_pkcs7_mime_sign (body, "joey@friends.com", GMIME_DIGEST_ALGO_DEFAULT, &err))) { + fprintf (stderr, "sign failed: %s\n", err->message); + g_object_unref (body); + g_error_free (err); + return; +} + +g_object_unref (body); + +g_mime_message_set_mime_part (message, pkcs7); +g_object_unref (pkcs7); +``` + +S/MIME also gives you the option of using a `multipart/signed` method of signing a message. + +```c +GMimeMultipartSigned *ms; +GMimeCryptoContext *ctx; +GMimeMessage *message; +GError *err = NULL; +GMimeObject *body; + +message = g_mime_message_new (TRUE); +g_mime_message_add_mailbox (message, GMIME_ADDRESS_TYPE_FROM, "Joey", "joey@friends.com"); +g_mime_message_add_mailbox (message, GMIME_ADDRESS_TYPE_TO, "Alice", "alice@wonderland.com"); +g_mime_message_set_subject (message, "How you doin?", NULL); + +/* create our message body (perhaps a multipart/mixed with the message text and some + * image attachments, for example) */ +body = CreateMessageBody (); + +/* create our crypto context - needed because multipart/signed works for both S/MIME and PGP/MIME */ +ctx = g_mime_pkcs7_context_new (); + +/* now to sign our message body */ +if (!(ms = g_mime_multipart_signed_sign (ctx, body, "joey@friends.com", GMIME_DIGEST_ALGO_DEFAULT, &err))) { + fprintf (stderr, "sign failed: %s\n", err->message); + g_object_unref (body); + g_object_unref (ctx); + g_error_free (err); + return; +} + +g_object_unref (body); +g_object_unref (ctx); + +g_mime_message_set_mime_part (message, ms); +g_object_unref (ms); +``` + +If you'd prefer to use PGP instead of S/MIME, things work almost exactly the same except that you +would use the `GMimeGpgContext`. + +```c +GMimeMultipartSigned *ms; +GMimeCryptoContext *ctx; +GMimeMessage *message; +GError *err = NULL; +GMimeObject *body; + +message = g_mime_message_new (TRUE); +g_mime_message_add_mailbox (message, GMIME_ADDRESS_TYPE_FROM, "Joey", "joey@friends.com"); +g_mime_message_add_mailbox (message, GMIME_ADDRESS_TYPE_TO, "Alice", "alice@wonderland.com"); +g_mime_message_set_subject (message, "How you doin?", NULL); + +/* create our message body (perhaps a multipart/mixed with the message text and some + * image attachments, for example) */ +body = CreateMessageBody (); + +/* create our crypto context - needed because multipart/signed works for both S/MIME and PGP/MIME */ +ctx = g_mime_gpg_context_new (); + +/* now to sign our message body */ +if (!(ms = g_mime_multipart_signed_sign (ctx, body, "joey@friends.com", GMIME_DIGEST_ALGO_DEFAULT, &err))) { + fprintf (stderr, "sign failed: %s\n", err->message); + g_object_unref (body); + g_object_unref (ctx); + g_error_free (err); + return; +} + +g_object_unref (body); +g_object_unref (ctx); + +g_mime_message_set_mime_part (message, ms); +g_object_unref (ms); +``` + +### Verifying S/MIME and PGP/MIME Digital Signatures + +As mentioned earlier, both S/MIME and PGP/MIME typically use a `multipart/signed` part to contain the +signed content and the detached signature data. + +A `multipart/signed` contains exactly 2 parts: the first `GMimeObject` is the signed content while the second +`GMimeObject` is the detached signature and, by default, will either be a `GMimeApplicationPgpSignature` part +or a `GMimeApplicationPkcs7Signature` part (depending on whether the sending client signed using OpenPGP or +S/MIME). + +Because the `multipart/signed` part may have been signed by multiple signers, the +`g_mime_multipart_signed_verify()` function returns a `GMimeSignatureList` which contains a list of +digital signatures (one for each signer) that each contain their own metdata describing who that +signer is and what the status of their signature is. + +```c +if (GMIME_IS_MULTIPART_SIGNED (entity)) { + GMimeMultipartSigned *ms = (GMimeMultipartSigned *) entity; + GMimeSignatureList *signatures; + GError *err = NULL; + int i, count; + + if (!(signatures = g_mime_multipart_signed_verify (ms, 0, &err))) { + fprintf (stderr, "verify failed: %s\n", err->message); + g_error_free (err); + return; + } + + fputs ("\nSignatures:\n", stdout); + count = g_mime_signature_list_length (signatures); + for (i = 0; i < count; i++) { + GMimeSignature *sig = g_mime_signature_list_get_signature (signatures, i); + GMimeSignatureStatus status = g_mime_signature_get_status (sig); + GMimeCertificate *cert = g_mime_signature_get_certificate (sig); + time_t created = g_mime_signature_get_created (sig); + time_t expires = g_mime_signature_get_expires (sig); + + fprintf (stdout, "\tName: %s\n", g_mime_certificate_get_name (cert)); + fprintf (stdout, "\tKeyId: %s\n", g_mime_certificate_get_key_id (cert)); + fprintf (stdout, "\tFingerprint: %s\n", g_mime_certificate_get_fingerprint (cert)); + + fprintf (stdout, "\tTrust: "); + switch (g_mime_certificate_get_trust (cert)) { + case GMIME_TRUST_UNKNOWN: fputs ("Unknown\n", stdout); break; + case GMIME_TRUST_NEVER: fputs ("Never\n", stdout); break; + case GMIME_TRUST_UNDEFINED: fputs ("Undefined\n", stdout); break; + case GMIME_TRUST_MARGINAL: fputs ("Marginal\n", stdout); break; + case GMIME_TRUST_FULL: fputs ("Full\n", stdout); break; + case GMIME_TRUST_ULTIMATE: fputs ("Ultimate\n", stdout); break; + } + + fprintf (stdout, "\tStatus: "); + if (status & GMIME_SIGNATURE_STATUS_RED) + fputs ("BAD\n", stdout); + else if (status & GMIME_SIGNATURE_STATUS_GREEN) + fputs ("GOOD\n", stdout); + else if (status & GMIME_SIGNATURE_STATUS_VALID) + fputs ("VALID\n", stdout); + else + fputs ("UNKNOWN\n", stdout); + + fprintf (stdout, "\tSignature made on %s", ctime (&created)); + if (expires != (time_t) 0) + fprintf (stdout, "\tSignature expires on %s", ctime (&expires)); + else + fprintf (stdout, "\tSignature never expires\n"); + + fprintf (stdout, "\tErrors: "); + if (status & GMIME_SIGNATURE_STATUS_KEY_REVOKED) + fputs ("Key Revoked, ", stdout); + if (status & GMIME_SIGNATURE_STATUS_KEY_EXPIRED) + fputs ("Key Expired, ", stdout); + if (status & GMIME_SIGNATURE_STATUS_SIG_EXPIRED) + fputs ("Sig Expired, ", stdout); + if (status & GMIME_SIGNATURE_STATUS_KEY_MISSING) + fputs ("Key Missing, ", stdout); + if (status & GMIME_SIGNATURE_STATUS_CRL_MISSING) + fputs ("CRL Missing, ", stdout); + if (status & GMIME_SIGNATURE_STATUS_CRL_TOO_OLD) + fputs ("CRL Too Old, ", stdout); + if (status & GMIME_SIGNATURE_STATUS_BAD_POLICY) + fputs ("Bad Policy, ", stdout); + if (status & GMIME_SIGNATURE_STATUS_SYS_ERROR) + fputs ("System Error, ", stdout); + if (status & GMIME_SIGNATURE_STATUS_TOFU_CONFLICT) + fputs ("Tofu Conflict", stdout); + if ((status & GMIME_SIGNATURE_STATUS_ERROR_MASK) == 0) + fputs ("None", stdout); + fputs ("\n\n", stdout); + } + + g_object_unref (signatures); +} +``` + +It should be noted, however, that while most S/MIME clients will use the preferred `multipart/signed` +approach, it is possible that you may encounter an `application/pkcs7-mime` part with an "smime-type" +parameter set to "signed-data". Luckily, GMime can handle this format as well: + +```c +if (GMIME_IS_APPLICATION_PKCS7_MIME (entity)) { + GMimeApplicationPkcs7Mime *pkcs7 = (GMimeApplicationPkcs7Mime *) entity; + GMimeSecureMimeType smime_type; + + smime_type = g_mime_application_pkcs7_mime_get_smime_type (pkcs7); + + if (smime_type == GMIME_SECURE_MIME_TYPE_SIGNED_DATA) { + /* extract the original content and get a list of signatures */ + GMimeSignatureList *signatures; + GMimeObject extracted; + GError *err = NULL; + int i, count; + + /* Note: if you are rendering the message, you'll want to render the + * extracted mime part rather than the application/pkcs7-mime part. */ + + if (!(signatures = g_mime_application_pkcs7_mime_verify (pkcs7, 0, &extracted, &err))) { + fprintf (stderr, "verify failed: %s\n", err->message); + g_error_free (err); + return; + } + + count = g_mime_signature_list_length (signatures); + for (i = 0; i < count; i++) { + GMimeSignature *sig = g_mime_signature_list_get_signature (signatures, i); + /* ... */ + } + + g_object_unref (signatures); + } +} +``` - COPYING The GNU Lesser General Public License, version 2 +## Documentation - ChangeLog Log of changes made to the source code - - INSTALL In-depth installation instructions - - NEWS Release notes (Overview of changes) - - TODO Description of planned GMime development - - PORTING Guide for developers porting their application - from an older version of GMime +This is the README file for GMime. Additional documentation related to +development using GMime has been included within the source release +of GMime. +| |Description | +|---------------|-------------------------------------------------------------| +|docs/reference/|Contains SGML and HTML versions of the GMime reference manual| +|docs/tutorial/ |Contains SGML and HTML versions of the GMime tutorial| +|AUTHORS |List of primary authors (source code developers)| +|COPYING |The GNU Lesser General Public License, version 2| +|INSTALL |In-depth installation instructions| +|TODO |Description of planned GMime development| +|PORTING |Guide for developers porting their application from an older version of GMime| You can find online developer documentation at http://library.gnome.org/devel/gmime/stable/ -MAILING-LIST ------------- +# Mailing Lists For discussion of GMime development (either of GMime itself or using GMime in your own application), you may find the GMime-Devel mailing-list helpful. To subscribe, please see -http://mail.gnome.org/mailman/listinfo/gmime-devel-list - - -BINDINGS --------- - -Other developers have been working to make GMime available to -programmers in other languages. The current list of known bindings -are: - -- Go: https://github.com/sendgrid/go-gmime - -- Perl: http://search.cpan.org/dist/MIME-Fast/ - -- .NET (Mono): Included in this distribution (Obsolete). +[http://mail.gnome.org/mailman/listinfo/gmime-devel-list](http://mail.gnome.org/mailman/listinfo/gmime-devel-list) -Note: It is recommended that MimeKit[1] be used in place of GMime-Sharp in -.NET 4.0 (or later) environments. +# Bindings +Other developers have been working to make GMime available to programmers in other languages. +The current list of known bindings are: -1. MimeKit: https://github.com/jstedfast/MimeKit +|Language |Location | +|-----------|----------------------------------------| +|Go |https://github.com/sendgrid/go-gmime | +|Perl |http://search.cpan.org/dist/MIME-Fast | +|C# |https://github.com/jstedfast/MimeKit | -REPORTING BUGS --------------- +# Reporting Bugs -Bugs may be reported to the GMime development team by submitting a bug -report for the gmime module at http://bugzilla.gnome.org/ +Bugs may be reported to the GMime development team by creating a new +[issue](https://github.com/jstedfast/gmime/issues). diff -Nru gmime-2.6.22+dfsg2/README.md gmime-3.0.1/README.md --- gmime-2.6.22+dfsg2/README.md 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/README.md 2017-04-23 16:04:05.000000000 +0000 @@ -0,0 +1,782 @@ +# GMime + +[![Build Status](https://travis-ci.org/jstedfast/gmime.svg)](https://travis-ci.org/jstedfast/gmime)[![Coverity Scan Build Status](https://scan.coverity.com/projects/11948/badge.svg)](https://scan.coverity.com/projects/jstedfast-gmime)[![Coverage Status](https://coveralls.io/repos/github/jstedfast/gmime/badge.svg?branch=master)](https://coveralls.io/github/jstedfast/gmime?branch=master) + +## What is GMime? + +GMime is a C/C++ library which may be used for the creation and parsing of messages using the Multipurpose +Internet Mail Extension (MIME) as defined by [numerous IETF specifications](https://github.com/jstedfast/gmime/blob/master/RFCs.md). + +GMime features an extremely robust high-performance parser designed to be able to preserve byte-for-byte information +allowing developers to re-seralize the parsed messages back to a stream exactly as the parser found them. It also features +integrated GnuPG and S/MIME v3.2 support. + +Built on top of GObject (the object system used by the [GNOME desktop](https://www.gnome.org)), many developers should find +its API design and memory management very familiar. + +## History + +As a developer and user of Electronic Mail clients, I had come to +realize that the vast majority of E-Mail client (and server) software +had less-than-satisfactory MIME implementations. More often than not +these E-Mail clients created broken MIME messages and/or would +incorrectly try to parse a MIME message thus subtracting from the full +benefits that MIME was meant to provide. GMime is meant to address +this issue by following the MIME specification as closely as possible +while also providing programmers with an extremely easy to use +high-level application programming interface (API). + +## License Information + +The GMime library is Copyright (C) 2000-2017 Jeffrey Stedfast and is licensed under the LGPL v2.1 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +## Getting the Source Code + +You can download official public release tarballs of GMime at +[https://download.gnome.org/sources/gmime/](https://download.gnome.org/sources/gmime/) +or +[ftp://ftp.gnome.org/pub/GNOME/sources/gmime/](ftp://ftp.gnome.org/pub/GNOME/sources/gmime/). + +If you would like to contribute to the GMime project, it is recommended that you grab the +source code from the official GitHub repository at +[http://github.com/jstedfast/gmime](https://github.com/jstedfast/gmime). Cloning this repository +can be done using the following command: + + git clone https://github.com/jstedfast/gmime.git + + +## Requirements + +For proper compilation and functionality of GMime, the following packages +are REQUIRED: + + - Glib version >= 2.32.0 + + Glib provides a number of portability-enhancing functions and types. + Glib is included in most GMime-supported operating system + distributions. Glib sources may be obtained from: + ftp://ftp.gtk.org/pub/glib + +The following packages are RECOMMENDED: + + - Libidn + + Libidn provides APIs needed for encoding and decoding Internationalized + Domain Names. Libidn sources may be obtained from: + https://www.gnu.org/software/libidn/#downloading + + - GPGME >= 1.8.0 (will build with 1.2.0, but will be missing some functionality) + + GPGME (GnuPG Made Easy) provides high-level crypto APIs needed for + encryption, decryption, signing and signature verification for both + OpenPGP and S/MIME. GPGME sources may be obtained from: + https://www.gnupg.org/download/index.html#gpgme + +## Using GMime + +### Parsing Messages + +One of the more common operations that GMime is meant for is parsing email messages from arbitrary streams. +To do this, you will need to use a `GMimeParser`: + +```c +/* load a GMimeMessage from a stream */ +GMimeMessage *message; +GMimeStream *stream; +GMimeParser *parser; + +stream = g_mime_stream_file_open ("message.eml", "r"); +parser = g_mime_parser_new_with_stream (stream); + +/* Note: we can unref the stream now since the GMimeParser has a reference to it... */ +g_object_unref (stream); + +message = g_mime_parser_construct_message (parser); + +/* unref the parser since we no longer need it */ +g_object_unref (parser); +``` + +If you are planning to parse messages from an mbox stream, you can do something like this: + +```c +GMimeMessage *message; +GMimeStream *stream; +GMimeParser *parser; +gint64 offset; +char *marker; + +stream = g_mime_stream_file_open ("Inbox.mbox", "r"); +parser = g_mime_parser_new_with_stream (stream); + +/* tell the parser to scan mbox-style "From " markers */ +g_mime_parser_set_scan_from (parser, TRUE); + +/* Note: we can unref the stream now since the GMimeParser has a reference to it... */ +g_object_unref (stream); + +while (!g_mime_parser_eos (parser)) { + /* load the next message from the mbox */ + if ((message = g_mime_parser_construct_message (parser)) != NULL) + g_object_unref (message); + + /* get information about the mbox "From " marker... */ + offset = g_mime_parser_get_from_offset (parser); + marker = g_mime_parser_get_from (parser); +} + +g_object_unref (parser); +``` + +### Getting the Body of a Message + +A common misunderstanding about email is that there is a well-defined message body and then a list +of attachments. This is not really the case. The reality is that MIME is a tree structure of content, +much like a file system. + +Luckily, MIME does define a set of general rules for how mail clients should interpret this tree +structure of MIME parts. The `Content-Disposition` header is meant to provide hints to the receiving +client as to which parts are meant to be displayed as part of the message body and which are meant +to be interpreted as attachments. + +The `Content-Disposition` header will generally have one of two values: `inline` or `attachment`. + +The meaning of these value should be fairly obvious. If the value is `attachment`, then the content +of said MIME part is meant to be presented as a file attachment separate from the core message. +However, if the value is `inline`, then the content of that MIME part is meant to be displayed inline +within the mail client's rendering of the core message body. If the `Content-Disposition` header does +not exist, then it should be treated as if the value were `inline`. + +Technically, every part that lacks a `Content-Disposition` header or that is marked as `inline`, then, +is part of the core message body. + +There's a bit more to it than that, though. + +Modern MIME messages will often contain a `multipart/alternative` MIME container which will generally contain +a `text/plain` and `text/html` version of the text that the sender wrote. The `text/html` version is typically +formatted much closer to what the sender saw in his or her WYSIWYG editor than the `text/plain` version. + +The reason for sending the message text in both formats is that not all mail clients are capable of displaying +HTML. + +The receiving client should only display one of the alternative views contained within the `multipart/alternative` +container. Since alternative views are listed in order of least faithful to most faithful with what the sender +saw in his or her WYSIWYG editor, the receiving client *should* walk over the list of alternative views starting +at the end and working backwards until it finds a part that it is capable of displaying. + +Example: +``` +multipart/alternative + text/plain + text/html +``` + +As seen in the example above, the `text/html` part is listed last because it is the most faithful to +what the sender saw in his or her WYSIWYG editor when writing the message. + +To make matters even more complicated, sometimes modern mail clients will use a `multipart/related` +MIME container instead of a simple `text/html` part in order to embed images and other content +within the HTML. + +Example: +``` +multipart/alternative + text/plain + multipart/related + text/html + image/jpeg + video/mp4 + image/png +``` + +In the example above, one of the alternative views is a `multipart/related` container which contains +an HTML version of the message body that references the sibling video and images. + +Now that you have a rough idea of how a message is structured and how to interpret various MIME entities, +the next step is learning how to traverse the MIME tree using GMime. + +### Traversing a MimeMessage + +The top-level MIME entity of the message will generally either be a `GMimePart` or a `GMimeMultipart`. + +As an example, if you wanted to rip out all of the attachments of a message, your code might look +something like this: + +```c +GMimePartIter *iter = g_mime_part_iter_new (message); +GPtrArray *attachments = g_ptr_array_new (); +GPtrArray *multiparts = g_ptr_array_new (); + +/* collect our list of attachments and their parent multiparts */ +while (g_mime_part_iter_next (iter)) { + GMimeObject *current = g_mime_part_iter_get_current (iter); + GMimeObject *parent = g_mime_part_iter_get_parent (iter); + + if (GMIME_IS_MULTIPART (parent) && GMIME_IS_PART (current)) { + GMimePart *part = (GMimePart *) current; + + if (g_mime_part_is_attachment (part)) { + /* keep track of each attachment's parent multipart */ + g_ptr_array_append (multiparts, parent); + g_ptr_array_append (attachments, part); + } + } +} + +/* now remove each attachment from its parent multipart... */ +for (int i = 0; i < attachments->len; i++) { + GMimeMultipart *multipart = (GMimeMultipart *) multiparts->pdata[i]; + GMimeObject *attachment = (GMimeObject *) attachments->pdata[i]; + + g_mime_multipart_remove (multipart, attachment); +} +``` + +### Creating a Simple Message + +Creating MIME messages using GMime is really trivial. + +```csharp +GMimeMessage *message; +GMimePart *body; + +message = g_mime_message_new (TRUE); + +g_mime_message_add_mailbox (message, GMIME_ADDRESS_TYPE_FROM, "Joey", "joey@friends.com"); +g_mime_message_add_mailbox (message, GMIME_ADDRESS_TYPE_TO, "Alice", "alice@wonderland.com"); +g_mime_message_set_subject (message, "How you doin?", NULL); + +body = g_mime_text_part_new_with_subtype ("plain"); +g_mime_text_part_set_text (body, "Hey Alice,\n\n" + "What are you up to this weekend? Monica is throwing one of her parties on\n" + "Saturday and I was hoping you could make it.\n\n" + "Will you be my +1?\n\n" + "-- Joey\n"); + +g_mime_message_set_mime_part (message, (GMimeObject *) body); +g_object_unref (body); +``` + +### Creating a Message with Attachments + +Attachments are just like any other `GMimePart`, the only difference is that they typically have +a `Content-Disposition` header with a value of "attachment" instead of "inline" or no +`Content-Disposition` header at all. + +Typically, when a mail client adds attachments to a message, it will create a `multipart/mixed` +part and add the text body part and all of the file attachments to the `multipart/mixed`. + +Here's how you can do that with GMime: + +```c +GMimeMultipart *multipart; +GMimeDataWrapper *content; +GMimeMessage *message; +GMimePart *attachment; +GMimeTextPart *body; +GMimeStream *stream; + +message = g_mime_message_new (TRUE); +g_mime_message_add_mailbox (message, GMIME_ADDRESS_TYPE_FROM, "Joey", "joey@friends.com"); +g_mime_message_add_mailbox (message, GMIME_ADDRESS_TYPE_TO, "Alice", "alice@wonderland.com"); +g_mime_message_set_subject (message, "How you doin?", NULL); + +/* create our message text, just like before... */ +body = g_mime_text_part_new_with_subtype ("plain"); +g_mime_text_part_set_text (body, "Hey Alice,\n\n" + "What are you up to this weekend? Monica is throwing one of her parties on\n" + "Saturday and I was hoping you could make it.\n\n" + "Will you be my +1?\n\n" + "-- Joey\n"); + +/* create an image attachment for the file located at path */ +attachment = g_mime_part_new_with_type ("image", "gif"); +g_mime_part_set_filename (attachment, basename (path)); + +/* create the content for the image attachment */ +stream = g_mime_stream_fs_open (path, O_RDONLY); +content = g_mime_data_wrapper_new_with_stream (stream, GMIME_CONTENT_ENCODING_DEFAULT); +g_object_unref (stream); + +/* set the content of the attachment */ +g_mime_part_set_content (attachment, content); +g_object_unref (content); + +/* set the Content-Transfer-Encoding to base64 */ +g_mime_part_set_content_encoding (attachment, GMIME_CONTENT_ENCODING_BASE64); + +/* now create the multipart/mixed container to hold the message text and the image attachment */ +multipart = g_mime_multipart_new_with_subtype ("mixed"); + +/* add the text body first */ +g_mime_multipart_add (multipart, (GMimeObject *) body); +g_object_unref (body); + +/* now add the attachment(s) */ +g_mime_multipart_add (multipart, (GMimeObject *) attachment); +g_object_unref (attachment); + +/* set the multipart/mixed as the message body */ +g_mime_message_set_mime_part (message, (GMimeObject *) multipart); +g_object_unref (multipart); +``` + +Of course, that is just a simple example. A lot of modern mail clients such as Outlook or Thunderbird will +send out both a `text/html` and a `text/plain` version of the message text. To do this, you'd create a +`GMimeTextPart` for the `text/plain` part and another `GMimeTextPart` for the `text/html` part and then add +them to a `multipart/alternative` like so: + +```c +GMimeMultipart *mixed, *alternative; +GMimeTextPart *plain, *html; +GMimePart *attachment; + +/* see above for how to create each of these... */ +attachment = CreateAttachment (); +plain = CreateTextPlainPart (); +html = CreateTextHtmlPart (); + +/* Note: it is important that the text/html part is added second, because it is the + * most expressive version and (probably) the most faithful to the sender's WYSIWYG + * editor. */ +alternative = g_mime_multipart_with_subtype ("alternative"); + +g_mime_multipart_add (alternative, (GMimeObject *) plain); +g_object_unref (plain); + +g_mime_multipart_add (alternative, (GMimeObject *) html); +g_object_unref (html); + +/* now create the multipart/mixed container to hold the multipart/alternative + * and the image attachment */ +mixed = g_mime_multipart_new_with_subtype ("mixed"); + +g_mime_multipart_add (mixed, (GMimeObject *) alternative); +g_object_unref (alternative); + +g_mime_multipart_add (mixed, (GMimeObject *) attachment); +g_object_unref (attachment); + +/* now set the multipart/mixed as the message body */ +g_mime_message_set_mime_part (message, (GMimeObject *) mixed); +g_object_unref (mixed); +``` + +### Encrypting Messages with S/MIME + +S/MIME uses an `application/pkcs7-mime` MIME part to encapsulate encrypted content (as well as other things). + +```c +GMimeApplicationPkcs7Mime *encrypted; +GMimeMessage *message; +GError *err = NULL; +GMimeObject *body; +GPtrArray *rcpts; + +message = g_mime_message_new (TRUE); +g_mime_message_add_mailbox (message, GMIME_ADDRESS_TYPE_FROM, "Joey", "joey@friends.com"); +g_mime_message_add_mailbox (message, GMIME_ADDRESS_TYPE_TO, "Alice", "alice@wonderland.com"); +g_mime_message_set_subject (message, "How you doin?", NULL); + +/* create our message body (perhaps a multipart/mixed with the message text and some + * image attachments, for example) */ +body = CreateMessageBody (); + +/* create a list of key ids to encrypt to */ +rcpts = g_ptr_array_new (); +g_ptr_array_add (rcpts, "alice@wonderland.com"); // or use her fingerprint + +/* now to encrypt our message body */ +if (!(encrypted = g_mime_application_pkcs7_mime_encrypt (body, GMIME_ENCRYPT_FLAGS_NONE, rcpts, &err))) { + fprintf (stderr, "encrypt failed: %s\n", err->message); + g_object_unref (body); + g_error_free (err); + return; +} + +g_object_unref (body); + +g_mime_message_set_mime_part (message, encrypted); +g_object_unref (encrypted); +``` + +### Decrypting S/MIME Messages + +As mentioned earlier, S/MIME uses an `application/pkcs7-mime` part with an "smime-type" parameter with a value of +"enveloped-data" to encapsulate the encrypted content. + +The first thing you must do is find the `GMimeApplicationPkcs7Mime` part (see the section on traversing MIME parts). + +```c +if (GMIME_IS_APPLICATION_PKCS7_MIME (entity)) { + GMimeApplicationPkcs7Mime *pkcs7 = (GMimeApplicationPkcs7Mime *) entity; + GMimeSecureMimeType smime_type; + + smime_type = g_mime_application_pkcs7_mime_get_smime_type (pkcs7_mime); + if (smime_type == GMIME_SECURE_MIME_TYPE_ENVELOPED_DATA) + return g_mime_application_pkcs7_mime_decrypt (pkcs7, 0, NULL, NULL, &err); +} +``` + +### Encrypting Messages with PGP/MIME + +Unlike S/MIME, PGP/MIME uses `multipart/encrypted` to encapsulate its encrypted data. + +```c +GMimeMultipartEncrypted *encrypted; +GMimeCryptoContext *ctx; +GMimeMessage *message; +GError *err = NULL; +GMimeObject *body; +GPtrArray *rcpts; + +message = g_mime_message_new (TRUE); +g_mime_message_add_mailbox (message, GMIME_ADDRESS_TYPE_FROM, "Joey", "joey@friends.com"); +g_mime_message_add_mailbox (message, GMIME_ADDRESS_TYPE_TO, "Alice", "alice@wonderland.com"); +g_mime_message_set_subject (message, "How you doin?", NULL); + +/* create our message body (perhaps a multipart/mixed with the message text and some + * image attachments, for example) */ +body = CreateMessageBody (); + +/* create a list of key ids to encrypt to */ +rcpts = g_ptr_array_new (); +g_ptr_array_add (rcpts, "alice@wonderland.com"); // or use her fingerprint + +/* now to encrypt our message body */ +ctx = g_mime_gpg_context_new (); + +encrypted = g_mime_multipart_encrypted_encrypt (ctx, body, FALSE, NULL, 0, 0, rcpts, &err); +g_ptr_array_free (rcpts, TRUE); +g_object_unref (body); +g_object_unref (ctx); + +if (encrypted == NULL) { + fprintf (stderr, "encrypt failed: %s\n", err->message); + g_error_free (err); + return; +} + +g_mime_message_set_mime_part (message, encrypted); +g_object_unref (encrypted); +``` + +### Decrypting PGP/MIME Messages + +As mentioned earlier, PGP/MIME uses a `multipart/encrypted` part to encapsulate the encrypted content. + +A `multipart/encrypted` contains exactly 2 parts: the first `GMimeObject` is the version information while the +second `GMimeObject` is the actual encrypted content and will typically be an `application/octet-stream`. + +The first thing you must do is find the `GMimeMultipartEncrypted` part (see the section on traversing MIME parts). + +```c +if (GMIME_IS_MULTIPART_ENCRYPTED (entity)) { + GMimeMultipartEncrypted *encrypted = (GMimeMultipartEncrypted *) entity; + + return g_mime_multipart_encrypted_decrypt (encrypted, 0, NULL, NULL, &err); +} +``` + +### Digitally Signing Messages with S/MIME or PGP/MIME + +Both S/MIME and PGP/MIME use a `multipart/signed` to contain the signed content and the detached signature data. + +Here's how you might digitally sign a message using S/MIME: + +```c +GMimeApplicationPkcs7Mime *pkcs7; +GMimeMessage *message; +GError *err = NULL; +GMimeObject *body; + +message = g_mime_message_new (TRUE); +g_mime_message_add_mailbox (message, GMIME_ADDRESS_TYPE_FROM, "Joey", "joey@friends.com"); +g_mime_message_add_mailbox (message, GMIME_ADDRESS_TYPE_TO, "Alice", "alice@wonderland.com"); +g_mime_message_set_subject (message, "How you doin?", NULL); + +/* create our message body (perhaps a multipart/mixed with the message text and some + * image attachments, for example) */ +body = CreateMessageBody (); + +/* now to sign our message body */ +if (!(pkcs7 = g_mime_application_pkcs7_mime_sign (body, "joey@friends.com", GMIME_DIGEST_ALGO_DEFAULT, &err))) { + fprintf (stderr, "sign failed: %s\n", err->message); + g_object_unref (body); + g_error_free (err); + return; +} + +g_object_unref (body); + +g_mime_message_set_mime_part (message, pkcs7); +g_object_unref (pkcs7); +``` + +S/MIME also gives you the option of using a `multipart/signed` method of signing a message. + +```c +GMimeMultipartSigned *ms; +GMimeCryptoContext *ctx; +GMimeMessage *message; +GError *err = NULL; +GMimeObject *body; + +message = g_mime_message_new (TRUE); +g_mime_message_add_mailbox (message, GMIME_ADDRESS_TYPE_FROM, "Joey", "joey@friends.com"); +g_mime_message_add_mailbox (message, GMIME_ADDRESS_TYPE_TO, "Alice", "alice@wonderland.com"); +g_mime_message_set_subject (message, "How you doin?", NULL); + +/* create our message body (perhaps a multipart/mixed with the message text and some + * image attachments, for example) */ +body = CreateMessageBody (); + +/* create our crypto context - needed because multipart/signed works for both S/MIME and PGP/MIME */ +ctx = g_mime_pkcs7_context_new (); + +/* now to sign our message body */ +if (!(ms = g_mime_multipart_signed_sign (ctx, body, "joey@friends.com", GMIME_DIGEST_ALGO_DEFAULT, &err))) { + fprintf (stderr, "sign failed: %s\n", err->message); + g_object_unref (body); + g_object_unref (ctx); + g_error_free (err); + return; +} + +g_object_unref (body); +g_object_unref (ctx); + +g_mime_message_set_mime_part (message, ms); +g_object_unref (ms); +``` + +If you'd prefer to use PGP instead of S/MIME, things work almost exactly the same except that you +would use the `GMimeGpgContext`. + +```c +GMimeMultipartSigned *ms; +GMimeCryptoContext *ctx; +GMimeMessage *message; +GError *err = NULL; +GMimeObject *body; + +message = g_mime_message_new (TRUE); +g_mime_message_add_mailbox (message, GMIME_ADDRESS_TYPE_FROM, "Joey", "joey@friends.com"); +g_mime_message_add_mailbox (message, GMIME_ADDRESS_TYPE_TO, "Alice", "alice@wonderland.com"); +g_mime_message_set_subject (message, "How you doin?", NULL); + +/* create our message body (perhaps a multipart/mixed with the message text and some + * image attachments, for example) */ +body = CreateMessageBody (); + +/* create our crypto context - needed because multipart/signed works for both S/MIME and PGP/MIME */ +ctx = g_mime_gpg_context_new (); + +/* now to sign our message body */ +if (!(ms = g_mime_multipart_signed_sign (ctx, body, "joey@friends.com", GMIME_DIGEST_ALGO_DEFAULT, &err))) { + fprintf (stderr, "sign failed: %s\n", err->message); + g_object_unref (body); + g_object_unref (ctx); + g_error_free (err); + return; +} + +g_object_unref (body); +g_object_unref (ctx); + +g_mime_message_set_mime_part (message, ms); +g_object_unref (ms); +``` + +### Verifying S/MIME and PGP/MIME Digital Signatures + +As mentioned earlier, both S/MIME and PGP/MIME typically use a `multipart/signed` part to contain the +signed content and the detached signature data. + +A `multipart/signed` contains exactly 2 parts: the first `GMimeObject` is the signed content while the second +`GMimeObject` is the detached signature and, by default, will either be a `GMimeApplicationPgpSignature` part +or a `GMimeApplicationPkcs7Signature` part (depending on whether the sending client signed using OpenPGP or +S/MIME). + +Because the `multipart/signed` part may have been signed by multiple signers, the +`g_mime_multipart_signed_verify()` function returns a `GMimeSignatureList` which contains a list of +digital signatures (one for each signer) that each contain their own metdata describing who that +signer is and what the status of their signature is. + +```c +if (GMIME_IS_MULTIPART_SIGNED (entity)) { + GMimeMultipartSigned *ms = (GMimeMultipartSigned *) entity; + GMimeSignatureList *signatures; + GError *err = NULL; + int i, count; + + if (!(signatures = g_mime_multipart_signed_verify (ms, 0, &err))) { + fprintf (stderr, "verify failed: %s\n", err->message); + g_error_free (err); + return; + } + + fputs ("\nSignatures:\n", stdout); + count = g_mime_signature_list_length (signatures); + for (i = 0; i < count; i++) { + GMimeSignature *sig = g_mime_signature_list_get_signature (signatures, i); + GMimeSignatureStatus status = g_mime_signature_get_status (sig); + GMimeCertificate *cert = g_mime_signature_get_certificate (sig); + time_t created = g_mime_signature_get_created (sig); + time_t expires = g_mime_signature_get_expires (sig); + + fprintf (stdout, "\tName: %s\n", g_mime_certificate_get_name (cert)); + fprintf (stdout, "\tKeyId: %s\n", g_mime_certificate_get_key_id (cert)); + fprintf (stdout, "\tFingerprint: %s\n", g_mime_certificate_get_fingerprint (cert)); + + fprintf (stdout, "\tTrust: "); + switch (g_mime_certificate_get_trust (cert)) { + case GMIME_TRUST_UNKNOWN: fputs ("Unknown\n", stdout); break; + case GMIME_TRUST_NEVER: fputs ("Never\n", stdout); break; + case GMIME_TRUST_UNDEFINED: fputs ("Undefined\n", stdout); break; + case GMIME_TRUST_MARGINAL: fputs ("Marginal\n", stdout); break; + case GMIME_TRUST_FULL: fputs ("Full\n", stdout); break; + case GMIME_TRUST_ULTIMATE: fputs ("Ultimate\n", stdout); break; + } + + fprintf (stdout, "\tStatus: "); + if (status & GMIME_SIGNATURE_STATUS_RED) + fputs ("BAD\n", stdout); + else if (status & GMIME_SIGNATURE_STATUS_GREEN) + fputs ("GOOD\n", stdout); + else if (status & GMIME_SIGNATURE_STATUS_VALID) + fputs ("VALID\n", stdout); + else + fputs ("UNKNOWN\n", stdout); + + fprintf (stdout, "\tSignature made on %s", ctime (&created)); + if (expires != (time_t) 0) + fprintf (stdout, "\tSignature expires on %s", ctime (&expires)); + else + fprintf (stdout, "\tSignature never expires\n"); + + fprintf (stdout, "\tErrors: "); + if (status & GMIME_SIGNATURE_STATUS_KEY_REVOKED) + fputs ("Key Revoked, ", stdout); + if (status & GMIME_SIGNATURE_STATUS_KEY_EXPIRED) + fputs ("Key Expired, ", stdout); + if (status & GMIME_SIGNATURE_STATUS_SIG_EXPIRED) + fputs ("Sig Expired, ", stdout); + if (status & GMIME_SIGNATURE_STATUS_KEY_MISSING) + fputs ("Key Missing, ", stdout); + if (status & GMIME_SIGNATURE_STATUS_CRL_MISSING) + fputs ("CRL Missing, ", stdout); + if (status & GMIME_SIGNATURE_STATUS_CRL_TOO_OLD) + fputs ("CRL Too Old, ", stdout); + if (status & GMIME_SIGNATURE_STATUS_BAD_POLICY) + fputs ("Bad Policy, ", stdout); + if (status & GMIME_SIGNATURE_STATUS_SYS_ERROR) + fputs ("System Error, ", stdout); + if (status & GMIME_SIGNATURE_STATUS_TOFU_CONFLICT) + fputs ("Tofu Conflict", stdout); + if ((status & GMIME_SIGNATURE_STATUS_ERROR_MASK) == 0) + fputs ("None", stdout); + fputs ("\n\n", stdout); + } + + g_object_unref (signatures); +} +``` + +It should be noted, however, that while most S/MIME clients will use the preferred `multipart/signed` +approach, it is possible that you may encounter an `application/pkcs7-mime` part with an "smime-type" +parameter set to "signed-data". Luckily, GMime can handle this format as well: + +```c +if (GMIME_IS_APPLICATION_PKCS7_MIME (entity)) { + GMimeApplicationPkcs7Mime *pkcs7 = (GMimeApplicationPkcs7Mime *) entity; + GMimeSecureMimeType smime_type; + + smime_type = g_mime_application_pkcs7_mime_get_smime_type (pkcs7); + + if (smime_type == GMIME_SECURE_MIME_TYPE_SIGNED_DATA) { + /* extract the original content and get a list of signatures */ + GMimeSignatureList *signatures; + GMimeObject extracted; + GError *err = NULL; + int i, count; + + /* Note: if you are rendering the message, you'll want to render the + * extracted mime part rather than the application/pkcs7-mime part. */ + + if (!(signatures = g_mime_application_pkcs7_mime_verify (pkcs7, 0, &extracted, &err))) { + fprintf (stderr, "verify failed: %s\n", err->message); + g_error_free (err); + return; + } + + count = g_mime_signature_list_length (signatures); + for (i = 0; i < count; i++) { + GMimeSignature *sig = g_mime_signature_list_get_signature (signatures, i); + /* ... */ + } + + g_object_unref (signatures); + } +} +``` + +## Documentation + +This is the README file for GMime. Additional documentation related to +development using GMime has been included within the source release +of GMime. + +| |Description | +|---------------|-------------------------------------------------------------| +|docs/reference/|Contains SGML and HTML versions of the GMime reference manual| +|docs/tutorial/ |Contains SGML and HTML versions of the GMime tutorial| +|AUTHORS |List of primary authors (source code developers)| +|COPYING |The GNU Lesser General Public License, version 2| +|INSTALL |In-depth installation instructions| +|TODO |Description of planned GMime development| +|PORTING |Guide for developers porting their application from an older version of GMime| + +You can find online developer documentation at +http://library.gnome.org/devel/gmime/stable/ + + +# Mailing Lists + +For discussion of GMime development (either of GMime itself or using +GMime in your own application), you may find the GMime-Devel +mailing-list helpful. To subscribe, please see +[http://mail.gnome.org/mailman/listinfo/gmime-devel-list](http://mail.gnome.org/mailman/listinfo/gmime-devel-list) + + +# Bindings + +Other developers have been working to make GMime available to programmers in other languages. +The current list of known bindings are: + +|Language |Location | +|-----------|----------------------------------------| +|Go |https://github.com/sendgrid/go-gmime | +|Perl |http://search.cpan.org/dist/MIME-Fast | +|C# |https://github.com/jstedfast/MimeKit | + + +# Reporting Bugs + +Bugs may be reported to the GMime development team by creating a new +[issue](https://github.com/jstedfast/gmime/issues). diff -Nru gmime-2.6.22+dfsg2/tests/data/partial/input/photo-discuss/message-partial.0.eml gmime-3.0.1/tests/data/partial/input/photo-discuss/message-partial.0.eml --- gmime-2.6.22+dfsg2/tests/data/partial/input/photo-discuss/message-partial.0.eml 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/tests/data/partial/input/photo-discuss/message-partial.0.eml 2017-03-28 23:46:29.000000000 +0000 @@ -0,0 +1,865 @@ +From: anonymous@mit.edu +Date: Tue, 28 Mar 2017 18:40:37 -0400 +Subject: Photo of a girl with feather earrings +Message-Id: <4KN8PRPHW0U4.IO0XMYJCHITO2@mit.edu> +To: photo-discuss@lists.nesop.edu +MIME-Version: 1.0 +Content-Type: message/partial; id="6MCVORPHW0U4.BCPTXD0EM9BT3@mit.edu"; + number=1; total=3 + +From: anonymous@mit.edu +Date: Tue, 28 Mar 2017 18:40:37 -0400 +Subject: Photo of a girl with feather earrings +Message-Id: <6MCVORPHW0U4.BCPTXD0EM9BT3@mit.edu> +To: photo-discuss@lists.nesop.edu +MIME-Version: 1.0 +Content-Type: multipart/mixed; boundary="=-/wKNlseqdbBnOf3qd253ow==" + +--=-/wKNlseqdbBnOf3qd253ow== +Content-Type: text/plain; charset=utf-8 +Content-Transfer-Encoding: quoted-printable + +Hey all, + +Took the attached photo of a girl on the subway. Just thought her earr= +ings were really cool looking. + +What do you think? + +--=-/wKNlseqdbBnOf3qd253ow== +Content-Type: image/jpeg; name=earrings.jpg +Content-Disposition: attachment; filename=earrings.jpg +Content-Transfer-Encoding: base64 + +/9j/4AAQSkZJRgABAQEASABIAAD/4gxYSUNDX1BST0ZJTEUAAQEAAAxITGlubwIQAABtbnRy +UkdCIFhZWiAHzgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA +9tYAAQAAAADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAA +ABRyWFlaAAACGAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRk +AAACxAAAAIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAA +ACR0ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0 +AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAA +AAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAA +AAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQ +WFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z2Rlc2MAAAAAAAAAFklF +QyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAA +AC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAA +AAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0 +aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRp +dGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAA +ABOk/gAUXy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAA +AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQA +AAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACB +AIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwEN +ARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJ +AdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLB +AssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5 +BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3 +BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9 +B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglP +CWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuw +C8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5k +Dn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFt +EYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTO +FPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiK +GK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyj +HMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEc +IUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3 +JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2 +K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDb +MRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbp +NyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1h +PaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RH +RIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0ua +S+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1Nf +U6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuV +W+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RA +ZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1g +bbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4 +d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEK +gWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuW +i/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaf +lwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqIm +opajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4t +rqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1 +uy67p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/ +yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO +1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj +4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/ +8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t////7Rpm +UGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAI0cAgAAAohxHAJQAB5QaG90b2dyYXBoZXI6IEpl +ZmZyZXkgU3RlZGZhc3QcAhkADW1hc3NhY2h1c2V0dHMcAhkACXBvcnRyYWl0cxwCGQANMTAw +IHN0cmFuZ2VycxwCGQAMbm9ydGggcXVpbmN5HAJ0ABtDb3B5cmlnaHQ6IEplZmZyZXkgU3Rl +ZGZhc3QAOEJJTQQlAAAAAAAQjGjE2Zu5v42TrLLrKSzP0zhCSU0D7QAAAAAAEABIAAAAAQAB +AEgAAAABAAE4QklNBCYAAAAAAA4AAAAAAAAAAAAAP4AAADhCSU0EDQAAAAAABAAAAB44QklN +BBkAAAAAAAQAAAAeOEJJTQPzAAAAAAAJAAAAAAAAAAABADhCSU0nEAAAAAAACgABAAAAAAAA +AAI4QklNA/UAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAAAAEAMgAA +AAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA/gAAAAAAHAAAP////////// +//////////////////8D6AAAAAD/////////////////////////////A+gAAAAA//////// +/////////////////////wPoAAAAAP////////////////////////////8D6AAAOEJJTQQA +AAAAAAACAAM4QklNBAIAAAAAAAgAAAAAAAAAADhCSU0EMAAAAAAABAEBAQE4QklNBC0AAAAA +AAYAAQAAABs4QklNBAgAAAAAABAAAAABAAACQAAAAkAAAAAAOEJJTQQeAAAAAAAEAAAAADhC +SU0EGgAAAAADRQAAAAYAAAAAAAAAAAAAEpAAAAxgAAAACABJAE0ARwBfADIANAA0ADAAAAAB +AAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAADGAAABKQAAAAAAAAAAAAAAAAAAAAAAEA +AAAAAAAAAAAAAAAAAAAAAAAAEAAAAAEAAAAAAABudWxsAAAAAgAAAAZib3VuZHNPYmpjAAAA +AQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRv +bWxvbmcAABKQAAAAAFJnaHRsb25nAAAMYAAAAAZzbGljZXNWbExzAAAAAU9iamMAAAABAAAA +AAAFc2xpY2UAAAASAAAAB3NsaWNlSURsb25nAAAAAAAAAAdncm91cElEbG9uZwAAAAAAAAAG +b3JpZ2luZW51bQAAAAxFU2xpY2VPcmlnaW4AAAANYXV0b0dlbmVyYXRlZAAAAABUeXBlZW51 +bQAAAApFU2xpY2VUeXBlAAAAAEltZyAAAAAGYm91bmRzT2JqYwAAAAEAAAAAAABSY3QxAAAA +BAAAAABUb3AgbG9uZwAAAAAAAAAATGVmdGxvbmcAAAAAAAAAAEJ0b21sb25nAAASkAAAAABS +Z2h0bG9uZwAADGAAAAADdXJsVEVYVAAAAAEAAAAAAABudWxsVEVYVAAAAAEAAAAAAABNc2dl +VEVYVAAAAAEAAAAAAAZhbHRUYWdURVhUAAAAAQAAAAAADmNlbGxUZXh0SXNIVE1MYm9vbAEA +AAAIY2VsbFRleHRURVhUAAAAAQAAAAAACWhvcnpBbGlnbmVudW0AAAAPRVNsaWNlSG9yekFs +aWduAAAAB2RlZmF1bHQAAAAJdmVydEFsaWduZW51bQAAAA9FU2xpY2VWZXJ0QWxpZ24AAAAH +ZGVmYXVsdAAAAAtiZ0NvbG9yVHlwZWVudW0AAAARRVNsaWNlQkdDb2xvclR5cGUAAAAATm9u +ZQAAAAl0b3BPdXRzZXRsb25nAAAAAAAAAApsZWZ0T3V0c2V0bG9uZwAAAAAAAAAMYm90dG9t +T3V0c2V0bG9uZwAAAAAAAAALcmlnaHRPdXRzZXRsb25nAAAAAAA4QklNBCgAAAAAAAwAAAAC +P/AAAAAAAAA4QklNBBQAAAAAAAQAAAAbOEJJTQQMAAAAABO+AAAAAQAAAGsAAACgAAABRAAA +yoAAABOiABgAAf/Y/+AAEEpGSUYAAQIAAEgASAAA/+0ADEFkb2JlX0NNAAH/7gAOQWRvYmUA +ZIAAAAAB/9sAhAAMCAgICQgMCQkMEQsKCxEVDwwMDxUYExMVExMYEQwMDAwMDBEMDAwMDAwM +DAwMDAwMDAwMDAwMDAwMDAwMDAwMAQ0LCw0ODRAODhAUDg4OFBQODg4OFBEMDAwMDBERDAwM +DAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCACgAGsDASIAAhEBAxEB/90A +BAAH/8QBPwAAAQUBAQEBAQEAAAAAAAAAAwABAgQFBgcICQoLAQABBQEBAQEBAQAAAAAAAAAB +AAIDBAUGBwgJCgsQAAEEAQMCBAIFBwYIBQMMMwEAAhEDBCESMQVBUWETInGBMgYUkaGxQiMk +FVLBYjM0coLRQwclklPw4fFjczUWorKDJkSTVGRFwqN0NhfSVeJl8rOEw9N14/NGJ5SkhbSV +xNTk9KW1xdXl9VZmdoaWprbG1ub2N0dXZ3eHl6e3x9fn9xEAAgIBAgQEAwQFBgcHBgU1AQAC +EQMhMRIEQVFhcSITBTKBkRShsUIjwVLR8DMkYuFygpJDUxVjczTxJQYWorKDByY1wtJEk1Sj +F2RFVTZ0ZeLys4TD03Xj80aUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9ic3R1dnd4eXp7fH +/9oADAMBAAIRAxEAPwDtFR6sP0A+KvKl1X+jj4pktiuDjlUgYttb4ulXVS/7UWfFNCVGlrjL +hKm2hm36Ijw8VJjXPcGtEucYA81fr6c8saXOYxrvbLid2h9zmtH9tycLKHOFTBw0DwhOAr3U +XdMxseS5tba3APeSSSD9FrnBY93Vsf1a8bEac3NvcGU0UzIP/CO/Mr/qselSm4oZF1GKA7Je +KgYA3TOv8ke5YfV+tZ+DZZhusaMqtxbazEAdsdMGizKa+zbZV/hK6vfv/nbPU/RrnXZzjY4u +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 +Dta6A36exrP0+Q/b7P0dP0/UVbrn1kpxHXZuTFjMcmrGxm/n2f6P/ime37VZ+f8AzH+FXn/V +ep9Q6xlHIyn7nWkjya0f4Nn37nfvqvfEbZhGhTa691jI6saDa9zmNc51gjbIaKvs9ez81v8A +IcqN7tgBcfcHHXzd/wCcqD7GuvbQ0/ScHvI7Bo/6nah5Ly9lh49wH3QkBsPM/wCMV5O/0H+K +E9Wc6rIkawZAWuM7Fe3dkMBgTuESI/lt9y5ex/6XcNQYPycjNvc1wY6HMmQTpGqeYRlVsRkR +dOyx2F6pbD20vGtO4bSXfvDb7P7Kjn5rfTGPSSxjolgc5x0+iJe4+387ZvWY9zw0FzDsI089 +TwxqH6zSwH6IiJMlsg/vEH6ScICwddFlt+vqFrYENcRxuMxr+d/5k9GwMiy3qVNj3TD9xA0A +A1P9b6ayRsI2loJYRsc/XcAT3/Ob/VVvEyXNrde1u1tVTjud+fa48/1PoMYxNzx/VTAGsgYf +4/pZeWP67GTtCQmfLH65f9FngZbGdSGXpFdpJeS6XMLnTtrZ7f5sv+mi9SfVXuwZDK67YMgF +riD7fHc7Z7n+yzes8faHMDbbA1j+a+XEfnRU3b/4I9XMlrLLmZW70jY0b7HCXywek7Yz/Bbm +1ts/64kYgZInoY8P1h6of9LKji4sUh1jLj/wcnoyf872WLnbHD12bnWBrq8Vo97x+ZZfG32t +/wAHX/24i7Oqf6QTu9WNI9T/AEf+Z7lVtzmVS3EZ7nHW9wlzoG3T85//AFCp+vkzO907t3In +dG3/ADtv5qfqxP8A/9k4QklNBCEAAAAAAHkAAAABAQAAABgAQQBkAG8AYgBlACAAUABoAG8A +dABvAHMAaABvAHAAIABFAGwAZQBtAGUAbgB0AHMAAAAcAEEAZABvAGIAZQAgAFAAaABvAHQA +bwBzAGgAbwBwACAARQBsAGUAbQBlAG4AdABzACAAOQAuADAAAAABADhCSU0EBgAAAAAABwAH +AAAAAQEA/+EZm1hNUAA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2lu +PSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4NCjx4OnhtcG1ldGEgeG1s +bnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYw +IDYxLjEzNDc3NywgMjAxMC8wMi8yNC0xNzo0Mzo1OCAgICAgICAgIj4NCgk8cmRmOlJERiB4 +bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMi +Pg0KCQk8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczpkYz0iaHR0cDovL3B1 +cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOk1pY3Jvc29mdFBob3RvPSJodHRwOi8v +bnMubWljcm9zb2Z0LmNvbS9waG90by8xLjAiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2Jl +LmNvbS94YXAvMS4wLyIgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEu +MC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxu +czpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZl +bnQjIiB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIgeG1sbnM6 +cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiBkYzpmb3Jt +YXQ9ImltYWdlL2pwZWciIE1pY3Jvc29mdFBob3RvOlJhdGluZz0iOTkiIHhtcDpDcmVhdG9y +VG9vbD0iTWljcm9zb2Z0IFdpbmRvd3MgTGl2ZSBQaG90byBHYWxsZXJ5MTQuMC44MDY0LjIw +NiIgeG1wOmNyZWF0b3J0b29sPSJNaWNyb3NvZnQgV2luZG93cyBMaXZlIFBob3RvIEdhbGxl +cnkxNC4wLjgwNjQuMjA2IiB4bXA6UmF0aW5nPSI1IiB4bXA6TW9kaWZ5RGF0ZT0iMjAxMS0w +Mi0xOVQxOToyMjozOC0wNTowMCIgeG1wOkNyZWF0ZURhdGU9IjIwMTEtMDItMTlUMTU6Mjc6 +NTItMDU6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMTEtMDItMTlUMTk6MjI6MzgtMDU6MDAi +IHRpZmY6c29mdHdhcmU9Ik1pY3Jvc29mdCBXaW5kb3dzIExpdmUgUGhvdG8gR2FsbGVyeTE0 +LjAuODA2NC4yMDYiIHRpZmY6T3JpZW50YXRpb249IjEiIHRpZmY6WUNiQ3JQb3NpdGlvbmlu +Zz0iMiIgdGlmZjpYUmVzb2x1dGlvbj0iNzIwMDAwLzEwMDAwIiB0aWZmOllSZXNvbHV0aW9u +PSI3MjAwMDAvMTAwMDAiIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiIHRpZmY6TWFrZT0iQ2Fu +b24iIHRpZmY6TW9kZWw9IkNhbm9uIEVPUyA1MEQiIHRpZmY6TmF0aXZlRGlnZXN0PSIyNTYs +MjU3LDI1OCwyNTksMjYyLDI3NCwyNzcsMjg0LDUzMCw1MzEsMjgyLDI4MywyOTYsMzAxLDMx +OCwzMTksNTI5LDUzMiwzMDYsMjcwLDI3MSwyNzIsMzA1LDMxNSwzMzQzMjsxQTYyQkI5MkE0 +M0NCRDZCODQyNzc1QTBFMjhBNkI1OSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpCMDMy +Qjk4NTg3M0NFMDExOEU3NkIyQTQxQzBBNDE2NSIgeG1wTU06RG9jdW1lbnRJRD0idXVpZDpm +YWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtcE1NOk9yaWdpbmFsRG9j +dW1lbnRJRD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIGV4 +aWY6RXhpZlZlcnNpb249IjAyMjEiIGV4aWY6Rmxhc2hwaXhWZXJzaW9uPSIwMTAwIiBleGlm +OkNvbG9yU3BhY2U9IjEiIGV4aWY6UGl4ZWxYRGltZW5zaW9uPSIzMTY4IiBleGlmOlBpeGVs +WURpbWVuc2lvbj0iNDc1MiIgZXhpZjpEYXRlVGltZU9yaWdpbmFsPSIyMDExLTAyLTE5VDE1 +OjI3OjUyLTA1OjAwIiBleGlmOkRhdGVUaW1lRGlnaXRpemVkPSIyMDExLTAyLTE5VDE1OjI3 +OjUyLTA1OjAwIiBleGlmOkV4cG9zdXJlVGltZT0iMS8xMDAiIGV4aWY6Rk51bWJlcj0iMjgv +MTAiIGV4aWY6RXhwb3N1cmVQcm9ncmFtPSIzIiBleGlmOlNodXR0ZXJTcGVlZFZhbHVlPSI0 +MzQxNzYvNjU1MzYiIGV4aWY6QXBlcnR1cmVWYWx1ZT0iMjk3MDg1NC8xMDAwMDAwIiBleGlm +OkV4cG9zdXJlQmlhc1ZhbHVlPSIwLzEiIGV4aWY6TWV0ZXJpbmdNb2RlPSIzIiBleGlmOkZv +Y2FsTGVuZ3RoPSI4NS8xIiBleGlmOkZvY2FsUGxhbmVYUmVzb2x1dGlvbj0iNDc1MjAwMC84 +OTQiIGV4aWY6Rm9jYWxQbGFuZVlSZXNvbHV0aW9uPSIzMTY4MDAwLzU5NyIgZXhpZjpGb2Nh +bFBsYW5lUmVzb2x1dGlvblVuaXQ9IjIiIGV4aWY6Q3VzdG9tUmVuZGVyZWQ9IjAiIGV4aWY6 +RXhwb3N1cmVNb2RlPSIwIiBleGlmOldoaXRlQmFsYW5jZT0iMCIgZXhpZjpTY2VuZUNhcHR1 +cmVUeXBlPSIwIiBleGlmOkdQU1ZlcnNpb25JRD0iMi4yLjAuMCIgZXhpZjpOYXRpdmVEaWdl +c3Q9IjM2ODY0LDQwOTYwLDQwOTYxLDM3MTIxLDM3MTIyLDQwOTYyLDQwOTYzLDM3NTEwLDQw +OTY0LDM2ODY3LDM2ODY4LDMzNDM0LDMzNDM3LDM0ODUwLDM0ODUyLDM0ODU1LDM0ODU2LDM3 +Mzc3LDM3Mzc4LDM3Mzc5LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3 +Mzg2LDM3Mzk2LDQxNDgzLDQxNDg0LDQxNDg2LDQxNDg3LDQxNDg4LDQxNDkyLDQxNDkzLDQx +NDk1LDQxNzI4LDQxNzI5LDQxNzMwLDQxOTg1LDQxOTg2LDQxOTg3LDQxOTg4LDQxOTg5LDQx +OTkwLDQxOTkxLDQxOTkyLDQxOTkzLDQxOTk0LDQxOTk1LDQxOTk2LDQyMDE2LDAsMiw0LDUs +Niw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwyMCwyMiwyMywyNCwyNSwyNiwy +NywyOCwzMDtBOUI3RTk5REREOUI2Nzg0NUE3MTNBNTY1RkY0NTUwNSIgcGhvdG9zaG9wOkNv +bG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIj4N +CgkJCTxkYzpzdWJqZWN0Pg0KCQkJCTxyZGY6QmFnPg0KCQkJCQk8cmRmOmxpPm1hc3NhY2h1 +c2V0dHM8L3JkZjpsaT4NCgkJCQkJPHJkZjpsaT5wb3J0cmFpdHM8L3JkZjpsaT4NCgkJCQkJ +PHJkZjpsaT4xMDAgc3RyYW5nZXJzPC9yZGY6bGk+DQoJCQkJCTxyZGY6bGk+bm9ydGggcXVp +bmN5PC9yZGY6bGk+DQoJCQkJPC9yZGY6QmFnPg0KCQkJPC9kYzpzdWJqZWN0Pg0KCQkJPGRj +OmNyZWF0b3I+DQoJCQkJPHJkZjpTZXE+DQoJCQkJCTxyZGY6bGk+UGhvdG9ncmFwaGVyOiBK +ZWZmcmV5IFN0ZWRmYXN0PC9yZGY6bGk+DQoJCQkJPC9yZGY6U2VxPg0KCQkJPC9kYzpjcmVh +dG9yPg0KCQkJPGRjOnJpZ2h0cz4NCgkJCQk8cmRmOkFsdD4NCgkJCQkJPHJkZjpsaSB4bWw6 +bGFuZz0ieC1kZWZhdWx0Ij5Db3B5cmlnaHQ6IEplZmZyZXkgU3RlZGZhc3Q8L3JkZjpsaT4N +CgkJCQk8L3JkZjpBbHQ+DQoJCQk8L2RjOnJpZ2h0cz4NCgkJCTxNaWNyb3NvZnRQaG90bzpM +YXN0S2V5d29yZFhNUD4NCgkJCQk8cmRmOkJhZz4NCgkJCQkJPHJkZjpsaT5tYXNzYWNodXNl +dHRzPC9yZGY6bGk+DQoJCQkJCTxyZGY6bGk+cG9ydHJhaXRzPC9yZGY6bGk+DQoJCQkJCTxy +ZGY6bGk+MTAwIHN0cmFuZ2VyczwvcmRmOmxpPg0KCQkJCQk8cmRmOmxpPm5vcnRoIHF1aW5j +eTwvcmRmOmxpPg0KCQkJCTwvcmRmOkJhZz4NCgkJCTwvTWljcm9zb2Z0UGhvdG86TGFzdEtl +eXdvcmRYTVA+DQoJCQk8eG1wTU06SGlzdG9yeT4NCgkJCQk8cmRmOlNlcT4NCgkJCQkJPHJk +ZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOkFG +MzJCOTg1ODczQ0UwMTE4RTc2QjJBNDFDMEE0MTY1IiBzdEV2dDp3aGVuPSIyMDExLTAyLTE5 +VDE5OjIyOjM4LTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3Ag +RWxlbWVudHMgOS4wIFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4NCgkJCQkJPHJkZjps +aSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOkIwMzJC +OTg1ODczQ0UwMTE4RTc2QjJBNDFDMEE0MTY1IiBzdEV2dDp3aGVuPSIyMDExLTAyLTE5VDE5 +OjIyOjM4LTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgRWxl +bWVudHMgOS4wIFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4NCgkJCQk8L3JkZjpTZXE+ +DQoJCQk8L3htcE1NOkhpc3Rvcnk+DQoJCQk8ZXhpZjpDb21wb25lbnRzQ29uZmlndXJhdGlv +bj4NCgkJCQk8cmRmOlNlcT4NCgkJCQkJPHJkZjpsaT4xPC9yZGY6bGk+DQoJCQkJCTxyZGY6 +bGk+MjwvcmRmOmxpPg0KCQkJCQk8cmRmOmxpPjM8L3JkZjpsaT4NCgkJCQkJPHJkZjpsaT4w +PC9yZGY6bGk+DQoJCQkJPC9yZGY6U2VxPg0KCQkJPC9leGlmOkNvbXBvbmVudHNDb25maWd1 +cmF0aW9uPg0KCQkJPGV4aWY6SVNPU3BlZWRSYXRpbmdzPg0KCQkJCTxyZGY6U2VxPg0KCQkJ +CQk8cmRmOmxpPjgwMDwvcmRmOmxpPg0KCQkJCTwvcmRmOlNlcT4NCgkJCTwvZXhpZjpJU09T +cGVlZFJhdGluZ3M+DQoJCQk8ZXhpZjpGbGFzaCBleGlmOkZpcmVkPSJGYWxzZSIgZXhpZjpS +ZXR1cm49IjAiIGV4aWY6TW9kZT0iMiIgZXhpZjpGdW5jdGlvbj0iRmFsc2UiIGV4aWY6UmVk +RXllTW9kZT0iRmFsc2UiLz4NCgkJPC9yZGY6RGVzY3JpcHRpb24+DQoJPC9yZGY6UkRGPg0K +PC94OnhtcG1ldGE+DQo8P3hwYWNrZXQgZW5kPSd3Jz8+ICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +CiAgICAgICAgICAgICAgICAgICAgICAgICAgICD/2wBDAAEBAQEBAQEBAQEBAQECAgMCAgIC +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 diff -Nru gmime-2.6.22+dfsg2/tests/data/partial/input/photo-discuss/message-partial.1.eml gmime-3.0.1/tests/data/partial/input/photo-discuss/message-partial.1.eml --- gmime-2.6.22+dfsg2/tests/data/partial/input/photo-discuss/message-partial.1.eml 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/tests/data/partial/input/photo-discuss/message-partial.1.eml 2017-03-28 23:46:29.000000000 +0000 @@ -0,0 +1,850 @@ +From: anonymous@mit.edu +Date: Tue, 28 Mar 2017 18:40:37 -0400 +Subject: Photo of a girl with feather earrings +Message-Id: +To: photo-discuss@lists.nesop.edu +MIME-Version: 1.0 +Content-Type: message/partial; id="6MCVORPHW0U4.BCPTXD0EM9BT3@mit.edu"; + number=2; total=3 + +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 diff -Nru gmime-2.6.22+dfsg2/tests/data/partial/input/photo-discuss/message-partial.2.eml gmime-3.0.1/tests/data/partial/input/photo-discuss/message-partial.2.eml --- gmime-2.6.22+dfsg2/tests/data/partial/input/photo-discuss/message-partial.2.eml 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/tests/data/partial/input/photo-discuss/message-partial.2.eml 2017-03-28 23:46:29.000000000 +0000 @@ -0,0 +1,751 @@ +From: anonymous@mit.edu +Date: Tue, 28 Mar 2017 18:40:37 -0400 +Subject: Photo of a girl with feather earrings +Message-Id: +To: photo-discuss@lists.nesop.edu +MIME-Version: 1.0 +Content-Type: message/partial; id="6MCVORPHW0U4.BCPTXD0EM9BT3@mit.edu"; + number=3; total=3 + +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 + +--=-/wKNlseqdbBnOf3qd253ow==-- diff -Nru gmime-2.6.22+dfsg2/tests/data/partial/output/photo-discuss gmime-3.0.1/tests/data/partial/output/photo-discuss --- gmime-2.6.22+dfsg2/tests/data/partial/output/photo-discuss 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/tests/data/partial/output/photo-discuss 2017-03-28 23:46:29.000000000 +0000 @@ -0,0 +1,2439 @@ +From: anonymous@mit.edu +Date: Tue, 28 Mar 2017 18:40:37 -0400 +Subject: Photo of a girl with feather earrings +Message-Id: <6MCVORPHW0U4.BCPTXD0EM9BT3@mit.edu> +To: photo-discuss@lists.nesop.edu +MIME-Version: 1.0 +Content-Type: multipart/mixed; boundary="=-/wKNlseqdbBnOf3qd253ow==" + +--=-/wKNlseqdbBnOf3qd253ow== +Content-Type: text/plain; charset=utf-8 +Content-Transfer-Encoding: quoted-printable + +Hey all, + +Took the attached photo of a girl on the subway. Just thought her earr= +ings were really cool looking. + +What do you think? + +--=-/wKNlseqdbBnOf3qd253ow== +Content-Type: image/jpeg; name=earrings.jpg +Content-Disposition: attachment; filename=earrings.jpg +Content-Transfer-Encoding: base64 + +/9j/4AAQSkZJRgABAQEASABIAAD/4gxYSUNDX1BST0ZJTEUAAQEAAAxITGlubwIQAABtbnRy +UkdCIFhZWiAHzgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA +9tYAAQAAAADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAA +ABRyWFlaAAACGAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRk +AAACxAAAAIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAA +ACR0ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0 +AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAA +AAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAA +AAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQ +WFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z2Rlc2MAAAAAAAAAFklF +QyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAA +AC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAA +AAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0 +aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRp +dGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAA +ABOk/gAUXy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAA +AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQA +AAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACB +AIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwEN +ARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJ +AdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLB +AssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5 +BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3 +BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9 +B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglP +CWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuw +C8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5k +Dn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFt +EYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTO +FPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiK +GK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyj +HMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEc +IUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3 +JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2 +K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDb +MRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbp +NyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1h +PaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RH +RIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0ua +S+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1Nf +U6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuV +W+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RA +ZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1g +bbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4 +d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEK +gWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuW +i/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaf +lwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqIm +opajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4t +rqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1 +uy67p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/ +yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO +1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj +4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/ +8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t////7Rpm +UGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAI0cAgAAAohxHAJQAB5QaG90b2dyYXBoZXI6IEpl +ZmZyZXkgU3RlZGZhc3QcAhkADW1hc3NhY2h1c2V0dHMcAhkACXBvcnRyYWl0cxwCGQANMTAw +IHN0cmFuZ2VycxwCGQAMbm9ydGggcXVpbmN5HAJ0ABtDb3B5cmlnaHQ6IEplZmZyZXkgU3Rl +ZGZhc3QAOEJJTQQlAAAAAAAQjGjE2Zu5v42TrLLrKSzP0zhCSU0D7QAAAAAAEABIAAAAAQAB +AEgAAAABAAE4QklNBCYAAAAAAA4AAAAAAAAAAAAAP4AAADhCSU0EDQAAAAAABAAAAB44QklN +BBkAAAAAAAQAAAAeOEJJTQPzAAAAAAAJAAAAAAAAAAABADhCSU0nEAAAAAAACgABAAAAAAAA +AAI4QklNA/UAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAAAAEAMgAA +AAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA/gAAAAAAHAAAP////////// +//////////////////8D6AAAAAD/////////////////////////////A+gAAAAA//////// +/////////////////////wPoAAAAAP////////////////////////////8D6AAAOEJJTQQA +AAAAAAACAAM4QklNBAIAAAAAAAgAAAAAAAAAADhCSU0EMAAAAAAABAEBAQE4QklNBC0AAAAA +AAYAAQAAABs4QklNBAgAAAAAABAAAAABAAACQAAAAkAAAAAAOEJJTQQeAAAAAAAEAAAAADhC +SU0EGgAAAAADRQAAAAYAAAAAAAAAAAAAEpAAAAxgAAAACABJAE0ARwBfADIANAA0ADAAAAAB +AAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAADGAAABKQAAAAAAAAAAAAAAAAAAAAAAEA +AAAAAAAAAAAAAAAAAAAAAAAAEAAAAAEAAAAAAABudWxsAAAAAgAAAAZib3VuZHNPYmpjAAAA +AQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRv +bWxvbmcAABKQAAAAAFJnaHRsb25nAAAMYAAAAAZzbGljZXNWbExzAAAAAU9iamMAAAABAAAA +AAAFc2xpY2UAAAASAAAAB3NsaWNlSURsb25nAAAAAAAAAAdncm91cElEbG9uZwAAAAAAAAAG +b3JpZ2luZW51bQAAAAxFU2xpY2VPcmlnaW4AAAANYXV0b0dlbmVyYXRlZAAAAABUeXBlZW51 +bQAAAApFU2xpY2VUeXBlAAAAAEltZyAAAAAGYm91bmRzT2JqYwAAAAEAAAAAAABSY3QxAAAA +BAAAAABUb3AgbG9uZwAAAAAAAAAATGVmdGxvbmcAAAAAAAAAAEJ0b21sb25nAAASkAAAAABS +Z2h0bG9uZwAADGAAAAADdXJsVEVYVAAAAAEAAAAAAABudWxsVEVYVAAAAAEAAAAAAABNc2dl +VEVYVAAAAAEAAAAAAAZhbHRUYWdURVhUAAAAAQAAAAAADmNlbGxUZXh0SXNIVE1MYm9vbAEA +AAAIY2VsbFRleHRURVhUAAAAAQAAAAAACWhvcnpBbGlnbmVudW0AAAAPRVNsaWNlSG9yekFs +aWduAAAAB2RlZmF1bHQAAAAJdmVydEFsaWduZW51bQAAAA9FU2xpY2VWZXJ0QWxpZ24AAAAH +ZGVmYXVsdAAAAAtiZ0NvbG9yVHlwZWVudW0AAAARRVNsaWNlQkdDb2xvclR5cGUAAAAATm9u +ZQAAAAl0b3BPdXRzZXRsb25nAAAAAAAAAApsZWZ0T3V0c2V0bG9uZwAAAAAAAAAMYm90dG9t +T3V0c2V0bG9uZwAAAAAAAAALcmlnaHRPdXRzZXRsb25nAAAAAAA4QklNBCgAAAAAAAwAAAAC +P/AAAAAAAAA4QklNBBQAAAAAAAQAAAAbOEJJTQQMAAAAABO+AAAAAQAAAGsAAACgAAABRAAA +yoAAABOiABgAAf/Y/+AAEEpGSUYAAQIAAEgASAAA/+0ADEFkb2JlX0NNAAH/7gAOQWRvYmUA +ZIAAAAAB/9sAhAAMCAgICQgMCQkMEQsKCxEVDwwMDxUYExMVExMYEQwMDAwMDBEMDAwMDAwM +DAwMDAwMDAwMDAwMDAwMDAwMDAwMAQ0LCw0ODRAODhAUDg4OFBQODg4OFBEMDAwMDBERDAwM +DAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCACgAGsDASIAAhEBAxEB/90A +BAAH/8QBPwAAAQUBAQEBAQEAAAAAAAAAAwABAgQFBgcICQoLAQABBQEBAQEBAQAAAAAAAAAB +AAIDBAUGBwgJCgsQAAEEAQMCBAIFBwYIBQMMMwEAAhEDBCESMQVBUWETInGBMgYUkaGxQiMk +FVLBYjM0coLRQwclklPw4fFjczUWorKDJkSTVGRFwqN0NhfSVeJl8rOEw9N14/NGJ5SkhbSV +xNTk9KW1xdXl9VZmdoaWprbG1ub2N0dXZ3eHl6e3x9fn9xEAAgIBAgQEAwQFBgcHBgU1AQAC +EQMhMRIEQVFhcSITBTKBkRShsUIjwVLR8DMkYuFygpJDUxVjczTxJQYWorKDByY1wtJEk1Sj +F2RFVTZ0ZeLys4TD03Xj80aUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9ic3R1dnd4eXp7fH +/9oADAMBAAIRAxEAPwDtFR6sP0A+KvKl1X+jj4pktiuDjlUgYttb4ulXVS/7UWfFNCVGlrjL +hKm2hm36Ijw8VJjXPcGtEucYA81fr6c8saXOYxrvbLid2h9zmtH9tycLKHOFTBw0DwhOAr3U +XdMxseS5tba3APeSSSD9FrnBY93Vsf1a8bEac3NvcGU0UzIP/CO/Mr/qselSm4oZF1GKA7Je +KgYA3TOv8ke5YfV+tZ+DZZhusaMqtxbazEAdsdMGizKa+zbZV/hK6vfv/nbPU/RrnXZzjY4u +3B5kvbWZeT4WXWb/AHf1UaU+ggtJcGuDiww7aQYJAePo/wAh7Hp4XNfV/qmNj4AFh2vue57n +kgyR+j9wZ/N+m0fRsaz/AEq3aM6i4Syxr/h/d9JCxdKopiFFS3A9wfMcKKKn/9DtFR6r/R/m +rypdV/o3zTZbFIcdUv8AD2fJXQqbQPtNpP0WxPnPZNC5t4kB4cQSWxA7HXd7vuRep51nqtax +0NDeSeCdHbfzdu5aP1exhkAkAEsneTwJWN9ZRUzJ216tIeAB2ke3/O2oZCRDRMBcnl+ovusx +rBu0dcxoH9Vtu4fisvGzc3pV1tuLvFt9D8cvrcGuax5abvTe6u11b3bGs9SrZZs9RambZ6eG +6wQZvLyPMM9/+c9rnLOvya7JMQ/dtB+XtUeOcrvfVfOIqnJ9SxjtrP1cNkQzcDH8p7vck2st ++XBCsXPDn7yPu7eai0wZA0PLeB/YU4NsdKxTsyW7iNtp2EngOd9Bx/tq42wNMtJa4akcEH5K +ncxvpkiYOh8v5SPrexuS3U2CXgc7x7bf8536Vv8AxibIWL7JiaNOpideyK4a8ixv8rn71p/t +2qPoGdsxp9Kfo/1dv5y5b0yYc3WfxTyfA8R/sQ+qaf/R7RUuq/0f5q6qXVP6OfihLYpDjqiS +ftNjRrMQPPhXlPoOK3I6457xNWK313jsS3Slv/bv/UJgS9Hi0jpvTqsXi+0b7vHdE7f7DVyP +WQLLmmdSASY84n/pLeyeoOszg+dGHn4nb/35YGcB9uLJBLS5sTrzKiyysH8GfHCvst5m1rsj +pmW3l9AbbpzLR6Vsf2Fj3NGvmWn5FpW1g2CnqGS0jcy4PaWc7pLm7P7X0Vm5+P6GQ+sO3M2t +Nbxw5pn03j+s1KG5H1RLZqNYS1oPPuB89pTBmunB0g/9SjOIZVuPh+Lv9yg10+6OfpBTBjK7 +R5bgdCFCtzsKx1cbqnkWMnwPse3/AKhGcxxh7NfEDkjxCHnAurrcDq2QD3/tBEKLfa1j2G5n +uY7V4H/nz+s3/CKX2RviPpeI4/e5/wCks/ByjW4dmnkeB43Bavr4sfRH0d0SOZ/89fnKPhPF +XdfY4bf/0u0VLqv8wrqpdU/mCgdikOP3Vj6uvt/aObS10Vuo3vHYln0f+rcgMY99ja62l73n +a1g5JPYJ3WVYJtZQ4W5Fo233A+0NPNGP/I/0t/8Ahv8AifpxmQiL+xfCBkaH1cjq5ute5rrC +2tx+iNNB9PX+VP0kS6uo5lOSGjc5lZL58GtZ/wBUELLqvcd5G5uunmVSxMXJpxadzSx2OXBr +Q4Fu1x9Q/vfve1NNGO4ZtQdmrZjkdUura7aX2uYw+BO57FX6iDbRTcBt0I28wQRuYP7e9XOq +NNedZc0alzbW/HcP+pcmza22VWhv0RF9Y8j7XN/zSxNBoxKCLtyH176SPE/kVSLKZ3D6MCDp +M+a1RUWtDjoAZ+9Ru6fbdWz0m6FzgT2aGt9Tf/Ub/wCo08To13WyjpbRrta7USf3m8OH8oJ7 +AXtDSd7T9EjlV3May57DPtcdjwOBPtRxvYQLmktdPvaYcC32u/tf104+CwHujFF3DSHEcdnf +5r43KezMiPSd+79F3xn+qrVRDQN7m7Dw50R8PpfSV+enxG+v6HnzMpvEb2+q7hFb/R//0+0V +Lqf8wVcKpdTP6FI7FQcyzOx+n4nqHW/J3tLjoGVsIa6sf8bO63/gvTVAWsez1w5r2P8A3T/3 +5XqMLH6haMLKZ6lFp97Pl9Ns/Rc1ZOT0v7FkW49Tdr3kbuQ0wIbb6Y9rXuZ9NQyherZxTFcN +ebrUV1mo9w4aKpkGprSzui1k01NrmdrYlUcmzcVCIWTqzAitXK6odWyJ2+10fd/31KhvqNx3 +zod1LvDa8kN/6XpIuQ31ORPY+KjjUu+z218uA3M84h7f+lSiRQpYWrcCystI9zTEI3VMkY2H +TjVAPbtsJb4usc1nu/q0V7E+aG3XeswEMshzweQ4RvVXJabbPfr6Y2E+Uf8AfU8UaK2TQtxs +e8ixr/T3AEsfwOHe12n7qhVaavVLmiza15DT3dZtb/1S1MullWBtBBsGx4PgHm2ts/2kDFwa +ra7i9u11Ve520SCR7Wbm/wBdPH4LeCzo1NrG2zS39C8bm7jA2xu2O1/84ei+njf6NnE/SP8A +m/8AqVV84inIOJWdwqa0PcNYt1c//N3bHKpF/wC8Z3ePf/zlGtLWfpcPjT//1OyJVHqQmmZ4 +KuuKpdR/mD8UjsVBpdNufVmsLAHOdIa08F0F1X/goY9ZGRldTxHOu6swlzoe+xzh6rdwDh9o +rP0fpbdv5i1MR+QL9uK4V5NrXV02OkBr3fQ9zfo7v5vf/LXP5FXUb8hzc1zrS1zvVDjJFgMO +3fvqOQsC2fFQB1H2atxmdVk1epQ8WNBgwZg+CBY6TClTRVjiK2gSPcGiAoWvEpoADJdonNCJ +UGCyTO1wLXfH95Bc7zUmP0lx4SlG0qtY0VndxzKzxYz1xXMEukHkTGrf80IublAtLBpu0MLP +cG7YcR2hziQB+650fmtQjHotJ1denDoay1xrafWBJD55nd4+xzFn5fUaenY9lNBY7JeQQAd2 +0j6Ntz9f5v8AwVX76p3CG2NcSSAWuG6RPxk7lk3QDA07wE8RWnJQ0GpRg+4kkkzqTqTOskom +8+OvighPtdCewv8A/9XsHKn1E/q5CtF2sFVM+TS7sBySkdlNLpdZs6lit7eq1x+DT6jv+pVX +Ktruyrr3xute55jzKs1WDEc3Jcf5s7mjjc5usH/gq/8ACf8AbazcrpfVbKRnYVIdjXHcxjrG +tsG47Wt2vLfUa53829qhM4k8N6x1ky4pCyD1RWvZ2VS61vzWZfn5FdrqrW7LGnaa5BM8R7dy +p251rzDTCcGQmnRtyms7qs7qE8FUxWbDLnyURtbRwEqQZEq9V9z4HAUrnbHUs7vfA+TXP/6r +alU3Y+ex5Q89365iAamLSB57YYgTQJ7An7F2MXkgDrxTjH/GkxynOax0nkRHxWS4bnQFbzMg +Wta5hlrwCD8R/wB9VavQfHX7uE8aBhOpU2lxJ/k6lS2ItZaAd3BEeev+5Nv/AJPlH/fULVT/ +AP/W65xVPPspqx335DtlNeriOST9FjP+EerTpc4Aclc8+vI+s/UXUYZI6ZhHa67s55+m9n7z +7P8AB/uU/pEzLIgVHWUtI/8AfIJ7M+l4+R1rMFlzNuMCB6Y42t9wq/4qtv8APf8AqRX/AK45 +rcfEZQwHs5wboQ1um8/usY3ct/Gw6Om4oYAGAAB3wGuz/vz1579duom0XNZJtyCBHBgkMYzX ++t/1arTIxmGIDinklr9PnlItnlcQqc5fLjjxecz8m7ldI6fXm493Ucbe7IduJvd7fTYPY2ij +92276WTm/wCCp/Q0en+mXMdQbsudUHB5Yfe5shu7+RP5q73Our6H9VKcarS7JG58cu/0bP3n +cMs/7aXBObuJ3ck6tGp/tOViNWSP5f8AorGQeu511X6fnHHuAuJfQTDp1LZ/PaunDKNu5pBa +RIK5V1OhjtqrXTs19EUWHdX/AIMnt5Jx1VE1oXcd6f5ugHdZuaycvFeB7fUayfNxKsOvDhJU +q6234brJ99OZRDfjXku/74osp4YSPhX+Mz4BxZsY/rx/5p4nn9QAx2myWn5Epw8duSrPV8Z1 +PU7KWCfUItYPKwep/wBF29RrxmtIYPcT9I+P/mKkhMSjGQ/SAl9rDlgceScD+hIx/wAXRG1l +1g3hpaz97/yKJ6B/cPExJ4/0q3MDoz8l+3JJZW1nqFjCN0fmsdH59n069v8AgvetH7Bj+tt9 +V2/d6MQ7+Z9L1PW3T9P0Pfs/616iNjv0tjs9n//X3r8bL63kW9Kw7Dj4VJ2dTzG6uc7/AMrs +X+r/ANq7P+tLoMPD6f0bDbjYjG1trbJHgPzn2O/8+WKPTqaMTEa2isVY7RNbDoXfnOse53uc +5/07bnrN6g63LaKKXmsXnc6ziWjV17uNtFX+DUUjw2d5S/lwj+qmEbNll1PqI/Z7ssOIrcSx +m4RI5fZH7q8t6rknOyazJIusDWt7kTDf857t67D6957a8LGxKWllFlbdkyDsJd6lj/zvoM3f +9cqXF1vDcnFsI+gd48ZJKriJOWUz+j+rj/0py/xm5xCOGMB+n+sl/wBCEXS+s94u6j6G79FS +0VSNSAPZDP8AhHx/0FhX4Rpra+qHBgixnJHPu/6K08gevaXD3OJ47kGd8fytEPGyrKy4ugMa +NSZMDs2+r85rf9I39Iz/AIRTQJA/Fgyany0clrd2siCIHh96A9rmEh3bv5ro7KOk5ZIdVbg3 +WQQ+ssfW4ngsB/Rv3fyPTeqOT0W4xVj2NvtmGtdNbiP+E9T2t2/1lJxfT+XdjB6NJmc4V9pA +7q/0C030ZNDjL7srGc3x0ry2H/q2qQ+qlQj1c4PI+myqvSf3W3WO/wCl6StYFJx82nHoqDKG +2AOc0cnhpe/85yhzyEsOTh6RMr2+T1tjldM+Li09QQ5Ff2vFxcrm5jn4l7z22Oc6of8AbaZu +K1rj6eo2y8k+Jazg/T+mrWN7n52I8bw8vur5jdW4v2Ncza5r3s/N3LPecmz0WBzat7XENjaC +6fT2b4duv2+pt9T9/wDRo8uK4o38puI/qZP1n/oH+AjmjZE/3x6j/Xx/qz/3M/8ADdHGs2it +9BO2l4Y+5u4vj215Nxa17dtdm30nv+m//g6q/wBLV/auV6e/1X7o9Wdx27t/pbPo/wCj/P8A +9Mq7oqFtTa6vRAAsY15eGgfSdbd7n+72NU/tH+E21xH0tn5n8x9H6P2fd+i+zfzv+G/nFY0u +/wAWq//Q7O2wvxm35QPp3BpFbhtc5p/mcfa76PqR6t+7+ap/trI+sHVaum4rrsp7RbeCAD7Z +Dta6A36exrP0+Q/b7P0dP0/UVbrn1kpxHXZuTFjMcmrGxm/n2f6P/ime37VZ+f8AzH+FXn/V +ep9Q6xlHIyn7nWkjya0f4Nn37nfvqvfEbZhGhTa691jI6saDa9zmNc51gjbIaKvs9ez81v8A +IcqN7tgBcfcHHXzd/wCcqD7GuvbQ0/ScHvI7Bo/6nah5Ly9lh49wH3QkBsPM/wCMV5O/0H+K +E9Wc6rIkawZAWuM7Fe3dkMBgTuESI/lt9y5ex/6XcNQYPycjNvc1wY6HMmQTpGqeYRlVsRkR +dOyx2F6pbD20vGtO4bSXfvDb7P7Kjn5rfTGPSSxjolgc5x0+iJe4+387ZvWY9zw0FzDsI089 +TwxqH6zSwH6IiJMlsg/vEH6ScICwddFlt+vqFrYENcRxuMxr+d/5k9GwMiy3qVNj3TD9xA0A +A1P9b6ayRsI2loJYRsc/XcAT3/Ob/VVvEyXNrde1u1tVTjud+fa48/1PoMYxNzx/VTAGsgYf +4/pZeWP67GTtCQmfLH65f9FngZbGdSGXpFdpJeS6XMLnTtrZ7f5sv+mi9SfVXuwZDK67YMgF +riD7fHc7Z7n+yzes8faHMDbbA1j+a+XEfnRU3b/4I9XMlrLLmZW70jY0b7HCXywek7Yz/Bbm +1ts/64kYgZInoY8P1h6of9LKji4sUh1jLj/wcnoyf872WLnbHD12bnWBrq8Vo97x+ZZfG32t +/wAHX/24i7Oqf6QTu9WNI9T/AEf+Z7lVtzmVS3EZ7nHW9wlzoG3T85//AFCp+vkzO907t3In +dG3/ADtv5qfqxP8A/9k4QklNBCEAAAAAAHkAAAABAQAAABgAQQBkAG8AYgBlACAAUABoAG8A +dABvAHMAaABvAHAAIABFAGwAZQBtAGUAbgB0AHMAAAAcAEEAZABvAGIAZQAgAFAAaABvAHQA +bwBzAGgAbwBwACAARQBsAGUAbQBlAG4AdABzACAAOQAuADAAAAABADhCSU0EBgAAAAAABwAH +AAAAAQEA/+EZm1hNUAA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2lu +PSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4NCjx4OnhtcG1ldGEgeG1s +bnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYw +IDYxLjEzNDc3NywgMjAxMC8wMi8yNC0xNzo0Mzo1OCAgICAgICAgIj4NCgk8cmRmOlJERiB4 +bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMi +Pg0KCQk8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczpkYz0iaHR0cDovL3B1 +cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOk1pY3Jvc29mdFBob3RvPSJodHRwOi8v +bnMubWljcm9zb2Z0LmNvbS9waG90by8xLjAiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2Jl +LmNvbS94YXAvMS4wLyIgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEu +MC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxu +czpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZl +bnQjIiB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIgeG1sbnM6 +cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiBkYzpmb3Jt +YXQ9ImltYWdlL2pwZWciIE1pY3Jvc29mdFBob3RvOlJhdGluZz0iOTkiIHhtcDpDcmVhdG9y +VG9vbD0iTWljcm9zb2Z0IFdpbmRvd3MgTGl2ZSBQaG90byBHYWxsZXJ5MTQuMC44MDY0LjIw +NiIgeG1wOmNyZWF0b3J0b29sPSJNaWNyb3NvZnQgV2luZG93cyBMaXZlIFBob3RvIEdhbGxl +cnkxNC4wLjgwNjQuMjA2IiB4bXA6UmF0aW5nPSI1IiB4bXA6TW9kaWZ5RGF0ZT0iMjAxMS0w +Mi0xOVQxOToyMjozOC0wNTowMCIgeG1wOkNyZWF0ZURhdGU9IjIwMTEtMDItMTlUMTU6Mjc6 +NTItMDU6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMTEtMDItMTlUMTk6MjI6MzgtMDU6MDAi +IHRpZmY6c29mdHdhcmU9Ik1pY3Jvc29mdCBXaW5kb3dzIExpdmUgUGhvdG8gR2FsbGVyeTE0 +LjAuODA2NC4yMDYiIHRpZmY6T3JpZW50YXRpb249IjEiIHRpZmY6WUNiQ3JQb3NpdGlvbmlu +Zz0iMiIgdGlmZjpYUmVzb2x1dGlvbj0iNzIwMDAwLzEwMDAwIiB0aWZmOllSZXNvbHV0aW9u +PSI3MjAwMDAvMTAwMDAiIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiIHRpZmY6TWFrZT0iQ2Fu +b24iIHRpZmY6TW9kZWw9IkNhbm9uIEVPUyA1MEQiIHRpZmY6TmF0aXZlRGlnZXN0PSIyNTYs +MjU3LDI1OCwyNTksMjYyLDI3NCwyNzcsMjg0LDUzMCw1MzEsMjgyLDI4MywyOTYsMzAxLDMx +OCwzMTksNTI5LDUzMiwzMDYsMjcwLDI3MSwyNzIsMzA1LDMxNSwzMzQzMjsxQTYyQkI5MkE0 +M0NCRDZCODQyNzc1QTBFMjhBNkI1OSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpCMDMy +Qjk4NTg3M0NFMDExOEU3NkIyQTQxQzBBNDE2NSIgeG1wTU06RG9jdW1lbnRJRD0idXVpZDpm +YWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtcE1NOk9yaWdpbmFsRG9j +dW1lbnRJRD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIGV4 +aWY6RXhpZlZlcnNpb249IjAyMjEiIGV4aWY6Rmxhc2hwaXhWZXJzaW9uPSIwMTAwIiBleGlm +OkNvbG9yU3BhY2U9IjEiIGV4aWY6UGl4ZWxYRGltZW5zaW9uPSIzMTY4IiBleGlmOlBpeGVs +WURpbWVuc2lvbj0iNDc1MiIgZXhpZjpEYXRlVGltZU9yaWdpbmFsPSIyMDExLTAyLTE5VDE1 +OjI3OjUyLTA1OjAwIiBleGlmOkRhdGVUaW1lRGlnaXRpemVkPSIyMDExLTAyLTE5VDE1OjI3 +OjUyLTA1OjAwIiBleGlmOkV4cG9zdXJlVGltZT0iMS8xMDAiIGV4aWY6Rk51bWJlcj0iMjgv +MTAiIGV4aWY6RXhwb3N1cmVQcm9ncmFtPSIzIiBleGlmOlNodXR0ZXJTcGVlZFZhbHVlPSI0 +MzQxNzYvNjU1MzYiIGV4aWY6QXBlcnR1cmVWYWx1ZT0iMjk3MDg1NC8xMDAwMDAwIiBleGlm +OkV4cG9zdXJlQmlhc1ZhbHVlPSIwLzEiIGV4aWY6TWV0ZXJpbmdNb2RlPSIzIiBleGlmOkZv +Y2FsTGVuZ3RoPSI4NS8xIiBleGlmOkZvY2FsUGxhbmVYUmVzb2x1dGlvbj0iNDc1MjAwMC84 +OTQiIGV4aWY6Rm9jYWxQbGFuZVlSZXNvbHV0aW9uPSIzMTY4MDAwLzU5NyIgZXhpZjpGb2Nh +bFBsYW5lUmVzb2x1dGlvblVuaXQ9IjIiIGV4aWY6Q3VzdG9tUmVuZGVyZWQ9IjAiIGV4aWY6 +RXhwb3N1cmVNb2RlPSIwIiBleGlmOldoaXRlQmFsYW5jZT0iMCIgZXhpZjpTY2VuZUNhcHR1 +cmVUeXBlPSIwIiBleGlmOkdQU1ZlcnNpb25JRD0iMi4yLjAuMCIgZXhpZjpOYXRpdmVEaWdl +c3Q9IjM2ODY0LDQwOTYwLDQwOTYxLDM3MTIxLDM3MTIyLDQwOTYyLDQwOTYzLDM3NTEwLDQw +OTY0LDM2ODY3LDM2ODY4LDMzNDM0LDMzNDM3LDM0ODUwLDM0ODUyLDM0ODU1LDM0ODU2LDM3 +Mzc3LDM3Mzc4LDM3Mzc5LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3 +Mzg2LDM3Mzk2LDQxNDgzLDQxNDg0LDQxNDg2LDQxNDg3LDQxNDg4LDQxNDkyLDQxNDkzLDQx +NDk1LDQxNzI4LDQxNzI5LDQxNzMwLDQxOTg1LDQxOTg2LDQxOTg3LDQxOTg4LDQxOTg5LDQx +OTkwLDQxOTkxLDQxOTkyLDQxOTkzLDQxOTk0LDQxOTk1LDQxOTk2LDQyMDE2LDAsMiw0LDUs +Niw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwyMCwyMiwyMywyNCwyNSwyNiwy +NywyOCwzMDtBOUI3RTk5REREOUI2Nzg0NUE3MTNBNTY1RkY0NTUwNSIgcGhvdG9zaG9wOkNv +bG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIj4N +CgkJCTxkYzpzdWJqZWN0Pg0KCQkJCTxyZGY6QmFnPg0KCQkJCQk8cmRmOmxpPm1hc3NhY2h1 +c2V0dHM8L3JkZjpsaT4NCgkJCQkJPHJkZjpsaT5wb3J0cmFpdHM8L3JkZjpsaT4NCgkJCQkJ +PHJkZjpsaT4xMDAgc3RyYW5nZXJzPC9yZGY6bGk+DQoJCQkJCTxyZGY6bGk+bm9ydGggcXVp +bmN5PC9yZGY6bGk+DQoJCQkJPC9yZGY6QmFnPg0KCQkJPC9kYzpzdWJqZWN0Pg0KCQkJPGRj +OmNyZWF0b3I+DQoJCQkJPHJkZjpTZXE+DQoJCQkJCTxyZGY6bGk+UGhvdG9ncmFwaGVyOiBK +ZWZmcmV5IFN0ZWRmYXN0PC9yZGY6bGk+DQoJCQkJPC9yZGY6U2VxPg0KCQkJPC9kYzpjcmVh +dG9yPg0KCQkJPGRjOnJpZ2h0cz4NCgkJCQk8cmRmOkFsdD4NCgkJCQkJPHJkZjpsaSB4bWw6 +bGFuZz0ieC1kZWZhdWx0Ij5Db3B5cmlnaHQ6IEplZmZyZXkgU3RlZGZhc3Q8L3JkZjpsaT4N +CgkJCQk8L3JkZjpBbHQ+DQoJCQk8L2RjOnJpZ2h0cz4NCgkJCTxNaWNyb3NvZnRQaG90bzpM +YXN0S2V5d29yZFhNUD4NCgkJCQk8cmRmOkJhZz4NCgkJCQkJPHJkZjpsaT5tYXNzYWNodXNl +dHRzPC9yZGY6bGk+DQoJCQkJCTxyZGY6bGk+cG9ydHJhaXRzPC9yZGY6bGk+DQoJCQkJCTxy +ZGY6bGk+MTAwIHN0cmFuZ2VyczwvcmRmOmxpPg0KCQkJCQk8cmRmOmxpPm5vcnRoIHF1aW5j +eTwvcmRmOmxpPg0KCQkJCTwvcmRmOkJhZz4NCgkJCTwvTWljcm9zb2Z0UGhvdG86TGFzdEtl +eXdvcmRYTVA+DQoJCQk8eG1wTU06SGlzdG9yeT4NCgkJCQk8cmRmOlNlcT4NCgkJCQkJPHJk +ZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOkFG +MzJCOTg1ODczQ0UwMTE4RTc2QjJBNDFDMEE0MTY1IiBzdEV2dDp3aGVuPSIyMDExLTAyLTE5 +VDE5OjIyOjM4LTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3Ag +RWxlbWVudHMgOS4wIFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4NCgkJCQkJPHJkZjps +aSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOkIwMzJC +OTg1ODczQ0UwMTE4RTc2QjJBNDFDMEE0MTY1IiBzdEV2dDp3aGVuPSIyMDExLTAyLTE5VDE5 +OjIyOjM4LTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgRWxl +bWVudHMgOS4wIFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4NCgkJCQk8L3JkZjpTZXE+ +DQoJCQk8L3htcE1NOkhpc3Rvcnk+DQoJCQk8ZXhpZjpDb21wb25lbnRzQ29uZmlndXJhdGlv +bj4NCgkJCQk8cmRmOlNlcT4NCgkJCQkJPHJkZjpsaT4xPC9yZGY6bGk+DQoJCQkJCTxyZGY6 +bGk+MjwvcmRmOmxpPg0KCQkJCQk8cmRmOmxpPjM8L3JkZjpsaT4NCgkJCQkJPHJkZjpsaT4w +PC9yZGY6bGk+DQoJCQkJPC9yZGY6U2VxPg0KCQkJPC9leGlmOkNvbXBvbmVudHNDb25maWd1 +cmF0aW9uPg0KCQkJPGV4aWY6SVNPU3BlZWRSYXRpbmdzPg0KCQkJCTxyZGY6U2VxPg0KCQkJ +CQk8cmRmOmxpPjgwMDwvcmRmOmxpPg0KCQkJCTwvcmRmOlNlcT4NCgkJCTwvZXhpZjpJU09T +cGVlZFJhdGluZ3M+DQoJCQk8ZXhpZjpGbGFzaCBleGlmOkZpcmVkPSJGYWxzZSIgZXhpZjpS +ZXR1cm49IjAiIGV4aWY6TW9kZT0iMiIgZXhpZjpGdW5jdGlvbj0iRmFsc2UiIGV4aWY6UmVk +RXllTW9kZT0iRmFsc2UiLz4NCgkJPC9yZGY6RGVzY3JpcHRpb24+DQoJPC9yZGY6UkRGPg0K +PC94OnhtcG1ldGE+DQo8P3hwYWNrZXQgZW5kPSd3Jz8+ICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +CiAgICAgICAgICAgICAgICAgICAgICAgICAgICD/2wBDAAEBAQEBAQEBAQEBAQECAgMCAgIC +AgQDAwIDBQQFBQUEBAQFBgcGBQUHBgQEBgkGBwgICAgIBQYJCgkICgcICAj/2wBDAQEBAQIC +AgQCAgQIBQQFCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI +CAgICAj/wAARCAH0AU0DAREAAhEBAxEB/8QAHwAAAgICAwEBAQAAAAAAAAAABgcFCAQJAgMK +AQsA/8QAShAAAgEDAgQEBAIHBQcDBAAHAQIDBAURBiEABxIxEyJBUQgUYXEygRUjQpGhsfAJ +UmLB0RYkM0OC4fEXcqIlNHOSU2MmRFRltP/EAB4BAAEEAwEBAQAAAAAAAAAAAAQCAwUGAAEH +CAkK/8QASREAAQMCAwQIBAQFAgYBAwMFAQACEQMhBBIxBUFRYQYTInGBkaHwMrHB0QcIFOEj +QlJi8RVyJDOCkqKyQwkWwhc0Y1Nzg8PS/9oADAMBAAIRAxEAPwD0yFSVIYd/pxDqR7lw7nHS +B9c8aSi2ADK/lBI2C9X1/nxkRcpOYFfCpwScY9PrxrLayyBN0utaRk0VQcdx7fTgXFtBBlP0 +TuWuHmQCtylHlGGPf14pOLBzxxUpRAykHeli/cZ6fT7EfX24xjZMlJywZK6Ok5YkMAT3P34L +YbW1WngarGqELKxZTnY9tx9OCGNg8kkQltrZAbTWAqpYg78LaSD2UgGRIsq6aMPg38yFRjr9 +9u//AJ4PpETKFpHtEjRPe51XihQCm2TkZHp/W/CY3TdPSJg+CFquMFTgEN7H7fv42wkrAztA +SlneaESkoFBK9vv/AKf9+JjD3Eod7RFkKJpATnDRkgk4IG2PbgwVzuQnUgm6z6bQcAI8VBj0 +AH+WPtw2cbvnROmgLAiyM7do+iixmFSwO49D9OA3Y0kTvW+qAhSc+k6SSNgYcNj0Gx+314S3 +EHNMp/8ATwCoCTl9TSFz4Ix3BPY8Oux2kIf9NIIKmbZyypJomr50iobahw1Q6562xska7GRz +7DsN2IHG6mKJJk6JTaI05rNt+iaNpWVYkUIrSFiuyqB/Q4HGLc7RP9WwCCpilsFFCVZYo3U4 +zt/D9/DX6gvBWZTEqVht1LGAPCUg4BPr+XGjVMpynScXEOUjBDTgpiMDcD7f9+EguIhZLTAb +ostQuGwq9Oe2CP3cY2dFokC2se7rKx0sQVORtjGcDPfhBZvlJm+Ybl/Fl/DhlGRtjII/04X1 +ZIkLdQtNgNFxc9KjJJYDGc9/6/y4xrCTBTYaN66hHgj8Jb0H+n9evC3G/csBcTZfyq3U3T1A +E+/9Y4csTzW8xF12qcgZXqIyMkHhsU7yVp7gGRvXWwy/TjB6s5znPCwwgwkkgCeCyI8EIMYx +2+w9frxhBcBJ5LYIBkFdhQ+cbMoBOO5B4cDYsBosquB00K4ZYgHLEbYztn6f9/rw11e9L0GX +iushs+ZVVcE7eo4fa2LJtoEyu4IGBCgb9tz9fXhljSddywOAJi6xGDnAYYYZxtnbheQQYSwb +5iV1unV1EDJIzkA7jOf38Yxp1Kxr4GU71jmMkA/XI3/hwp1O9+CwkgLHfK9JKnqz3Izv3yOG +ajZ0WCToo6chfD8mCRk7+vCWMJ+EpZdw0XpA2YAlifTiTQWYHRcCcNjPSO/bvxocFsXXwYA3 +9du3YcaBAssg6LkRsFIJGNsjhSSWhL/WIzQTNjJwSOBa92yiqGq1vczEH6Ulz2DHJx24pOIs +48lIYc5RLilW2CWJPTnhGS0jVY9pFvd18cYweluruPfg2k8gEBJAhY8pUqCScAZwMd9+H2AE +hYG5rBLrWMZa2zqMl+k9hnJxw5TYCCdE3RsLqstsmFNdyoJUFtt+CsNBMBYxoaSQm7HOJ3X8 +LHGw4x87002MxXGZBLGqnY9PtjhYtdZkMXUO9rDk9QQAnGCM/Xf+vfgtuJE2SJiXeysyltSq +pPQACuewyRv34Q+qCl9WMoy6rK+UAKjpJB2J+vDL3Tos7RE6grLggw2CMEtuMD24yeCyoAbT +opOGkmqI5Wii60iAeR2IVI17ZZuw+nqfTPbjAeK01976LMqEhoi0EUTz1g2Z5kx4Y7+SM757 +eZvyA78JPApyAdNSoqfxahiZTLJJ2HUxYgfTPp/DjbTdNMuZKy4EEFFVySMI5ZemKJOohipO +WbHtsB+fCjDQkhztNSsRUdiuHCb74XOd+FsIiFjQfiWT0gKSDkkA4Aztn3/z4SXhO9au1FDn +cq/t075PCpcEwReW6LKGQQT1DO2Ccj04waRwTuSxtqu5WOBgMdtznbv/AA4TlE8Fj4NxouYQ +geZTjPvt+f04d1dAKQSGDMdV8aNWABBbO2cbN9OEulosnCARLtVxIDFs9JXGx77fbh0NLQmg +DlXFUJ6W6d+kdRI7/f1400B1itgiDCyQqlckkrnO+eHy2TKS47t64NEHKt0nHZdu+3C3OGkJ +sPLYssgYAzkn8v6+vCWgC4SrxdcSijpwAG6skEfT1/l7caeDqdVjRJuvnS3SMkknPfvxs3ML +WXhoushVZyQVGcD7cbZIF1sg7lkdIIbuI++3sM7cYCLgb1uIEhYjkswP4cE4wNse/CmDswdV +mR2qx2AAGCWAGVyNj9f48JAvbcsAtJ1K6HQv1MQF37gfw42ROu5bi8cViOm/7SgE579uE5bk +cVvNaVHugdySzqO/rj8v4cMuqFltVpzl6O2BKgBiPTiRCGIkWXUc7KwJYnH343xhbBhcl6VA +GwGTtnjQSXEalcCRtsSM9z/lwpLiAgnV4PyMhI3wdwOBK9mlOMI3LW7zNJN0kOTjr+3FPxjR +nR9N82lKxyT1Lj+Hb6nhlkEyU7IOi6CAwPmKr9d9zwQ0AaarUhcHU9JVgqk7Ee/9f58EsbBJ +GhTeYaFAWrkBttSApPl9Pbghi2wzcqpW4vgwcDqGN8Hv/wBv48OUCTPJNOAJIN7JvUL7J14J +znPv9eHXkapDRBhS0agsoIB6hgkDGfvwnKYMJUhwhu5ZEcZRQBhcent/rxhgGyW2zbLuwCfL ++X34wC0SmS3U71/CNWOThhnOQMjH9Y4zWyUWD6qQt9sq7hW0dBb4fHrql1hhjBx1O2wBPoN8 +59ACeNtg2GqwEzKLzJaoLsKWk6K2wWpGmTqXAuNQoA8Vh7PJjpB7RgD1OVhwDsw3Ju7Wxu93 +97kO/Jiojlud5rpE8V2ceXrnqW7sQNgBnOWJx7Z42xt+1ZabPG6xaaiiq63wYjL8qvU7NIAr +CMbkHHr2Ax6442GtLraFbdmiXLhWwyfMyTSL4RyAEBz4YPYH8sDjRaJgLTwA2yxmQxOI2KI2 +ex7jb1425oDTmSnNyiJ1X8Y3LCN4m6z5QAM5PsB/lxjDeQtFhHZ4rOZvk1NKCpqWGJWG4T3U +f5/u4ce6NU41xBPLRfyDqDhSWHYt2z9uEkHLJSQ8kiTZciBlsAADA9v634XTuYKS4yspIwxX +JDDPfPfPCXDK5IYQDELr8PJTK4IHp7998d+CHNJkaLbrhSlDaLhdoJ5bdSzVqRn9fKAFigX3 +llJCIPfqYcE4bAVa/ZpNLo4bu86DxTDsQymcznAe96VesebfKXQ0cyXTWlTqi5ICGt2kLLVX ++qU+zSQqlKp/91RxK0ujhEGvUa08B2j/AONvVRx2qHD+Axz+4GPMw31VJr78fGo6fmFb7Haf +hp5t03Lh50jqr5daFRVwIThpEoYJmV8DshmUn1I4S/ZTBUAzW4x9J+qfo4itkLuqM8JE/OPV +Xfl5m8ublyU5j88tEcwbPq+1aPdZL/p662K6acvy0xdFapo4quKSlq408QuyrUKwWN8AkBWk +cR0aPVGtSfma3UxEd959PFRjekAGIbhn0y1zo/zIkRx7QPIi6zuWvMHSfNXRll1zoqva46eu +ERaJnXpkjZTho3T9l1IwR9iNiOK69mQlp1U8KhcM0I3f16SD2xnfb2z7cNvjMAU8xus8F/A/ +tDOexwN+EW1Nkm4tvXHo8xQBwT2AOdt88byyUpryuzoIBdmG59vxf9+FBnFNOdayxpFILlSB +nbvwpvAJIN5KxZB5mZsZLY2GD9xwhhBdKU+pAC6HYkdBAGds/wCueFgBZEQsGQl8YXMfc+nT +v34TOY2Ss0aqNcRlsnofO/btwioYMQtlrtF6POokZI6T6nPc8GQmTyXWBuVLEnjRSGsMSV8z +s2Cy4OA3v+7jSUO5fDk5Jz1fUfv42tCdQgvVin9Hy4znBzvwxX0IOicpgla3OaCsLo4GSerb +J4peME1JKlaDBEpTt1DG7d8DYe//AI4ZLrWTmtxZdanbcnPt78E0rGEwTcuXx1PnByW3GD6/ +f/XgwGLNCwyZBGqBtWD/AOm1g9QDvjse54dmUlgsqhnJvoBYtlthn6+37+C6UApFUQeHem7Q +t+qDDLOSANjt7/z/AIcIe06LbmTKIYukqF2yBtttjHtwnfZYJuF2h9w2WXbufX34UWEBLcez +AXJcHBZSxxkDHbjbY1CadAMTqu5Tgk5Yjvj3/LjIkpWcu7IRha+q1WS438ErWT9dqoTjcMy5 +nlHrlY2EYPvN9OHAMslaaBGV3v39Vk2myAvTWh4Jaq7VLeK9OiljTU6gnzqPMWJGy+mB3PZt +rZcAtF3ZAKGK2WoqquaSrp5EnU9LII+hogNgCv7JGAMH6cbcCTOkLVnOklObR/LS/VFokuVD +Sw/pCXCGasISCnTY9IO/VIc/hAJGBxKYTAVXjsC/y/dC1MQ1ol/v3vWDqDlrqLQlmul1u8dH +PSyRxlamKTxk8RpR0qWGyuAT5Tg8arYB9Fsv19+4Sm12uMNSloqSoudXDRUKSSTucA7nC+rM +QNlHcn04j/iMDennkNJAGuikJ2pqbx6S0x1NXMrFfmyuDj1RB6Z337+nCgRozRZmdEFRj0VZ +RSQrU0dVTlwGXxIygP26vpxj3EWeCspsbOcGy5xSxAhcks25PUME+23bjf8ALYJ0MsGneuxU +diCFKpkAZ3UcOTLreSZYBlIcURXSzf7KaetmsNfXG36D0nXEmgqriel7ko2Z6SkUmeoX060X +ozt154ksNsqrUYKlTss4n6DU+CA/WsLi2mC4jW1p79DG+JjfCq9zN+N3lFyt8WDQnLep5g3e +INmt1avXC22OqO0U7qMAnI8aZj2yvccSs4WgYazrDxdYeDR9SmmUa1QS50DgNT3kG3mVrJ51 +fGZ8YvO6vtVp05pkSWxmEFBR1NF4FKfbwKKIQ06n/E3Ufc8R2L6WUCCatQEN3A2Hg23pKIbs +J5c3K0ydJH3t4gBVo1Lqf4gdM3hLfzx1/YOWkkY6zQUkgqa2RfpHTSSKn/Vj7cRZ6TvxFPNg +WZwe8D1go8bO6p3V4h8evysgm4889DwzSB9Rc6b8/bxJb3PTxk59Ilzj93AwpbYeJdUDTwCP +/UbMFmsM8SVmyc0Zk05f7Rpe464t1JdKJ1uFve/1csVwhyCiTU7MsbAMocyOrY6QFO7EE4Cr +jnv/AE1SsXA68ANTyJPoNbpvF0sKxvXspBpGh3z9P8LbH/Zq2XUdk5E3fUV2Wf5C9Xl5rZCW +IBhgj8FpkU+jyB8HuRGDxLbXe1tUMGoChsBSJYSTr9P3WxSGsEqt0wvK3c9LDI/LP0PEYx4J +uiarSD3Lv8WIg9TyU7HOA46fb39O/C2RqtVLGw1Ui6ZVSASenv6Hh0u3lNBx3roIJwScY7dx ++X8uNQTqEsiAukh1BLHcHfA2+3Gpg2SCWkwsSQDDZLLsAM99/b340GlLbrELDZQek5zvgZ9B +wqZAPBYDuKj3IQ58wwdjj19uMA1gLYEiVHzgMVLBG7/i2xxuCdUljgJGq9HDZxgAL6bDglqa +tNl1npX8RyT340tgncuOX3bOASc/17cJtvSQQV/MCQxzkd8H04UQltse9Ceqh/8ATZScnc54 +HriWlOU7Fa2eagxeJQCoPXg8UnGnt6qSpuix1KUOTgKcuw7Y/Z/rHDOa6U4g6WXBQCAPKfb9 +3vwcwCJTTQQeS+OSB28x7Z75+vBjGwSmn1HRewQRqxwLdVjcYU7Y37bcOtYspkl0FVFnyL8P +N1MXxnHf+v8AXheHFoWntJeS7RNq3/h7HP8ALt/rw/VZCzIwtNtFOKNh1DA2z6Z224Z00W21 +N/NZEYYqM9I+wIyff+GM8bLiCtPjNYQshc+TpLKT39x9M8bATJN51A+qz7fbbhdKumobbSvU +180qwwqv7cjHAH29z7AnsOMY0kwLp1kzJTit9LaY69q2XrlsVlpWhtwWFmNYyFnmqQu2C8nW +VzsB0k56AC62nOu5MdaR2tZ9z7+i6bFfNQajp9TVRWaGmelEESRqxSPqcbKVAGQAPrw+2m94 +INgnH5SYtKffIXl4mu0vOseYdyt9bo+ymKOrrHp5GqhKCOmFXYKZnJKAR+YZK5I4PwVAuOeo +6QOVxyQj67Q2NPfvvVurFfLBZ9SWr5a3w2aaMzi3WwSrO7RKOqTpyAzSgbnfc5A6uLTgKzG2 +Ag3sga7XkydJ3KvvxGxtdqhmsWIkq2gqJmjYCAskjMHTbygggkbYPb6wW2quZ5a3eQpDB0AW +h28qnEpodP6buaW6XAmf5aWdcBrlJkl1jPdKdfw52LHP5RLWhrT5d/7J1hzOjegWrrKwx0jB +IKB2bqijpSyJAo/ZxnPUc++dvfhp4EBwEJectM7kTUN5kt9quNor6q43S3VZjEkDTu/g4z+s +TJ2lGRjHoCD34eoVIaQ+SDCYrAugsF5VJ+enxf8AKnkHWpaLtPNry8CVY/l7VIh8RiMr0tuX +JyvlQEgtg4PD4wR+J+nz/b3qtNxDQYGvyt6x/lUs1Bz/AOfWs9WXDW2urjd+U1ihhSCh5X6Z +kzJGp2WW7V7ZdXkIyYlxjODgbcHVKFNl3jLbQfWffcmKfWkwDOvdr7lQFbQfEjzWs9y1LBZb +Zyw0fSp4U95r6xKGiSMbBJKuYrgrnISI7jPl96TtTp1hqDuoa4ufua3tH9lZMDsGq9nWVOy0 +byYb3Sqca71VoPQlZLQR80JOYGpM7zWGnlSFm7kJOwSSUfXAX6nheEZjMW0Pq0sg/uInyEwm +qxo0HZWvzf7ZA8CYJ8gq26t5ymr8aOOKFncAFZqn5mVNzs2MjP06j7cT2H2QGDXyEKLr4tzm +z87oB0/Sai17UXJNPUNI1JRxiouNXLJDTUVqhJwJaypkKQ08Z9GkZersuTgcHValGg0GoddB +qSeQ1PghKdKpU+HQa8kxIKDlZpSjt95r+Yev57WZRBU6n0romGro4JgEZo6CW6VlD826LLG7 +PHEAoeMh2WRZCPXoY+tTNWnSGSSAHOIkjccjXRukSdbjcn6dTDsdlLjmgaDj3/buQnYdMcsN +YfEJDYNA8/75y00S/hRTa45n2nwJqypkAV3nobc9SIKZnfHnmlKxgyO+R0getjMbhcJ1tSgH +1BMMpnQDm6JPcBOgCcbRw9WvGfKze5wnxgd8r0v8m+YlgpOW+lNOWsR6RrrDC+mq60z1nipb +K+ikalqYRIFAdPFhd1f9tXVvU8AVMQKobXBkVAHDudcH6HgVItw4a7qjALJB8NfP5J4xalqa +mlNURbqqIeUT004fH0z2/I8JJfNlgaAOK7KTUwqHFPJdFdT3+Y8qH6bf58KbUJ8UmpSOuiKK +Ks6nUiUQAnvC3VGR7lvTH14NpguEA3TNSm1qmhJclbCVVJLGd1Mg/F+Y/dw7SD96FeARZcJa +6ppsCtoyYs460PUN+HQSNVssANlzSojmICOfEx+HGMdvQ+vGhEmFjhN1wdT1t0nc5AJ9PqeM +Y0LTh2YKwJAWJZSuM5H1+44SJkpAdJuoyVVDYJC+22c8Nhg/mRAII3L0cZyCRj6b8SI0QhJP +wrh+ycBgcd/z4bIMpQuvilRkZAwPfOeMcszbyF8xhSAScjtjc8KmUhz+CFNUAG3TDpVdtse3 ++nDNbQp+nGaFrZ5pk/pWVcMR1Ehfrnii41pa4yFI0B2QUnnYDAOMEZ2J4bDRqnXm6/lIKkkh +mIxkbhvvwbRMmIsmzEwVyb8Lbqy/v34Kdqkkg9lAWrGzQVQK4HQcEZ24eaLapIILpVR3UG/R +goGbq9/xffhykLwE250k5U3rcvUnmVDnfGdh+fvw8TaE24bplT0YQgYHl7ZP88cIAISyARby +WdTUs1SJFp6eecxRSTydIJ8ONfxOT6KNsntuPccKAcTZZWEEZiuChQA7YRSfX0400EGy0IYZ +CthonlnW2jR9JVXSX9BaivFUYUnedYpaCgERaWIOT+qqJT0J1EAqjFMguxB1Ki8NB0nwEfSU +O+o0kTf7Xnz/AGVhuTXLvlmlBb6/mHPqCC/VVUIKaqiqA7W9mlTwi1XT5i6sxqATlQrdPm34 +ldlYQsYXVyC4ndNuF7++KHxNQOdLRHv9k1bxS8kdL2ttLLoaiFpVWppKiB368+NlhIqsBIqu +ynJHWCScsMcT9RmHYA0iRuj6oUNdw0UklfpOwadt+h9N3ii07RxVc9wmSsZTM1YWKQoB3fEj +ltyNgmM7cDtoBpygwBJTrszbjmfGCB85SV5o81rDYqu/2u22qkW4W+Q09XUQKySvEqh0kEm/ +S5YgknZyBtjYtYuoB8Lb+4W6VKZG4KvnPHnNarfy+l1Db8pRKrinKvgSKsEkxIY+gBTBxxSM +ftOdodUP7fnB+as2HwZGGJ3EOjwBK1j3n45NAyVVNa6rSNzqdQJ4k0dMk0TRtAhAkAA7MAwY +H1BzvxP1A3NdRLMM7LYrhcfjZ5VaanqDqSKGNZIEe3zU0T9UqeIemRQSOlsKwcMCQUPqOEua +wGY7kp1JxETzWsv4sPjl1RrjTVRbNDajvGndPtWS23wLWCLhf6liuIKfpy6jLYLd8EAZYgcP +08NT0BJP+UI7O1uZ3ZGnM/URv8lYn+zl/s9ec/Na4WXUVJoP/wBRedVtVaWmp1p1qKXSNLLJ +4ny0RkYRPMjFvEqZWWKNmKB2KksZTe+rJpRDLSdOP3QNevSw4HW/E7QASY4Ab76n4Qd+9bBv +is5CfCt/ZW6Grbr8VHPimrviiv1ulqrDyw0BRUt7v9Q7qxhqK+vr42paGm8Xo65Wpm6sOIfG +YYMYej7agL8RUcZ3A5R9z32HiorFdJsY55w+z6bQ9tjmGbLIsXn4QY/kbneQZEDtDyzc2Odn +OPmXZaW980uYmqNSXGJ+ilp6qoZ5HibZ1p4EUU9PErnGEQNv0+nDezdgYHBiMPSa2d8XPMk3 +PiVZquKrVfjeXH3oNAqw1VDqy4vb6JLZcrdFcKlaOmhSGQy1kx/ZCAGaZsYJAB+g34kP1FME +wdBfl46IU0zad6I00xonRjVVXre7tf66F28HT9sr4qWdwpIxW17Fo6Un1gp1nqf2T4B83Ar8 +VWqENoiAd5E+Q1PCTDd8OCeZRY2c5nW33P0F+5B195p6t1pUWakW36Yt+lrXMZrVpqgoBHZL +bNgjxjTOz/MVG4LT1LTzyYAd2Hl4WzZ9GkHEklzhd09o8pGg5NgDdCbbWe5wLQLaCLeW/wAV +HVi69q9OVtrj1pcLjQz10t1qKF5D4T1siBJJyGyBIyqqlgBkKoOyrgmntIsaKLRDBoNw7vIJ +b8ESS8mXHzKwrXPXz3Wz2DUrUsqUVGWdqRQamSnD5MYyVSWRF6yoYgBdurA2LZWNRhyi40n6 +ocMDHQ/Qrd9d7/pH4b6j4eLv8N3ODWnNX4cOZuj5rvam1VS0UU+n9QUdQ0V0tksVMFjjlUyR +SPFjI8ZW6pOvxDzXB7Wx2LZiKWNYG4jDEWbMGm6S0gHxgjXldWynhMNSfSNAnJWGp1Dwd/eN +UeWn4nbbDLJNfLLW0FZEd5KJ/BBG3mUdiN+xz6cAMxpzBzxrw9FLO2ey5baFYHTPxYWGqgpq +a3xU12gzhxVoqTgeo6l2J9N+CcPtGBDRpuNimq+zs8Fx11Kf+k+aGktRvGtora+jqyMvTpUo +siD6L6j6b8SGGx1N5ytMHgoh+EfTPa0TYpr5JGfFpKmoqYiAfDmXw+3ofTPB7XGJmyHFLKZI +RXbdT09VAAYY6oYAOJh1Lk7hlP8AW3BNPESCHBM1KIBEWUhKKKZ+oeMDswR0K9OfVfc8PZBe +EwS4QHLnFM0fUrjxYuwfG4+h4xhywBcrIgydVzlKSYMeCSchhvwuLpuNZUewGenIUjbvnjVW +mSbCUpo4hejQYHmBP14OTQcNQupgMYbJH8eMPJZeLr5uvsPtwgiVsPBX07AAg9vT0HGRCQCP +i3IQ1RKPkJ8YOB7flwziGy0wnaZEyN61t81cC6TZ6Q3V9vvxScaSXqTpCwBSZc5JA6gO3b/L +37cN0SYkapYvdc0GGbZcngtkwBwSC61l2OQV2LAevr/Dglxm0phrYueCBtU5NDUjpOSDw61s +LfWZjlCqPLH03xWVsZYAjO3f/tw/T1umJuZTctxxCAWOenBz3Prn3zw9UbySiwTyU6jDG4AJ +zsfX24biCnGNm+qM+iGgtGpnpGTwZzb4oy25KM7ysPr5oF//AF4dEQ4A6pAJeQRrf36on5ZW +2nkudNX1K9dY9UlHRbZMDBDLLOM7dSRoFUnIDShv2eHMOxpMkx9t6YqVHER79x81sC5W266X +nRlHqeG96fWkjjjrA8jw1AWBf1ctRNTMruaQOHjY4GQAWOVUicwge6kKkjju000Qkicp1Pz9 +7t6en6e0poy2XHS+n7RZrFPSQRKtNKiLDdY5JMFx0fiOHLLIvbIJO3Eu5zaYOQCRu4jkkU2l +x7Xh81TTV2paGLUSSSmfwoq54WFT0yBqtFMkbSMpHT1rGwztlVyeOfYva4o4k0tzzaTv3X3X +jzVsw+znVKQdvbr3D9p74Vf+feuY49O36toLwlRXpAZ4J/mMZqY2UzJLhT0sAUIb0KEDBGeJ +DDbUbUe6lNzcePsoc7PdGeLaFa/+ZXP6+Ga8Vhq5Kumq7UlFJ0uydRFbkgM24fw3kC/9JwBw +5W2nJawmTHy3+icZgm5cwEyftbuQF8QHPStg+GblJHVvQ19wuEdzgRIgXaWNPmIoZMgY6hGY +EZcnOCdtuOf19piptupuYxrT45gY8gVYsPhMmAYTq7N8iPmfRaPL5qarMlouNqqZoJZklaLp +bpIjzgJn6LkDHfpzxdcdiMpDwoShhyWkCLpdaq5hXe7rS3CpqppaiCQtI4HT4niMT0H6dRft +tvt34VSxMumU1VoljS0WP1Tb/s9eWt3+I7+0R+Gr4erPX2aiq73qcWhqm5qXjtqGGWWoqEQE +F2RIpOhAVLydAJUHIsOEodY3Lx38lUtt49+HaaurgQ0A8XODRJFwJMnfa117Sv7TX+0m5K/2 +LnJQ/BX8Btr0xWfFDPQ09RqC83DwqhtJQzRssVwuOMCouMir1QU3T4cKBWZFQxRyyjWCm1si +BuH1PH69yqVClUxVWpSpPP8A/JUsCSP/AI2bmwDeLUwYAL3EjwDa656621xr68czNW6ouutN +d3WqNRdNRagJr6+6VTkgyzvKSXkbJCjOdlGwAUMmoS/MblWihhmUWdXQblaNw53PnqSZJNyS +brjBfLlo262q+atn1D87FGXggrKRaV44sbGKBiCoyT5pOgD654jcTRfWaWC0+SNpVWs7SOqn +nVyZ0lTVVy/Rw5q69qqbwXtcccptilslhW1ZaKSpRfL+oTpp3Y5eJwo6pbA4LB4Noe8dY4cf +hHMN0JHF0nkmMTiKtV0NOVvKJPeb+kd6qTqW712r73U368W+wWpmjjhjpLVRRUtLDGihVTpi +VRsPpudyTwPitoOqOJCcpYcNF7rqipmRkNCzROoA8ENtj/D6H7cRx5ohovZGNpuUZdfmZUoZ +FPSTJkmU/Qeh29cD68Cvp3hFMq/1HRYOsLYpMOprG7Je7eVlyo2mQYJBHuN/oRkZPD2Brmm7 +K7esxdJrgXDUI0sfNi92HQ6aas9FBeNKzX6l1fbaOYti2XSKMwVCwn0Wop2NPKvZxHA34o14 +OfgKf6pmNA7TQWnm0wYPcbjhJ3FR7cQ7qjQGhIPcRv8AurgeBdqMQ3DS1cuo9LVFHDc6OObD +NJRzxh42WT8QbpJRs5AeNwe3HNukez2YbFuoukDVp4tN2zzix5q9bHxD62GFRt9xHAjX3wUU +lQDLG1uqRFUphnjYlJIid8OvvsRn92eI8VQTLh4o2Lywo4tGuLxb/BkrLnXQtHtT1BZuqI+g +6u4P0O3DWIZ2RkuEsZSbp2aV+JLU2n5YDW19RWxsQWNSXaFvYjc4+uNvpwThsU9pMHMOaDr4 +Fj/isVc7RnxB6T1GadL7cV0feNniq1PVDKD+z1DuO2QcH68S2F2iypB+EqMxWCNMy0SFafT2 +v4K6kgE1fA8P4HnhJZQ3+JNiM42PE1RqyMwOqj6tEtAI3JqQTVTQiot90jrEO/4ckfQjh6md +8yQhBJs60qSpbhNNFJNKrQuGCyIR5Sf8uCS45ZjwTQYu/wCYhk3kKoe/vn8/Xht7+cJtzWmF +6PQcgHGTjbbiQNkg2uNFxJBPoPpjjaVBlcMDA2OPb140eCbgari7beUYb68aI4pzfCDdU4+R +qACDtvg44YqnsklLokE3WuHmon/1GXcFerYe/FKxvxlHUHG0lJiTf1YL6bevsOEgmE8XAGN6 +7FACnAPrgZOB9+CKMJtxA7Wq5EeUkjuDv6f9+DKbwSbJpzhmkIG1MQaOrADdj9+HGgAJJcDM +hVQqX6byrZz5jsfp6fvxw7QiQEhol1tyadEPIJMk9vU7Z4cDk40HNIup2MnZCVyBgn0/8cIm +0lJpvdlkm6LqKmeutFJa/m6Sm8aWateaUsEjSJOgdRUE4JabAAJJ9OHqbZfZKe7KCR7snzpn +RF+03ZdH18mnTWC4perdT3KJxUU0FXL0QqVePKgqjq3UcD9YAN1I4JZh3ZASLXCCfUkjLrf7 +KzWh9S6al0TYdOV9w09phrMrWyzVbWWVajwMyCeLxoZA0ozuzMpEgkKMAQrCbwVZhpDM4Aiw +Ma8p3pqvQmpDRI4ef39Vmc+6yCg0xpmmsklHRzy04NNUxT9SCoVus9LMx6FdT513wJAf2TkD +aWMFFgeR2Ra3qpbAUDVJaddffvctcdz5uf7TXmy1NRZY7fPfJJrPJDOyoTXU0zrCJFJHTIpa +NC2+UmYk445FtvEtc6tSmXUyHtPFh/aY5tG9XvZmGjq3OtmBB4gga+fzKQvMTVU/y2oq+of5 +Cj+ahWsVwEPyVUfAOE36WiqUOVIzkEE9+INm36v6wV2GOsDhA0kQ4eBExClv0Tf05pG+U+hl +voYWsvmNqC9XjTkNII6dK221Ekc9HI2CrK8SFSCPKgZWO/8AeJzji17T2z/xFJwFnDwggn9l +F4XZbTTdTNiD+y6Oflzmt3wz/BXQVc1ZV3eS0X2tWUjEMjxvHUyKn9/bxFwdz1ex4oexcT1m +2tovnsNLB4G3hdS2MphmDw8/EZPldaxKiO4PaamdwXqaC4xU7Ed5MFkBH+EoFHb0+vHU8Xja +biAD8QVTpUHgGdQUOXK3IouseWMPgq8andTg9Qx6d844ZwmMhwjWUvEYaAY4Ka+GStoOXvOP +SfxNWX40uSfwqcytG6pFxsSajs2pblcZaiJjItRTx2yz11LLEBL0mKolRjggqVOeOpbPflaH +AgR704LnO0qDaoLKoJE+MgyIPIiRzTA5ycxvhT1Dr/VXMPmb8VfPv4reYt7qJLlc5tMaBWww +XSukfrd6m8XypknyWyPLbm2JxgngjElr5LjmPl/hM4Omyi1tKk3K0bvX1Jk8SSTqqp3j4i6e +yV9dRcmeU2kuU8WXiFxSomut9ljPo12qMNCpXYrRx0ikE5Bzwwxwygm/v3vTtRpkpJ36/an1 +1d59Q6qvNddLlOAs0pcFmX0XOMKo7BQMAAe3GqmLk5U4ykD3LuprcUjVaVI4iw/aXqDfc9x+ +/gJ7ybuuiadhZc0geJz4gmoSc5B8y5/nxhI0C03S6l6SKLo/Wo0inu6br9z6j93CTKcbCmXt +sNVGqVILxuoWOYkZ+2ex+x4ZdINksMmSV8hlrLLIkdxdZaTdYqjBK47dLjvjf8vqDsh7Q42S +6buKg3oktVZNQxoY7TWMaikOf/t6hRlkGfQjzD3GPbiVwWIzAscboTHUchDhaVdrkpe5Lxyv +ulAKdquu0fItYngyFaoWStqOhjEw/Zpa+RQVIICXJe2OInpTsv8AV4AVm/8AMomDwLHHfyDv +/ZH7Ax7aWI6lw7NSSP8AcBceIv4FFwj07qNDT1M8FPcT1eHWQ9KMVzuZFHfBxnA29R68ctd1 +lMTB5hXmGvnQfNdVTPddMTLbtUU7XC3xDoguMKqxRTgqky9pIj6NuRnv6cM02Mqguo2dwPux +Sgx7T29PDfx5L6jLRQSVVDFJ+jwwaoopAP1TE7FMndT7jb04fp0yeyTfj90h+UGW+Sz6a7ik +RZbJ0VFI5HXTHPSCe4A7I3pttw60k9moII3puoxre03emroTnhfNPzeHRXq4pCPL8vUk+Qf3 +DnsPbiWZWqMaCDYIatSY6zu9W30l8VV4p6qKKuLJT4ABO7qPb6j7/lwTT2i6ZKjnbNkydFbz +SHOuzajmo1td7iS5zr5aapwPFI7gN2I/j9OJajihUhwMEqOrYfKSCE56G5QzQLLUwP1nuqHZ +D6jHBTmGdJQk20Xpz7YIJz9DxME7lHOEmy+HOd9vrxtONNl1lts5JOM4znPGoWnE6roZtjnb +0I4yFgfOiEtTEtQzlmB8p4HrCAYTlNwmCtdHNYBblKWOHLD04pWPb2iVI0QASCkqzZ8hIUk7 +YHDTGt3JcHUr+Tpz04I29u3twdSpAAXTTnRML7kYCjrAx3Hb+u/BTQblIdcoM1NvQ1QHm8p2 +x9OFcloB02uqjVSr+m1AJz1bk/c78EUSU2D203rcrNQ+MTFF4RVCFXDOG6j1H3IIx6bY4U4j +NAT7RLi4eKlkwAPNnA99ht/XfhAM6pDb9ngjP5WippEeSrubTikVYWpo1CRTbHolJOW/5mQN +8lRuM8LblAk6+/om5LnCE2rPqZYBy8rrZXnpSiSir6SBivjdFSzrjBHnUuuMdwzDcbEuiQAA +BIjTuO7mEgtMzMEfc+ynnpCwmp1TaGr7cs90o69cGsdqqmWHpeSNj4Sr4Ts7RjIYhekK+eon +gzCYVkgaEc/IpPWPDbXB9+aAOeGrKe/WWkrqG3i0JUBYP0aISopo0RyYkI/CxQuVx9AMZ4qG +3sa29MmA4QfIwfkCrhsjDEQQLtgyte14Nv1PoaS5UklNWXGz3mgr/GOAykdSSTJJnJSSNKfr +6tsqx9uOSPxsYljh/M1zD6ET3FXQ0IY4eM8pH0lC3O6lj1Po3mINO26d9R3Oz16RvKwyt0Cw +1yHwm/YMkayjPdqtz9OK9ha7cLiqTXu7NNwPhOQ/+Lo7mhHVKLn0nxqQe/iPULXxr6Wg1VNY +rzF0G33hmqJI1PUamqiVlkhXY56ugsd+z/QDi216wbR6s/8AxSOYaTIPhPooyl/zbm7gD4jU +Lu+M+hqaHlH8OcdBNFSVunLR8gVRlUUtTUR03iyM2cAnwJ1+u4UcUr8O8W1+0MWDpUeTvuGz +b1ClOktBzcNSLbQ35x6KkF00lR1l9vVPT0lTR0EtG1TSvCesh0qiGhAYgs4D4B22B+h4vNLa +Dm025tQ6D3Ftiog4UF9hut5pbXu2p/s89fTW6p6moJZfEM/SR0uGX9WFGAPEVc5bOQfpxM4P +Fg1g0nePfzQ9ai5tIvN7T6qtXMDQVvbWF6s1NbVpXlqTUL4lVMYZH82MEfh82Uz/AD24v2w9 +tO/SNqEyAOU+4uqVtHZA/UFp36cPcpXVeh5577MtLYWskrSs0MBqZJgxBJwrPknPTsdxxYKW +1Gind08dyiXbNcHREFRV1oPBl6nt0okUlQpfDADGMH/2kDH0PD9Mg70NWpODtFjU9RQO2fkp +I5AQCol8pPsQR68OGyRaUR22utMhkgSWst8oU9St0uB91ONs+u3CXB2pS2lsc0Qw06eChZqa +aDBwMErJ+R2z9m4QXFPtpggXnVdDWeJZVkgIom7fiPST9CR9uNhxSRSzAELPRqmhBiqY08Fv +M2BlG+rL2H3H7+NG6UxpFypSilRYpIxEKmDAzTsMtuNymfxYGPL+7hp1O8pdN2YlpURW2Wlq +bdPSMD28ajqYz5qWYbrlT3QnIIG4z+9FKq5rhUB0198U47Dh7ch8OSOfhw5qWXl5zO0jqHWi +VZ5dVBnsurIIWIkNjrYzTXAJ/wDzI4n+ZT2lpIj34tWCqs62Kv8Ay3gtd/tdv8NRzCq9cOy5 +mfGwhzf9zbgeOh71ZXXOl73y817qTQOsWgn1FZLtNa3r6Z+iKukichZlI/YlQxzIceZJVI2P +HLdp7KqYau/C1PiYYP37juXRNn49lem2u09lwkeP23qKp9Yv009BdIoaqmbqTDKfD6ydlZfY +ggjBxntg7cQx2e0klpgqQZiSBDhIWNUSiKB6uyxyCFHbrt65MlOfXwc9wMZ6Dv8AThNOm4HL +U8/utuNiG+X2QtLe1B/SVmro6SqVR1g56JD69Q9O+Dn134kGUJ+K6Hq1B/KYUobhQ3WbEcpo +boqBniB8zodx0E7Eff8ALjTabmNk3CxxY+AESWXWE1FUNS1niSRZCopJHQcbnPv7+h42/DF1 +1oPDNE79P6olnpYPlK4s/ieInWxVkIHoR9sgj1HA9OQcrko0G1Lq12ifitv+lbfLZ9QUhvMs +fT4UxLdRXB2Yjue2/EpRxpaIfdR9XCtF2le6olsbDzZxxdAJVSm0BcMknJzufTjHclthtK45 +wNiTvxolLFhBXVJsGG49M54xILrX1CEdRk/IznJDdOcd+GazZCdYNxWunm1vcZN0PmIyTxS8 +c0l9lJ0SJSQkbIK4AHt7cMsFoW3OvBX8jeU5JGe3Y7fb14NpX7QSMg3Lkc4YE4HbIPfH/jgp +p4powLNQdqQgUdRgAjGMe+3r+7jMt5WBgIjSFUqsJF6B/B5t/wDXginBMJsgB0BOTTUIqoLp +THAVqKWQdRACNGBIO/8A7SPzHD1Vm/gtl0HkpyyWuuulxioqbE6D9Y7MQohhXBd3YnCoq5JY +9vqSAWmtJOWNUunl0Cc2h9JvqWpqKaw1VuWoqa6jpRV18UqxZnkOPAUKQQVDlS3ncRSNiNd+ +Heqa8RofcrTXODy52is3yy0pRapWy32moLZQaaSguFRTVENAIGhpp2eONmcrkugWaNSfMzHq +G6gk+hTBLYAAv6pgukHNv9OSYOpeWlNbpNJT6Noay3tbi5tdW7tI8VPSjpdn8w6jJK0iBQME +Jvtw/wBXlcHU7Ab+XDxT1MzZ58FWLmBbotLvcbBV29LLb5RPc0eQGR5J0JnSRDIrFY+maQFF +I6cY3JOOddMaJFMEaEnx4K57CqDOT6cFrfju0tu5iXnTNzpGSz3SirYXhgiJKPG3WAu46vOY +SrDGyj1bHHF9oVXmk6DcOG/WbfdX9pDiARqN/Aa+hSo/2sNr1/pC21Pj+NVwUiZ8UmOWaCpE +T9s5DU8wUb5ACjvjAWLoGvh6jhun1Fr8iJnxWsMA2r2e7T3uVC7JFNZtVcydDSvI1HpvVTVU +a52jplqFhZQScqvgy07lhk+bse/FxxdUVsLRxLb9bTg98SO+8jyUPQYGV3UgNHa8FYr42bCa +6h1Bap4IYYEhs91pzGcSPEbhPSgnA38gGcb5cZ78c1/Dd5aRUGsvB78od85U/wBJYeOrI/lb +fxhVF0NZIRNXRyTtS1MkM5opjl3hDKkpyp3AzFE2exOBt1Hi9bWqk5TukZhx1H1KiMKQGHN4 +eUoZ1xooU2m6+6Iq1j/oq4wx9CMvROkq+QoBt+ErjJwVHBeDxf8AGDBbtNPhCbqgdUQeDh42 +SQ1po2trK+z1NJFGtYJnFM2OqWV8iQHI7rv2O3334sWxsZka5jtIvw4FRe0cPmyv37vmh9LG +lbb46Wpp5IbjChekkjVS6eYAxTE7gdQCqTuT0j0PEq6vkqZmnsnXy1Hz80A2mHMIOo089EFc +xtIWmoqqm9QWgxQ1Yjlkp2IQJVKFEieyg5BGRjcb78TWx9oVAwU3O0tPEbio3aWEZmzNETu5 +qsuptJSWqYViU7midiFBBDwNjISTbsd8HcH34ueGxee3sqtYnDllwF02ew2264pBWVtkvKMs +1NUOuVQ7ftLnqTGWz7D17cLxFdzLxI3pyhhs5y7xoiWCaqsU7Wu/UFNBcQ5R0ijK/M9P/MQY +6XX/ABKRvkfQZTqB7c7DIPoscDTd/E1RNQxwTI80YSpgXyuEXq8M57MvdfpnY/XhBcQ4A6p5 +gky1ZwtFPWU5NM0LqqlmjUHEZJznIGV9twR9Rxt1bK6DosNDMC0IfqLaUwkYk8rdWMYPbuvf +29Mg+3Dzas6pipTyutYrFo6mojk8GR/P263GFb/DKPQ/4htwipSFyEulWJEHVCGoaAWy9xvJ +EtNBWHreNwGEco79vxIwwc+vmzwds+sHNLNY+SA2lRLHB7d6vDf7pU8weSnKTnLcrrV1d8ts +g5W6nkODLDU26kjks1VL6v41rAgLt3a0ycPdKsK6tTpY5t3HsO72gQfFseIK10bqtpiphnWA +7Te50zHc6bcwlDLUVtKstNMYqqlBIi83UrqfN0MfTv1K3cg+uOKKaLX9rQq21Kjm6aLtiuFT +E4aGSYFN3ZnAYAdg5Ptv0uN87EkbBl9JrhdO03uBMd6xroy1FR+kKSZqSvJPUzABKz3Vx2D7 +4yRg8OUGkdl1/p3IasSCOJ9whmeol8WN6YVUFfA3hGJicqR6J6rsfw/u4OAEQbhMFvb5hE9s +uUlwhDK0or1OwBx1Y/uHsGBz34YNIMdG5ENylkoosmoqqlqZoTTvVT565ad2KfMA/tJ/dkHc +gbN34GqUmxc20SqbzMNHv7poQ65rqSGJmgNfC65jk7sMd1bHqO3AxpmLIqmA2ZX6VGdjnYb/ +AJ8dAB4Ln5MngFxJH+EgfXHGASVuRovh3xk7DHrsRxqQsJkSdy4sAUJGANthxgWRoI1QjqJA +KOb12ODnfhqroUpmsOWuXm6o/SEp9eo4zt/LimY8w5STSPiSKkYH1DD0xvjhmiC4wnDBuvqk +dJYgMRgd+/BdN14O9NFhIHFdqjpVsA5P+fBbRzTN0I6lQiiqCd1C47dh9TwpPUmgqnVykVb6 +oyAevB3+vD2H+JNOiJBlOXT9NLcgUhUYXoDN0lujJCgADdmJwqoN2JwPcO1IGtwlEA34pr3G +potPwx2mmpYaujjlZ6mN8OLnVKSpEhX/AIlNC2UCg9Mkgkxt5gnMWuDR7/wsYQIJEbv38Va3 +4cbLW1V9guWoJo6uy0VJX19bLTVaeLPUVAkaWNJI84n+Xt/y6kAeEruVxtwbhm9vl90w8knM +OMeavdyWsUNmFloqh7PNqCnsclzqEihJow/RHAsNMrZBjidYURxtgbZLMxLoukx4/RaJBJPv +d+wVg6/TE9+QRy0Nve3W+khpI0kYIhkhUglQASVMpYknv0DGe/EkJeDAsm2jLE6lawuelFAL +rfai3U1vp7PTyCpkf5cmqrT5gsQBGIVZZndsHuUBIAwaXteiKtOqwi0GDzHaCt2zCRUYZ4eW +hWmavuL2vWVLXXNkjNsuhopqgDrqBC6MkMwDEnpBkeNvVgQCM9JHm/atNz3Pa3VwBHCRE+kn +2V1dk5WgXg7/ACVfOYaTUdyhWk6xX267LWWypo5FKwRhw6HYbLmkcdGxAZQQDtwvZ9NzqfaF +iIM937/NM4kAW5/L39kguc0KXLmm2prRSCOHmDpKkudvqaZcKlZE0UFSkg2616li2749wBgv +ZJ6vCmlVP/7d5Bng4Ejx15IHEUz+oBiM4+Wvjomt8YdbE99sZjnkmnuukKWOKo6lURzLXNUg +sPRAyk9WQcM3cY4q34d2pVd2SobcZbl984Ult4y5k6FvyMqm1m1pTUlzqLXMCK6nNVRRYHUx +YUio8YONz4gcdwNg3pg3yts0upip3H/ymfL1UBTe0uyxxHoAs6+65tlRarpbqn5U1L2+uZej +JjXxqhJHlx+0FAZd/VxtgcKw+zXCuH7swnwBAHqPAJLsWMpvuOvHeh3XNNTG66Zr6irRZfn6 +qocyAdE0Xyzs24xnChellI6WGwwTwdsgOhwA3DTkfcobFPLmttvPyVbb7dBSpR1NwjcuryJN +04AlXbxQ528/lRs4yCpI4ueHw+cEM3+nD6qCr1+rcL71H6kvsFVSLIiw+IqJI4kQ4kOyttk+ +UIyBj9m9OFYfClr8u72Uqq4ZecpDzXappHjmmMddaalXh8CZwzBlbDKB3DAnJAODkHvxahSn +sCzgoYtAGc6FdZjt9Oy3KizFBE4MiBAzIpO7Jn2ySRjuR6E8O5nxkSGsAAc1dtxqafWdBHQ3 +145bxbgyRTqxjAQHytEQMKrDJ6QMK64xg8OMzU39Y02cm6jQ8ZXfEEEwxXGxOlU9TKzw4NPW +wDpeRA26uRnDDbbcH2OOJMPD7IBzS0apsU9ys14jje6PJS1HSGjqqZAksJI/5iqQGXPqDg7c +Bim5pMCVIh7XWJ14LKksdXLF4br+lYWUMs9IgbrA7iSMbhh3JC+3bvwM6plMssUSGCZfcIDr +6WWlbxDKKqJScEMOuMe3V9iNm/lvxI0K4cIdZR+IohpB1UddKVb7YaujVFmqY18SkYYHhuu4 +6R+zn8JT1BOCeH2tyVA9vim3xUolv+bJ7fB3WQ8xL/rH4fri9Qf/AFFsTW+xoHCiPWFv66qy +vj+/Mwq7bn//AGZ+3Fqw1AYilUwf/wDUHZ/3tu3zu3xVZFUUKrcQdGmHf7XWPkYPgUE0csMN +ImICLdUoJIJlUo1KCdw6/soxOGX/AJUvsCRxzF0uJO8ajjw8RuO9dCcIEAaruaWmo7lBb6j9 +cky/7rMUPROp/YkXOzd19RkduB+qdkzDXf8AslBwDy067ln1FqqaKdxiSooJenEU27xeyMO/ +/sbtsVONuMbUDhP8wSqlAtdB+E+i6LhY3ukMdfS5W7mPeM7pWIvp7iQDBB7+h9+N0sRETp8l +upRmw1+Y+6GzTTCVauMzUtXkq3V+KT0KOvbqH971/mWIdzCEbSDSER0lTFc4Y6yNuipRwpwP +MSP67bEcMBkAtddO1HEnM2ynaWqWATFblSQ9blisjlSD/W/CMhIBTgqDiv1Acjbsw9M8XVom +4VE5L5udznjTxuC2AQAV8B2AIBOcnP34S8pRIAAG9cm3Xtjf12HGzEyUobzCDNTSAUU2Rt0n +v/nwzVsCVkxcrXHzdI/SDj/Fk+pPFLx4/iQdFI0gCEipcdZfGdu2e44baDa8J99wJC+Q9WwB +Bwe3BjQGlIeQTBWdGPLkD3G/r6/5cENgpAcC3uQrqYg0NVhR+E9j2+vC2ssmWk3IVKb1IsV+ +d+kAAdew323x9zjh2jxJSiBNuCttb7RHpaGN6yV4vlKeORTGQHaSWIE1K+0shaSGnz+GOKSf +GFXrKxbMhyj3zSWPa4CdPdvvzQ6jvcKvxpEiiXAAjiBVIYlGFjQf3QAFA3/MkngR0LHOOiuf +yTv9JWXbS9mtv6Rp6qlp2uLRuzDro0patTI3SdyzVDydGCBGIu+GPBNMjNkGn7Lbf6ju9/Jb +eOT2go6qgoYLbQzy+NZaOmjklm6o4KaOmD7Y9CEiO25x334msNTLiMqHL2yTx8tVYHmRRW7Q +ej5rdRTLPX/JRIZuoYcyAncn2boUfQkd+DcSW06eRvxG3P3ZZgxnqNdu+y0789bra7bYqisu +ElTJUVkNcnm6euONpfEbpUAlcpkYwceGgzkE8UPHY9tNhDtXEj7eiuODwb3Plu4BaD+bl0ns +3MWS+UjiqtV0aRkSFsZi8NOpQSD0nJLjIzlVPHEtpYVrrvOnsfNdSwdSGiQZj9volBf5qc8x +2o2quiy3WTw1qCRGGFSssUTk7hWJmXrJH7W59eBNmycPI1A79IJ+SYxLrgkWOqSNuSfUPK+y +W6vqlhv+hr91TrOhV47ZcoJGbHTn8MpgwP74IByN8xYFLGOeB2K7SLf1Uz9gfZQlIZqYjVhn +zG708kTfGxJT1eoeVTUafJ2ipskyLFE4ZUWFnp2Trx5lWBNyP7oOAM8V78NGObRrkiSCPMwQ +fOPNH9JAczJPH5LVw15moeYGlOuokpzHLUPcVk7eIZDGTj/Eesg/cg4G3ZzRD8LUMcAPC/8A +lUttXLVZ5lR2oNTTVFsuwaDFSoro4+lR5P8AhbAbFgOljn1J4dw2HAe2NDlSK1UgOLhe/vwU +/rzWtZLpS33egrWRVorfJE5UNFTSyo6fgPcMyMNu2D6cK2Nsxjaz2uG8j6/VB7Qrk0gQdw9Q +ga43qkvtJTVRhFLT1L9agtlaSYmMPGQQSUwzHfcBgQTjHEjRoGkYBuLd4vHjomnEvbI19/NA +VzqbjHPV0007RmPLI4lDBulvC61YbMrDwyT9PTGOJNrGOaCN/wDlAkkuIQrengqrZdXWApFF +WM0vSuDA2yM+MbjBXPr9e3EhhxlqCd4tzQ7wHNJ4G6HrdW1FIOimdXK5JWRMrKCQvT7juBse +7D34OfTBN0xRJBssx50qDBe7THGamMq8lPlgWGxYD3B33/hnhNNuUljiklhd2lKO1PWxtW0j +9NKxyG26lAyAWU/iIxgj7+m3DzRBylN1Gh11hm1PTy2+Wm6aWPwwIzDKoAzv0xt2ZT1Z6D7/ +AEzw6asOlJibncjGkrpYIhBVB1mY9J6o+pGP+MDdSR2kUKP7y583A1WlmMhFsrluqLLpW3ho +KiSSh09qSFoxN8veqb5h5AVxmKrQrUJgAYxLjYDB3HAtOpbK7zG5OPw4zB9PyVcbpWGhlMsE +dTRVY2lgZhsfcHAzn7ffidovJsbhQ1doabWULp+/XGzavo7xYbrLZ70KmO42+ujyrUNcjiSK +ZT6NHMkUgx6jiYwtQshzTdpkd4uFE4mnmJDtDr46rY1zat1n1jqC284dJW5aTTXMS3LrpLZT +xhFtlZPPJDdKanXs6U9ygr4ii9o2g6hgqTUumVIUMb1zbU6oDmncJ+JvLK6QPRWzo1VFbCgO +u+n2XeGh8RBKUVy0jTzW0xRzQyWWdwkFSE81HOBukgOWRhjYnYhQPxKQa9SxIOtnjdxHJS9S +hBJBkH580N6cuU7XGrsV+qPCq41YI8myq2Mbk9kc9IOfwP0t2JPD9VgDetZ7/cJNCoc2Rx98 +0TTWsR1kFNWyYoaqVmpK4eQLMo3Vh/y5lwcr2Kgn34F6wFpLfiG7l9kX1UENqC3FRdVZzWPd +rfcKNaW8ogM0S7irRc4mjPbIBGQO4IPG6dfJlc09n5HgkVaRcTTcIMeyhR6Srt8qVtQiTlgp +bo28ZR2kHuQO/rjiRzB+mqB/5bu1oUSx2uC4Zmp5KFDgBwRkZ9wdtj7cBOrRYos0BMr9QZQO +wY+n3PF/XO98LkT0gqxzjb78ILRK3I0JXzBIwTgntn14TMFbc2y4sp/CQ2PpxmaZKwCSgvUe +BRz5wBg9/Y8MVnCJTtMaArXPzcx89ITjGST+/inYwdqVJUWD4kjHBz3XPf1G/uD/AF34ZgEE +p0kEWXBFAbIMg/LsP6HBVMpGXM4xYhZyA9OGwMDfHBNIbkIZAgoS1NtR1C5VAVbuPT7cOgGI +TlJ0WO9U5q7PLdL7VSvU01rtUOWqa6oBMNMvtgeaSQ9liQF3PYAdTKRh6UknRY4EOF1YHUFy +FwvlxSGKSnoIZysEb7u5EaRmSQjIMjCNAcZChVRfKoyvEA5iSNUkU2n4LSuqjUuZ0DMGaMqP +oeGC66fMtlzuKv78JXLu76q5oUzWWknmmhrJY3YLvJEEMKxY9FIx1Z2A27ng7A0HVKkAIKrW +DWR7ncPSe5ejW06atHLOxQ2W3xxrOYohOypnASMJ0gf3OkDb1IPvxaCW02xxQbWGobKm/PLW +ctRpqKSnMj1KQtICjZZgoGCSMb9bJ5fXYY34rG1doxTmb7lZtnYLtkH3P7LSx8Q97nqbWaMx +yLTVVtvCO7Meo/q51YdQOWx8uT5QF8/0xxyja1eoSDeLn35LoWy6LZ7iLeIWoTmm8r27Rl/u +oiiCXX5OqkkGGLNUIikkeX8NQGJ9ABnHFRxozOfSIuQSPD/EK0NDWtAYbJNa+hqKnT4ppnpv +01SUP6VtKNhFM1G0MAh6sbLI8YGd8E+meBNgVGlxD7tmD3GSfQoTHhwPZNju8Er7Uf0jzgoX +aveGi5hWqnki60CfKoo/3VmBGAyVtHULgjIVFz34b2yC3Ane6g4nvm7vDI4eKZwLR1oDrB1v +fiuz4sayom0TyF11FSxJWW3UlYstOVEZVJa2rQxOx3KMygkH9lj6EcRfQdjW4jE4d3wubHiA +0go7brC5jHcD87FaoNbQqmobLd6aqnuNHT0a0tS77STU61rxpIRjZ0kjeNvZlHoRntezj/w7 +6bhBJkd+UGPEEELn+IBNdjjMR9YWDrY1NI1eHkkWU3CSVGGcrGyswfPplRnhWyg0uA3QPsnN +o5gCeZCxNQTGq5TaZ6lVRUtb4TJkdaKkk7YUeuMHP0wfXiRwbAMa+eJPoPuo+u4nCsjSwQXJ +fP0PVTVHQ9VSNATV0y5PS2Q+VJOOtOs4Prgg7HiT/T5xlFiDYoBtXJfcuVHGyVokylfZalWL +NGuchoyfFTPuEBKn7HcZ4ZfOWNHBKYAXzqCug0swmiaZiYqx5YpZmTqScnylh6EL+r6gfSTf +h8OtzERyWObDu/35oRq7VJTJ8vClQrL1eGxz/wBUZJ9QBsfXA9uD21J7R8UIQBIGq7KOUx08 +lXTN1QNGJZFAyyOGx1D2B6mOfQnfvwqpTkw7VIAtm4qRoKlaWeKujaGnfrYSx9PkLjGWC+nu +R24UATIN7JLSAQVJ1EDU0ZnpKd5LLJlZ6KRS3SRkEYP8Ox7HPC2PMQ7XisqWEgSpalFKsFMG +p/maQf8ADEh6WT/CG79WOytn6E8IEl2t1kAwER0yVlIsa0tWtwtjJ1pG5HjwH/AT+0MnIOQd +x7ZaeGndBRAkNQpq/TlLdqI11JDGw6T1tGhx1Y9j+E+pU/ccO0C5pQ9akHiQqw18VTarhTzS +xkmKVX6l3BXbO3vjPE9QeIlQGIZqFfPkZqJtTcm9caLlukkN10NcW13ZG6AfCtdXJBQ3dQc5 +6UcWirKAY6RVMfXgnamFOL2e5sS6kcwHFpgOHgYPmtbIxv6fGg/yvEf9TZIPiJHOAm5LTSVt +JVVM1qJqPlUmqoEVjFWop/40Wc5cDBwN/LnzbY451bmHKDafEHgupue17Q8jVDWpuW8tdZaS ++0FVSVlQMvQXIMuJ1AX/AHapA/5iqc5P4kPUMhSAVQx4D8j7HePkR71TT8FIlpnePsfd9yhN +KxxXqnnsF2tkq1KE0z0zsQ/Unm8LqwSJUVSY2G7psCSo6lYvLTOdjo3z6eU68DdNYLM8ZXDw +/f5cRZTX+zwpkOKuZ3pn8a21hj85gB3Vx/eUHq6ezJ4mPw7BDEQ4NdvsRz4+KN6jK3snS47v +ZURcLWehkpoIoiHaQxRnz0UgOR0hieqM5z9VI9+CKWIyHK/T5od2GLxO8ahBv6PqQ7tQ0MaS +HHjQ+sTfTH7J7j93pwfVMmQg2uiZC/T7HSN9h9MfTi/wQFzkr6SNyAFPfHGELDxXzK+XzY7c +aJ3JWtpXXJ1BSCOn079vpwngUmYsEE6n/wDs5T15PT678M1xYp6kN610c2wxuDZG/Wckntvt +xTsX8dtykqOl0lGVWznJ32/z24bpvi0WKWahaLrguQwGPXc/l/44Lpt3pLpJtZZCMOlip6SM +5we3D1OE085RlQtqFlFHOxwQFPpv/W3DsLKILtFSXUJL3rwvFYx+IxALEhM7EgdgTsD7gcO0 +RcApmcokCU+p3iq6mO6RgLFVxR1Aw34W6QrqfqHVxj7H14deXC25LkDQIn0xba29X612e3wm +eunnWKKMnsSdy30AySfpw01pdAbqVqo5rRYyV6UfgO5P2XS+nrtzk+Tip6epWW3WFpPMZoRI +TPWlh6SyeVfZY/rxa9nUI7Xh4fv8lDkB9SW6Cw5neftyVh+Yurop3NGlVC1zkR0VCx8qr5WZ +iOwBb0O/fsOANr4sAho1Vk2ZhCW5jpZa4Oe+oa2loEkt9HLJQFFjY9IfpUyd1HqD8uxGfXA2 +6sjnu28aRTtp+8+sK6bLw4L4O6/p+618/EWz3Gx6U/RkElXSyVldSo7LgxxVExG3uelOwwMZ +J2yOK9tB2ek0Uxx8pU5s6nkees4A+IGh8/HRakObdnNZyw1rapDT+LZ7jS1MvhMf1xcorsdt +gPMucfsgj34q2LblxDXjfM+KsjKrj2YnSJ18VWX4gbpXrpC46mpDAlXJQydak79Mk9FOFUDc +KQHXI9OIjoqQMXk1g+ozBN4pjXMI3j/H1SO5iailqtP6a5g2hkF9t1HZK+IJGRHTx1UUbshU +DCsJaeYZOctVE5y2DZqOGaXuoP8AhdmB8J08CJ5NhQectAc2xGnvz8lbPnfaqDXvJmuit6Uk +lQKV79b1VVx1eIapVTct1MY3BON/FGMbZ5Z0eqOw2Mhx35T6tk+atO0WCpROW49wtD+sE/Rm +paesoqWXEvzkEsUpK/NQPUNIO/ruxwdwyggcekNnOFSi5pP9J8QAPfkuXYxpbUB5fWUQ8zWo +Vjv7Sxyw25zT+FPjLRBqcqwcdwRgdS+uCV+o2xGHM0g3v809tQQHSFC6ogSj5d2W3+EPEgmg +WSRXJUkQySqqejL+uYdXuDtxL4b/APdOJ3j7BBVHg4dpalrHEtVLc4WkibxkL5JwVygBH3+u +/bg92oPBBtbII3Lny4rxIstuqSwiSPyxuc5GCCB/E/8AfjNpUDIckbPInKVN3enFuutDEjGa +COqMXQd+lumORiD65LgYPsOEsGZh4kfslvID5A3rGWlannr7fWxyGhMnhqc5eJS3UjD3GBjb +sVU+/DrXNIBCacO2WlYNTap6eqpJ4AhV+tJFUYB6iw2x3R16vsdvbh3rAQZF7JpwJbA5qJhh +ikiSZCTTuhUkjzL07Bj7MNwfp9+CHBwTTQA210RUE/yjos4jTzeCHYHwxJ2UN9HXAHpkDGOM +LQ4QFk5Tf2FKSww0aQT1U8dPZ53IUyEMI2yPIzYwpBwQTgHHbPGB5cIGqccALjRZzRC3Hw6m +pkoqlXBSdU8WGQZyDgHqX2yM5wfpxr44AuEgjL2T/lGVDRgOPFlpYa8xdTeF19Mi9/N1KOoY +7N+WTtwyDBEmQE+1peINkiOaughJHNeLZSxR0zEY8N+pCSCQBuekEehPcbHfHEvhqmWAVD4x +gIzD2FD/AA98yaTlhzR0dqrUdJLctJQzvRahoDv8/ZKqJ6S4wY9S1NPUdPs4jPoOLHszEtZU +Bfpof9pEH0VfxlIwYF9R3i498yrXaZ1LU8uNT6h5a6hraW4UtkuM9raqYkoyxyeSsjcb+DMn +hT5/ZWUehyaL0h2KW1X094t3x+1+au+w9q5mhzRY+kp6UP8AuctU9pmhFM6ior6HqZY5Sd1l +jA8qvvnrXY9Wce9NrgZe1fgVaqb3ZgG6G/LvQhrDQ8FTBTatsTSm6Ixi/VAocR4ZY5mA/VSo +RkMBhenqUlSQqMFiXBxo1B2T9eHHml4im2A9tncuVx4g6KYsF4odVW+qpKuCRr+ylHSVF6qk +q2fKFx4cmSSrDbrUr2YcDYmg6k6AezNvfDj90/QrNe0l2vr3rGvOnQlBDVUyQ/NCIPFIFwZo +xkMuPR0zgp6KcY2HDbKjnEsOh+fFOVmj/mDcEHVdtorhMamSll8QgdQDlMH/AKdj7/x9eDcP +X6tmVxQlSlmdLhdfpUYyAQO/cj146xC5JK+nbIABI3x+7/TjJkLe5cQMuwwScHjUGVto8Vxk +wRuCAPTjHC1lgG8IH1P/APZ1GDt0kdu54GqE3S6ZK1182Cf0hKwbLdR9O4z6fu4p2OZ2pIUh +QdcnRJhsH+7nPtnPA9P0REgmSsRhktkk7kbjuf8ALgprpuE28nKTC7IwwyO5J3yeCWDemXEC +YQpqRiKacbklcYx9P/J4fixSpJENsqT3yUNf1wWH6z0H1HC6I7UFMl3aAHBOaxlTArBGyFGQ +PXb+hnh8tkEBJa906K7vwlcr9TcxNcWqw6dpSlyvsxssNeyFltlPjrrKnbt0xKVB/vMB68G4 +PDlzrb7dw3nvj1TGMPZMamw5E7/AfNen27T2LQ+mrTpbTNHBb7PbqWOiooEIURRInSo+mApJ +P5+o4seJrCmyAE5gcJnPAKlGp9XyT6pt1K04kgkr1iqmz0hVmVounq3x52g8u+3fHHN9o7SJ +xApk2kT4/ayv2HwDeoc4CCGyPC/ylVd5wmngotP01+hRJ4LjDUZjkZXqoTUyIoI6cDIibIXO +Quds54r+1IbRaH6Az4SYUlgSXPcae9sab4B+3mtffNPUpj0PpWnnlo541EEr3KaEBnb5ITA9 +GMIgkMqhcd8bnO0AKx6ll50vEblaBggcTUixEmP+oDXeYvwla69VtDXUfO+2dcVXS1drNeiC +LeVS0JGQf2ghJPcdTg9hxXcc89UCNQR81JFjmvbaJH0KqNzspY5+S1Q90cR1Ys9F4A6AzTDJ +ifL+nYN6DIAPFc2M51PaPZ0JdPzCzGjsRoqf0lfVRxak0jTVcVbUf7EWXw4pBnpmS3QVKADt +t0OuDuJIYh3cZ6PimBrmVCLZjPcSQffAlVt9QODmDdPoT781f7kHNFqjlFb7hTfI1FDYrVb7 +ikFXDkyUcEg+Zi6cfhRYZM+6gbHI45Pt/BupbQcG7yR4uFvU+asWFrg4doJubSNAQPrZaRed ++np9D8xNZ6KucQutJRVchjd89dZSGplMFQDlf1nhSIc7dQ77YPHbOjmKGIwjK7LZvQwMw8wV +QtrUslYtPsHRfOZdJLHSXOvgo6a8UNRbrc8kTu5ZgEKns3UO7N5snf8APgjYwLnNAMXKTtGQ +JN7AoCuVXQV3LgieCvio4rtTydQmB8LxEqfNkrkpmPGPXbf3nGNcMZmnUEd8R91FgD9NfjPz +QVTpEbtbVFMIXenaPPidXWQVxsQADkDf24MqTkLhrKYoQ1wadFAWOI2bWNbG6j5dZHQKRsQW +yNsex9PT24Nq/wASg0oeg0NrEAWlMDmIBTaiqIDIksL1ZZzgqCXjjHid9sOuB9NuB8GDlB5f +VO4txBPes6625axpB1imrHo4pVONjlVJLDcEKwLdQ/un34GovLXQRIlOV6WbtN13c0Ow1Py0 +dDTTsoogOmJ2jLGkcscq+fxJ2bb0Ix6cSr2Zp4j5IJkiOH7qOrrdPYKwzSUoa0VT5iLtnw5P +VS2Nxv05/ulT78LouFRuV2oSHsIIOgKzJ6B0WOnqEc0Eg+WkDkZQdkY+zA5Uj1H33XTeJk6r +TwIB3KTtNZFa5Z6a6U8VTQ1HVBMsy9SwFh0+f/CfRvQnfY8MvYCBGoWYd+WQdCs2ptUlmR6a +JZqmxklYShDGA+iODny9sN6gj64SX5jOjktwLW2uCuEEVWKVBbl+cp4T5o4iUkjOfN0g9iCM +7HG+47HhbWjN29VjXEWF0fwUFDq+1VKLTwz1pyJEVM/NxnGT0gAiQftIQM7EAbMSKDMpI3Jq +qM0neqUa201VaT1RHCruaaVmlpJSSUlXqx5Se4BXBzggjBA4mMJW3G6hMbTAILUzKnVcl2ud +ougMsdZNaKaPxNsvJTL4G3uyokab/iCYPfhW0T1gDnXsB5aeiRs2plJaFZblfr63VtNT2a6V +dVQp4fSjiQtHAWOzIh7wkHdTuhz6Yxz7a+EfS7YuPp91e9nYwECmdArR0UNUk1ZHTyPS3+BI +1qoU2S5RBQ6NkZBkAPWjAE42I4qT3Gw3HQ8DwVnaA+/H1H+EG61tUGnq+k19bPGpdNysYL1B +Snq+Ryer5qFR3j6gGaMfhxldthJ4HEsrf8O4dsaTvjd5KLrUTScHgy3eju1XSiumnK7UZVqy +hRoZbjLTkP8AJM5Mcdaid2OQA648yMDsccA18E9tUBuo9wfGwRlOq0tjUb+4b/e6UE3bSBSs +kip46yKRSTJHCwYISerKnI8h6upfufQDhRqktDo1TWVoEnev0VkBBwe/b1247I0zouRF1jC/ +mGMg7b7bcYVtpELiAd/XbuPbjRK0AZXyRfKxJ7cYFpxugTUZ/wB2nG2MevpwzXFk6x5Gi14c +2lxXEsBu/rtjim48y6N6kgYN0lHPTlfMVzkAe3DNNoNynX1ovCwsZ7gs3sR/LgkNAFkikdZ3 +rvRGwfMFbbtw/TN0M9slCWo42+Wn6VUPgkeu/DxMm6eqEzbQKkmoCF1B2AIkyWB+vC6Alybf +VGaYTqsjSLSo3Y9IOPf6bcGuBBmFqmIIOq9P/wDZ78m4OXHKCx8yLtbp6LUdzoGp6MTL0vHT +M4d5SO4Mjhf+lV9+LFs3DdXSD3C8IEnOZHP11+gHcnPzN1bDTU1fXLLIwUNggjdCT3xk7kDY +d/tniF2tjmsaXq2bLwpLmtWu5NUNdNbWi1zyLBDVVkSxM4GI5/FVwMAE+YADJ+n4Rk8cTpY8 +OxrKTrSfWZ9dF1PE4DJhDVZqAZ7oPyWF8SVsZbbU6kWtNuoadJWghIdTLEtPJUxrnBxg7Bcb +gHzLvmx7YozTe82A+USq9sKr/EZTAkm3qGn/ADe50WuDm7d4Y9JWS5QSQVJoK3olTpJWQmAq +iSdvLkZ2/YV/YDipmqOqYG7vfkr1Qw+au8G2YeVxp71VHaGSkvWqbXRVP6qsrrfcKKpmjYku +wZceKg2yymPAGNmG3biMxrs1B4O8IrFMy9rcCNeF/ldVl5w0VTU/D7dKGlNPWo2nbjHE8sYb +omjZmU4Oy48PPv0sw2zxXNjOnaPa4jTuCFrUDmLSNFrS1rqSXTPP3mVLFHV0MFLXS26FWHS4 +kjihh3BAx5oFIyNuhfXv12vRD8Pldf8AyqfRc6QeN+XFbPPgvvdopLalbJLF/si8Aq2hmbJW +hkVYqmBxueuLxSu+zBY2GxOOWdLsIOsDzc3ab8NDyUzgar3sdSAvqPnbRUC+PjlRV6W1vpSV +qd6WWeyT6d8SQ5SWstxEMfS57iWnWkKnO5I754t3QPHQypTducHeD7mw4EnzUHt+mHubUboR ++4+yrVrSl6NN3uq6ZhVx0FLJEy5BGGlH4e/bKjPsOLLstx69jQbE39ELtKTTcTw9/NKyaaW7 +6F19bq6FZq6Cks06yw4SQSBppD1AYD+UuPQ/Xbiz1WRiaVRukuHnAVdYS+i6mdQAfJDKR06z +UfzJjmiSVCGKk5QsjBSvqD+8cEtaLwmASWgkrjV0j0ur6F2jjDzQwyOCQ4ZnQIWBH2Jz9ccJ +p1A7DkcJTtRpFYHcUfcw7WlberI7UrIlTQwRE7efEh6JMZ2xkA/bhWBqHJbj/laxlMOf2TyX +2RIl05o+vep+ZqIYq+219MVGY4ounpIIOcEM3fsR9N8dSlzrcCO9IbU7LeIF0BXO1zpVVVHN +HULWU6xCIAeaeNVwMEZ86ENjPoSvoODW1RAQ76RvwCnbZDQ3y2Ggu9Ygp1bpBJJFKrbdRA9M +lSCN1yQdjw1UDqbszQnabutbDjcem5YdPT19rrKq1XeE1LQhY5kffx48kK6t27AD/wDU+nDj +ntc0PYbptrMkgLKrbXPTwmGRvmKB41McxUDxFJ2L+xBH17MPTd6m5oOYG6adTcJDeS4UVbNS +QwUVU6x04BQknpaDDHy9Z7LuOknOD32Y8IjMcy0KhBsp2CGWjrop4pZKG55ISoA6Ov2SQZ6d +s7HORnB2IPDD3Wg6IunLe03VMCzmGmr6WaOnorXcZQAjTqy01Y6jBizt4cmc+xHpjuTcO+0F +B1aEy4Je8+9L2q9Qyi50v6NqzhokqZ+krUYwQJPQdgzeuQ2cgcGuc5pzs3aoCq0Olr+cKqVu +eaaiko6p5KK/W6rE3TUL0OVOI5Ubfp2AicMDg9H1zwd1gcJGhUX1Za/KmBRVUlDUh5I3gmhm +6XTHSY2PqM9hnf75HbiIxVEEQrBhamWHHcrscq9XUd6hp7bK1XT3dFMdJLTylihJwelfxCJy +UwM/qn3B6W2oG1ML1biT8O8e94471c9mVA8CRfd9VYe0Xg31KOgltpm1HHJLFVQiQQLqJN3B +px2jrly6lGADsikAOSjVevRNJxq03dnUciOPEHd9lPte0iXiTaeBB+u5Ctko63lpNXVdkqrT +UcqtQI9DRVkiIkVpqXmQmkrIyf8Adv1kajzYEUnr0P5Z1u0m4phZH8YC44i128fDUcwoT9L1 +Lxf+GTY8N3gOe4qalq7ZDHFT3Cz19ZFEWihEZHXTgHeJwAd1Pbc9/YDhFN7XCZgoztMNhIX6 +DCkZG2/rx2MCTdcX0F1xcHBByx/jxt0TZYIC4gHPuMcancEo6L+kwwIyCDwtoETK1vQHqIdV +LL7kE9vXgSqbJ2mRK1782VBrZCO3URgDioY+nBEo+nrG5JCRMblVI+m/5/XhmjJHBPkgy4rq +KjOS3lPcY78O0zBhIdTBML70gKcnc7nbvwVTdBTD7CdUJ6jRfl6kAdI6Se3bh9vFyW0X7VlS +DUgA1Fk9JbxMZ99+F0wAe0tVGw6Cry/CPyWrfiA5x8v+WkCSi1VNStRdpgQDTW+LDzt9yo6B +9XHEphaHWVGs3e5QdapDMo1Nvv5D1Xqz1bqO3aft/wCi7XHTUlso4FpYYIm2hhVQqjHt2Hvt +xNYzGBoMI/A4EGAFrt50a/HU9OqTKYwA+W8skhG+D6DBA99uOSdKtrAgsFoXS+j2zBq5VEsG +pqem1xp+7SNH8tQSy3KZm8uFp4ZKg7/eFRt7jjmuxHOdjWVH6Nl3/aCfmF0DHYcOwr6bf5wB +x+Ihv1JTM5xXqe78o6yzyzw+Ak96opZ8NMzLHCJYYiV2CvHUevcRMPQ8X3EVS/DFp35vTT0K +ouGptZjWvA1yGNLkwT4FvqFq+5jmOLRFpkISVfBkudQvVgSAsgEZ9Sx8Xp+nU3bB4pI7NFo3 +710OnJrPHcPLeqi6dWJ+YFquD1IjemvDVLE7Ho8Ikj6fgj/dw1UdnYeY/wALeMpEsIOkfX9y +g/V+nVuvLWg08iPK88t4tEqlRiJp5JVQqD3AMgP06R78UvZxjHBxOhbfuQGNqAkk8j5R9Fo2 +5j08cWpdaXSk+aqoVvFYkZqGy7xxzv0tIR3Y4UH6jjuOGrA0w3kPX3KqFag5rgHbuGmivx8F +mp4KC96Q8Rum0rUSafrI5j+rWGrAkQuR7Kvf0zJjfPFD6U0W9qBJMO78tvr8lI4UkQd4n5fd +WI+L6xS82OQep4KG11ly1Fpu30mqKGRYGM1RBSPJRXClxkYlhETuNicRD0K8RmwKn6XEse42 +ccpnS92O7jaU1jZdIGh0HDeI89e/gtTvNCno6626g+WLTRVNlgaKSPZZcqkrNj0IaSTBG249 +Rv0TY/Zqsjc7TxIUPjmzTcW6xZV0tdaHo9X3eWEPPi2ics3T1/qpVbGPdeoEdsji5VKZGVg0 +h0KtU7Au32lRtfa5KUx0yiaRxVxxLnzEog6wfqSAT+Q4JwrwQSeH7JrE0yIAUpbrcZKjTLpG +08BglhZV3Ysj/st3BII3/nsOBqZBztPH6IhzSMp13IqvMcNRUWiSONeg216jPUTglpFGcbAh +ljG++4xtnh3AF2WDcz9k3iRldyjVf2s4BZLjpCGWcPTR2+a5VjIuERa1InA6WHdSXY7YJR8Z +AzxJURIcAbzbwUbVcA4Ei37oaarrK6x080KGnrUkkSUrjxFcNuhbbDYK49+kHfJ4GdTDXk7i +nw89Tl4Ifp3WiuRneKmjSZSssaDpVOtcZQdvDc9Jx+ywxsDwURnpxwTDpa7RGNNMK5KeklaO +SmiiPhq3mMaEYKZHmIG5C/iPYeYAEKwM8UUCcsSpa3pFRVKWuscXC3uvQrHA60ZcYZgD+IH8 +Q22BwMcKaSbgR7+63c9lA9/tc9jrVopJVq4AGhbqIG23SUbthlwfYbjGCOHxUJ7Q1QrqAbcr +jQvW0sEdIJzLay2KeojB/wB3Bxs/+AE7g7r6HGAN1QHQRqlsc4fELJj6ZuVdYaiWiNxgqaCr +OflWk8WkqPUMFbKnG7ALv6oQRjjcBwk2I81k9vLuKnOagjvWl4Ka5QRV9reIinITomtTAfiR +ezQnB8uAQDnYjHEiwkNQNamJjVUCmaO2XWopawStlWjx1dSTxFSrBW7hgCdjsV/9vBFB5I7K +h69MNN0W6cvD1dsWOqLXBqXMDSAfrVVdulvRtsEeu/5cNYmiZlSGDe3RMvT11uVgqKe6Wuu8 +PoYSxOvS24GcFSPbII9ie4JHEDiqLX9l4U9hq5aMwMK7WjdWW7X9tmr6iv8Aka9ooRUsqFli +nQnpaYKC4Rj09M3mwfKxI6TxQ9pYN2HcGsbLb2+32Vx2diW1bnXu99ysHo95dQ3O4/P0tquV +2uCCgvluqkX5TUqFQAtV/cqWXHTVDKt5SWPVnitYkuY3MwxB7JGre7lxBUsKbXMyOGuo5Ips +vLLU1mo5U0fZOYOrtJPMxpltzwNVWqUKoko66JvMksfkAf8AC6FSNwwBL8a3ERULgx2/geY7 +0M2kaXYguG6N3L3uXu3XYDJIHHoPLcBcLLV9PctlR9BxjmnXRbFlxycnODvvxqJstXXGTdfT +AHoe/GDRaFrID1Fk08xDBtj+fDNQJ5gErX5zZANZK2cKWxt68U7aDgHXuj6QMghI7BHYg7Z7 +be3DDDIun3uM8QulmP554ep3MlNudu3riGIBdCBk+n1/8Hghgg3STpMW3oWvoHy1SxO3STj1 +P+g24fBJGVaaQ3cqO6pXo1EgXHT4mffIzw7Qcc0rVVxc+NF6If7IPlmtr0bzV53XKKJWqOjT +dsk6ssEQCWoIx+HJMa++x4sWzKeVr3nu+6HyB1TsjS31P0Vx+ZmtWpKSsHjurIS7oG6AxxsM +H2zjiD2piuwROiuuzcKS4HitafMTVBq61V+ZZj1ZJIOTncn7ZPcex78ch2oesqQZXUdnUwxm +kJWW6vNTDq89CMr2qS3wupJKy1csVOGHptG85H2PtwHgcNlDz/bH/cQPlKkq9UNNPiHT/wBj +S755VZmWppdV8qL0tK1JTCsqLhdadYfMhEUrUZyuxCMshXc/hwcZ4tLsQ12HOXmbd8KiYqm6 +jjBJ0AHoHDxB3cZWrHWxabT0UEUnVIsVe8hAyT01DBV27dK5/N2PtxRMY8EDhf5rpOHkvc47 +w3/1mfHTwCrYtGY9XUM/WiQyVKhz+yVdWQjv9FUffgao/skjmisSwdWY3j6/ZZ2poWWwUyOk +rRJeLhcVUrk9AaCfo98edj+/04rDKI/XEDl9Qq3XeCxxPD7gfJaHdd0cDHUU0CjwZIpahV3I +87s3bufMcfUDjsGBJLmjgoXF0nNZMJxfDXdlt1zmt9TUR09umvFE07y9kRUaEsPXy+I5yDtj +6cQnSSlIbU1sR8il4epqeVlslsOqbjRc2dH0tRNB8vqS1JdaWGdx4FVXRj5O528knHhVC0on +IAw7049HJ4r7MGythXBurTB4xq094keZQWLq5akEWN/e/wDytcfxL8rqDlbrGp0vpsTy6Tlo +cW15nEkkNK1M8ccbvndl6Ick92Ru/TvZdhY11ZnWPPbBE8JkTHK580jE0zGnxA+aoDpajWs0 +/qmtrY8weBA02dxvDVDt3yG6fz+/HTcQ/K9o7/oqQ0EtdHKfNd11SoMejLg/SJ6eZYqjbBBW +HpDP9SiDf/CfY8KwhLXPbuOniVqs8uDXcFNaP8VbN8y/zMD0VG1VE65XPlbOfzf9+PpwjFgN +rBw0NkVSdLSNFntT1Btck4jlFPNTU9MxUk+GsdSsxyMYYZKLgkDzE54c2eQKltxPy/ymMVmL +IjX5WS81bfJmfwHkkaSOhp6NCWLNGqQrGV6dicZc/wDUOJynTgyodz5OUoftN3eguE8NS71V +LUwCR0x1MQFALoDsXUMGHuFI9uG8XQztAFkujWcy8ItqSlU8MDQU8UsXnXMY6J42IBYZGSrj +BP8Ai32yeAqUi/sImoRUsFiUHzENRV2+YLI8AbrR8q0i9WCGx3PY7dwcjcHh14kB4SOruQmB +b/8A61RxUasj1LMYoH2QzSqC/hN+ys+ASp7Sdxgk8DVHCmczt2v3HLjwRLJcMqzzDSass9F4 +00DqY2pFqSvV1lSeiOZMhlkA6h77bHcHhpznMdYe+SebQDxdKqqpLzo6s+ZlimmtTsAZg3jL +jPZ+xBGPxbEevtwUxzagtqhHB1IEbveqZ2m6iyVFJKsEcJt7DrIDBo4x1Et0EfhJJ3DdK+uc +7Ft7nTMwUluUiGiQpvVduudLptZWnqKxVBdGV8pgbFW6M9MmQDk7Eb/UydCrIk6oau0kxqPV +Us1fFRVymrpRPQ3OmfrWWGQsrgejKw7jOCD3Bxw5Slp5IGu0O11QxbJkt11Wuo4ibfXp1hqe +UFY5l/En0ONxkDIxxIBwcMpUeDkOYGSN6aNsuz0sySARturoYhhww9MHb0yD3ByPXiIxWHlT +uDxRAkpraV1JU2OuivFg/wB7hlYtJFCp8QIfxKV/bTIzjcqQDxAYzDCo00qo00nipzD4hzTm +p71cfT2rIUWhuwKQ2+RTT/ql6hQqf2eg+YLucxsNj+BiDjih7SwTmjK3/KtuFrSczR74K2Ol +deyaioRI36QmuNOq08txttQqz3CMZMfzLO+X6AWRSdwAVJPTxUsRhy2AGgclN4d5gw5e5ZOw +ww9gePUcXsvPHcuTYyQe2x74242XDQpAsuI2JGSu/CNDZYSQVxZdtwGH8uN6SAszIA1KQIJx +g9t9+GKwT1Mjetf/ADYkHzUxDZXqwdu3/fio44B25SDAR4pI5/ExOfXIPbbgFvww5PyQZJWF +1nJIIOBvv29OC27pTdQmZNv3X1dxlsnJ7/n24JaJMJDiAdYCFr7j5aoDDygHbO5GM8PCmNSV +jiQVTG6Wm5X3V9FabPRzXO7zT+HDBArO0zk4ACjJ7443SbL8o3pLuy6eC9hfInQlPyV+GPlV +oCDwmraW1hq3CFfFq5VMkjMO/wCJiPfygcXFlPq6QYm8AL311VM+et+WlhqTGx6lU4AXbrz0 +gL/Fv+riibaLSCV0nYzNAVrnv2o4qiu6i8hj6wikEeYnfbH3A9+KTUw5Du2FdqVXKyx3IU1B +zT0zoLQ9wqrrdaaiuddcvloI2cDoWCEg992lZq5FRB6nJ3KA5+lIo5RcuPy/ymxXDsQMxs0T +3lx07uzffu0TP5Zc7dDJfByht2p7ZdLzHZ6ymIikWaJ53qa6mqQrDOUSrhEJzjdFxnY8HUMC +W0TTO+fqPoFXtsYoPqHEHSQecQ0j0JPitf3PHmXSaS1VebLVeNNTzS18lLiPJPUIpAGKZ3PV +g4yMtnsc8VKrhS45e9XTZW0B1LXi5hvpPp9lWex826S6X2itkkRjhSqpv1mNmHiRNlc7nAO4 +O/ftwBUwbhII1lGY3aYyBwEHd6yrCXy3/OaQt80ZarLDUEUhUkHq/Q8pRgw2P6ymRs+2B68V +CzcQHDWAfUW9So+pUzSDoI/9v3WhC5T082kLfVSfjIoYM4w3T1xkj77N+/78dWwrYqQ3n8io +baNQhna3lZHLZpKe6XSjcSzyyCVoYzIQGILnY9lx1Mcnb8XfPDG2BYEJulBMEq5UFA195OV1 +vjuT0esNF3OmvFlrxP1NT0VyZCqqBu0KVRbOMFFaQDvjiIYDTxIMWqWI3EtHocvmQCgcVMzw +9I1j3wTG1hUpz15TWDUt/tkFJrW2KomUBleOTq6SjEAAnMEuzbEqCu7LkOlTGGquFM9k/VOs +JZ2iZj3PhI8+S001Vuns1t1zZ0eSGWKpkpGD7HpLgdLd84GT1DPoQd+OwUazappvGhE+ipla +nlzNO8mVGVkbzXm8W55Zaellt0KqRv0ysF6H9+olv3MeCXGGNcLkE/umQQSd3uEaafJgrL1T +VUvhI0rUERbJUBEiU4Ptkgfcn6cC4sSwObuuicKGtdH8pXZS22Wot17tckpURMDgOVaRZCqE +eoPmWI/v4RhMQOvD3bx7+a1iaJNO2gKq/qitmrr7c6pGVYpah2U9sAeUEfUdIH1C8W+g3swV +WK7XNcSSuyhqIKynPzRMMMZgk2X/AIEpyDjPZWGPz24ZqtLSE8x0jmjm2XHokTTtxd6esJMl +squrEfmHbzD8BPVkb75I4Ee2RnHilio4EAnu+qJK6AV1WC3VQajpFIk26RNGDhvqQuMhhkge +bsGww0ll9Wn0KPf2m2PaHqs2gnqKOqiSopLRNM6tG9NW5jgq4wdkd1IKZJBWVTmNsEHpPGYh +rXMytJHMaj78xvC3SeRUDgPPQo5mnoat6/VtjeonrgfBvFsqUzLUgKfEkkjQDM0WA5YYLhS6 +7hxxHspuaRTq6biNOXn5DTeiAWE56eo3ea7hW2jUVO7U4BroykboCGeMNsGZe0qk4ww2ZTg7 +gcMvpvp6aIx1QOEblA0emKa3XenrLDI1irGJz8nV9MTsQB0hXPSCcny5A75GM8PUNouAh9+9 +C/pA50tsiuvlqUsTUNwt09NdT0ES0j/LioGSQzwMDEwx+1EynPo3biYo1mOEDcox+dhgqoep +6TNVPUyo9JKjYE8SK+ceki5Af7bHvueN0XFoQ1Vofd6Wc1nijp5rrZq6lakEpkqKaDqY08in +8SgjHSQ2VBOd2UjseJWnXBADgol+H7VkZU7Zo40kVVV+kpJE4wx6cglCexyNwRw3UAdoiWkt +sd6LrM89VGWpo4Xqx551iBUykDaRUyCsgxvjY/nxFYulBupnB1S4QE59I68rrW3+8TR3rTqR +NFVdUSST0qb5DKPOVG3lPb04r2O2cyo2AIdu3AlTeHxTmWmW680+49a0dsigrhXVVLb62JZa +aUUwr6apA2LwsFJQ9gykAggAk42pdbZz82URI1vB+itmGxYc2d3dK/RzTOCDgj9/HeW6LhGZ +fxXJb0+/GFsmVrVcV3OwB39uNFslbcv4owUZ2AGP48ZkC0YS81PhYZu5BBB9Rjgas2E+zWFr +75rAmqkDb+Y+u39d+KltB0O98FI0nRYJIudvcen2/r04EbpIS6sZsrd6jjKwcq2FX6/yz+7h +9hvC2TJK74n6mYkAr7e324KbyTVQCJ4oW1C0iQVPURnpO3sOCbEZRp7utsMnmqoUGs7honmD +Zb5QNg0lwhqsbDJSRW3ONx5cYO254dw5LKnZ3EH9kPWbAM7x7PmvUjyd50LzGs0i1Fe1U0qf +P0KNGEdqWUeJH0gEhlwy4PtsdxxaHVg97vMdx0ROFaYBG8KkXxB365Le/wBCWymmq7kzNMkQ +3MinuN9sDdixwFAySAM8UDajndaGN3X8F0vZdNvV9Y4wOPu/dFzuWpPnlz2t/LtqyzW2ujvN +UyiOvu1OemKnUnCw0R/u+QiSoAHiHCx9MYLSxvVBxhu70U1lMdY4QP6Tr3u+jd2pl3w0L5j8 +1NQaXsXL663mVq/XtBbWuunbcUDCjudyqGmW51EZ/wCGlHT/AKPanjPmknSFsdEcrvLUsO0A +Ru+t0A7Fl7nj+owe5toHEk5g47myNTaT+Bm01el+enIq9RRVWVopbOEaZykchrmq6cHv4jl6 +eQEnIzJvueCX0QWFvJR2NLarHOOs3jhEfXyVovir5D6b1JqbSxuymqgEM1OksUpjZZ42ECyE +jJBaJYc+h9c9PFSFIda6OSmdkV3OZ2xz87x5kqpNo5M0WnK2qltFY8Jhw7CSViZWR1AJBOGP +Y7bnc42HEdtDDAS/WFNAmL+xu8VeqyWD9I6AuVjmNQs0LXAmVWKgPNRSxqC2cBiMEdtmPHKd +oUCyoCLwPkZC11hLpOpi3iJP18F57NUJJJTkiJI42uiRyI24E0bBmK/4WALZ7Alh6cdRwhDS +HHeJ81F1nZh3e/2Uty0lgpbxTXCoMvygnqY2xuVSZ1hUgHueuTA9R39ONbWaXMyjWPldBsJD +iDvj01T0tt8tOh9Y6Gr9V08Umhb3a67SGpIGl6VkpppWwyOPwOPEWVSu6sqkduIrC0nVmPY0 +9oQ5vIt9+Sa2gSGtqtvH208U+Kiz6j5X/wC2WmbwsN2np1kppehilPc2SRAkkYA8hkEZPr0O +6kZA4EoObWc1zRAPmL6eB9Ed1TcoIsBe+4f4+oWvbnZaHt2tdZ2a9R0CSV0L3Cjrol81aiOO +ln6T0mRgQGTYqykbgji8bHLuppvaTYwR73Kr4uS45t4J+qr3DJBV1NTJ1JLBHN+rOB1mJtgS +D6DwWUexGOLQ+1hvUYzXTuRdbKVK2G3oX6KiczL5DguJGLBsg4BIhTOO2BxHOq5XXNkXlbED +ciu1yTytX6migo3FfHEBTuMrHNl42XAH7RKMAR3IPtxGu7JyH+U68kYaWZgcBM29+CqfrK01 +NHV1WciPaWB1wepGJ2z6kMGHod8HB4uuzsS17ZGu9VLG4MtMFB8FRJQVVXUyxLUItOtLUoD5 +XxjIOdurH7yvvwdUGcwgqLsslqJqW4R1luoIHaWuVXeliL5LZXzKgHqxVnA3yejG+2Qgwh5g +Ik1MwAKZtFLTX8xq9SDV0Ko9PLD5WqkGD4QONpQdx1d1Jz23He3KeR1RdOHAA6hcqeV7uDTP +Tx01xC9SouP1px5RGP2M/g6dwcqPY8IAym6ca4OcYWVZ7nOklPdLdVVNLcoGUR1CqVZcHyiZ +SN1HofQjYnGOG6wDgWnRP4eZFQWhGFVQ0uoFrdS6Wgjtl+hiC3K1BSvgsSpWWEDytDI6ldsB +XIH7Q4AzmkerqXadDx5HmNe5FsY15zU/i3j3uQ1SapxJT0t2oJDWM2SR1B5cHcDG0g90YdQ9 +PRuEVMOdWmyXSq2h1iiN75BV0sMNFcJpaJh1rG+WhD57BSMIT6lG2z7jHG6NR9OT7/dN16LX +kAC/FI7VtvqoKuS5pTGNSOyFlPtlW9ceoO/37cS1HEteNVE1MO9lilTX3ytstbDdaST9GVan +w5JK2NZY5EOxSVWU5U7jtj/2ng+nSaWwRI5fRR+JcQZFimHFUWSrs7S1VjsQhBLxi3SzlIQR +1GNmDkLsS6AjdQwOCMcNta9p7Dj4pYexzYe0btPf0UHPJZKOWGqis16gjUlxPSXBZcjuCo6V +2B3zknf8uHMlQ2Lh5ful52MMgW70b2vVFnuk1PWU93utsukaiLxKihSfrGNg7JIHb039fbYD +iKq4OowRlDh3x9FItxgJmYKalg15S2SCohoL/S2VpX8WeOmVhBLIRgyLDNE6xuQB1dGM4Gc4 +HFexeBqOdMZu+J7pBE+KsOFxFEA5nR3aL9OlOrBA6eOorlBC+ZYAYXI9APfvxiUAv4jf68Ys +lfz46cH07HvxpwstalLnVbHwZen0HfgSsSQiGu3qgnNUjx5ycMvVxVNoOgmEbRAJvuSJlZgm +CAue2xyRxHsdBI3hGBpmyjlQGRgQoOe+f8uC2iDzTDja2iylUqgbC4z/AHuwI4Ko6wmyLFCu +oEdqecIgz6jt6bcOBwFisa4Aqj+qNtQAtgr4mDn13+vBLAMwutVG3uvSb8A1kt18+GrlFqeS +jjpr1RXa4WiSpeQu1VD43UoHt+PpAPoCOLVhKTTSa+IMkIXDV3NztGgJ+QP1VePjFke16x1R +ZfmDRWoTiOoSFB4lT0/hEzsR1IMDEf4B36c78c229imjFupTYLr/AEbY52HbVAl3E7u4bjz1 +5wtKXM7TbXi9Q22226KOrqZ1ghrZQJpYXdggZQV6F3OM9JYA5BBHDWGu6Nyl6xaWlzjYeGnv +9lXXXFps991jqS8NTyTUlTMIYTPIXkEEaiGHLerCKKJfsB7cSzqpcZQdOkGgEiDHrv8AWUf8 +pLu2k9Q6IrresBqLddIqmIfhfqSpimUZ74YGZM/4uGKmLAAvy9U47Atc0gCxEeYI+yv18UVr +gNymWhZYamj1BWBUyD10tRGs8J6vXHV0j/8AGeKvXeGYiGiJ/Za2C4uYCdC0GdLix+571SWt +ias1dR0dKrVL1NalKw3bpdpVGOkZydwcAZ2PfhOOqy0nVTpflbLuE+QJVjNH3HFl1hOFb9Gf +JRXoIxJH6mBZNgpG3hIwbPYA+vHONp0wXQefkTCGq9lwaTcwJ56fPTvWjrm5pun0/q/VNhnZ +v0dPdKuenYYK+HJ1P3A2c42ONiTsMni44CqHtY8bgE1i2BxDgLHT33oAjtUtltay1aSdVTPD +TQlR5Z3WaCYsp3G0iRDp+rZ7cH1HdZVht7fQj5FRz22D5Vj+dHLmfU/K+jqaaM1h+cuU0AVR ++wgqEDuThMwrIDkgfqW9eKvsnHjDYw9YbQ2fOD6wm8dQc+jIRNYtaXjmro6y3qsqBcL4dKQ0 +gRY8kz0cOYJ2wASWhiZG9G6Qdu3DmKojDYp7W6Zy7z1HnfknsEQ6j2xujwm/zVaufFmt1fr7 +T90oZame21VOt1iLRFPl4JozHIOkDDLFNQyRErsFZScFTxcdhvnDvZz9Zkf+yreMpHrGu7vH +94ueaqNd7XHRu0Eqo8z5hTfAlQTPlVx2OACPfBPc8WYVbXQHVBrrI6objTW666OqVo5KqiWS +Bp1TGWDrgkbHpxIzj6EL78Q9dudrm79yMp0w3cp42Q6f07VQwVVNX3FK2eeJUXyyBFTpw37I +YEsB6dIztjgV1cPc17hEiPU/KEXSYWsLYnelVqHT1vv5e1o1aFnPj0LEDpVZQGeLO3Scr1Ae +pU9jngrA7QLO3a1j4aeiFxmBDjkd3hIm4WUUNBdae8SGgu9fUCCJpoz5hEC4cke5dR1Y36cd +yeLbSxWeHMuB7hVSthTTeQ5R+l7PI9XcLbP4NR0JDcY0ZiClXEQEVxgnEhfoOwzkZOwPDlSv +AzxxHhvTNGiScrju15rHuklxt15rzby8dbTSYqmiORUooCrKwP4gp3bI2JyOnfC6bgWgu38f +fksqAj4dQj+wanpL7C7ywlLjED85Sb9YGceJFncrnumdsgjPDdbDOFx770RRxTSYhF1RR/Oq +l9tkjrXEEMVZiAT2bPqHwchhswcEdjwLnDTlcLI5hBAc23JcrNrK4Wy7UM9VBRU9VTqyHMSl +JFIw6SDG8bA4ZW8pG/UpAIFxNAPBG4+/Pgn8PWAddFmqaW019HFeBDU12kp2CtUKjvV2SY5x +BM3/ADEOGaKU5DLt1FlYcR2Hc5hLB8fDcefI8R9Ea4Nd3cd4QhcdNXW1ww3KlraTUlmlZo4r +vQyGaOfHdJlADBhtlZUVxkd9jw46syIiDw+37JtrXSZMj1WK19ueIIL7BV1tAB0oWiYrGo22 +cZdMDYZLAAdgOBm0Rd1Ox+qcqOdOU3+Sj67SWndTL4tsMcqyElldEkRds9wSGI/9oP8ALh6h +tSpRMVLc0zV2cyqYYEBPyr1FaLk1bpyS3SSiMpLDTzGVJEzkbBiVwQdurbPpxNs27RqNGeYU +FU2HVpv7KwZ6SW3uDcKanhVmCyR9YWSJsbq3TgkezY3H14MZUpvEtKQ6gWjtiCuiPT0ErNW2 +S/w26vA8kFT5fmGyPKshwr4znz9BGDgk8aq1y2zxbktto5jLTC5Q6jloeuK9UFeJicq1MivG +/uRnODwLWo57sIRFF7mSCv1dEGFPcDG37+LOqgYK5EkjIxnjaUQuAbH3xt7jjEmVybGCAQPc +44xbCW+rFJglAw3l4EqiBBTjSqBc00PzE7Ekrk5z6cVPaWtwpKhrbekXJ1BSB1ZAyT2zwE1o +Jsne2RKwlAIXcKu2/ueCG7+K09gjTVdwBwApTJ2z6cEsPFNOsJBQxfgfl5wzEAD1wMben04d +pui4F0rKMwVJtT0k1RqHopomlkD58uBnucfz4epCXFLqkF3dC9OP9njYZbNyQ0zoy4RUtKae ++013rZHO0URgFRPI+OyhQFye5wN88WnBuyYcufoHT3CJUMxxc5zWiCcvmQflAHgVSX4tNSUG +pOYGsbvTRmotU9dPUL1jykE5GF3AP044JidrNxePq1RdpdbuXojY+BdRwbKbrENWsrUJijl1 +BeqXod7bQTVnU4JxK7JTxj26vEqUI7fhz6cXfDU4bICAqjRhNiQPqfQR4wqZ3SCmQCKKNkBw +FJ2AHtn7DgqlTMaJvEVgHwdVAwcydM6Qu8NFdZo6O5IRWQNUKAkqockI+fMc4BXuNjgg8BVG +PnMBZPGuCBG8aLYrNrnTnM/QEOvKOrWrSptcSq3hkoa2nq6tI4223OO2NulRueK/iaIBzHv8 +/wDCCwWIdTeKY495ghsqqenrxbY6L/aKxVlC/iy0qiqhlD+GrzIJiOnu5jfwyScjrPqRheNw +xYyCN6mamNDpMyb/ACP1v4KwfKidLla77aKoohqtM1TSLIh6OgRJA6YA2JM5XHpg8UDarQGZ +nbj7KysYqAtgwRHnI9AtQXxAUKPqiOpjj6Z/ApqSTqdR84Io0jZ8rsJeiSNWXuc9XuOLFsho +AhvPwnTwSqhLocPcn7ylRq96WqtFCLZUFKKnqqal8WVGMSSyVM0sruMZBLs2Dg+VV29OJDDB +7arnVLzPkABHl8yonFtlmW2n2VxuWOppNS/D5E9tqqeK50M1DUTRvEWhaKdXjJbO5AmOSDjH +T/i4p22cOaePAI7LpH1HmPRG4YipSIB8uVvOEm/h9qhoO46dpmiSkpHrf0b5XLpDTyFI1YMf +xNF4m/bDIy/eW2oete6PiMHx/f5JhjC1rYg+z9kO89NMRaPr+W9dW1yq1BNe9N1iKWVJKcyq +7AEDsEnrGH/uU+hJsHR6vnztA1yuHlHzy+SiNrMDoe3hpzn7AKk12sFQ13ttpqagR1TzSiKV +cMrZCgBT2CtnYj9obd+LayqAC+LKOgZuQ0XOCpaC/wDiyGSmSGrWkdQ2AUKZ2PplipIOx+hH +AdWhLZAnenqLy0lNHUlO9rOlKtwoaWmlWpgl2MqAKHYKp6epR0bbHAGM9uINzznc3cYjkVIU +2DJbUfJDNxsEsdFVRUc0dTXU4c05eTpFREPMFYjt5gQD284PYbMUsUA6Hj/OizEUA4AgW9bo +N1fpK36ot1DfKZojQU8AjmJU9VO/iEyySL36OtiDjsRgY4kMHtV9GoaZ1M+NvnwUVicE2s0v +0CXDWC6aZenkvFKs6QUyVy1sODSzkMY6VPE7YMkisytvuMHvxY8PtSnVOVhubEHUbyY7t6hq +mCNMk1D9p70mruK+0XH5xqepqKNJOuNutgKiJh1YPp5lJB9CcH1zxO0arXtib/VRFZjmElw0 +UXVpKjrddPSs0sDdbp0gvEv98AfijIIBHpn2PD9N/wDK/ehnOIdmbuRZYeYktHNC1XTxS0Ew +Ec0TyOFYbeRmG6kbFW77D1HDNfChw1RNHGBl3BNT5i06ihjltlYpEUOOtYcTh9yFqFzkNgke +KmQRuQwBxGvD6bjG/nbw+ykm1mVGCdeSxbVe9RaUrnrLdKk0MiGGooK1FFPWxtuynB6RkjPU +uCrAMMHhrEYalVEPHiNU6yu5phpn6KWvBsCxQ6msBulotNW/y8oPSxo5cHFNWBQR1Y3SQDpl +UHGCGURTab2/wnkE7ufMfUI9tQHtMtxXGCgqqoiekoKiOEkFqigHiRquM+I0YOAvYbEj0x6c +CPqBtna80VlJhxGqzJ9M2u4081xoLlT01whPhyS2wly//wCVfQ7YwQfpwwMa9hDHtkHj9E43 +DNe0lhghZVtpNTRPFIzWu/U2R1eJC/UR2ADx5Kd/XpHCa1WiNOyeX2S6DKhMm459yKn1BTXS +BbbfrPQzx9QilSujSdmI/ZEg8xGNu/bGx78DUxUZ22kmL2t6Il2HpvblcBK53HldyfugUTpr +LQ9TIhdJ6CQXCj6vrCoLqvpsHIz6+hVHpJiQYs4c7HzQWI2BTjsWJ71iUfwo3y706VXL3mdy +q1pQksZkqbhSUM9E3UQqyQ10tPIpYLnZMbdzxKHbwMF9MjuKiTszIAC6O8T8pX6Zi7AKQff7 +cdHXPid64vkkYAxn1PGLCd6+EDGPf6+nGLAv5iSuMcYCsm8pe6pwIZSw2xjgasDKfA3BUH5q +MGnlyDgsQNscVXaECyMpySIskDUKDgH8I9cfTgBg4I5zoso8EAlenpbG+fTh8NjehnOcSsyN +Qy4VTufX+fBTDBBSGVQChu/IvgzhguCpPt/WOHWiL704Hk3iUhtB8r9c89eZdj5McubXLctS +3e4BlSOIu0cCDMrtjZY1XdmOAM5J4IwmHdVORvG+6yYrVG0j2rz7K3oUUtg+DLltrbl1ZtdV +vMbnRqSZZNUXqlmZKO0IihUt1sTPkhQbO+ep26if2VSldOunDaTX7P2fLqh+Ig6d3ONeHebd +I6EdBKmIq/6ljRlZ/K0+k/TjustW3M7WEEzVjiaeqkLFcyOTk+wz6cUro5s8CJ13yur46oNw +gclR7Ueop/8AY6/pOqePc7vTUuA//IpYnlfAx2MtTTbj1TG/p1bCU5pA6kqj417RW5AE+ZHr +Y+ar/W1NO1RHCswSQKSR3LHHbHpnHEsGtayAoFwLnBx93VNviv5frqvTNdJT1c0UqKHkpnpv +ETr7iRGOPCkx+0CBjuPXiHw1YtqkKVxeDY+jlNj5p+/Cvrq6WD4ZNF26S5VlTHQ3H5mpxMWE +ilYYnITPSWjCyPjfqDMM+gA2yC4kgWPv9lA4Zpp1C0ax8tPkgRtTXay80+Z+m4tLz2qjR462 +mqaOTB+WNTG8cbKNlPdyd+oqx7KMkVsPOHZUePcf5TmH2kXVMpsPvr+3IrZVyV1RT33UFZHR +V7RVVbZp6KmkVSFmZaiKSQONunDJGBjvj245Zt+iQyp3+hVnpVbNfrBHyK1xfE3ZI11Jqaam +CL8neVkCsmOuNygJP90gdHbuB9BxKdH39kN4iEViHkOAPP5k/dIA06x6f10jpGaVaillbIJM +Q+YnQuMnbp8SM54nHj+I0jn8goyq3dvP2lWI+EB6aqotT8ubhPBRz3G1N8uGf8DL0SEJj9lp +IR338wx34rHS+kS1tZu76J7ZcTb3P2Cib/aGgsmqqSKaamrKStMyu5C5jlIdH9MFZBICMd1z +3PDeBxRNVhcBBERxj6QnalB7aZj37si7n1SrrbQl4v8AFLCk9RXab1dEqKCkXzMElDVqSOwE +xPUB6dOeJHY9Q0sUGHg9vkZCFxcvpZiP8TK12GhCV9hSogaOCJJJn3IeEL0E77ftdJ+/34vT +HEsdHGyh3Ue0JPmsmOwxXO60wrI43KKKh2yFWdcb7ejYUbfTPYHgdmILRl3Il+HEZt6n73DP +cdO2+Gvq3WeG4v4c7k9VP1wKS+fYPGQc7YJ7Y4iq9ItrEAbvkfsU/Qc3JO8lSWnqipYUAqIZ +SsUDTwTnAaiaPq8RWXuItizD0yT68V/GiH21OoR7WZ2ZTvP+FAVWnKmwVMU9JVzU8b1I/WOA +3yzFWz1AeVh0qyMMASIx7lc8PMxDKogiYHmPenA8rIB9B4DnnQoU1Lp686c03UrbrNNW6AvN +ZSw/ITzZFvaCAvOiSdgkLVSuJBt0rGp+srg67K7+scctVsw4b7wLcwDI7yo3E0HMEfEwkW75 ++yqxqe3foeppqu31dTHpqZpKdS3UpjVXPR5WyVYBlBXfDIRnGDxccDXNZsPEPEH39FXcbhhT +fY9goW1C36JutsqaBI7bchABKUclXlRmQuOkZQFQhA32Y52OOJegc9PtXH0UZXblqCF1Gmpr +o6FoHozWMqQyJGHjkZiFAYdm8xIBGPbIPG21MtgdOKbfTa8SF9rKKq0hdjRzzxtQrKFirIZm +V4TnHWj+isVJw3ft374x/WszM9Vt46lwadCmZZNVhpP0fqWeCoj6jGKqMMxkPfzxFSM7bken +cY34CrUAQSz34/RSOHrme1dHlpko6KrNdSRU9fbHTwpIpCWoa6AnqaCdRlgNsgqSUOGVkIHE +LiGuLYJg+o5j3pqpWg0F0tvy+66rvpu9WuhGqtGST1ukXmUPGrZmtcp2CThcBwdwlQpUPgA9 +LeXgZtalUJpVvi9D3fUIjtsh7NJPguNt1RWXKohE9stFbcV2MVZhJiOn9mXMcp7fhLOOBKuz +2UwcriAeH2uPQJ+njM0AgePsFM+yVlGk8sf6KvFKGiJwHaYRD3Ulerp379W/078QldpLZLgb +8gpbDuAcIFjz96JiW6ptdU1JS1lxtSQPHmMSxbMBt0kOJFOfbKnHtjiPcx4Jc0GffBGMqA21 +KYOn+V9tluQrLS9JC7HxIxIzw5yNuiSF/wBZ0nHkZDn34BxG0Xhkaxu/yi6NBrtRHcnNRcja +2uo4KirH6YgIIieeWmcKQSGCCpijlA2AwVxtsT34F/1ISTk9D9JCx2GBsCCed17yVBAIOwxn +j03vXnoL4SSdiMcYt23r5jfPrn09DxsFYHL4xPSe5PrxpJKWuq5GWKRQvmwfpwJWMhE0nQFQ +7mljxJyxGOo+n14qu0N8I1sCOKQ05Ug9YVu+3AVLSE7GU3vCh3Yo3T09X8McP0wJibpNXSCF +n0jkgr0qW9CeDGtMZkOBOqnNLcttW82tVWrQehbS931PcXKRQh+hIowQXnlc7Rwxr5nc7KB6 +kgE+hRe8hrdwS3VQ0S7T58grb12peWvwd6Q1By45G3ChvetrhCtNrTXqxD5q7nu1LQsDmGhQ +9lBy58zEnjk3THp2TmwGyj2NHPGpOnZI07/Lie5dAvw0sMdtUTUN2sOgHPmeHieAoZq/mJX3 +WsRkqpZYt/E3zljg5ce3fb34p+zMDEE6rquLa0AtCQd+rbjeD4qtiIKxkjKgeIfv6d+LbggG +nMNFXcZSluRInU9grVhEwyMKzBCS3SSfMB29cHP04uezdptBglU3aeFkEjT3CRtNRNHdX+bw +oXLvL3DD2++/E1XxfYOTVVelhnySVU/4oNYXMRR6WtdtqorLkSV1aYQSSMHAA7gew4Gwz2uf +D7BHVnkS9u6yIfhi1RpunpLHy4oL3JV/M2d6l+uiaJ46morXaIMMknCCnx7hsepzvb4pspks +MnXyuoMPc6sHkW08rfdWm1vNoeii0Xc5bRcp9YTUMtA0sWVDSHuCSCiOxRssQzHC9IGBwLh9 +t0H0RTgkj56JX+iV/wBQXNIF7cYtA+iYXI6/1FFqBjPDFZ56KukNKceSOJgnqdiSyRE7b/me +OadICKjXEDWytWEwwbTDDpw80oPio0+z3a93Wig+dFXb3qY0zvMyqSBgDy5wY8b7hPfhGwKx +YWybCAfqiaxlt7GT797lSmip5q/T2qkeNnaa1zQgsu8hDxVBH7opBn034nyMpD98/smHAkQd +3+PspPkBqr9Gaw0jfTUBYpresXixykBpIwZHJPdSAiHb1J4TtykH0X0TuJ8ig8Af4st3n0Vw +eY+nbdeLjrGS1uFoKyhqWpZNmadRH46Gbp7sobqx7E8UDCV6lI08w0N/kVYKdMOpXj2Pkg7l +db49Y6RqNLSmlpUko73pks+T4EhRa2iVVAzvPTSqNsguBt34sOOq9VWFTm10x4H0hRmFptLS +HaAXHofuqMa2oJKOrstd4ZRbhbRMgx263EbKPsUb+PF+wlcZT3qPbTmztyx6eik8OprFw0fg +FdhkLJ0hTgHbIBY/9Q7HhsgkwU+WEmSimW2LX26pWXEU5qYmiaQFo5AYnJ27hj1AE99+AWvc +KoBuDPfuWm0xl4c/FdFDQTx07BKdI50nKr1v4kcpIADpIPKRgAHGQcnODxDbRa1rswMtPn+y +Nw1LM0tNys6koo6uZtJ+LPHHV0wntVQyL0Edah4JgTgdDFCGPbYg4J4i6biWisf5TBHqD4j9 +068NzZDcm498lg81NK1FXy5tc01HNRw0lkqLnVyE9AQCt62p5CM+G/TPCjsPLiMLjCkmT2Pi +gMTa949NRykExreVD7UouNMtEcfTz3KnbaTuupdHX+H5SZK+llop8R46SZ4jEQAcggyquwJ3 +Ixni94esGYhpaZBkeRn5SqvVpdYyAN4/wuPxRcv6Hl9c9LUEUrTyQQz0NRIY0DNV0/RHLhlb +H/Lbbcbdzng/YGO68OPcfA3HzUXtbDlgaT3JFWKtjs61d2p5quB6eNOiN40limqJEwC8bEBu +kFpD6ZVd8niXr0s3ZIsfl7so7D1Q0dnVMuml0hfLZbVlVLfEKOLcA9FOetwwPVllQkAdLdS5 +Aw3biNpmrTeZvf7e515I8NpvaHHf80NVelrrb6m2ho4J6KZVp4qlVBhkkV+gQTp2GfIVcHYj +0zng01WuBA1HuQmGUCBmIkBcKW5XS1xirsrS22q6/wBZSsS3WjMd0Y7eVleMq49t8nHCXUw8 +5HXHH3x1WNrEGWlOLSnMmOhrKe4SUxtTVEXy889FHG8NQrHDJUUT4imjbBV4wFLbbg9LCBxW +yC4FsyeBt4g7jw3KYw+0csQPfNM/UukNL6nVqrQV501q+14eSu089W0Fzsjj8X6ipCyPSk5K +Sq8iqCFZs+Zoim6vQaDVlrtAdQeE5bA+F93AS7qtCoQxsH69324obtlrttBU0xqqPWmm0UoE +aGmMixgYyytE/m7dgGA7cNVazy0izuM2+adoMaHCJaRwO5Mehioa2omam5l0s8ZwqfprTnX1 +bbqytDJuNtyy5xxCvaAZdSjud+6lDVeQSHT3j3ZWG5XaegnuFLRw3zk7c3mkMQUWOpppQPXo +eCoQls7YCYGST24isX1brHMB3z52+qLw9Wo0ZhHlHLjZW+tdBqCK2W1dFaojtaeAprY7XqCe +SFJt/IGaRmwowPNjfqxsRxHVcEJkCZ5BP08e50tMWPcvaYp/D3x9ePT689riSu7DtnjHBahc +AQAQRuONLa+Sk9LKCD22zxixLPVQYpKTkYzwNWAhO0wJVF+aWBLMhIyCe38xxV8ewTmUjQJm +SkFKoCnpYfl/meI5jQRA0TjiItoohkyzBuwPY8FMEQsLcxJlH/LXl3q/mhq2z6H0RZp79qWu +cpDApCKqgZaSVzskaDLM52A/IcSeEY+o7K1CVXBouP3Vydeap0n8Mela3k5yrudLedY3CnA1 +hqiGLDXMjH+507HzQ0anOEG8u7Md8HkfTvpk99T/AE3Zp7H87t7t0d37gHWe4/hx0Ba1o2nj +xLh8DToN4McftfdGr3VGpbrWT3JqrwqmOMqYdwrYJGSSNsbjAA4pmzcIWiIsI/yuy4nENcYB +gnVBlVVyJTPUSTU9Ngs7sVyCvoMfw4ssFrZCiKXafl1UdSUkVQ61CIacvIY1V2Kk+pYLwsVQ +QCFrEM3EqUj0uKjxJKxlrXViYlEYHhKdsfX3zwuniSwZtVWsfQa8ZUo9c8syrSx00SBSCe+C +PXPErhNuAHtblBnZ5jMEpZuXlPUxGlrrRTVihPO8yKcEt27Z7b9+/EfjNqGo4uaVOYTZTbSp +vTPKiw23UiV1DTpTVLRrSxvJCD4AXpEWH2I6GVGwc7539eEM2q4tIKGx2xIIPf8AO/1Rtf8A +R9PcP00tNTiGJK1bjAnQAf1vUWUf4UljOMZwGB/a4YZjSZANkE/Zp7I1IEeWnpvQNpm1iw8w +FWWb5OjqKmkWRejr8NnwAy+hK/qtvX8+BsZX6xpAF0RXw5LLDcb+f7qA53W6quFjeGZ5Yrha +WjqnkKqheld1gkJAxvHMoOPYngXZ7w2oQzTf3/4Q1ZvbkaOnz19RoqGUDw0WpL/RVMTQRUlz +j+ZRMZWF5WjeVBvlGSodiCMBgfccWhhOQTv/AG+yAxDDmhusR6T9EktAJVaMWtppoqeoulhu +8lMYpjsWjadfwjcgor+vtwfjWB776OB+iBMXc3f+xWxKgrIaKzcv9Qzyx1ttoxSU1W2/S9MX +NPLnfOfAlgYHO4De5PHOMQHGo9ptcx3m/kDPmrDhYIkCSR79ZSu5MXE6M1xzw0VdEauu9sr4 +r5Tue8gpKklt/wD8TODjuT3PFpxo67DU6kWiFFUA3rhwJjvlJHnvpmqtl0qKWnZZKO2ahrbZ +SdK4xTzNHWwsB6qUlbHtxO7IrNc0cXAHxFj6pD6Bzk7jH1+yi7NaI6mmmg6YRK0vUVZQery5 +bHrgqhOfc8EvBLtdE+9lpIj391Jx0H6Pt1PMaGgqqaVuqSJ0LLMBDkqwBztv2x22IPAOJnNl +MjnwSzRkdkXKA7jUwWu5VUVot726d+iqgRaiQpMFMnmV2O5K5BVtxkbtwuvQz0x1jpix7kKA +Ac2739UZ2u32m56d1BfaqxSQT0NC12NRTS+G6QBlNTG2cpv4SORhckYG5HFTp9YK7cPNnGDb +feCi8VTHUmsNQrN6j5cX6g5Fzaf1ja4Kep1RoYfKVE0pjFQaukiqY06sHor4opopWjO0ySIT +0MBnGPfhcWKpEtaflby+SQ8sxNC1jN7aQSL8QYidxG8Jbcu+RNi5b8kKXUFbcludwvuoNPNP +hTH8kqxS1ZoDJuPFizUVMgUgKIqVc5LYttbaXWVJZfsu08BPhZVengmsac+rZjja3raOWbkt +e/Oe23fWtjs072W51sUmornVCRIypSaojWRiHIG7BpRg/wB0nAyTxYtm1m0XkzFgO8C11F4x +rqnY1IJ9/JU6qdP1jwBamVLb0jxSs8qKVkkGMEKSRt4Q7Z77HPFwZiW3i/mqq/D5ddVlRRS2 ++PSVXS3S3NW+BNEipIMTR/MMXQlukMCHPv2A4Q5gdmaR7hONcaYDgdE/ZLTc49H2G9oKakLV +tXQzUsSjEyYDJMoYlXVlzmPupUgEZHEc1jQYOvu32Uk+uXctD4cUVaz0NYtW8suX93tNrjW/ +yrfIpjFOUNTJTyU9V0Ixx1MErCADuRHgknpPDVGuaTrm0j1sPskvotcC0CYAI9Z+SS+mLNU1 +1kikSpFXSVtaKaOlulOksU88hdBDKGA6G64QnUOn/iK2QQcGYix5xutpv8kLSeQCToi3Sty0 +tba+33ix1F6prtbYv0hQIaGaK5JECVMcbw1CGUxMHQrhyQrIRsMh16VRwLX3Bsb24g6WnXdu +KKo1mASBB3fbmmparZym1cst+03UXOrus7GSWjtFfNTS1XUC7T08bytt/eQhpE38rAErGVHV +qcNrMsOMepj10PJPuqNIBY6D5XXfNrrQ+kaijNt0R8T1VVFQsnia2oYqaoPo8Mq0cjN2yASP +UbY3dds6hVgHL5aeEhLGNxTAQCT5/dNDTPxCanpZmkptA86rFpWMl2lquYlLSgkoR0PKlMJq +liRlYkJJ7YA8wAr9HMLBiJ7iiW7UruaAdPAjxCYUHxYXRoIRbaLXNlixk09Ffa2tKnAAMkiQ +L5sADG42wCQOBx0aotAbkEc7fMlODaz7gv8A/H7L9CFWABwN/oeOtwSuaSvrNkZKkEdsjhMA +FYulmA6z6ffbjGgTdYSutmUqQcH340tpeaobyNk9uB6+kp1jtwVE+aRPjTFl8oJBz/L+vfis +Y9t0fTp6cSkHKPLgHGQck75+/Ec1oiU8BfLKytOadverdRWTSmm7ZNeNR3OrjoqCkiPnqZ3O +FUZOPcljsACTsDwZRpue/I3VIqvDW5itpNzs9g+FLlzXcsNIVbXbmRdET/avUlIwUzt07UNK +Tkimj9Tt1tliMEAVXp70jGFo/osNMn4iLE8gulfh/wBFHVnDG4oAx8IN45rWbzBucsiThJY4 +I0y3jS58Rm9iu22SP38cR2UAT2V3d1Ym+vyVX6zFTVx0805mlPZkGCwJyR37ZA4umHwxcInR +R1WuNVnPbIY5mQQwtnpQnxM9Jx6e3fPEiymIgKO/WGASsS1aeqIuhJZBUtEGQ9IyG3yO/tn9 +/DIokCTuRn60O03pladoYaiqhjWOpiq+jrIcknp9j6Z9hxFV8QxpyjVB4ik5wLtWps1eiY7h +b6h6iCkFV0dI8uCNgcMc78QlfGkAuO9CCkM4icqRF30RS010cmieUlAqsASoP+H67nJ4Zp7S +EGFPUQGtAC50umlWhLmlp5ZAF/bzlh/jOBj6n1xw+zaTsuYRZN16Ic45jZQ+qdNSQ0U01NAp +NM7VCpu2UP8AxI1x2OzED/Djgk40B8hRLqdxIVfNYUVNVpT10EsYhnpKYjGV8QrlCw/PoOe3 +Y+g4VUxQMlFsw8PyuFwT5a/sozXz0lfcKS6yOBQXW3GS5RgeXw6pXSoIB/aSZWPcbsnbbhGF +qSco13d4v8lDvwpbLct2WHc34fMQtaWr6B4dSO4qM3KWKeyVb9W7yqp8FycYySUU49Ah4teA +rktI8UDjKJbDhZLurSOp5gTXqBhFQ6gtSXJVLZWSthUq4BxszAKf+tuJkPd1Ub2H0UQ5gaAI +1+9lbflFFSau5aa20gtQK+WCmEdM+5Zg0ckXVjsD1rTkHbGcevFQ29lY5tXS5+hR+zS5jsnA +T78ykLdtTU1l54cvOZc3jtS3W1UVyqwwbpeKrpXiq0b08syzAn6jvjiewv8AEw78OTxHPcR6 +Qg62Gc1/Az8jA9E2ecWnvmtKW6vkh8JiEEjsSXeqtbvBIPp10bxP7HpHAmysUG1jHf4O+zlL +upgguAiPsD85S5sCJT014c0zicRRzwEICEdCQAT6dQaTPcbcWoRIJN0I4EkAi51UnqS1NS0y +PaumaniEdTTSLuHViCmQR3xhSCB2I4GxtIGCN6Ja7s5ilVco6GSWx1UVGrI9QDEjZKdYD5py +PTqjxg5GekY3xw0XZGOYffNReJpudDtPf3R3pm0V1Lo/UFjlhqqu23Kl/QchlwT4NVJMVZmG +OvKU8mP7zNjitYuHVw/fM+Ij7qRwrC8Qe7ztK2zf2ic9t5BfD+eVunVoblrKvvRsduqqtEkq +Z62jttO0cDSx4CCQW2iDhFz4ZZSSSOLVsrCMrksqNsRJ4/EXEzxEiFQ24yqHse02gaadokad +7nfOy188+aFLVpS66Qor0lQ0NdVtV1FEf92eb5f5KaqRMMygePPGXG3S4OM9qrgHVcLVDhdp +03TeQPRWt7W4mjGhgd4tmjukTxla579y7qdN8tL2LpDVVFxtV7t9zhq0lboqIHmqaOfqYAjr +AnpWYHOVbYjB4vuE2tTruGUwTIjwB+YPkqpUwFSkSCJHEchvVSa+WgF0qBHpi3tO08iIzyuC +3Q+DGSvSGdcKR1A9SkZ4tWGa+B29APUKArHiELagoYprBp2CaMUlLFNWKvRF0CJxKuTge3Y7 +/u4lKL+04jl8lG1m9mTpdOHWFPJBonl/R1zU9wmtVj08KidZcSOK+nrKth0DchHqIwz4yPEi +HtwNRZ2nkHUu9Mo+hHgU4M+Vo3XHr+0pqaEqbN/6G2IV9LTVWoLVr41FPVzz5hqLZVW6pp6i +Ag+Rcy08EikkZLkbbHiOxVH+I4N3gekEKRoOaWtduv8AMfchNTlPybpb/wDDr8Tl3vK1p1Ho +3TtTcHYQdFTWxx362xx1Cx4JM8aGVyuemTIPUcOOBsRX/ise22ZzO4SHyO75JynTs6kReD6C +R6hKTmdyyvj1umtV6PudFTXK42qq1dbKRupY1vFMoF1oYCCQPEWJ61EBwyMAAOoDh/C4oSWP +GhAJ/tPwnw+H10QtWg6JbYD35x6pX2+2V+prvFPNabTcgeqrt9bE7q9KXwU6zG69fTKSpdGD +q3S/ZmIeccgyzHHnH3H1C1SzF4LhKadhqLrdqCstOsNN2+x3KWtJqbrRWRqh4pMESPJDIOsl +gG8RVPUSodD1gggYumGkVKbpEWaTAPjujd5HVEYVrrh48feqlblyD5tUl3d6K2W+7RQU/wD9 +/Q6mpUpTSkYEkbSskyqVwSpi9e7DPDdLbuFADXktPBzT8/h9fALeIwrwZGh4Hd73IefkjLc5 +Xq5Ndcr4VwF8KorKqqeFgN1MtOhQnJ9D7bDiSbtimBvQw2Sf5hPeSv0xl3z08XUECxVKBlfG +2wNlHvjjXJb5rHY+Y9WQT9OEwVkXldbEspIYAkA/fjS2I0QDqNVMcodiqY7gZ4ZqNlOMAVIe +a1DVPJPJTwPVxg7+COo/mBv/AA4q20QWiQjmAO0Kr18rWSEpHQ1JkH/8ptu3f29eA2klPvEm +SNFsr+Gq06e+HvkXc/iD1HAv/qDqj5q1aeZwhe122OQxTTwnJIkmcOvVjISMdgxy7tnaI2fg +OvAmo+zffr5cFNdFNhu2jjww/Aw35n3buB4qknNLnlcL/UV1fSyqsvUUjmmlLLH6gAH3x69+ +OFv2Hi8bVdWeblelcNRoUGinw3aSqj3/AFvcNT1weqqxLWu5VHJ6Tv8AX1+3biQb0fOFGaNU +RRrsdLWmwQbTaT1BJ/vcSGqUuGUg9XS2+AuD3O49vXjTNqtp9l4grVfCtqaFZ8V5a1VJguMc +glOULqQ24ONgPXOMniXw2Jo1btKhMXhXgQBomNZG+fTpjdpiE2A3IPchttt+HKtIkZVHNrBr +hm1Tc09ZI1MbhQ4QArg+Zz6gnvn/AE4o+1w5ptuU1SqF1hvTZakjWkJHROgG8TDbOdiT6nY8 +Vmq4u8E4HGcpEJdalt2XjlnjQOx6yoOBCPcMPXgTK4GUfSgCPZQdJOlsoJfFZI2GD1FclQPp +6fbg7D6dpPtw+d5AS5vN6gpaOCei6I4436REwAIUklT0nJJzg/mc8HsoEkOARB2e27agnn78 +lXTWVHBFBcLfbYE+RMBjpEOcU4YdfQPYZQgDsMY9OJKlTc0gO0JsowPyGXG/sJOXS6vW6TtU +U1TKY6StZIwFBdEnYMp39PEVGHoGG+Orgs0HZxA5z75KL2hT7TiNHCPKyohzMhmj1TNSBcfO +gSRM+CrSDqUEdgDlDE3fco3FiwUAW9hQ7wSyXDT096+YS/o6qa7Wy2LGr/OWq+QVCAHpLI7M +koP93xEcnbbqT78ThaWOl2jh58PJQtdoBllhf5WVj/hznmpOal1slPUz00VxtD04EgwPGMUM +sb4zuQ6Ht744rPSEA4UmND+yd2e7+ID5+BM+iF+ZOjA2kdAXqkSOGShvV003LT4IEKysa2Jc +enSzyqP8LD1B4Z2Tij1zqbt7Wme6x+iI2g1uaQZGvhofkPNOy3TQ3/kppvUFUKithornbqu4 +MzdQ8ORGt9UT9D0QSMe5yffjGUyzF5Z1Bj0cPWUoPluVuoH7jx1+yr/T08lKZbSV8WeGQ0T9 +I6RIyCUOR69+ni60Yc0OdwlGCmQXOHCe7RE1vppK221lzpeiemhphOVB6WQN5B3/ABgPjt26 +1z78Lr0TAgSmKhIJa/37+6r7JcK2ehlgWEVNSkni9EjEAdDKyvt/dYrg98kHsBwziKDScwsP +vZRhObsjfotj2htCm7a00fT1Vrojp2GhtSSN54hNJFF4XSQzZcB262OQB4gIwMZpOLeG1A4G +838Zv74KQwgAouA35vQzzUF8eXMau1F8TGh6+qq6iXS+m3j1U1VIo8enlqUqVjdguV8RY0jf +rYdTDAGwB4uOwXgUXPaZcZbytBP2VPxeGOVtIDT6a+s90LVrz05y6k09X2K7tX9F5pCtxhoY +p3HjQyzSyzeKR2QeNTsVIzI3sqni04bZVKu00XiW6XGh3Rzse5QuIxzqNSaQ3/t8rJkaM1dY +9V2nUVlqEShWr8YzeYGCbKpKZZEBHS4xvgAZJIxtxRtqbAxFE9aw5g2IG8G+nJWbCbXZVbD/ +AHwSy5mcgNGSUwvFNWy6VWtMU0VW1Qr0VROfKmJxshIbwz4gUkYOTgHhzYnSjFCr1XxkbiLj +edfO3NK2hsHD1KQcDHP7pK6p5OXq82m1Wuy3jTtxrvDrESf5noWSSSZlXY5BKlEBI337EbC5 +YPpKxr5qMcJi0cvBVersZzgGD33qP1dYGtWq+YtQscs9qgukNPTQqzSNNRQUs1MnYHO0SEEb +AgbjHExhdptexsTJBnQGSZ+qjamzngyRHsfug2hmA0HFpVjUWkKY8pG56ZJRNWyxyEH8RVAu +Cw32A78GF0VC/X9gAUMxhIDTz9Y+ytnpnWeoOX/w988UpqmdqS4WK1WmnEc3VJTTvf6qpYxY +PUvTBSx+UbEyDYDvFVqbKlVrefnDfu5EszAZtbfZSWmNZWjmNyM1bqzSsFJp7V+lKqj1wLZH +4cgs9VHKYKzw1ZVdaSVJ46lQSwURPF2iUmNq0Dh8U2lUMhwLZ4ggRP8AcCIPGZ3lG03NqUs5 +EwLj3yVeOZNNoK2aqh1Jo6lrP9h71TLqW0U8J8MwQzdSVFGCrYzFJHPC3lHmpyfUcTNJ1YsL +X/E0wd/cfER5oFhpghxuPn/nXlK+UC6XrbhmyXPmjWFogJVlaGQy07JlKn9Wy9RBHQT05BAJ +Oeo8MtNY/HlHnrw+yW5tMHsg/sm7YNZWSllTT960vcrhSx4lEt0uENE8EnUTmNx1SJLgscKc +Nkq+cnEc6iSCc1uQRdOvLoLbhN2wU2s6+laqp7hqCOmkPWsdGkVIVJJyXL/rJM7YdgMjsSDx +GVWBgAAHiUVkFUAuNx71sv0HxjBHUcfv247JBXKwRov5mBLZySd+NObwSl0sQWJ3Hpj34biE +kFfCAFOTgjJ4UADotoA1NtHIAQB6nPbgeuYFk6zXmqMc1XeKokkimeKUHIZGII/dxVtoSLhG +gTbckFVXSulAE1wrZsf3pSfTt9fXgFpLgnnkECE5PiQ5n3Ko+Ez4a7lp4xi22Nbnpa8RwIem +jrEn8eEvv3lhlEgPrhsdjwTtzBivhaFQaNkHkbR6BdH/AAxxTW1a9M/ESCO6/wB1p81VzEvl +zkeSqvPTRMxbq8Q4x9u39HiKbQGVdXfWymwB4of0pzq0RR3OK1y68009cSU8KW5wBw2fw4L5 +z/24HxGGa9sahBHEBsFwj3dXXsmraWWghellpZKYRhpMn8WRnHp6E79tz78U7aPR7rTn3BTG +HxzQcriZQXqK92yOOrCR0kFP4nWijfwxgkdX0yfc54ghsx1IwLBSxqCoIm9190VrCJLhFEo6 +nZlwY2B6R69u2Sf/ADxZcLSc5hKpe1KQDwSrgaenjlggmklaMyAEBGxgf54zj04pG3aEvI00 +Ups13ZgI9p6ylniMiOUEkmSRu23Ynb6bcVZtAyI3qSdRc0X1QXf7isNM8jyyFlYgIm5I9Dgj +vtw8zBkiCiKNPtBu5ILUOopIGKVE3TCp6F26n3IB39d8fw9uJjDbPA+JSdOqAcw1SpuuovmH +lQeGqdAjBUYYHcEg++Cd88WNmCbYgJVasN5vr+yXcNwnM3gThi8DqIhkZI6wcb4BwRkegP34 +TjsLDQWjS6g8cGglzdHJH6kga11OsNL02JUqKZprc0jboBJ4gxvuVYfhPv8AThZoio0VQeCj +cRUJa12g3+UKn3M2gp77Z2vjy1TdNS6NjINHN1bdQOCoONj7qM7nh3BHJVgeCjcSwhxB1sq7 +VVXcrKP0hNNJJMcU1buVWQdfUsm2/m3BI7HPY8W2m5lRoG75KGqUQG6c/orKcm6+O38zNJXB +5Z4S0Mg8SViepUd1H1HTlRn2CnvtxXNrUf4NRjvdk7REOB4qwmotLRX2j+IDQdPXkXSn/Rms +rYJAQC8ExVsEDYFHEbHsQR9eKlha7mfp6p0MtPcR+yLqWm3L6rP+G80ustM6t0C8Qhor7bpK +SmUtkwVMysTEdu6ywqfTHR334m9ogBzKx+JpB8B+3zTDquTtbgffzSn1HB8lVWesriaZbjX0 +1fUF48CJzD4cuU75DxuT+fFswFRrmETcTHcbpTZAOXUCO+Db0QPQVZWjEJmZIDS3GKSMbsEw +GAwPqjEH3A+4kHusHDkt1DmBG8m3v3ZKugp501VbaZ51kk+cAkVEDfqpH8JiBvkCIFht6DhO +Mnqy4c/29VFvrDPEQPZWx/lPrEveOWNc1fBcKM2Kpq6yKbAMbxSJ4yYYHzZpsEjBwuVx34pO +MwmU1HO1lo9P3uj3VAKWWNc0RzmD4zpx1uqSfE1qCS5/NXCgusk9XeLfZ436nWSoMrwQg9wO +jHVUMFHZXXG3Fu2BhnNIa4fC5x5Ru+irW1KrescGjs6d1z6fuVr719b5b9qmqvFwIrbN41TT +hwh60iZ2iYv6jKBTntsPXi6YZ4ZTa0a28/2Var0HVDLR4cN4U/yTe5af5g3Kx3WliqvmqWRQ +r9LAyxx9IK5yM9Bl7ZDKxBHbCMW0PaMtlui0skN0R3y/u2s7PYb3p6jhpbpFRoxms9wpy9M8 +ayPG3h7h0IZVIVWVt9ie3FS29sihXxDKlSWz/MNZHmN+8FT2ExNRlBzTeIsUf6a5g8u9a1dk +u98tNLo3UlOkD3CmegE6RyhjLvVxCKVQ4UsWlBHnwTkZ4gsV0fxuFd/BcajZtDiLf7TIPCAR +xRrdpU6jS0jKQP2VedZVdNWWS811PWCSllnSBpaaqc9Dq5Zy8Rc4VvEU5Hod844uezaL2mKl +jroPsq9i6jHSWJNyRJA1hntyq7QVEMLHwww6VQlTt5gMykE7gbduLA15vm3qKqMAe0N0CcHM +2QUXLCxaKoIGuK1l3lr5ZVw5WKlhiihhwp6gMmVsf3lz3Y4GwVUmsXOtAt4zKcxDXZBA3/P7 +Jd8oNcjlLzR0rrCabrtCP+jb7bq2OT5a5WuojaCtppYyR1I8M8xAyMMFIIIyN7RpfqKLqe/V +pG524+YTWCPVVA4E8D3JlXjlxNYo6zldQXW43u1W6tq7vo+qEQnaenMZaqpC4GG8WKBKhQN3 +eGdQOpnADwuOdUIqPADohw4HcfA25AjdCexOCFN0C7XXH2Udymsmn1v1Lc7jXX6sSzzpNDT+ +LHFFURySBWjlPn/UqGaUggEjI9SQ5tFr8uQQM2vHvHPcOGq3hWNI3kt7vJGen63SdiEk9o/R +VBUZEgqKWPxJ5STklqyUsQSTklDnvtvgi1aVVxAISqdWkwE7uH7o5GtY6wJUT6p0/pijdQ0E +dddHolk/ZYx+RpJd1BLvgeZQAMMqv0djhwM6oSrtp9IBrdOX+F+i0rZXqOSPp6cdFyDcqATd +cGOMsBgbjbjDwSu9cN8MMj7Z7cJIIKSOK4OwC9wB9OFOO5YQl3quQxxSFVAIU9/58DVRLU7T +1VE+aExeSdQdgcjirbRJmFIMEjmq+y9Q6iV6lPcg78BMJmSnDE5USaU1VQ2yi1NpTU1qbUnL +++QLTXa2rKUYMhPg1dO3aOqhLMUY5BDujAqx4Ow1cNlj7sdY/ccwn8JiqmFrtxFIw4evI8lr +R+Kb4XbjLpK7PaqituvL+ofwP0lTKwjAOCI6hV3hkI2ZGIB9Cw4jMThyy4+Eb93vvXdthbdw ++L/5RFxBB1H7cOS146H+DrTdFbblarhYrXfG8MtG6xDxB9TtvnOx9x9M8F4aq1zTmuUfjxmI +Isu/lRrvXXwx68puXusJr1e+Tt0qFpqOSV2mfTkzHbpY+Y0xyA0f7H4lwMgorUWvFrFRj3Po +dpt28OHdy5LYpebpUyST05kLEhsKpyNwcfQ8V6vhhmIUvhsVIDhqhLRN0qorlHSeIxErLH09 +f4d8ZyOw+vpwunhmlhBCD2hUzVAtmelqrwqKBKhAelApBYeoHfPpxz3bNEl8tUvssWRlTVRl +WSNZmHk6ECHDAD6+/p9uIY4EggqYNQwGwhK53DrpQak5aLACjsW9D7+vbO3rwZSwm8pbGlps +bH5JDX6d6gywOKUQBcBME5OcgZ9jjg/DYSRCPqVW/FvKS9xnIeTwqjLbAALgEjf8z6flxP4f +CwQTohMRiWxG9A5u7iu+eqOqaKJGJwdzgYySPXIX8xw9UwIc0sO9R9arN0F6z+XulspbpHLC +1zppCVLAlZcglgx9M5IPp5ifTiObh3UXkEdlyjmVQTkd796jwVdL3baWrnrbbVzTQUtbAGMc +iALKc7Se3iIelWBwCrZznPEXiKLqZgGwv+3ckuewkCJOn28FXbVFiSyz19kusTJRTIUV8ktG +CcEoT+0rDBGd+47jiTweIlgc3VDVKWW25TVoqJvmqQzn5WekeqVii4JQw7sPcg9L4HfJ4fxc +PGY74TApAWHv/Oi2G2G3RVvOHluZY4hQar0pWacrnJxg1FF4kco9PM8Uffs2cY4oUEYd7W6t +MjvBj7+aXiZa0ngQfAGD8/RI/lFXXHTvMS60k9NHSVVLXxyTRwOyqJ1kRg6qd1VysrY3GXce +h4mK561oE6i3iP3SMjW8/fseCYXxQ6UjjuV3nt0Ip7PJVtd7fJGuARUIHZB/gEhmx67nvjiT +2Fiew0G+7yQ1Ktlf2iTNj4H/AAqcCsWmFIXkZWlkR926f1QceLnG+D1sPspHrxburMAbhKee +bkk3M+aF7VEJtY26omDMKdEikjj/ABFkikCsD9Vwce4J9ONY+qGUiBqo8S5xJ93FlbHQOqbT +auW812rEijuMOl6hoOlhhPmZ6mEOcjIOJ48DO4Uk42zXsVh+25o3uHoB9kmq/M9rCLC3lB+i +pX8QFPHT6loaiOUmBqKluMboTgkW+AKMejBhv7FuLXsZxcyJvf5/ZQ2PpNmRbX5lJ+vsgajn +kj8ZQkzR5GcqMLnJ9tj/AN+LEHgiVH9W6BIupG222oF20XqV1heqo66Kkq5MEP0AjpcgdwYz +IM/TfhJiMvFL6kS5pHd3q49h5c2e4a05sNP4soq7FcKkOVOJZFMLtuATg9JPsCRkjbNX2rUc +G0xwcFK7PhzSdARb1j0VMUsdPbNQ6tW4pHVIlt/RcsxHSzdSJCOo/tDplc4PoWxjiXrVTDQO +M+RlMHZzHNJGp/ylHZNFteqPUUdhmnls5g8KoCxBpqOaKRR4jrjLJhmBYEZRs/4eD6tZwhzh +2lD08G2coNkPW7StxttdR1E0c9KFkaR0YkoDkZA9t0G/0Htwp1aZlPt2UYkWTK1PpK7agrrX +Q0NJW1NRTQR08BijMkjthpmIyD+079R2wFOSACQJReGkuJ1Tx2eDEi90vqnTR/SXyNsvE1yj +lU+IY4z0rK27ImDuqk9IbHmA6gMEcP1XQDIgJVHZucgESeCcty1HcI6CyaduFbeKbUpMV001 +OB0SCsBV5KSJ3XyO06maFsEJO3T+ColyJSwocTUaJ3O7tx5wLHiOYCD2iDTy0qtpuO8e/klb +rCsghvOmNf2lHi05cVe4RR+A/RTVILCVAkmwU4YqCMqrNGd4mPEzQpXNN2ot4e/vvVXqVMrg +5BVTra0WommtFHLdZmRZIampAWnWHuPGYbvjBUoDjKnJUbEunhie0bfdR7sTD+z5lLi6c3qu +GunqKaWiv9dJj5mquFGJFJH4UhRmXojUEjOB1eygKoNbSDREQEC+qcx3r9VlRkAHYY/dxNAc +FESvpwCSwJGw2/lwogrXzWI7HGxH3+nCdDJW80WXVI7FRjBbcb+vCZSglvqtj4UnYDp2PAtY +2TtI3VF+ZZIlmYZyCTjHfseKrtBsmJR9Mk3iyRU03RgbSIO/bfgdgOhRLngiQuuAUzOXik8L +HdG7H8/678Lpk6QmSQZhWj5B6e67pPEy01TJUwFpKapRZYJYm8gSWNsq6sST0sCMLwfRe5vw +a/um6JLXy03H+B5z5BIj4yfg+0lyy1npHXHKGOig0PqiyJe1tEUxdKGRR01Apyck0/WjsASe +gMF3GOFbV2axh6yloRMe929dK6K9KauIoBuI7TmmJ48Pe9a/r7prTxjSpuVipatxurld9jsc +/njiGqXGYq3HEOcbFJ7U17NSwp6C11P6odK+TbGMYB9O/bgXqi68IhjXMJDSpTlRo++XK9G4 +GgSmVMBU33Oe5x2yP4ngXFvyUjFiVtzWvIDtfVbEbZI9HJTUk0kTPsGIGVBA3IPr6cUTFiXw +VLbOJa0qXluBWmEaBi3mVCW7t9cem/DFPDlwU3lEyl7eq9achzNibYYJ/a9cfw4Lo4Uk5U/1 +0iSlRe7g08kyyBYwGxjGOkY9T/nxMYSiAcqDq1zIhKi/1QbHSVIAbGB5se/7+JenQi6DFaSS +UAVjuUZHAOFyT1ZL/TH59/Th/qjl7QQpq5jkG/8Ayh2rURBnTADdSiPIJZ8YGM/QnH1xw3i8 +EKjblCuxEmAk7VUjVjRQRq1PVeIxp3PmRZACAN/RgQpH97HfiAxuDfBziQtvcNd6EtQ2eLVF +pkR4JI7vSS9NRTsoV1IBUlMZ6sHqx6FelTuVPFdoF2Hqf2uRDocIdbh+/v5JXQUFRQLXPL/v +ktLbZZi3UeqSDwimVHc4yfuCOJjMHgAHUhaYBa2pCvpZliaxfDxqYMvXTLDQ9UjHClZioHWP +wgY++QPfio1JFaowWBv4Rp80y4AlwOo9++SBObVFSaP+Ieqr3maG33NXd5PRFlJYBgfQS+Ky +n0yR6jgLA1i+kWN+Jund/iycA/hg67vEex6p/wDMZ7frflO1Q61EVfZYFWJk3RomaKVCx7Mh +V6hQNiDID2B4L2ZU6qvIHxD1UdUac4A0JPpb5xfgFrR1XbporzVUdP1SRRTvBECvSRE2MdPo +3d9x7HjpOGdNIHxWmHKJd7O9ctG2uO7czbZZPEEMNw6ImYAFut0IAwdsk5A9fNw5i6Y6sk96 +j61UlhJOgUlDUS0vLXU0DiGWpMMVO0ySEhoyqzADOMeaNu/97H2BxTjmA4mffvcttP8AFJdo +Aft9Ur9U22m1JUXi0W3oaK2vHFExYl6lTEQ4Vj3GIY2AxuSQNtuJLAEtyk71FvZLYO8eqHdP +UlLe7Z46BoJagYmSVThJh1KwJGcHIxjtniyB949wm2B2UJhWPRFdJQ3FaRRLDNT9PQgGS+cq +Qcbftg59G4EqV9yPZhZ7W9Xj0Na/9lNS3GC6xyUtxr7bW2eLw4PFZIqmOQuFXI6yRAi9Q9yR +xFY+i57C48QfL/KHwzg0AN0j7LWhzjpzBfeY1HTSL4z1QZnyT2pkZSScEgmQtkjsOJKk4HKY +0+6Ja5/V5fJVo5b1d9tlQ1VTiSluq0ctPOgYstShjI82O/bv7gH14nHhpFuKgWYdzHRPerba +fNHqupgSupoIpkjLSqQC0j7kYB79t/Xffc8QmIlhLTxVq2aC9oJ7irNWj4fhNpC76ihhlipl +p+ur/WeWVXGQGxufMD5c4IG+QONYKSTmuApCvhWtgCCdfJU2sGgpLnqpYYow0RquqQouOnB3 +cke+4wf4cOY3EBjIJReztlt6w1Iuln8cYbQ3MTltpC01krz09hesnkSTJDSzYCozYZHCxhgU +wM47kDiY6P0ZpvzXuPlK5v8AiDjcmIpspyLE+vpoq6W3VMOo7PdrPqmurZbZcJ+uoaaRqhqK +6FNqxGJBCzjeQbgnqYbrgydTDZSCzUeo4Hu3KjNcSw5t/uyTd0oq5I57PVW+ECmYsIoKg+fO +5J/aJzhgcYGTjglsC4QdUWLDoo6naxLCqrc77SVIJEsdNSLU9Pt1NkEHvsf8+FkHhKayu/ls +v1nkGAvYfc44lY3KJuuqXOMZxjvxi3N7rEdjuO5HCC0apU3WM+T1DAA3+/CTpZZdLvVmTC5G +OoA7HgesLFOsVF+Y5JnlGADknOeKpjjDjdHMcRYpE1J/djtjIPA7AQJRLhmMhRigdQYnA9T7 +Af8Abh3cmnNsQFfH4W7dVaouWrrvQSQ26mhBi8eUZShhSmYB2PbYyEgfTiYwrM0v0+lignF+ +eG6+gsbnz9FYrn7y0tVXo/4GqGzR1E1uajqbZAlRnqno6gOyyv6nqBDgegbYcP4xrc9Fo0Jj +zCnOi2JH6Svk0sQd+tu6f2WiLmvp2TSGpL9ZJadKgQSyRgKSQBnYZ7Z9DjYY4o2JrCnVNMXK +61hD1zA4GEiKa0GqqFjhpGjBbcYzhc9j+87fbht+NDRLipyjh4+G4VlNC2CO30+YoTHK7L1b +E4b8+23p7nis43HipN4CJbQcPiR7WpJTywTT5I8TbB3wd8n23x+7iJq3vxROzndr5rC+eVXK +SOGXqJbOdj22+nD9BpFlLVX9nMLeyl5f6in8YSIVkAXrwRvn7eh4msNhphyj3YtwGUapT3ep +eXxZIiEO/UANwB9M7niRpUGgJqtVM3S6r6ibx/KpkRQT1e33+v8AXrwXSaRohqzwW3KGqiV3 +jZJukybEhm2yOxz6cPvbpJTDmk6b0GTSLM0jB3ZFbBznc47g+3b93GU2NJ7STVgfNCd3t61R +bw2YSAE5U4Bb037HHbjKtAEEBIpVHEgmFC1VqrJpRcbVI9NeUHUjbkySLjpB3I6nTqRgdmwp +2JxxQMXQDKppO+EoyiY+Lx+/hr5qBr9Nx3BK+/UERp3qLe8VRSgEdJdoi5UDH93ceoYEZJPD +TC5hFM6T8pTzRkOU6iE/eWqm48tY9MSyIK2hqo62AZwyPJllI9iHCgk+uPU8RO2GXFVvuP2T +DWTUjiL/AC+S+/EJbhrPT+jeYFuhlp6qa2ZDEZimZWXx4WUDYqxY/wCHrXiHwrGUajm7pHfd +P0GANyO4n374IE0Bra92i4Uum7jUVlw07VUJEET7r5eghiceYhFYMDk4A9OCX4NoBG+TBTNb +NUaXNNxE+PDxSl1fpyW3vJHLFARFUtGhRAFmjBzE6423QkZHqvF52PVzM1QGKLZzAaj/AD5I +WuHi6cu9vv1AyNdKeeOdGxtG6SFlBP06P3b8StW7b7vsgRQDzlOhWTzAtXyNTrOyUs3VTpUv +K7gYUDZkJx32OMfXgIP7VOUy4uyB/wDUlPpGikqbHcb/AFL4aoeaUHYyRSOwKEeq4wMfbbse +JNoIeG7gEM1wBzHksuKiisFV+lkxSWm4SqswClIqSvwMgHJwsg6W3wM5x68SdN5js3+f+AlZ +A1xG737/AMq03KiJJ26J0UKHPlBwCMdx9D1HgbEVezAUxRohoMncibXGtaK3fFHpqnt1W9S1 +LY40eOMnMdS/hN1MB26YZJukDzN4mB3yHaoD6JaeSg8RS0yWjwte3nfwWv34kGntvO/VlvqF +LRTU1GZT19YPVTqFK7DACquAdwBj6cHUWlzGuCJwmQs13n5z+6DLHpxLRJLWIkcigBEPSSCz +HYZ9sEnHseJBrnAApqpRZHNMTTK0baitc1vLFXJEqlctK4AJY74BJ9Pb7cAbYcAzMRop7o/Q +OfIRqPktnV7e+6E+He4XOGRKmG4QimWNz5kYkqpQt6+oG/3weInCVCymXDep6nhJxDWNExP7 +KsvK+jtOnaZr3cKaot88iszVEynphjG7McDGMA7+2TwLiajnEMiSpJmYS51he/3WmX4h9aT8 ++uc2q9fWmtSjaapeG208tHJFikiASILIQUBboZ9sbufbPHRcBS6mnlPivNnSDH/rcS6sByFt +w089fFLSltF8FW8UtovM9POngz+DTZ6X9/uCFb8j78GuqAiVANBBggo7fSmob3Q0612l7r+k +4Y/JUfJOZJI9xnDAKwG/c5x78DZwD3p5wzNBG7zQPHPqGkeSmoa6eqjXGfmKt8ocfhEcS9MY ++nDz8u+yEY/LYL9WdGGCQTtxOZoFlFciuuSQgY6SB7f6caItYrI4rCkdfUbZ324bJvCwLDmm +wvUTnc54bIulBLTVtUFpZjsGxg/Thiu4QnmtCohr+qaWtm6t2ydiNhxV8aQXKQbrok3UEHuB +04zn1B4HDkprjNl12+iqLncKSgpjFDNM4TqkIVV+rH2AyTwunEwN6bcHRIvuWyrlRo3/AGg5 +ZW7lPy1rorVddQ3mno7rcX/4iUUrEPOw27xJKwX26R68T+Gpio0Uqep17t/7KOxBdkJG+Nee +ngbnuhXd+K/nl8P/ACBp9NV+t72JtQW+kW06VskLrNUUiGExfMsmcoojb8Z7kgL1Y4N2zj8N +gQKla79wFzffyCs3RTo5i8aOpwrf4YiSdIGg9715z+ZFYmutS1N9VYJ6KZiwkhRvDCr2I6sE ++hwdz9OOJbR2sx1QulduwmyHUaYadUNWfT1JRIssap0qV6QcdRUA5J++c/v4g6uJLrypdjw0 +lqYNNNTUcMZMD9OM9XqT6euxHCDDjBTb3HUlf0tZR1dJPG7p/hBOcYPcD34VVpuAhIZaoCl7 +cat45DG+FBYgdR2GP58S2AZMHkisViDlgDglzfZfEEklPK/jggDp8vr3B7fXiyUqTRZBtrZR +dBchjyetZAMZU5y2fXgzqr2CbqVTOaUF3V4l8GU088nn3IwuPYeuOMyuNyIhMB+aZKD6qNpV +kDp1IR5VUZGR7fU78PspZhJSXVSPhN0O1kLtGq+F9N+5b0zjG/8Apw6YAgCUM2r2rqIniKJK +rPIzY2JQYH29xwO/WydY4F2lgsG2QgVUEVVJKtBO5gkYbeHMvmRgffYffHFT2zh3OGZuog/R +GMeDaLj5ELsrLcaGO40MgY00sqJhQRhC2epD+yysAQM/YduIKhU7WV2tz5e7p4FzwHD2f8Is +5bz08d4qXqemC5S0RSXoBCvNGySo4H7LEwhv+rbHqrG0Qacc/Q2KZc5zffv2EztTUdyobNUW +Vo4BSpUi6U/SuVeOZRlMegbCZ2x5OK3ToyyTrceSWKozg8Y9+F0ja/T1PBUvTJKkM9PPJNR9 +OD1J15AIG+OlwpOx8vEpTpCoztardVxBltmmJ+fnI9VJXnTdFfDLQB5y9RRx3SlkV8j5hUAn +Rc4wwYucZwCTttwTgcRVZB+ITB4gbpQjml1nEAjX6eaTNXZpFZ45YJFZnXDNg9JA3/ePT6/f +i5UwHUwSgKch0EzCDNZ10qWI1MFvpommsiwuSxZpXhKlmbG2SMr6EgZ9+AnS6sADaQhy9zZm +8KKo7YKDl1FCkSxiW5NVSMBlkhaACHI9MtFUNt6OPrxNf/IZ3D90NSpye773WZpq1U1/pZrF +VOWpaxQk65x1BclXJPqMkg+mSOGa78pF9FM4fDZpIEoX5p6g1xyft9gsGnVWa51Rqf8Af5Ey +kUOY+llDbM4y2Qe2B7kcSGFosc0EnVAVq5a5waNOKA9ETX6TW9DqSurrtcb5Wx22peVVLyyS +dPh+Zs+VsxKSffh+uGtZlNkhtIvbxuR6z9U+PiU5I6tvevdQ6uodK3Ksijt1sDnfqmVaKISl +VA82JA/1xv6HhWCxFOmzqzzuk4bDudTDgRvtv1P2VX6e808NrjtjwmKWBizx4wUyQACO/VjG +/tjgqo/dNkUaD3Oki/BWF+GnlLWa11vRXSoo57dZ0k6fEfK9WTuVzg52OPbHEHj65qHI3RW/ +AYXqGGq+cxGncrtc5pZ9R1dl5YWZjXWO2kvOqkAMwVR2GBnIY4wPt68ZVDQzq2qUwINKcQ8X +ctR/x78+6Sw2GXkJoW4w0N8qURdQVIfJp6Y4KUylAcPJgFhkEJt+3gTGwdm9s13X4e+S5x0+ +6VO6o4GiYLvi5NO7vdv/ALe9akw0VPJBIK5XiVVQmNXIY/teg9T34trRO664m43gFE9vvE0b +rSM09ZEd4y8jL39AQc+pA39eEQlsIRfbL3SwSUclVR1Mjl8dLVXXhgSMnqXYYH8+EOB1CVng +wo/UNrqbjViqtZSGmbJ8FPKsZ75Hqc98nJ/cOHmOaBBSauHObsr9XZTsDkg9/vxMBQULqYjJ +/Z9Dn041K3YrAdmyMgn89/678JcVg5KOnz0HP9f1jhDtbLYmUudU0jTU0mMk4IO3fhiqLJxm +sqjHMOkMNXP1JnJ99v38VbGfFKkcPBbCTkxODsT9D+/gVhWzJA4qKYkfgIGRswGw4cabJTxI +ynRbAfgh1xUUetdVTXWuD1czRTxl/wBuRYJkVUO/Sfwjb2x68WLYVQCvmd71/ZB1QC4TvI+c +fJadvjs5v1Wr+fevdTUtXHWWurnpKymUIVeD/cooxFvkqUaJ03+vrnit9IWdbjKjpmfsLeEL +1P0P2eaOzKLSIgR39omfGRCqxy6+Jd7Dclor21XNbWGJQQVIJP4g3tgnbOTtxS6+wKT93+VY +cVSJECJ3K6Ni1nYdVQw3Kx3GCaMRAzKmOuMZ7ED1I9vp6cRVTZLmNMiyq2Irljy1wU9S6opF +CwyeCqKCpIXcAkk5zgb/AJ54F/RdoWQ7qliSsWrqmpqqnqYHiSnZmO3oAdsnsDj0/wDJK6ox +BSBU0OqGL/d3UpjpfAIBwPXvvwds9hzWRLiHNMWQVVVglglHUSyHpA+n+Q4sdOncKNqsIdOs +oXlm8Gdy3WjHG5OSD7/fb+HBzWiYC25xPZ3IeqrjEfxqJS2MN6bnbtn68OGnaCkHDx2ioWri +KqmCrKexLd/++/5cKDJ3oHrHCSEP1VMWpyCGp2XsCQSo/rPGnDcSnhTMzqVCVSNKCiq0rjYn +pz2x2/h9uGKlOClhnFfKekiLfLTRyQQidWJUfhOOk/T1/MZ4ja1EPMnhCfzlmmgCP7dbIK6h +uNLcGeCSUGJWA61d0HV1dO+QMIduwYe/FB2nh30azHMEkXPcbIyg/NSOXQlBtjpDQajsM0sk +UEniRwSt3XJYqW+x6yP6B4Oc3PTcW6JGIJaXCLj/ACrM3+lW96Xsdc8n6yiZqSpSTJPhSLlC +7jcgFZEG23iL65HFZp0HU6zg7+a48OHOElgOWANL+PL08khvk6lnraYVDz4pYyanwwSAcKCP +sQN/rwZsysGOLXaFO1gHAOduKx5G+at1kmjMNPVx9dSispKwygBKhPt2kAH7OfccH4JgFWoz +UfdA1pgX5fZL7U9HFFWNWUCyQoJWx19opUJPRk7FCQCPoccWTBV+yA7d8kHUzRxn5fdI+7Wx +r1XGwWKCCuNTb6lF+ZLLFCFcSdTgZAVEDliey9Xfhuo9rKoM2kH5psuMGbAb/RQVoulpvran +t9vikMBoDT22WSUI0/y5R/EmL7AvmdgdukyY2A2mmMg38eSYDCG66G/7Lnp+y1ltviUcklRF +UIw6xJTtE6hhnJRvTO4YEhhuCQc8RVXENcQd2qtWEBbTlov7Ca+orLJqmxi1XyGCsgp6tJ44 +nXqLK4KnGcgDMabHfLA9u7tIOBGQ2uga7GvdbUyffmpmyW6zQ2O32mlsUEM4pvCDBOk9Ad+h +s4zsSPrnbguoHEyFlCtlBncVajWPOqS3RQUMNFPHUssdR4jKB4aGNSo29Rhu/pt24N60BnVw +ovZ+EzAzpp6qmGpLpp6srK2+fom3NcWcSSR+CFDP1ZBT1IIGen0zttsBWsIOU3Vmp03hoyzr +4o00PrC8VxaOy0goSOllIjCKiMScqB3JwR77+nCKbMpup+lhhkmbIR+I/nnYPhz5cXO6RVcd +w5j3dWprfSsAxeYrnxnxuFjByfcdI7kcHYHCurVMvn3Ku9JNujCUesF9zRxP2GvpvXnT1HcL +hfbhc79eblPX32rleqq6iZ8tUzMcsxJ7MT6duL7SY0DKAvPmKq1H1C95kmSZ570GUUcskYiM +QDq+N1xnJx6j7cacYchMoLY3hZ9K0scj07uFVQCoDDII2z9t+Elu9JzgaaIgYPLT+GP1UioS +rg7H69+NNdxTlRtvVT9vvRSHwzEPKAMdRGDjfG/b+XCXtulCsP5l+rmMBR2+vE+GybKvTddD +vvgEfThBG5YFgO/SudgD3PqOEOG8rcDco+aQdh+fDZhbAhDl6RWpJcgEgY7DHGniyUFRPmmi +irlOzHJIJ4quPb2kdSZIskNMFLMCpz2znIHAbTAlPBpJAUQUyzFifoxP4fz/AD4eETMLbQJK +e/w919Zbtayfo55FrAkNUnSek/qplJ/+LNwXQeQ7MLQh8QSJy3i/ldV/5yfBJrHUnx8UXJKi +tVBJy91hXVdXTaouFJM9DbqGnp5K6uSZoipjqIoY5VVQyl2ZCDgkhFbZ7qmMAI7LjM/Px8rr +vOB/ELD4fYTsS138Wl2SwESXGIN90STrYGyqzP8AAdpa2ivvq3y5NQVBc0dCtQxdYepo+twS +c9RR8DOwXPqOBmbPY3LJ1kjwMX79yHx/TvEVHaXEAnnrZU5rNCc1+XV2vFw5e1E97ttLKS0L +OFeRR5mQZ2bpUAnOPKdzseGqODfUnIJ/b9lIDpDh6uVmK7JO8KQt3xO2/wCbqLZqumrtO3+C +QLVUNZA0UsUncExsAV9wd+/seAsRgCxxBbBCQ9mZoNJ2ZvFWd0HzSsWq4KaChromyD65xt3O +diO2+w/dxA47D5HHLZC0a24ojuUhqqaVCVimhbKAE9vr/H93A2EpEPupTD19cyFw00zeHMjR +kE5GwH5++eLPTkjgUp0AkzdRVwhWJWEcigBclS2D1H29xw9SAEneU0HmZKE1MrMI3bKtnqAA +GB6cOQd63VqSZasg0olOYyqgt04GMZz7cOtMIVwBk8VH9KKak9XUoIUJ29f8t+G3OBMlazFt +uKg50eENI3hyRjDBCNxn/P1+3CXp2iwPaQbFfEbwZ3C9EiBCTk7nvv7enAbnEmIgJdWnAkKa +/SbUtZbzbXkMEMgnz1ZJLBAWXPp0qAfQ8QWOwLagcTv+iKwlVphp5rhLSSUd9Ekccs9LDKKg +QnCNEhYMqqR+yCAQRvjP0PEThJDYI1EeIRGKaCyZt7umDYdWVqxXWhuYWaOqDI7jy9aHuuPU +hlVgfTgLFYSHW5HzHuUD1mVrZHsb0L0nWgSo8JVcZjKAZ8eFsA5z2yEPf1GeImtSDKwO75I1 +8FpGsrDqaOK0w1hilxSJVLPC4J6ZMxlVH5g9JHp5uFUnOGIDjvEHzv8Asg6zM9PIBJSyvF0+ +Rke3MVqqOu6VjDHPhyrskvp0npwpORsWz+EYtFMhzJYIcPcfVRRIL59PfO6rxrC6mw0d0sVK +weuaGPxKtF3crL1yRBj6Y6SxAAYdIGVIYlUCHvD9fdkPVaTppKRMeo3tN5pqaJkqIKqirqam +mc9KkVFLOhYH+8p6h9GB+nE62g5xk8vomWvDfi3e/fJPHklraS66T0c6V71tsaiiMMMwDrAQ +nmVc7qAQ3lBABztxF1cGG1SCLzqrfgqrX0wWm+9PTRV6g1XcrvIIkNKlVNT9W48QrgF89iOo +EA+vTkenDpZCRTYbkfy28k2UsElmdrpAkCW+KGUSllzsxwCBg5G5z9Qp9+FAuQFVrXA21I/d +FOof0fe4Y6qopjA81JRuGC7ErF4T4JG2GjP1GfrwmpXqHXiidkYSXOA3H5/cJG12mrQk8lVK +Y1ZcgZCnJHbOPudz6jhTHE2Kswa2nA3j6pHczPiP5f8AJK2y05ufzupjGTBRUQWWYE4x1AkB +R3yx7dP14Pw+Dc8wFE7V6R0cOcr/AC0J/bmtN/NbmbWcz9U3DWGq7peb5c5cpBD4S01PRRek +UeWkbA9WwCxGSeLfhaApsyhcU2rtericQ6rVPcOA4D3fekZea1fwQrBFEPRQSfuWOSeDaZKr +lWpNyhWiqumc+KzSg/3j+H7fw4bcOC1SdeFnuAaoPEocOcY9e++37u3DtL4UzHahS0M8aSyq +CUUnKbHJHYg9uGcsXCcpvAMlZCK8nUy5GST+If58ZKdpdqTC/WTGwLY37jieBKr4E6rpfYs+ +MjsBwhzdxWTKjJycBgMd8YOeG3CAsAUUzEv26fXPvwgLZKgry7fKSDG4BG3c8IcLSE4zW6o7 +zSUPVTEAdW+3od+K1j29pHscYsEiJ0YFh0FcnPt9eAmFPyQICipAuSCFB7g/f6fl/Ph6kXDT +RN2V/vgz5RaFNBqD4hecV2udJoGzVRtFqtNC/TU6juJRWkiGMN4aCSIdK4LO27BUIaXw9BjK +ZrVNBaOJ9281rC7PxGNrjD0BbeeRHoIuT3Ab1bvnR8WHwy8m7frqj03R1v8AttdUe13iGhuc +kwaeWMpMR15RHVeqMyrjYYAPAm1+lmFwmdlMZ3zEDj38vmug9HfwtxeNeKtXs0z2pNp4c7rQ +FqnXGitWXC61B5h6g5Wct7Dbau73W6v01slptMD9JcQdPVUVMktRFDBACGnqKiGPqAJxSNn4 +raOPxMBwpsEyTcBove0kjkuxbc2PsfZeBOIq0euqmAGgkF9R0AAXgTvO4Bap+eWq21/YYrPd +LBpyi0xFLNLBYVpVlmrOtSvzF6rQwkrKvp6MojR0sbjpihCoCycHjX/qDUpkkcTv7mizZ8SN +5KEwvQSlTo5sZeo7UD4W/wBoOrgNCSe1rEKiMvIy6BILdaa7WNYSw6XqJjMYAcZSJnBdEyAA +ufKv3xxaxj3OibqJZ0ew1GXhxbfirDcnuV3NHl7qO1Xyr1DLPbuseJRsgLouRuXzgjvtj+XE +dtA0y3S6ZfTZDi0yPei2q2xorlQeKuUHhDCn0AzkD68QAAd2kLT7JiVxq6AQhkw7MyBlPuO/ +E7QEtutmoSSQLITr7bJM7ID4Y26s754IptKfovLRzQa6Tq00hMUcYbpbqOWIz/54c1TjmzcX +XS8ojTIII2xtuTjtxpNtpl2iw5jDI0bEDduoDOMeo+n58ZG9KgwVHyzQopGUL7N1A+mfX9/8 +OEkAJTKbnGQFjU9VFM1OkitLKQFUA5LqBjGBw08wYKVVpOiP5SVkz0sEkNS4AjAj6QxY9KKd +sfvP7zjgCtTixW6Jh0AXKIZKp56W1V6M7ssZjc9PSwZR5Sw9SMnB++eIQUmh76fiO9EOjwWZ +DKZ4GcQu6sOgLjckHcD0BJ34dqULyNUwKkanXcuqSqlpJq1FijnXoByewAHpgjJChvXfiHx+ +z5bm4JAqjNYqLulygrbT4NfDFLbajpjik6vOjlAFJGeylWByMEN78VmhQcCQSZHyRTsrRLNS +qscy9TR01BJbK4vDdYwsAiLdSuAeoyKdgThyu4Hr9+LhgA5xluihazQO0q6i/wD6ehnpZ43n +NVSuxRZPNLjt0Mf2lESgD9pQPpxI08IWOD+9AOe5wkbkH29NPUlVLatVWSuvFtqj1UNwo5Sl +Va6pScSRhiI5Y2/4c0DgN0+dGR1BayUn5hIQFedQd9xuI+nI/RBfL7Uuo+XFD8qsZr7GxLxT +RZIiYsMlc42ySelsH6cZiqAe6Wm6k9n7QfRcZuPkrRXb4rNP1NRSXPTlka00FDp6xWr5dSzm +OoprbT00xydyXkhkm+gkA4dxmED3TTEAgfv6p3Zm1WU2ZKxkl7v/AGJHofRSFf8AF/JBBcKU +0lXWMkBpmiMeVPUV7E7Y6ieA/wBHCXU2mwkub71QRqz4m9RWzSOnr5p+OepV6ist8EUjlCro +6SjBAI/DJt9semOEtwcvIceabwu3BSLn5ZmPkQqka4+JHm7qGlempK79AwzIWn+VceJ+Lt1E +7dh6Z79uDKWCYDdA4zpJXcYpnL8/AqpVwqXqZ6iSrnkqqh26pJHkLO7f4ie/E1h2ECSqbi6x +3m+8oNudxEPV4AVnBwCR5VP+vBzADqoiob2QfVTMUeWZnb1Jb1Ofb93D7QIsg3EZrqJgYGRJ +N8Y3wc9tuGw3dvSM4zSFOLKigyYVnQdIyPXPf+XGUzBgrbmXsuAqehegyoyqCEMn7Jz7j+t+ +NZZKS4ADkp6kq1aPreKSLPZkIYMPr9RwlzCLBLpvAEr9Z1cgdXr2/wDHE8102Kg8oWLUSeze +uftw288koBRUjgg9u+OGYBN1sysNwEXPScf134yFsIcvTgUsoHtnbhp4slDW6ozzSYmtkGR3 +7kdx7cVvHkko+mZaEjZJXUBVwBnsckEcBghOOLmzCwpCjEkK8bA7HOcn6e/D8GIW3aXVjarm +nFpb4YtMSRrVqumtR3erqZFBMavPDHJB1gb5ZiRnH/KO/YcSNbEFuEDgPgJnx09fkr/0Aotq +1alAWLo8t58BIWinmTzl1Fd7nWmnNZ0ZGZJHOW/vMR6kkHfikYfZwLs79V6Sq4ptOnk4eirn +rHWmrXXSml2qGFBfNQU3zZGFWVqSGeopoS57AzmOXp/aeCM90HE1T6tlCq0amPndc825jGna +OEqz2GF5/wCrKMp8LwibSWnpJoqya4hHl6yix9WVjGfc/f14j6DDBICVtTbxqOAYbfNPK1UT +dC/KWrxEACnByQfueHhiHDUaKs1asugOTTpdKmpgeaaIGbLHtjHYDH+vAGKIc4gpthLbhGum +MU0DUMrCNh+IHuR7A+x3/rHAmGpQ6Cl1XE9qf2WdW1QLdCFWRWPSx/ZHpn+PEvTBi29bbx0Q +hXXFnnkkWQZUANt7DY8GtNkY+gB2deCCLpVU5YvIWQZIBbOSMjsOMcJRDaLhdpmELSVCfNyQ +ICk5T8LN3A9fpwpzkjqIbrosWqUxYljAIfCsCdxttxghLp1HkZSLqJuBlf5h1LpEGIC/XA7H +6cahPUH9qDqsBKloxE7OwGVUN1YI37n93DThCee2dFIWiqqjRVD1E2ZR5pcsMMM+gH8h/lwG +2j2ZK1UcwEToiWjknel+XSaYQLKHWMgEEsO/+X5/XgbE0WTmjVMtrFrSHBEFNVOWExJiRUIE +bbCQ7DH2ye3DJaZ7KFdAEjRRtwu6mJo1jhMgy3VJ1OQVz2GQPzOfb7pq0iRcwg6z2udPFKXV +eo1s1HinuiXCKWIVMUQGIYHD+ZMnBLZ6sEAABu54ha+zGkS0QdCn6eIzgg6D3PcfNVW5k1EV +ztVJHRyPFVRQhJfFwZ6KAMV68dzuoBYb+b8uCNnseysQ/Q/NDYv4ewkmsSw1qCEiHwyiwkHb +pjx2/wCrbPFkZTa4wUG0EMhusIsojSGuh+cp2qKWSOSbuAylI233HSSDsGOCcjc9uCWuchnM +zNAFp9/uoiporHa6ar8C4XA0vgFXVo0j8q4yWYsQQBnJx7nHBLTJSajC1+dL+2Nbb7pCK7Q2 +0x0VVdLp8lUillhjraOM0yqY3ZQJh1rJlwWOSA2PKvBzmBrBPAqvUsUald72HshzSDrNiPku +qst6n9KM6zL1RqwLAHzdZPfv6e3AbWSpao/sgussbWNtpYuWNmpHMcktPc43cupXeWhj7/T9 +UR9878NCBWmNR8j+6EqMiROn3Vab3LRO0lNPEGAHQkyk9akbfh/a+2334kaLJUbWJB1SwuYk +iUhFAzndh3+wHB7Wneo7EERbVAtXArB5ZQWAPYHggclFvc4OkoRrnMkohVSI13P0/oZ4ckaB +DuEkLEoPMTD5SGYYI75z/wCOEuMFLpkcFKMPDmd9nAYkn3GTn9x4QdUsCQSo+dZIYZxkkFvI +Afxrjf8AL/Th4EHvQha6eSnLVOHo43yqSMMsGJH2PDVbVLpTlEr9bBSSpBGT9/48TQAnVRTg +sCpb8XSCce/CXTN1tvFRxJwMA59QTjhl3BbWLOPKcFvbjHNhamELXcj5SRdiN/6xwhwsnGlU +i5pKnzDsCSQfbitY4EFHUja5SLnYdIIcqfUA9uAmsO9POEm6wiwJKDrU4/d9eH8hzT3JBtPJ +PfkNT6D1TqmblFzVtE955cawWOz13y8hSpoqjLGmqoHBwHjkO+QQVYgjiYwxZBp1R2Ha/RZh +9oV8PVbXwzocDu52VIvjF/s+r38O2r7hJUVkV20fJO/ydZTsW8aMgvE7kgY6lOQB9fbiK2ps +jqO2TLSur7I6aVcYzLPa96KgV15d2y/0NdYaugVqKTDMD+IMDlXVhurA7hhgg5xxX2vh3ZKl +8QetZD771hcvuUldo+CWjjuN0usAZ5Fkq6hqiVizZJdyN+/TgDsOF4jEhwsEJTOVoF45qz+k +7RHTxx/MQ59SejBHp/rwzUrQMp0WssGUeVUsaRuQkcSqSVBOM+w4GY4F0BOuo9mJQnJ1s8xK +9fUMAr6A7D/Xh1tKStuBZGVY9bUgSOzykFQMbAfw9ex78FYbXuS8PJbCBa+qIqHckxqx/EcZ +H8e/YcFyRAUjktAuULXGqCieTrGFJCqz5Oc7FuFEkX3InDNAgTrqo0SIFWSdHkYnIxnIPYAk ++nCy4LYbJIBUZICpzHKp8xYBgDkfTbjRK3Ui4XTPUlYhEjAx7sFO+WO/bb14w2CG6y8lR6eF +NR1SxiY75IZiCCf6PDThY9yek0xmKxqcp4rSxtMekjK574O/5djwxSOg4JT65Lco0KNaF0kW +PqkUuuNmO529Pp/pwIQSSDuQbapmNy7LleYaXDfMsxUZYAdzv7dztwoNATWYEWCWN51SkdLK +xlaKlx+IdyAPYd2JIH1J4yqDlg7kNU4jekfqDUDTw1BqPDiCP8xChHV0yAAEdXqCuB7Flz2x +kYNBQ7qgbf2UjYb9LPeqXUjTeJNTwrTIrs2VQu5ZD79SMcj0BQbY42KGfNTIsT9rpnEEWIN1 +jz/K2+U01GrVlnqD48WSOtULHGW3w65IbGxIOxHB2FaT2n2cNU2594BsshWSNKqSJmrOpOgP +ghsEg7g7jZT9N+CWvJ3JwMDACTp6rnpCwaQ1jrvROj9f6ri0ToO7XqitN9vcnmFots1Qq1U6 +jcF0hMpXII6wudieC8FldWa02EiULtJ5p4Z7wJIabeCg9c6M1Xyw0fp25Xuv5kVGlLzBJfNN +0uob3UVpttunuUkBiihlAFMxaizKqjztGrMWwvTI42rNRrHWtpwJn7Kt4HAMp0KjqZmHC/GP +pcoduErGOsio0bLBkBbHm2Izn937+IxrzAJUy94HZKCdQVHzOn75HIzN4NzpGwdwAsE4yPT9 +lRwl16jSOB+iGry2Yuq01kYWUujs8pGSWPYniVw2l1E16kiRolvf6gQkqKjc5BC9+/8ADg8c +VEVCHAtJQNWzh4JIlVgi+ZyD2X139/T8+MJnVDmp2oGiGcF+qR1JdiWIJx3/APA423gmSAFj +U4MdXFg5TryD6YB/7cLI9E0HGVmD9aolRSzYyN+3/bvwnfBTjZPcs8UyXClwhzKh2GccNueW +m+iwtzCIlcnpSWCnoXpVVA6unAAAA/hxhKU0f23X61qZKgnb0+/FhLYNlBA3ssebBztlgcd+ +G3tIKybqObA6/wARX7+vDWa6UQsaYFgQuCvCnOiy2RvQxdYnankO3Vw24RZLaqP81UaOabMX +l6iM57f1/HitbRF4KIpJASkyEscg5P78cR7EU+lm1WMmOrbOcZPbft/rwQCWGdyRlgFHvLut ++Q19oiuMhjWK8UbM47qvirk8SBEgJgvyCRuI+a21fGzyrq9Z/C7pG7zimDwafpCZJ9izIxKM +G/vFMDH14mdrsnAEu3D6SpHoa8MxTWC9z/7FeaODR9zoZp4q4RVbqxUFVwBg7k+/b3xxyYYk +b13Wvg2t7bbSpqC1BUEaqkkjHAAGPL9eCmuhtioapSeXEC0LLNrnoywU9Kkny+mBsDn0x7cD +5pmCn6dIiHEKIrlqAo6OllGNh6H3P09eH2Ny3CU25yqNVumCQMrOh3UqO/5fv4MpAQmq0yoa +sUVEY6WCAHGWOBn/AMcE5YTVGplN0FVccUMsgAMa4wVPv9Pp3340Kl5cjGtLhA1QlVU+JJZJ +iwQjYAYx334USeCkqOImygaxulIgkxABLdJbG+/rwu4RjHyTGqiZqkpK0iOgd16wDuQvbP7+ +NoSoLXKjkqIVicSu0oYkE9R2XO+38vz4QBu1TdV8OsNF8oOiSaWlcgSgEIWIHSncAEnfvxq2 +kWSMRVJGYafdc0uMDQylTEGVSUcHZsZycfXB24bqFwAhCNqEEgr7SXynk8MDysq9Y3xvjP5b +/wA+GGOAcl1HuDZGv04oWvV9dZCpYlM5ZvU7/wDjb34WQZh2pTWaw4JR3a+m71jQI3TSJ52y ++PfBz9v3Ak/tcMVW3kpio4tsEq9YXiE9NPG/iRxgPKMf8U90jwNsYAZvoAOMYBMb/qgq1eQc +29L2rrHWBKOIoHCMGkOOt2Y5cn2J7ZG/cbcP0aBBkoQ37WvJTVknp54UtFWxjpyS8ExH/wBv +IfU/4Ttn7cO1Zaesb4hLw7xlusyspa61GSnqGiinYtnpmDFf2RnfIB3IyBkb+vG6dRpALd6I +rP7QBF0sa633/Ud/tWkLElXXXCeSmpxHDJ4clXVVEwjggEg3Rj5j1LhhlSGHrPbFwWZ+fU6D +vP8AlVXpNtNzYosMAiT3Dd3WRvqMW6+6OqbPY7vetTWaSvrqSjulwrJKiaooqRpKaGQM5Y+E +SrSxjIyjISMngLaTD+rfLiQ20+SktmEVME0FoYHN0G6d6gaaKro3geWpSUohYsV7sD+Id8e/ +3xwITuT9RpjtIO1lDTUGm7tdIwPlK2oiVlRwTBOocvEc49yyn1U+4IDrHEvCCqkBpE6ff3PN +VE1DqSGPxY4elDv1EsCfttnf6cTNJkCSq5WkFKisuM1TK0bKyIDvnYRj1yfc/wAPvw/ogKxv +ooKvqPFlgoV8qth5QB2X0H+fCmM1JTNQFrsoXHoLK8q5I6tsDhIsnakEWWOsXXKyhQoGSPpt +j/PhQJSYJMRC5QqQ/wCpCvIB2Ow+v+nGGUlgA01UzTUxhKTwCVUTdlbBIH+eOGHOGhTtJpyy +NSiGOCCoRJHaFj0jDq2Oofl+fCmOMkFEjtahfrALjAz3+vFlJMqpmDosWc5z0dWfpnhG+6WQ +BqoiUnLHO/bhpwusNiuCnJPUATxgA3LJ4qJu5VKeUtgbZ34Q9LBG5Uc5tMhklKHpJY+np+fF +a2mRYBFsgKuExOSQS/tgZJ4jmN9UXmG5YsWSVbyk5JGDt9eDADpuTT4mynrNHVNd7RHQRyS1 +71cCU8YOS8plUIB9SxH5ng0MLjlGpQdUhrHOJgQflK3p/wBoRqmXSvLm06EtpjkipqSKneIk +BJOiNRjB3O4yMdyCPfhfSrGdXhMrdT7+Suf4f7OFSvmf74rzw11A9TVP1KoUliCrHOO/+p9u +ONNr9oruWIw9gRouMdji6FkPQQWwMDZQNt/4bcGMxLrTooOtRMkBYV0tlPFA7sqgqfT1+3B9 +N1wChmh2U74QPcYVkpzGAw6t8AADv34kafaMpnqwCCUF1IFOEBYqMAjfH8eJOkAGgFIqgGSh +CvqERiyO7oMnc9vc8KD9yaFMRJQ5X9Dqj+aVyQ5GP6yO/CAwu1TtKqWkoMudQHE0cghLYHR+ +73/n78bc+LJ6g6BmCALrIGhlj6Vxg+GwzgZ/z24WR2RKlGYogyNyD57hP0oVTodG6GBGSR37 ++vCg2bJdSoBLXXlQ8tbOjq7eF0sOlwBsO57+3f8AdwltxZCPewQ0FYb3aGA9Tz+KBhgBt07H +/PHDTsupugamIdEqMj1fEruZCIlkBxjfA3z99wP48aF+0Uy6p2oCF6rV4KtDHIxB2DjJ9MYH +1z9+NFrtyZdWa23sIWrdWPJTxo269OA247+px679+HGMOWHXTT3jPdAtVqZLbb6uucxSB3km +6QMZRcAKPXBOP3n24bfRLnSExWrZgI1Sia+1fjyzVTrPNGGkkGcq9Q/fvvgYA4cNNpOij3Pk +S4rjS1MlZOqy9Ug3yc5wMdz9duHC2E5TIMndwR5aqUxRFukyL6fUbbD92Nt+M3oik4CG6wp+ +oeplii8cK7Rp4KEqS6r36c+oGdv9OGgwB1t6fqNMEhKzlxrC9pX83L5YquwLqqgu9fZbHVOk +yLRSvRmH5sSKxLVNOJGkiBHhl4ACBnqEjg+lLcHjW4Et7XV9YDzJII5RYg9/JdS6NfgLgekH +QvaPSSriupxFCsGtB/5ZaxrXObABdndJyu0BAmASQRzzW3Ttks1gscGIaahhgpo+sMIoUQBV +bG42CenpwJmzG65G6mGtlltwQhdJrpWq6y3GGjiAI6YiuSCdyMn6cbbZDYlxFpSl1LdrNQW4 +UVbUU12oHk66mnlqTipHoMpureoYbgj1GQX6TZeo7EkZZ3qst0jovE+YtjrLTBgPFIwYsnYM +B2b29/T6TTbBQtV0oNu9VS0sWI0Z1Vtsg5mc9gT/ABP0+/G2iTCFrOyttdQEFM8ayyzsWnkO +ZG929vyBA/M8Lc61kC1hzHipeKlKwE7+Idgc4H34RKKLTpC61QxJMCSx9AVPlX1P58aBnRKA +PGy+w22aoElbBlwi9IQfiB3OfqNscazwcpWhTuSiK20c4Uzs8aOIyZIsnf7D0P04acRN05TB +B4LOWi8YZpIVB7yRs4BRj+7Y8JMjfCW0xvX6unV5cD39+4HFsVTLbLocg7kEjvwh7d6W6BZR +k3UD9PoP58Nkg6BJIXV1BeptvftxoE71uEKagqOmnkAbO2w/78NVTwS2xKo/zMk65JQSytvk +E9t+K1jxJlHUNLBV/mGS5YZJ27Y/j7cA0xwT0kX3roQNkMQTgZxwZRp9qSU1nIHNWZ+ELTaa +t+J7kZapYFmpf9oqeumRk6h0UytU4b0xmAcSuEE1AN/7KNx8GkQdCWj1E+itJ/aG6qW7arq7 +caljOZC8pRslVKrhSc4PcnAx/Dit9Oj2+radF2j8OKYa3rSFqsq6yKmWR44hLIihc+j+nc+m +c8c0ZSIuupuguDTvWFHqCBacxyhJGI6+rHlU++P8+JHD4XNd2ii8TTa0lB97vccg6mJbJDBj +3+w+nEzSwhaFD1SIhpQHcrj1sxBzk7gYGBj+PEgyiW2KEqOlAddWSs5V/KMkgjsNtu/04LpB +wF9Ul5GWPNDNdURzAs7IhU9DZO/3IPp27cY0Wvqm5nQWQjU3tKbx3aTPoWwO30Hvsc8Kcd6Q +aeYgHVAN1vCieRfDAUDOfQE/X2/78IdHBPU65AQRdLhK0ciKy9Gduk5LH+WONtAiydbXgw4I +AuF8aNAGVox09PSNu2Ns/u43N4W6lSTKDK3VHhw1HQVBAJwWzj324UIKCq1BMJd3TVjlv1zJ +0gBRtnB75HCC1NHEAHKhSo1KkhdmmJj7EdWQfp9cn243E2GqFOMBMjRRL6oRVMqSOrkHAJGR +t34WGDRBVMS51nKIrNQBoZo0lQFkIBLYzt/qBwoAytGuA4OS4u+ozVRUNPGV6HaNcg9+kZxj +7jOPXjAwSm3V3EQsO2+NVq7Mxc9TZOfUE5yfy4wckinVdKamn7c/RH0+Hv6DvwlwTzQCCXap +gpRiCCR2RxJjIwQcfTHpwmSiqLZkHcorUdwi03p++3ytEQgoqaeqbJyPInUF/eo4zD089QUx +vIHmna1YsbmBiLqsfw6VVXVcu46iokllqa25S1UuDu7uKyIs2RuA8kX/AMfbiAq42nS6U1Q7 +Tq3MHe5jSPkSvW/4fufQ/B6riWtJzVHOMc6lWlJ4gFzfIcFYap0/QJcZ0bqMUUaopc9kVekE +j3PTn8+JhgyMv7K8l1GDUDuQ3X0dsgppwkUWcZyqjf6f6+3DtEk6qMxbQAN0JAa6r4p2cSTA +BF6S3QM/QZ9e+2ew+nB9CzoCjMS4QUgK6pEczvEVijKNlR2Zcn8QP7P1Pcj6cSYaSLqGeW7k +uavFzmkuMQJpIT0JE2T0EnAb6g42PfbHDzTAQDjndI0XKkpxVSYRCyDsxIBwNyT9zj9/DdR0 +BIbTm6KY6IyxvIGCwrhCxOFGfxEfl/PhoO0bvRbpIXXJQfOKIY4zFHK4brIwYoxgL998nH+v +CGVIvwWACBKOKSx07UVTQ0sMiU4pHqZGVcs0cfSzSE+i4APoPtwya7pB4FEmiyOaiZRPBFHN +VwRxyoxLxuNoV9iQcjG2R6kH7cOtOc23rQcMsRdR1bbqaaqllkp2aVgCwdiCNs9x9+x7Y4QK +pAhILIJPFfq0EnpyNsd+23FxlVAcyul2GTvj6578JLRELQ1ssCbfscbenCHNiyUOKw3Zukgl +v3+nCSVsFBd+YNE4x0gjfb04aqwltN5VNuZoAMuANid/p34ruOtdGskGFXp+lmZepjgYA+n1 +/jxHsCUCQSuNJTS1lQtPCpaU75xsv1/lwS12VKgj4NVe/wCD+eyaH5/cnVq5B+kKy5tQEjBw +09PLEoPsOqQDb34P2bWPXtLtL+oQ+LY0UpBkyPmPuln8eN9kg5mX9HDJNGI6eRcjqUrnB79j +3PrsO3EN0toZsQT3LrvQl8Ydsm3v2FrNqNWFlqIp5RGg/WNtnI9P8uK3SwrSMu5X91YF4yXK +i6vV0MdPTqHjVlHm9m9/z4OZREQEM/MXX0KHLnqMkiNagAIM5BOFJ9fT6cEig3UqNdPwjRBt +yv8A1EPJVOXyATuA3f2xjPGyzLZDPqCLILuWpoxIzwzyGTfcbD7Z/nw5fKmZtB0QzV6ojUeI +1UHOMg+nft/nwlwgXTTRwQrc9QAwliyhSckrtge2/Cgtvt8KXFw1EAfEepKMPMB1Ek/z778a +cBKU92UQgC5awhhQyCUiUqenqyen0B24WBvTQJaZ3JVXjXIxMzsQowASM4PuOFFkFMGvZKu8 +69SWIYcljuANjv6++O54wN5IR2IgEygKt1XNNK/QzkEZBxjp98Y4UAEGcRaDqoV7tK5CIWbO +GGTnA9uMyjUJkvOg7ll089ZNugPbDZ7AfQ/134URvTLnGYCzDSzSDztkDOPQA8Ka210sG4BQ +7LSsk9GDHiOKd2JA2VSCP888I7k49pm6M9I0YenQxpH17soz2JAJ2+zH9x4byhO0xeJTttVr +jZOs4i6QQTg7kHYff6cIebIlggHLcotW2uYR4gjyWBA3yQSB37Z7/wAeEu0sn87ZzO1Vefil +rmsnKDUtMrCmeuq6egXB36WcO23/ALYm/LiV2I0fqA7gCffmozbVQNwrr8B75JR/C3WBtCaY +qQ0aRw3x7ZN1jdRJKZAR9fMo39+OQ9J3ub0q6sf/ACMDh3gR/le4fwoxjT+DNaq5uZtKs+k8 +f2vqNfI5jNI5iN6tPVtDJLUyriBZU7Hc56jsAfpt+XHQMPWbVpB4sDu4d/MLyDtfBVMLiX4d +5DspsRoRuI5EGQlNqOsg6plgHWg8pP4s+XBAPsN+238OD6TdygKzjPaCrJq68Qy1ApoWIp1B +d3x+PH7X9fTiTw7AO9QuLN+SRV/uDzuaWHJZz+sAO59l/wC3+vB+66g6pMwFCR0zvIKWF8Y/ +VsR26ifOfsMdI+x40YhMtDjYeiOoaGOgtbSzxmMEYTPooByxH8fz4jKlYufA1Uj1BYwOhEUl +HDDbaCmqoi00xWaZFb8HUfJGcftHBYj26ffhLawLswTj6RADdV9t1OlXcqmreQQ0sMfQvoDn +Y7b5wCd/8HCXiGho1KxjP5+Ca+g62j/RXM66SkpGdMS0lEikjxTNWUsaocDAXp8Ukf3U277o +e0NInX2VlO/aA93SuqMTGtpZZ3mqWYSVMuNwCdlHptlm+5HtwaXwQAtGmcrlL0dmgVGq7r48 +FVP5+juVHoD9cEDhym0OHZSa7Tmuv1IGmz3J2P7jxawR3Km33rHecMfbf2/hwhxnRbBAAC6Z +Mle+B68IylYFiEYUnsPThZAiFt4QLf5QE36cAEZ9+BqgvZbbZU95l5Im6XJIJPf9/wDX14r+ +0BZSDItG9V8PfpXBbb17/wBZ4jGMnVLIgyi2gEdjt/zLAGrk/CD3Jxw9la511hMXGqP+T1t1 +NqTmlpae2tOktDVxV81SB5aMIepWJ9+oDA9eE4/aVLB0jXqGI0nio/FGIYb5rfcpi/2h1tot +a08POHRFUt0sdXI1JePlwGFuuUefFjlAPlO4Zc7FGB9ONs2thtsYJu0cHcXDhNw4ag/McQZV +46EbaaJpE3B81ovvGoXouqPxejEgzuN+24P24hxTjsrqTK4c4PlAVbq8NidqkKmMEMdwf8uH +gABJRxrib6KHrddRxpIXqSBkAk+o9tuFkSot9a2XegS68wkRgkVT1gjOx2222HCtUG6qMsQh +Or141VImahWb2U4AbO3fbjTXEhNPqXhRNRrQsgd5Yk6jkr1bk/1j93Co4JoPdIzFBV11yq9c +UdQelcE+b+A9uEsG5bzm5clXe9fRoJJPmE3B6SO4G+cfx4ca1BVsY2MrQlPeuZbfrI6coT+y +RnBP3PDgYh/1hvKW9VqO5V7ByHAOcZP17/bh3q7SgRjCeyDC4Q0NwqmbqyTkf1njWWyW0uJk +iylaaxys3VJ1rvjOQD34b3LRA1CI6SzYcM0TsgAJPufb+P8ADjbbG63FgUQ0lvWNunw1VSeo +4XIHtxohuiSGm5KzZYI4l6VUPkdIUYOP9OMOtltrJEhQlfbVaQRxozN4ZYg+u3885x9OGi6A +nmNBERdZWmWWjrhTSusMNQpkpXbyguN2Qn0OCx+324SX2lPgAA8E9bOEdljkiVIyATg//sAD +69v38bLRKepSBbSUawoGgkRXWMFMggDMePv29OGnxMncll7ALql3xrTgaN0zSh1EMtXLUgEY +LuirGv8A/wBBP5HiW2P/AMwx3fMz6QoLpG8fpg3mgL4dLalPyWrblOVaF749SmDgxyQPE6/Y +/qyftnjg/T7aLqfS2gaf8rWjwdM+YK+jP5c+i9PF/g5tCjWuMRUrEcn08uU8iHNB7lYa73WK +VHeKRQCgbI7BTuFz7kbk+x/d1rC0ch5H5/v814R2njA+m1jrPbI8OH/SZA5JI6tu8VLRVMIY +GY4yoJHUTjC/TsSfpxK0WS4Aqr4l8BVa1DXNFJcqiRw1RI4RBnbAyxP7+niXpthQWIqQSSl0 +gczfiHzB3DH0Puft3/dw87WQoxjHHep6yRLFKrjDLGOkbZ6if5nGP5+vAtd3ZKLpMAMBGUU0 +Fxux8f8AWUVMGBTv47KrOwGfQlR+Q+o4jwIpkxc/dFh2aoGk2C6WqKipuIaedxVBjM7BvxSv +5ev6YHYf4eFwGtssLS511JhI6ahaKnRHmkkMKITjqbtufRQM5J9zxlIy6TonXgNEFOCw05S0 +zWSi8Sd6qWnouwxU9Mbtkjb/AJgix7AE+nAtaoZn2Pd07hmAiIQobVS/pm/13UJaJJCoC4Cz +M0iksD23OEHsMfXh4vgZRr7haFhn4KEvFbPcLg8VAaiRIkBkeEhQ8jEsx6j3HoMdgPrxI0mQ +0BCGoMxJX6hE3WGO5A7g8Wh7bqmHVYpn6W9AffhsOAMLLaBZPjK4OD1beozwvOsJusCpmIjk +PUScdvXhC2BedyXF9kkdcBjn137cMPvcJxolVn1zZLlcPFMMHRHj8chwPvv34hcUySU+2YSx +s+jIqqvhjqatcKS79IwAPuc8BsoRaU64nMGyuEtpqNUawoNO6fSSscOEUKuVUDu7eyjvngev +iadCiarjACRUqhku3fNNrVus6HlfSQ8ttAzxPqKXplvFzQAdA2yM+/oBnYceMPxR/E1+OxPU +YcxSab8yNyrONxuesWA33n/8RwVQZOfV40fre6aYorVbdV6JvIWn1LaKt/1FwiIwJQw/4cyZ +JSQbjcHIOOGvw16Z4vYuJdiWGadWA5h+Fw3Hk4TZ27S4siHVXsqtq0LEa++XvelVr/4Htc8z +tN1fMn4c6e7ax0nhne2XELTXCmIz1KpJEdQox+JSvp5ePYWAxuHx2Dbj6EsYdzrEeO/vXV9g +9MG1mBtVpB3mLLWJzN5PfEdy7qZE1byX5o2NUXqDz2SoCFe+esKVPbuDjhklw13q809rUXjs +uCqbqDWepoWkpJ7dcKWYbMrRssi7eoOCO/DkFsB1gmTVD5IQXBqO6OY+o1ER3zv0j7Z9uF03 +wdEBiHak3Cy6jV00IRndQqjOSOx7cKZUBEpAfAg70MVurZn8RuiRUzgMx2O/8PtwsDeFqvVL +WgaoMrtSVEoOCUBGBvn+hw83RBOxDjohComq65wWlIX1xg5/rPD9NkmZQJqOG5d1NaacODJh +s5z9eHC0ApskubACLKC2UGVUxJ1gEbjA757cKc2dE1c2RIlqpyymFVVtiMjOB9eGnlpKNYLR +Kkv0YQFykZOMAtwyAiJG5ZhpkQgh3J6e3YAf0eNEhZacrdFweIH9XlXYAdtz6cLF4ICQ0wZh +fVp41Jd5Yy+MkYGTwngliZkCy4JAjtIArINir43B9Dw24XS6bS4krqa3eN1KjLBOZPGDLjyy +Dsw9vXP5+5yyf7U7RMgk8EwLJXyvFGhEPjxqOoKPKxHpjG23p+48ba65lOtaRY6BMugqo5Ik +yVaJfMQVHSTjtvv6jjHNJkJtslpduVBPjnqoS/Lu3wvFsKipwDvhmIO33UcTWyTBceP7KtdK +nDKwTx/ZQnw7x1N15H69slK3VWLWT1FIM9OJAgJXPsy9Q/Ie3Hn78U3sodJsLiH/AAkNDu4n +6fKV9Mvyj4SttH8Ktr7OomajX1XMvvDGuj/quLIu5X69tOpOVFlvSSxVF/ggW2mlDeamljUB +p5R7EFfDHqxLHaPD9xxOF6t+Td9F83aOPOImqdSST4pXasuKkzTMXlWI5dzghn7bE98HqAP0 +PBWHZvCHrOiQVXW71DzP4knmkcnON+/YD+XElEKDqOJNtyjJm+VQoAXrJW6TjuATvj+XGOCb +LSL7yiSgQ0dLIys6FN0PvIfw/n3b6ADgc9q8ItrIEqasapFDV1MrdISlnZQe3WwCKN/XLd++ +2eBaokQOSdoNbqVmUsQWYRdTSM0nzDtgAhQQAv8AX04HdIuE+wXAOizzTmsejjp43cMCGIbA +6i2CA230H/7HjGvy6rZZnOVNZLhSWqvoraB0MspdnVs+G2AoVfqwXJ9hgevDQJLpN0U9zWiN +Eu7xd5qytkigcRU46Y2HYDpA69voQp+/BzKAZ2jqVH1ahcYbpddEVyqYwRbKeaok7yt4fWTu +cZJ7eox7AcLNSBeybotcfhX6kEyFlY7ep7cXGFTCSVEVNOQxOx9T6Dgd7DqlBwXBUZVwcYJ7 +e3ChosJ3qOqielk3YHjCZ1WTeVCyUtPHC9ZXHKY8oPb78DVWylhVb5pairJPmI6P9RCDgYG/ +9fTiFxkkGSiQLydEq7PSV1LRC30VPLXakrW8KKNclyT2H2Ge/Ec4hozPKXIYwuNkd3+62b4d +NNtbKOoorpzWukP66YZZaQew/wAIz+Z/h5X/ABa/EqpiHO2bs89kakHS8R3nhuVX2ltAtIZ/ +N8hPzKpdfNSGio7lM88lTd6ks88x/E7HuSSf5ceeaeBL3tafhChwA0WF96h/hy5OXvntzFjp +4qE1GkoajoulcSVErDtEh/a+v249Cfh9+HztoVhWqj+C3XnyH15KxbMBd8Wg1XoybS1s0lpG +1aQtFsShp5PApIVjXpDKMFgB9gR+fHovpRUYMO3BU7BxDbcN6ueyMKCXO3NHqdSqzfGjzUa0 +0v8AslQy1NJUw0glqSuwijIwM/fHbjmXT3bBNb9MyRlueQPsBdK6IYEums/f+/2WmD4v+YvK +D/0q03Yanl7orVmrqSkLz1dRQRtVGpl/DGZgOrGSDjO2BwRgts1qNBlMPgNHaJvr3q47I6L1 +toY7qWMzFx3cSfn9iV5kueXNGwaU1dT6esenqG4zwqTcpo6h0jjYjYIdxt6j146B0SrO2lTN +eIZoDvdGp7kj8YNmYfo3im7PpXrgS8TIE6Ac0sJeZdquLolDa7/JXVVRHSWm3xBZ6u6zNt0J +GMY3OxPFmxeAo4ak/E1agbTaJJdoBx7lx2n0ovLmGTYRqSdIVlObXw96x5R27R02s7/pqj1B +d6UVb2eORnq7UmM/7zgdIznAwTk8cm6A/ifhOkVWsMDSf1dMxncAGuP9u/zU5Xqmk0B4hxFx +Mkd+4crmVU+53+no55IJZ0cqRlgCR3wM/v7cdVZRcdFHVcYxuqgavXdptlb8nWXGKGcjIXB/ +d2/Ph8YV+XimjtGmNTBU3bNdWGrkMUNzoZZlBbHijI3+vCX03xcJyljKRMNcEw7feBJEGiCE +sME9weEFxBlPgzvR/aatplVnAllODjBGf8h2HCjUk3W3DKIbqi8RSzoziIOcEdONs47DHDbn +DQBOsdMFc0s1b5ZCvUSB0g9wf69+By0alP5zFlmixTKFHTK2cguFzn7A8OBvBaZVAMnVZIsR +CGRolORjJXOO2/09eMJEkDVY0FfzWlkdBHCz5UkBvb7/AF+vCXxEpRpmJXBrHUM/XJHGh9Ao +7e+eEgDclMqwbBSFFTzqY+sDO7AgZIx9R9MbcJIT7HtzHn6FTgqEpYHjyC/UShxuw7fw3/fw +402TD3ltjvVAfi9uKXHUun6Xpd5YbWJUPoqeJN1Efchd/pxJ7PB17/oqn0gu5vcsP4VrtNTW +7W1tM4QOfEiDDaPsMj82B+gJPHD/AMb8EHVsNWjiPK6+iv5ANvVaWB2rgWm3ZcO9wLT8gk/o +O6mycz9VaapG8C11880apn/hSqSy7e4y649/tx2fAONXAUqrrnKDPG2v1XhTplSp4bpDjMPR +EN6x1uEnTwKNdYV0KUk9PEGUO+EGclVQ4Yk+/b954Jw7TN1C4uqIgJNzyxqvzMg6nyQn88ge +23fg2FEwCLLCtUT1dUlRUDyr1OfUgZ2z9T/lwlwtAWqbCXSCp+qYTyUtDGsbKcMwHqzfs7/T +GT7E8M5BrvTxMiApFCDNJTDqNIvho7b4YL5j+efT6DhL2wCBqlWmCpCGeSKWWdQVlb8PrkqN +sfbYfcg8NDDyIKce+DKkqORVihpzIVkRFMfSclW/aKj02yB+fDLqUkhqcpPiJN1yuV5lud8D +Es1PCAmVb/mBTvn13ByfXJPtw7Sp5BO9MYioHEGFivPFOK6Nn+Vj6/PJsBgvllX+G/0+nGmi +XAEpRqB3ioak1CagSx0UIlpYm6A3WEQn16Sd2PbJ4cdgpuTCGZj8vZaJ9+q/VXcDuMDb1PFw +hVQjMbarCnCsM5A+3GQtRN1gTMArKMDb+jwggBKNhbRQ8/mbp6tiff0/LhrKNVoA6FC+op2e +PwwfKNz9TwO/mnAq2akoopamWsqfJSwZcluxb0H+fERiQJMosDQnvXdDqm2ciNGXTmVqWijf +WNxiMdkpZGGY0xtkdwT+I+w489/ih+IJwjf0eGvVfN+AUDtfa7qTS5g7R+Hum5jkNOa1n33X +tw1JervqG+3IVNyqpTLKzEkKdvKMdgOw348wPwJjNNzqeJ5qlte5xJJ1UZpy2ah5saotnL/R +kXVVVEqpXVi46aKA/if74ycZ9uOgdCug1bamMbTaIb/MeA4qZwWFNQzvXon+F/kXaOX2mrFZ +bNTQxW+lhH69gOqbHd2Puf8APPHtLC4Klg8O3D4cQ1gA8ld8LQLQ1jb/AFjerQXKnge/QXi4 +PHDaLRRyTpns0pyM/YD9+eKjiqhfihiH/DTBI7z9grRhmFtMUmb159/jS5kai1q+o7na5HiN +0rhBSIq5leKJsAn2BPb2344RtPafX1nY2sctMnfqQ3ee83A4LvvQvo5XrvpYHCML6rzAA4m3 +hx4DUrQzz/1jqWb9I2iz9VYaHqe63UsGhoJCN0LHZpiM4H7I78dG6E9BMRtymMZjQaeGmcuj +n9/Jde6a9OtnfhqHbN2a9uJ2w4dt3xU8PO7+6odw3WJj4Tpk1Bb7rzV5g0OjeW+nb1q6911Y +tPT0lHEZJ7nUM2yqPUk5OTsACTsM8dv2ljsDsrBurvilh6TZLjZrWj33nvXhDaW1MRtDEPxe +MqF9R5kk3LnE+pJ3fRbfbB8Lml/7M/QtBzJ5tU1l5j/GtqCnH6Js7N41Foqncbnq9XAIzJ3Y ++VduPEWM6UbT/E7aD8Jgc1DYtE9pxs6q7gR6hujZl14UrgMEMKOufBr7huYOM8Y3+Atc0v5s +Nq24U1w1xzEu10nulaVnlqKn/iVkzZ6VRDukeM49ABkZ49UdHNgYXZ2HZgsGwMpssAPnzJ3k +qQrdlpdJM3njPy+gVGHq57rVVVdTxiOjj6mwfw4z3JPv2z7A8XOk0MFyohxc5wDdNfBJzUte +3zE1ZM5qK1wcNj8P1A4fuh6xAuUu1kmJLMzPGxAJ3BxwTaIUfBmZsiXTWv8AU+lagy2u6TSU +uSTTz5dX9hvxj6LKg7QutU8RUpXY6AVsF5Gc2LJzCxbpDBbb9GB4lOz7sPVkJ79zt34g8Zh3 +UzO5WXZu0G1tbPHuf2V3rNpFqiKBhLGqHGc7/XOO2N+A+sJEFS7WFslFI0lDACJI5oV7M7Lg +H8ye/wBOwHCC7eUbTIIAnmpil09CVXphWdBgKc7Y9csf58Kngt1cOXGV0nT9K4dWiKqfNgAg +D2zn0+nGjAEpBw7gM0WX1tLIsTEhHRQCpUd9/QcJBJErACOShqi2JGJBLGscBx0gDO+++3CS +Cn2U4ghQNZSU6rhiiRknJ9SMe2foOMa4HRJdvI13KDmtjyoBIhiXHUpxgt/2wP5cOb0w+C6A +Z71Qr4k7bBPr2KJj1Vn6Hp+jOf8Ah9dR1f8AyKcFUarmkR8N/OR9JVf2vTLnADSD80A/DF41 +Tfq23RyIhnhqogT6MY0YH2Iyp/jxzD8ayG4SlWI+Fw8l7W/IPUfU2xjcGP56UeINkn6iR7bz +eknVGSf59mYe0hBDfxz+7jpPRp5fsylvGUeW70Xlr8XcP1PSzGtNj1hnv/m9Vn6mupmqlEbt +IkY8GMZH4R3+2Tn78TNKnAVCqvE20QtUs6pPIpCgeUMPxd91z6Ht99vrw5KaOlkRUFGaGhWO +UqssrCWUk7AkbL/0qMn78aLd60ww2Dqsq0LEZKivmVVcB/DGMnOD/HsP+o+3Gy3cspvk2WSp +WCHrMgYliSx922A+/ck8J6u0JZ5LvpzmnaV+hZnxFEEGSFHbA/xHB/LjI3LJCjTVyRyqyOOt +iB9Il2GBj14TkhaFY6NWE90Whppy0gNRKx/CRlBnc59PQflxhpzBSH1RouVmiqb9WUizxSGx +mUwmCIkSyYUnbGTg7nPbbHpvvqw0HihDWJN9Ea1eiKigipY6C9WLxCoaSEyqDAGUOoOTjJD5 +2Jwcg4O3GU6rR8TUzVZUcZp3X6mcq+RicHbc/Ti0FQdN5JICip2K7YHfb1/dw2TeE68QoqaY +hWBJPvvwy5yTKj2Yt+EEY+nGJzRDN3jMhfsGOw3/AK+/AxMCFuUKV1psGnLBVa91xNTUGkLe +zTqJcYrJlOQCD3UH09Txyz8Sel1LZmEJ/ndYDnuHig9o4xtNkPNpvzPD6laQ/iP+J67c39eV +lVTOtNaoz4VFCH8tOnvjt1H1/wC3HkwYCpiKjsXijNR2v2CpNeuXuNWpEu9OXvVKOwW/V+rq ++gsenqCouN4rGEUdOvuTguxPZBnJOPbiUwGxn4qq2hh2y47lrDhznDIJJ9++C3b/AAm8hLXy +tgo9OJm8aoqEE11ruxOTllX1A9APbj130W6N0dlYUUGQXn4jxP2CvuCwIotDAbnU/QLdLpey +UWmrLBNWK0QePqVM749OCsc8O7BsFP4ZoDcx36dwSK5+ahuFt0bdGikhp6+6OYYo17ohGAMA ++2Txy/pXj3NpFodd8+Ai3oCV0Dorsw4jENY1suJAAG8nQe/FeYr46+ets5b2ym03peuq7hry +5uLTSSQjq+TB/wCLKD6YGfud/Tik/ht0XZ0h2ocU+ThaPZHBxF/E8dwHMle5elW3aP4W9FTT +pQdt44RIuaTDMu/tA/l3vdfQW1Dc9eZGiKnQtmsepLs+hOTdvikjNJRyq131JVIAXmmY/hjZ ++rDHc/Tj2NjdrYOkGUCYYLBrdTpw0HvcvnFQ2DjcXnxDwcpklxNySZJPeb8SVar4GK/QXwj8 +poviouPKu2VvPjmDTtR8ldCSsGq6W0ElP05dZG/4CTuMrnzNGowPMceSvxUo4rpxtT/7cwXY +wFAg1n7i8Wj+4t/lG90n4RKicI1zKgrU25nOByDlMGo6Ys49lg/ngxaSmFpfkzqHnLdU5pcy +5a3mPrUXKpqa6qqkIW8V0ZHUtNG2/wAqjusce2Cig482eOwdG+jGD2Vg6eA2ewNpU9BxO8ni +Sbk71Z8PQaylNSXEm5/qI18NwMaCwutefxGclNb82Na6goLWK2LRNlnVb7dFHUKy4yHM6UpH +/E6F6Il6dgFPYAniYpvFIHNqiatM1nljdLAnnvjuFgtfvOyOx6Io6fS1mpaaOogYt8oh6/C2 +AXxpOzyAb4GynbgigS45nJFWmxoLR74Sd5VGbpMVneWdmqayUEnfPTvjiSa0lQlV4BmbqFKy +9bySZDKxA29vThx9gAE22mXEldU6p4isR5N2UA9zw5TeRYociTJUlZLrc9P18N9tFRJR3Snc +SJImxUj34Q8SIKVTdldmaYK3gfDRzjoOZ2lqWtcxQ3eACKtgJ2SXp9B6g9x/24rWKodU8jcr +xs/FDEUs4F5g8v8AP7K4jU0Mqh2LTMANiM7ffPA+YASpmi8kZG2PFfFozGsZcK0YIx1Duw32 +Hr/LhQdmMLdepI71GVSeGCah+ttjuRlf4eu3CzpdaYN0QoWpqxG83QoSNjnpLfhx6Fj6/Qca +HCVjyy0m6E6+uheeSOPMjFf7uNz6Dbhp17AplgAiDqo0UcFIHnr5h4Sr1CNSTuSDk/ltwsRo +kvcSA4i6Ga+4rVSs8YJQjCLtsuT/AD24c01SS0gCpzKpRzxtk9bzHt1UjOlN+ho4mZm2DGaf +H19P4caq4hjGhrtST9PuojHszmRqkl8MMgpOZ60UhIQSSlsDtsyn/I8c6/G9hdsbMOP2K9if +/T6q5emz6JPxMPz/AHS45u2yaw87NYUMmBPFdFdWUHDKydQOPqMHHFx/DjGjEbBw1Vuhb8jC +4p+abYztn/iFtPDOtFSfBzWmfFCEkuXkqpBmJCcBj6/1vxddFw14Edy77ZAMvVTsREFwULbN +k5yfv/XfjbWSmA6brLqq5pZOkyYfJDevp5u3vsOFi45Jg9mOKy2rooh4cOFiVMEZ7k7kn+H7 +uG5hPQ0ab1iSVkckeXKCNC3SB+02PQfmf3D340dU5nF1hz3hYw0ruQ2MABwM49M/zP7uFCdy +Q6uAo6K6VNXWQ/LszszDHShwoz/Lft68JeRElMNJ0bopK12GorpVMtJUyBAcEocJg5yc7DBw +T9+Nl3NaNEagpr22kp6J6OeOOKllVZYnSLMj+KFY56mwAfbHYb434bqXF9ElkaC5Q9QXV5ad +DDRVwQDpDRRdSN9u2OCH0iDa6Dp1hG9fqlM4C9wD9PXixEqKzXyjVQdW+WIAAHvnhtxSyCdV +DVCBiMbj+XDZdaE4Ba66AOlTnq9scIWQN6/qO2UtdU1FTc6uGgtFLGZqmZ2wAo9Afc4PEJ0g +2xSwGGdiaxhoTFeq1gMmLStIXx2fFt/t7XzaS0dUT27Q1FJ4FLDGcJVyqcde/dfb378eK9r7 +YrbWxpxlacv8rToBx7zryVFfiTiavW6NEwOII1PM+gVA9GWf5gePVRS1ErsA0SksXc9gv14G +q1S45GC6i61QZ+pW5P4QPhxr9ISPzP1TGhvM8HhUFOFz8vEd9wf2vTj0P+HHQ12Bp/q8QP4r +h5BdA2Hsk4ZgqVbu+63a/DVyV/R8NXrDUEBilnzLiT275PHUHEtBc5TmHbnMDRPe8K1zNxrp +llaiplKpGP2yOwH9evFSxeKLab6jt27nuU7QYHvEaCy1W/GrzXl01YK2gingFb4ZVm68S+bA +EcHqWJIGRxz3a+xG/wCk1ds7SEUafG2Y65Qd8xfkF7L/AC5fh1ido7SGKaclJurvsdxOk66r +zwc3LBQ0jVGqr5aBPqmlpZloIpZBJBTzPu8zg9+gYUf4sn044Ls/8zuEwmzRg9mtnEPkW+Fk +k+ZgaDiF6O6Wfl+btzpGcdj3f8PSNhvcQB6CIF7md0LzcfEfehf9TVFLWTVlZRGUQpEhJerb +OOkYBwucjA3JPHpn8MNm4gYZuNxxJquvfcPv8l4q/H3pDgv1rtmbMAFCmYJFszhqe4acSZ5L +bd8BXJnU2s9c8l7bzJu9zrtbXKhp66WiqJDNHpHTscqwxCZiTh/CDdMWdi+O546VhcNh8N2K +bQ0E5jAAuTcnmd5XnfC04IawQTfuAtJ32aLcJi1gvSVoXkjff9mtR6i07S2uz6llU26gqq8g +0+n7bH1JNW1KkYD5aRvDG5YRg59G3k0mONs5nw4+Skn1DVdE907uP3jjHJaUPi05haW0noqu +0joG712n9E2mpajgqehBXasuRUtJLNtiNdh0oPwhgzdgDCMxHWw9+4W47rn3bepqjSyNysNt +OHvT2F5peampa3UF2uDwoviSuzSSAE5bPZSe4+vqcnifwbZaCVDYqpuGqTgtcUM9LHOi1dSB +1zA46Ux5jk+p24OLjoNFFtpb96jKmMyL1sgeRiSQn13/AHcIkJcRoFgSUzMhBwJB2A7KPbhb +XmUwacGDqVIpSiKjpnkTCyEHHbIzuT78JMlbdTAbJ3o/5R8z7xyr1ZFeKJnNE8gSqiQ7SJnu +B7jjMThhVblKcwWNNCpn1G8cVvC5d81aDVNpobhRVccscsQYKXyVz6Eeh4rlWiQcp1CvmHrt +qAFl5FkzZb7CiK0Eyse53OB+7+t+NCReU8+vIMoVq9TQSSLiWadwSQqjYZ/hnbhVyEhoLrb0 +OVNdd7jK5pYzSx7ZcrhY8+gx3OOMa0b0247iV2JUQ0yO/wA3G0hPSoU+ZjjO/tn9/bjRAWmN +kcIQxdLoXgnXqUv26VbYk/sk9yBj+A43lAKXT4FCcs8fTvMgPVnA26j7f58LLFtz3EZTYITv +Wj31Xo/n3eoKVKqtsWgobxSE/iWohvEDDJPbqikqUx3PWOOedMdqOw+1NlUmm1au5hH9povn +1DT4IvY+xam0KjsJQE1HBxaObWl30VKfhltk9TznittDBNVVTTFIYQPM/UdhjsO/cnAGScAZ +41+M7nO2LA3n6L0t+QKoyl03655gNpkk8JcNftqTbWy7vjC0/JZueltlhkinSttdFUrNGfJP +IheB+hv2lXwwA3r37HjX4CY9tbYBpA3p1HtPjDh81n/1Ddi1cL+JL8U9mVtejSeBvtmYZ/u7 +Nxu0myrzPT+JKiN1ClhTxHIB/WN3x7AnOf6HHYsy8V5CVhVNaz05hCpGCeo4PfH/AJz+XCjq +mzYEKLapEZRldZQQO3vvnf8ArvwoncUgNkzK7Ia+Qgt3Bbc5JycdvtxoBIibFTlstlReC8xj +SjokGGZQcnbOFB3x37e/CCbwkVnye5d/6NqLxWw2uz0wVQ/SzBd2PYEnfHcDHGpygucmXVHV +HQFZLRfKCJY0lqWqHnClVkVyUY9YXHSFJYMxC7bHrG4weIqviXOFvL3w17gbIum8SJ0Hv9lM +3vTVvsVRUxijiq5ZUV5zEFZVk36XG5QkgqD/APkJz5eJHC0XZQXGNYHL3MdyExGIbn7IUdZt +MzSiokudqvf6EqGSrkipaB/m2iiAMsq9WAqrEvUXbbKnGRkh8YWtUGWiJIm5Nhf5zw0382v1 +DaZGYxPmVYSTlRrTlfrDWuik8Otno6iISMKQthXTxIwVZT0t4bxkgZGTsWGDwhuz8PicPTq1 +pYbj4tSLE66Tpv4oKpth1Go5jXA6HTcdNV+i5L09HcMMdwOLVCCJKG6xwC5DFiPY8MvJ0ThN +sqiWkLHpwzepxjhFis5rIiglqXjghVpJmIVVxvn0404gAuNgEkuA36LXP/aH/ExBobT1NyF0 +ZdUS7Vw8S8zoeh4I/VdjnLYIGfTPvx5L/E/pcdq4o4HDn+DT+Lm4aDw3+CpG3cUa7zhx8IuT +xO4d3HyWg/UN2e93qlijWXwEwAhByT7j9/FJoYUsYYElKoUwKcNErb/8EXw6QVq0nMDV1G8r +xgfo6ndThc92I9+2/HXvw96Ghjv1+JEn+UfU+CsWxNh02E4mprqFvc5Ncmai+1lPWXyEW7Tt +MwdYmHT42Owx6KP9OO3ZMojcpZ5dUeWizRv9681eK+10dBSUVitaKiNhT07dKj/xxB7UxZJF +NqmsDhpGY2CAeZOoqDR2irlWSBo444WPkGWeQ9hj1ye/FQ2ztjC4dubEkimNSBJ46eCtewcA +2rWa12khecznLLW3jU1019qqvq6qQM4oY5W60D53ZFOyqoYD744+df5oPzK7Q2+aewsFTFDB +szANBkuvdxO4xYRpe8r64/gXger2ZTpsYGMG4a8iTxi/itRnxfanuFv0pd7Zb0qUutZThpXj +I/3eAnsfXJ3O3p3xkcC/lZ/DIbSxv+o4kTRoEGD/ADP1A8Bc+HNRf5hfxROydnOweEcRXrCG +kbho495uB58Fog5cWe+83efNh5b6HsEly1Dd7rHRG4xt1S2y0xeetqI2ciOACNZC1QxHSNsj +O/1Y2ZRc2lA1j3yXyf2xU6/Ew4wSYnUwPiI5xJzbuI1Xq7/s0uQFsvOmxq633Wa+8yeYl1qk +WtoEIgtlnicrDT0jyDKwU8MLlqkjLuyhAMhuBajwagY25dc/t3Cb77AJlmIil1zrZ5iNzZMD +uAGvLS4K2P8Axm82rXyg0NFyQ5d2yta4NG1HL4MYDPL1H1JPV0ZLEnJLMD3xiOx+Nbei0b/8 +fVGbNwRLg825bpv77zPBePv45OZEdDcafRNNcrdVXSkRlkNPiWmtELsSYoEBPj1crFmeUnA2 +UdWCeF7JbnOYiw92+qM2pWDBlaOfsbzrdaoLrbDCZKu7sKEsSyLM+WJ95D7+uBnc8T7cUDZo +lV40iPisg6tqqFxUtRwy1T9IiViCqMx9h3JwDwtrzq6yHLhJDBJChxQVUiOJI1hLE4UDHTxs +126JVKg8iXWXyKzeVjNGY4xkMT68bFYTG9IdSJ7l9r4/CSmXp6ohCAuRsO+3DjTqm6kDsnRQ +81K8YqD4cYbHWgx+Z/hw415mSh69IiSE8+RXNu46QuMdomqx+i5D5FbsuTvwzjMOHCQi9k49 +1N2Xd8lsz01rSn1BDSMa0MoUKQj4J37b8QlRsWNlaWVs6ZcVbQ4RYQqREDpPVnO/7Q7cNhlk +/nOqyKm9JH5YyqoB+JsEb/X33/lw6ZAgLDAklC9dV09UArKHlXzN1P5z9cDtwprINwmGuO9C +szRNJFGz1UwByFV28v0/f78bAJMlKJDTlCjq+qpIIpJYmjjl7dZGT9gT2A9+M/mWmuMQU+eR +lOmoeSnxjO1DIzwaLpgsygYQvdKUBSfTISQ/lxxT8SgB0n6PtLvixDxG+OoqaeJC6v8AgD2+ +mezzuNTL5tcPqtb3w00LnmndKxaemVZWpKaZioL+WEO8an0BKnPqcAZxkFH43YyNispg6gn5 +AHwlem/yF9GHU+mWLe8XpEU555jHy+qa3x26ICaT5R8wqaOR1oL9W2CokxnEcgSeHq989Mg/ +88UH8sHSIjaGN2W8xnp06oHNpLHfMFdX/wDqjdEi/wD03btMXaTTceT2hzf/ACYfOFrfuUxl +q2o1Z5EXCMerZidzsNsbDP2A49iMB1K+S1YjKGtQ3K79E3hIrq56VJGygYP+Q/jw6hnAEKOl +YL4cadTDOAMbn93GgU2XgC6YumdHVlyMMtTC8VMhyFII6zkZycdt8f8Anhuo8AEoeo+dEftR +/MintdvWMTOQnSx2jXG+F9u/pn8uGA4AknRMm5hu9NnRmmaewTxUUcIqJpR1yuoGSwGOjBP4 +usAHOyBwxyDw4zBurND3mB9PDlfnHJJfi20zlbqfmmobrHNG1sj+Zu1U8niRwwJI7FWPSsZU +kP0nBHm3CNIv4o9ywxuHaHaN46ePDjpvjigCXVSARLt3j78kCG7S3WstlrtsUV5vc0jxxwQ9 +MkNFIX6FLdB/WydTdXSD4KZALSZKCTw+y31P4j7U45gn7AcTcnhqhcXtAU2lou4enPmfRWS5 +Gcv+eGn9Q3296Qt9XQ6y+Q8C4TXKpijq6eCrLw/MLHUkSEK/WXkjU+H0o2OkLibxuH2Q/BMf +iwDRBMQCRYGfh5H3KrjcRjHVXdTIfedx1G93OIj5q7d+0xJzP5p8yKuXmtzMttvsLUOkoay2 +UNfOt0eigEbSiTqhPh9Ji6fE/Wkl3ZIhIqmoYzazcBhqTm0qDW1S946wg2LoEEzLoEvOkkAT +CMOz/wBRXf23nLA7LTqNZGgvMbzqdV7T3kYKCDk4+nbiyFS8wEN18ncngd5OqeBm6hldZDkg +EfU8NgwtEbihbnBzWsHITlTqPmZqGVUnSFo7dD1+aSYjAwPqduOV/ir0wds/CdRQM1alhynf +4KC2ttDq2ktu42A5/ZeULW/MXUfNvXt+1VeaqSorK2Zp53J2Qf3VPbA7flx5loYQUWhjrnWe +J3lV44Xq25dSZN/v3q/Xwd/B7eOaNfQ8ytT2ypg03Ef/AKbTyxkNUn0dgRgj29Mb8db6AdDT +XjFVxDZkDiePcrLsbBjqhWqGw0HEj6BekXkdyLpdNUlLLPTxNPGqlYVXaL6Ae/8ALj0DhMKy +m3TRSmKxJjNN4sFfOktdJaKGnpnUhiA7KBsv34jsdXABJRGFpFxAJ5rAqTT0nzt5q2wVUFc7 +Z9Ao9tyOKVjK2Saj9VbaFKYHBUd+KvXdVbbCllpaunqLzUyrDFADsHYYGfoM5P248mfmF6cn +ZuAyNd/EdMd+7y1+S7v+D3RP/UNotD2y1tz4ffRaU+c95gN4mtc9UKmy22EmaRfKhiTdj92Y +E/kOPmVhqOIx+0ppdtxLWMEak2bbmTJnjdfU/YrcPs/Z4LuxIkngALled74ueaVzv8WpNX/M +wqlsp5YlpYjtFXVDlYoyf2ikXSTj34+y34U9DqOxtnUcBS1AGY/1O1ee+T5WXzU/FfppU2pj +auJfo2Q0cAbNH/bCR3wNWDU3MTUep7RpyO0cvNE2/S2blWUwcvVyVM6RVFxrZjl5RHC9R4cO +RGjMoVc7nu2Lr5cK4AQIm3eL8/kvNmHwmbEDiRzvrJ5kCYGnATc+3X4SrZaOTvw7zcwqOxrZ +tVXynp7VYLcIfAexWeFSlPF0kY6xCPmnf9uWpTvgDiCdjRSomo34negn9p5kyiqlN1bEQ0dk +GB3aj7nvF7LTz8c/N260FRdxa6qMahuKrRxVUjZe0UTZyqsdzM/m7eZsE7A8VKpjC9xEwdT3 +blcMJhQ0SW2Gg991l5YObmvLauo7lHYBDdLq0hWetqMOA3bpjHbbfb8I37nfi9bNolzADZqr +W1cQ3rJZrxVf6CxXPUFS1XUJJUTdXmkcGQk+wPYcSlXEspiGqFZh3P0RDU2umtSJS9LI6kvI +QmTGcf3uwOOBxnq3REspG2qxI0o6iNVjTp2z4gXqb827A/QcY+mWRK0zENqyBqo2aghaXwna +Woj7rsFB+g+vBlKs0mYuhXtLdbhdU9ojkoldg7dDPEz4yQTuD+4/w4KYQRAQT/uhOS3zrUCC +QliyAxPjyybdvvtw66VulVkhhQ3VUEluqfE8Mwsp6sHIOP8AXhynU3IfEUoVpuU3MWanMNHP +UlpYz0kH9o9s/wAeBMVhpMqT2djcoyk6K51k10flvFmkkaPB6dh39e3Ee5pEhTprtIG5F9Pf +aWrjilqBGZA3XGnVnwzjsoHrnGSeGadzCdc8iVymrIKkhHjjjA85bsVb2yN/Th9xdoUljyTY +KIra6ojknbz1YA2AYIQD2+nbjBJWVCguaSQ9b1qVTL2WPp2+xI4TUYBEJmm5x1W0T+z80VT8 +wfhx/tEqY07ipTREcMCNHjw3Sjr61djuD1UcZH3348j/AI/7cdg+mvRMTY4hxPcXUqZ8xUKu +/wCFW1Bhel2y3tt/GYD/ANTms/8AyWrfkbpWl0/crXdolZv0hf4q5ixz0pLAqBfoAfE2+vEj ++MO0X13Pwh0ZTI8QZlfWz8tHQijsjbmIqUh2q9U1PMNgecq2vOTl+eZ/wt80LVTwtUVUDve6 +Dy7ipoZQ7KPbMZlX8+PP34bdJm7H6bYGs8w10U3f7awLQfB0FdQ/Oh0Xb0h6IY6hQEvFMVGD +fnpEujxgjxK0LXcwxyVSU461kbw42z3GB1HPtgd+Pp4245r8+dYttlQ9V1CwwpAjdJALHBzn +P/YcOCUPXqNDU2eXnLipvJW7XOmlhpkjMwUIcFASMk4IH29eG31o7IQZbmBzFNG8LT0afo60 +rFJt0iN+hW2ABYfgPpkgkn888AtOY5fNNObEZ12W6nawxCmE7LMcieaENI/UGx4UWScEnHbJ +6wgOFbPBlOk18PcOYB+Z5fSd4Q76hYSB77kdw26+UFKtPXWi9aTt7QHEtVAlOOkAASGaVwkc +ZUuqxhXk6QU8xVeklm0KbnfwSKhncSfIDWIEkkDfIEgtupFpOYEd8D1PHcLzuRjbNLxWXVdi +tGvtJ80NI6GmYNc5jA0Fxq4JOuNmhWVfDRneMxgSEs5LF2VWKpK4PBODXVaRZUrbmkgNBF4J +E3GpjS0CbmKxmIdLWOltO943b9/Hx3La78JPw9wcyXuFNywTQGuOWlP+olt9/wBPwvX0f6mI +TIk6oBWV0PiQxIz+FEgmVupvFcLCbf2tX2dOIfTIxJBIDZeCM0EHe1hMGAC9x7I0zJeCwjMV +/DY8dUSOREjXmdeQAuZsb92Pk3y8qOY/LTV+pLLrip1dpK0UdJpWO71EbU07rLKFnnCGbojB +mZWZh5SI1SPqKMePv6cYytgcRRw2IHU1i742OkAnKadNthBaDPxRcONoVhqbFotrU3FkvaP5 +SINpzOO64kGxO5Ut+GX4edc/EnatfVHNDW135Xw2K/1lJGlHQU081xuc88tRXy1LyABpFeWC +MEBcKirjCKT3HbHSvZeDNJmHY17DTZlJjLkjsBoIO67uMiVSdn7PxVcvfVeQQ4gwbyDeYPgP +FevWbIU7fuPbiYUqWmCNyHK9uokYAH1PDb413p1pGi50tLQ261XDVeoamC2aXoUaWonkYKHw +M4BO3pufTisdJOkeH2bh3V6zogIXF4ptJheTYan6d68yf9oH8Y9w+IjX0unrDViHl9bJWho4 +UfAqGBx4pGw9MAe2/rx5OrYqttDEnaGK+I2A4Du4qr4SnUrVDXqDQdkcBx7zv8tya39nR8EN +z+IW5UmuNUQCk5Z0FWjiNh57o6sCQSe0QO3+LjovQjoKdoVP1df/AJTTb+48O4b1IUMH17nZ +/gbv4m1gvW9pTlNaKC32ihsFmgoaGniSNOhAqgADG35Dj0fVwzWQRAjyspitiy45aQVk7Doe +32W2rUzKwqiM74yTxD47GtHcnMDgJOc3cVn1DU0aPFPEuwyFHdjn+s8ViviC6S5WfD0coAAu +VWTXeqmrNQNZaOQS262MJa2UHyPKRlUz75I2+nFJ23jAHO/t14cvMqy7PpEkDf8AX99y1K84 +9aXO5X/VuuLtOILLb1ansu2WncAmSbB29cDj5kfmZ2/Wc6lTee06S0eMA8pJzdwHFe/vyy9G +WPD3tEyQ2fCSVpD+J7mFX2/lrqitldkS61MdG/mK4j6uwI+uM/TPAn5ZOhoxW2Ri3iW4cZv+ +t1m+QBPfC7Z+P/SKngdkOo0zepFMRw1d9lo9+Ke8+BovSejraiGsrJZLlI5PmqJpNvEc/wDU +FA9l4+oHRmXEEaD3K+avSmoSziSFsE+AvlNZT8hp2z/MVFt1JrG1aavlKjKJ47JZ45KqWGQH +8MlW0cU5jzlVIDbkgWjbuKzNpUGmcxk9zbj3yVNwOFbSFWq60Q0cRz5F2vETcBen/nBq6sg0 +3pjlwsy016mo5P0rUUY8lAnT49YwI/AF6o6Ze4UBcfh4q22NoZjkBsRfTQXP2R2x9nn4t/1J +uPp4BeT746eesmpNSaoW1yzmwW/9V4ojCKHdcgKB+KSToAz+zGqKPUkTZFM1XNLv5jMcFZto +VjRpuMfD7A758hHNaeqnTBxUXnUtPJTAqHMEjBXYkZ8391R+88X0YnL/AAqN+a55VwwI62t5 +IdN9iSCqFpLiGHChYl6VG3UzAftdIx+ZHEpRwokOqKNr4+CQzT3ooyCmavonutTFPGCGc9QB +PsAP554NAh2WVHdZmYXGykaGz08XgtUdEJB8OQ7sIj6noByTj1PrgcKqMJEFY2sGiWHRZlZF +SuiVEdJWR26DASSWBlVScjzN7n1J7k8Rjqb8xLVJDFsyhtQQFk0sXzaTUwAELJ19GPwuPc/b ++fGqdSIg3WsRTJJa74UEXy3zUkkTFTHA46WBGxYHbH2zxOU3tc3uUQ+k5hlpssCnp4LgJKCt +iDVSYaJmGPFT2+/AlVhaczVIUHBwNN2qH7c1RartLHA3glWLByP4Hg6m6W5So6rTNOoCNFaH +RGqxVQpDUs2D3AOQ23twFWo2UzhMVJGbRP8AtTGsETiVBGMHCpv+ZzwG5glSgBsdQpRmlZxB +RVAlkJOcZGfueGsxBAKfC63nuMKiJ6eQznzJGJ2Z5Dj0UZLdvt9eHZkpBMcygm71l4lEq1MK +gqehlacgdXcg9ONhnGB6g77HhZaBK0AY0j7rbr/Y6airK3lj/aRWygio3ih0hSwhhkLI8tFc +opO/fEfUM+5B48LfmxLafSnotXdurv8AIOpOHqpPoY9o6R7Pe7+Wsw+T2kesLX3ykiWei05J +0BUD0mFO2CpI7/n/AB4tP4sU+r2u+nxkeZIX27/DTFdVtvD1NA63zHpAWzfldarZVWXXFpno +5JILfqF0qhnKyUtVGVkx+Rzj6Z9ePEXTqtXw2Lw9UGHOp2/303Ahel+nWHpPxhoujJUYDH+7 +d43nvXlu5t6XqOW/MrX/AC+qmMkthu9Xaupv+YI5WAf/AKl6D+fH2L6I7dZtXZWG2pS+Guxr +xyzAEjwMhfmm/EPo8/Ye28ZsqprQqOZ4A29IKy+XWhXvszXq7qUo1BaKOQ9PinpbDnYkKMZG +x2G/fPE9VqQco8VRKbsxvvVnp4Wp4jSBR8qufl4yqJ4ZwVyOoJ0n+WNgeId9V2jfPyRnUw2T +p7CDmrGjq0NTcokYhlV52fEZRjlgMtnp6Scrk5wCCGJEthcE0MmNfroPH3dA18SQ+CjPR1np +6BbvqW0a4paT9Hw081bc6W3qPlzM6rBTQVHTK6SOSwAjUHAYFu2HcZ1lXLTq0ZzSA0k3jVzh +YR3kza25DhwYTUbUiN/PgNTPcrjcteRejtbVFDb9Rya6rNZ1Nlp9W01yp3kjW1RTzrFB4MUj +yNPVSYD+coxiUkY6sJD4jHbTwYfWpBjaTDkgmC4wS4kgANa0XiNROgkv08LQq5Q6S435AG28 +m55929XR1xqahq77zJ+HWw2DSfMC5QCn+YpdQ3JaKiq7i1RCI6hZ3/Wzzo9VA6RwhArdgqJI +xg+juwav6Wjtdzg2mwjtMcS4tuCdcjWmJcST2QS7cEnam2qL6rsJTGZ53O05jiTAgCBujRXy +5EWenteiKPlhYdB6Vrr7bLnVWyqmjqAtLZpZZHaejeUS1DNLReN4YmcKoLNjqbLcVrpnTfiu +t2jWD3AthjZmq5ghrCB/KHzILSHkQSbQndlsbSDMPTIadTwabl17TEQQ4EA+C+6atuo9A6+o +LVLU60vfKVK1hdP0zTJRP4prFllq5ZY6eAODU0wZ41YtPIyMWVUZRXcPi6r6zKIz0s9g0jMQ +3LJGUuIAIjtQMoEfEUWaQBJEPDd4MCTzi4F411mwCoNr7Xs/w8fEZ8R+ntTVfMuWzXPURvVp +rZYYFN1iqA05qlcxyRyowmiVZI2wQnmVH6lHecNsZuO2fh6dEU3VaLcj8rnACNIDTbeY3TAM +QqUzFuwlepnDoeZEgeOov3+d17JZ89APVnbf34tbgiwNy6bfbKacVd4vU4oNOUa+LV1Bbp2G +5UE+u35DitdI+kGH2dhXYisYDQmcVWDGm8RcngvP5/aSf2h7cy6qr5Lcn6wUegaRjT1FTTv0 +/pADbG3/ACwf/wBvt38obS2vX21iv1eJkUmmWNv3An6KrspnFVA94/htu0bz/cec3G8a6qvP +wQfAJrD4j9UWzUeraa523QokWZ5pE6XqcEHBz2X+e3F/6I9Dam0YfW7NLj/V3cBz8lJ4OaoE +Wbx+y9gPw8/DpZdFWS36T0nQG36Zp1VXcIEVyAO2O/bj0RhsPSwtIU2DK0aIh9V1R3VUbAan +3vV9KO2UNkooqRArMgHSo7txDbR2lJhqmMDg2saAdB5lAmsNTvRvRxySgVDthIkOT34q2LrE +uEm6sFCiG3d/gJRa113FprT2pb3X16060cKh3HmbxJD0qqj1bfAHueIraOKFJj3TERPG+4c1 +LUKBm49+/oqq611ZTab0FqCS5wJb3ifeLJL1VwmGcH3KL0qfrkccs6abYp0qL2VeyBPnEn/t +FuSufRzZjqtUBrZn5n7CByutQ3xHawrbVb6Xl7DWRiqmVZq8pghHZutwD9CVX7Lx8pPxR27X +2rt49YZZT3CIBO7nlECeI4L6w/g90XpbK2S2oW3b6u3nxOnJaKPis1ZDqjU1p0VQPWQ221OR +W+bKNP3Yhc7gKo3+o490/gJ0OGy9kjEOEPrAOPrHgBp+68v/AI59KHY3ajcG0y2kT+/y1Wqb +nJq6S8anpxRUlujngqY4LbWMpE1GiklSCDg4OSMglfTj1VsDsUQIER7C8sbdf1lSxiTblwW5 +b+yEi/RFVo241ryTSWw3vV9W7nqaeqqIkpIfE/xO0jEZ9M9+M2nj20qzn/0iB4/5UPh8GDhm +U4u4lx/fn6rYh8cvN2s5caNvINfOmta62zJdK6kqP1VNFPLhaWEnu8hXzyL3COF2OTUscXVK +raYNzrGkcB5XPkrHsujlpF7vhBtO88151NdUtLbrXT11+lBYSLLJFJ5hJVMpPSB3YrsPpgk8 +S2z6jqlUtpb/AJJvadUUaJNT2ZVBOaU17vF0JqVfwGdWFOmdi3YN77evbjq+yMPTps7N1xja +u0Klaqc3ks6HSa2igpaisWrqqcxt8oRGQWlyuQpx+HHT32PBD8QHnKy3HuW24csbLtN31UVZ +xXmvq6OodIaNIxH4cbZZGHcbbb/X7cP9axoDt6aFB9SQNFPSW2lo0evpJqvrkjK1kdOCr1HS +d2Y+p6j/APE/Tgp9V1RotAQLWimTvO9fKu3vSUgWjW5zGdcwQyqWJ/aCqGz1E9xt6+nAYMmX +WhFvbI7IJnio62xVMstYtxgipmiGJVUAFVxncDse2/pxG4ym1gFRh1Utg6xdLKoUVqGQinWt +Mcc8MZ6TEw6h09ht7fXv68G4I5xlGqFxQNI5iJCXzkt4U1KH8CPDEFt4f/b7jccSFSmRZ2qH +bVZYsssupt0dfb3ki/WTIepgAfM397+fAnWFjgCizTFRmZS2lbuKOpRZmK9GAy+uf6xwWTKD +ogNMHVWo0vfKWqpwiVLxxnYjr8zb+nAVVs6Kap1XfDwTHobnQTFpERqeDp6dsDqwf5Db7nPA +7pGqNEF2ixKqup3DmnZKV5u8qkiTo79x/P6/TjTaYGmiSXZiMuirrzC1xDQ00tvoZ3G7Yz+z +k4A/dk/v9+CMmbUWQ9evBIW5L+wHrobvB8emnqgTSwT6KiqmAbPV009ag6QP2gWzn7ceDPzw +u6jHdG8YDBGJLfM0z5IfZGLNLaGGrN0bUZ/7tVTOW1NLBp2F0ZVkTqfI7eWVQOLl+NpDNuE+ +/icvuFg89Gvnb8THu5aOt74K93w78wqOXnNceUF1kWN9YaOrbvStI5AkrqCeHyqpGepoKmZu +4/4Q78eZfxW6Lur9GztygO1hK7cx/srA38HACOa6l08/EFlHpXsrAEg/qMKXDfem4Bw8Q6b8 +CtbP9oL8O8Y+Img5mCJY9MamtcFROoKgSXOmIgnUjIySgpmx6ljx6x/KJ01djOiztnVLvwry +0f8A9t/bZ5EuHgvll+enoIMH0sp7WaIbi6YkcXs7JPi3KfApH0NJT2e3yUkEkCU7oqhVmUdT +dI9BJgL5sE9iSRjfj1A2oHNsfc+d9y8WxaP8LuloKs2OohooaaWqgJYNKFMZ6juG6QgXbHm6 +vbsBwhxpis1tQmDa2vzM+HNZ1bjSJbqFlppieyx0l6slpqLlfLQq3KWimp1brpCvSRUZIlMH +Qx/WIZY2CqSQRjg3D16WJHU1nQypLZBPxC/ZiwdI0cGkaCQVGmkWdtolzb3+v7SrI8vp9M3r +mBpe51WmY9HPqaOntE1lqVp56C4UtTD0RVzMw8Fp4pUkzDLkACHqIYlA3X2K+js2oM/WHDds +OuHBzXT1YGuUjVwImSBAuma20m1cQ05Q01LRuIiJ75I3LH5B3XmGvMat5actNS2T9OXCpe1S +3WuoS0PycEVRDEyl0eakSNew6QYmELEDwR09A2qzB1cCcRi2AsY0uDdRJEECNZmOc8CZp9Cv +XbijRoG5JAOhBH2iRztvCuRy80bq34er9YOV9jXk1eufN8gq3sFyq6R8UkFbTlZpJ61AJ5p5 +YXdIo26KdPEEskjsVAqONrUNrUP1b6bv0tEQ9uYAGCCBBhjWss5zzmmzWgC6IoCrhKhoyDWc +ZDomNYM3MkmI7yTuUvyXoec3waf+pOoOZGh7lfZ46qh0lpy01N3jSnvVZUyNIVjVXdxMYSso +VolH6zrYxjAbfSylszpBWwbsM9kEVHuezISGhoaMzoiJlpcZ0hs6peyn4nZ9Ot1gN4AaZiSe +FjztxvfV8X34l7rHZdF0ldoq86X1rqK23S4UEdeYYILY9GkagUaBRJJTzyu8Pj7zq4ZVDg4H +MH/h/hmZ203uhhaCWuzB5qvMlxAA7Lb5AQ0CM8gXttPbz6mUuYN+o0gDTxEA79ypVzA+MTUe +mbpY75q3Taa4tmobLQ3u22xq80KacZ0K1MSxiOQkyVCTTEs5bzjIHc3bZ34dNdTdTw1eowU3 +OaXEyXwZzXAEQbBogXuTpAYrpA4ODn02mQDEabo3k95uV7l6Om+YnMalEUAvJIfwoo7k54vO +LxLaNM1H2ACHqvyDNvWk/wDtMfjpmhSX4buTFwkqVfFPcpqJuuWWRjj5denck/tY39PU8eQe +lPSKpt3HEtJ/TMNv7jp5DdxVXxL/ANVV7R/gsvP9Tvq0fPjChP7P/wDsnLzrtbfzY+IO3VdM +krrUUNncHr9+qbHb08vHTuiP4edbGIxwhu5h+Z5clLswnWdup2WDQbzfXu+a9QPKbkXp7TFF +RWGzWGkstsiCqqRqMNj6Dufrx2guZTENsFIuBd2aYgcfequHTUFDYbeqAJGAmAB3/LiGxeNg +ElSOHw8QAlpqHV9BQQT1fUiORhM7fb8v58VerisxJbvU5Sw7WCSFXi/6spdP2S5aivLLU3Es +7qW/5KAdz9B/HiFxWOZRpZzc39+9SpfCYUucJ980pJrfLq27curfLJPeKGB6jV1+LRkeIUIW +niUf/ldVCn+4x4jq2Hl1MOJcGg1HW1OjQPEgeBKLa8MkEXn0GvmYb4k3hVF+KHXMf+3en9MU +MpWjslI91uzjBSeoEhIBPYefA+yMOPIH5ivxE/0vCuqYf/miWNO7NJLndwMT5Bem/wAvvQV+ +P2g11YSxnaPfu8zfuaVos55c2bZZ21NrLUFTLLJWSzRUCE+ecoDhVHcZJGfYE8ePfwa6BVNs +7SbReMwbD3kni7fxK9+/iT0rpbE2SC3UdkDi6LgffdqtNeobhfbpa67UawTVN6raAzhUXrfx +qp8Iv3EaqRn+8Dx9Q8HherbTpRA+QGi+a+LxdSsamJf8RBPi46Klt9s1XQ8wNV2+qjiqFts0 +VIWEiFZqkJgRo+SCS4fJBxhTvx0TAtikHBUPaWImpG6w8eHmPRei3+y8sLUfKXWhBKXG6XC2 +U7eLhBT0yLJJLJI3bGFbLHYAZ24gNsV3WaBqfTUnwCKwzBq47p74myTfxeanXWuo77eJalpd +KUE7VypI5CTsilIFRG/CgAQD0GT3PVxUcPii5xqN0NhzVrbhiGMpnvPz9LrSnq++3nWl0o7o +FmmtlPEVp4YVLAejMw9SzMfMPQcdP2Js9lGmWj4jquX7a2i/Ev6w/CNPfHmmHr7RlLpvSZvd +RbKe4ai8ATNB4KsKdB+EuQCWbcFVP1z2I4MwGIc6qGEw3iq1jKYoCYl9rRu96BSWr+XNkv2i +KC6RrdJbittpq1JqWX9WfFTp8J4sj8Rwcd1xnbB4YwOPr0sY6mIcwm/K/Hj81I4ilTqYZtV5 +Ii/fI0hUo1lp7V+h7xQzagttRabdJ0T0xKNFER0/iHUPP3zvvkD34vlCrRrZhRcHRYwQY5GN +CqrU66kQaggHTUA93FRNffHtFKlPQtPP874zxMP1gZmYb49TjIx283EhQw/WCJ0hR+Jq5fh0 +Kn9Rx3i41dqXT12MnjK00qMhp3papUHiRrt1BAMAem/122ynTaxxq7rcZHFLqF73tDDr4Qd/ +ku602y3vXyVyXxJb1UHqdnchyOzRsuMEZB9jjiLxjyKZAZ2AjcDGfNmlx93XRdqU0/jWmuQI +wzHCVXcr9D647fu9eIug/K7rafipdxDmdVU8Epqijnt01TSVMTxzohaM5743H3B34t1Kq2uy +QoGthn0n5XeiwKGsmo4Fq0d2jWToY9WAAfT7f6fTgHFURMFO4auS2xWXdZJYqyGtpkj8CY4Y +H9lvXPtwikLQUTU/rbqjKwal+WCqS8UbDDEHYj12+vCiOCep1y8FNJda0UEMdEiVVbOy+WGJ +SzuM9vYA+524HDAdUazEwIChNTau1P8ALySTywWSBoyI4owGl2Pq/b1PYcYGA2K07EPyncq2 +368xs5jQsx/aYnqIPqM+p7cEBnBR1aqNQt7n9gjqdrFr74yIPmFhp/8A0q8VgThdq7w2JP8A +7Zm/LPtx4H/Pnhc+D2E7eMZ//rn/APFB4moaVHrJ+G/kQfoh/k5aDdYbdbwofyP+EZLAlX7f +9X8uJL8yuLOH25Xk2EEeMr7+U8HOLewn+Yn/ALmNI+aBU1TPoP40fh11fW3CqprZYPFkq+nY +fKNcDBNG3oFeFsNnbC/TiY6G9Hae2egu1tnloPXta0f7sgc0+DhZeL/x16Z4nZnTzYeNfUgU +hUBnQML8hHdBk9y2J/HLy8/SHK+83WOV5KzTt0ju0ckLlM0rnwJ2DdS5XDRvnOMJnjzH+Urp +ecD0iOz36YhhZcfzs7TbEG5Ejiuy/nE6Os210QZtKkO1hnB878rrO7gAZWmq3W+v1Ddaejo/ +HXxVAAjkwisNgxIlIGBnY59Tx9O/1rKFI1KhsJPyML5Jtwzqjw1ttytFofSNDEIqahpKqeTr +IKLuaglcdJIyekg7DZu5HYladjMRWxFSSRujkJnun048DM0qLaTY3eqja6y0ml62rsNHRwD5 +SsM0UVIZYaelVnD9dJ8wWFPI3RLiaNnppAskShySp6Ls2kalEYh7iC4RJhz7C2eA3OLglhAd +Ts+YCpOKrDrCxoECeQ8JmL6EaoSnvVk1LyZ0tULZit30ncaWFCQ84eklqGV5DEZMrBL0qxWM +jeEqmN34vVWi+htF4zENqtIsBFm8xdwN+1YZpPBVZ1dlXDzoWHUzrI17xa3horJ6H5dabr/i +D+J656/1Druz6asNPcK+41+mrdFRzU9IgWVJnTHjRxyRAwBVR3UOZZiGXDweG2hVp7MwNPCU +2V88MbL3C43ggGYDcznaTEWNmsRRDsTWqVnObEOsBNxpqBvGVu8i8KRpNbXzTj6Q0F8P9mvk +Osb/AKAigtdTbIYTcrLPJUVFPUVVzvDwCdglKrFjGVihKKIcRhVWQ2vhcA7B1qvSGo11Om9o +e547LoIdkbTm4DiAwHO4i7iSShMLi67a7P0AIc4HLHxDiS7mNbADwkrDX+mdQ6a0L8OmidO6 +5g1Nry86qrJHuVJU1tQXrGenpKSSmqynV4C/Mzg+EHZn8RznKFn9nMw1TamJq1KLRS6umBIa +OwQSZZrDtZcBEQBYpmsKooUmtcS4udMSRPfxAF4431R18ZNx1Tyw0po7ldWsNTWW2VlJU6X1 +nTMEmnqkinjuPjt4jgVEjNGQVGQsYUEsSwrPQfYOArV62Ip2NWc9OwBZM0wGCRlbOpiTJPBT +22a9ejTbRNwy4dqZtJJ1nlcALE5G6E5LXjlXpq4600JSzagZpI2llvMkMk8a9OHkMkrHrLGX +KKiKmAMuSzcGdKdobSdjXN2ViRSaLkOAN5I7IIsOzMkkkk6ABN7O2bh3UWvxFLMTwJ9ed/lv +lesb+0L+Kuy/DNyzl0RpytSo5oXiB44kiIMlOCMdZA7AZwAe5x9eOTfit0ubWd/pVA63cRuH +DvJ3KrbVxZJ/TU/iIlx4A/UquH9lx8AH6S1BQfEfz0ppr3qSr6qi2W6oiDrTBznxJGb8Upzn +I7Z4kvw46DCixuNxI0+EeGp58OCI2dgWhjar7MFwOPfy3j1XqA01pJKeKOKkoY7bRBcABQu3 +0HHYXVABmKl3Pe98ARzTGgNJaIvEEglkGd9gR9OIXEYgC5UhQoweJSh1VzRpZa2phSdJKWAY +lcHYnOMD37gcVDEY/O8jUBWTDYUBpcd2v2Sc1JeIDDWao1FWRWfTdFG0kjzNjsOx+w4AxuID +Gl7zDW6n5AI7CUTUeDvWr/XfPHVnNXWdBYNDJV3W31VetNDFHGxgo6ZB1vPUN7EdIVT+JioG +eOb0Novx2Ia2jdpMaGA0XJPhpOphdAOCp4WgalaztR74ceduC2Kcq6S66f5b1NZqC4w197V2 +jnnC46VicsIgf7quxOfcNxdNrVnYfDODjLxvj08CfmqjhaIfWzDQn5GY8z8+C0tfF1zGhF2v +NFp4rHUXcLTO7qVeONBliPqRk/8AX9ePlF+YjbzdodKHYGlajhGNbH9x7Tp5yR4L6ofll6Ht +wmwmYysO3VJee4WYO6L95Xmj+J3mlVaz15qS2WySnFk01A1ro1U5/WtjxZT9S5Vfp0nj1r+X +3oENl7Cp4mqP42K7bp3NuGDwbfxXC/zA9NnY7bVXDUz/AA8ICBzeYLz4GGeBSe1DVUUdktMV +NI4p57pOHIPkkSmighjBGe2VOB9OO7OfNQu4fcrgJjI1g0cd/IAeqpJJWi4SJSVDYNRqKSvl +kVR1+GF6Nz7Drb824v1EZKN/6VR8TVD6oG/NP0+pXpx+CSO0ct/g71VrvU8k4pdS3GI0lGsp +SQ2iGIiVUwe9TNKtFGWBHT4rj8BHFQ2vXYAes3jTS0387AeKlMNTLqoyaA/T6fsVri+LbX1z +ulk1LTSMlPdrjWK1Q0UfkpvKsccUSf8A8NA7kDvtk7k8A7Apddiw4i0z5DQclMbYr9VhnGYM +RO+SVTSSqtvL+2ipgNNc9ZT00UFutrKPDtkL+UPKP2nbAKgkDHsCeL/hKJrkQOzJnnHBc9xm +LFL4dQBA4d/fqi3QU809tb/aKH9L1FU8iRxuwQV0oGBPKR5hHny79PUExkZ4GqCahw9AxF53 +gbwOfDhPcozEUi1vX1tTIjieJ5fUd6LtJaspLFoir0Zqaa53i+QTXS5R1pKoJaRkLwKX6JOk +iRGRekbZwCM8SWE2bTdXNWgAwdkGxPAGBI7yoobTcaBZUJLhmIMxuJG475HkhDXuitL6n0fp +2HT16rrRow2ylv6yXqqFZDWTVh8EBJCMRyCYdLINgwPbOx+Cr4llXrK9MPquc5nYblLcl7je +CJIM6QtVqtJ9ENpvLacB0OMyXWMcDOqoxqDSeptEXiKy6go46OngqBJTzCRZEdVfPSHBIB8p +GMgg7EA8WzBYyjXYK1EyCJi8+v8AjgoTE4apSeaT7QVJrNd6v9GeA8tPXJcXq6qrCh/DjlYp +GWA/ZYMCQM+mR34NqOaSSRMgfKSmWtdAjUG54SYEqaq2Y3Srqq6OsuMfVBSTxUKr1zVThiZI +0YFTlcDp759OAKVFpp2MC8TuA4+KIfVd1haZOgtx4rJpIbbqSI22srbcleB4lKY5l6/DG3nT +Plc4xjt+7PFex9J+HdnaOzv4Ty5KawdUVhlcRp4wlzerSVcWa8f7uSStNVEY6O+A/up2H024 +PwOIj+JS8QsxNIuHU1tdQeHfyS0ntdRbq6qttxiVHOD058smezg+xG/E66s2qwVG3lQgoOpV +CypZQQqaiCCS3SkKDkRudzt2zn93AoRlKsAIC4WquqiJWd3yCAOo7g/Th4tEABap5gC5G1kv +C0LzPIvXK+MnPmbHpn24bc2UTQq+aGNT6hnqsslQjQnyKC3oBvj8+EwBdLfVlsTZK8kyylmY +Eb5wc5/PhyCFHmXX0C20f2a2u4uW/Lb+0j1NAJFuVNyNlWBkPmVpLikO3s3VLEc+mOPJX5m9 +gnaW0+jOEOhx1+4Ui4+jSmsW01AaA/mgeZhXK+GKzVA1LRwDqNPTUjLKen/moIo1A++HJ+3H +L/ze4loxjn73Cn6hxK/Qk2k2ntMUANGj/wAGtp/Meiqt8Y1qGlviDhtkAqpKSXTLVKRxp1sU +lrGJCpgknuMEemdgDx1r8smJfU6MVa836xnowa+a+Y35x3E9IMHT/wD4qk+NUj6BbceUuo4u +evw28v7jfaeHxbhZJtN3eE5KvJEppnYN0rnPSkgIGxP048D/AIkYCp0T6e4l2GP/AC6ra7Dy +ec8b+bfBe8fwd2nS6V9BKTMUJ62kaTxzALD8gVqu0/YYNM3+t09dJUXUMNRUURSVh1yGGTw2 +KgnzHq8PAyBhskgd/qLhjU2rh2YnD3pPDXAjeHiRppafovkdtjZB2RiKuFxNqlNzmHllJBsd +fZTmo9UW2x9EtKlQDDK7SVTR9EFVSKheOpSZWyI+nxCVCiRhTSgdgUt2yujDaZa+rr/TvDpE +i4ix/muGlzTvvSNo7ac6WsuOO6Dv/Yi6EdRfNXS3X+hraSginrGrKs08lM04eomZWlWUnDsk +rvSx9MKl2ZqapQEsUa24cuMVGboG5vZGkTYZRmOZ27PTNoKqeJc0SHRF/DhpuM/CO/cmjcuX +ukrloz4O9c6PrrpSWmtWC0XqGvpBHTVa21jWVTyU6ynzQVU9XEFICYdGQxgA8PYraVdrsf8A +qhADTk49vsCIkgOAmAJNpuQEE6k1rKTWOMkiT3Cb84HHebcVprPnJqvl1pKx8zNP3ySp1Bqr +WF1r6ugrJWSW4UARkopZHYss8UEdVLhAUjDuiushAVNYDZtPGYs4CoM1KixgaYsHNPbInQui +DEmGm43h46sadM4iYc8k+cwI5a9xBU98LN409yZ5a/7b1F7ul511qOuFrhtE9ujM9y8OsKpB +S9TMs8BWGF55pwsUPT4QLtImR+ntWrjMUcM10soseXEiRTJg5iYMOLSRTYCHEglxDU7sIMoU +xVI7VQgNvc8QB83aXgAkWMNefCXzJ1Jp3lrX8mtdcvNY3iyUNbLUxWpxRVbXhaiSp8KhjZFk +KSEoqI3SYnjkRgCfKNsfpXhX47FMxDbVHNiAfhyBrc2l8oBtIAIgi6KxWyKzcNTcw3AJkn+6 +8bom0a7zqqv/ABA6ru12tHKSjqr7T3N7fbP0gREjQzUUk04jyQyq0b9UEpCbdACdQ6sFrj0V +2RUw+LxFR4h2ZoNyZN3cTMZmgm06blCbdxtNzKYaYMH0tGnImN25M7Ria45v2WO/6j5/ct9O +zRO8Mdvu91q6epiHUT4kgRd2cdOCWY9Cx9vWUpYDCbPqOp0cG6rNy4ZDfxGu88SSo2ttCtVa +HVKoA3C8jy8h3L0i8gvhW5r/ABxc+r18S/OyzGh07NViS2UNQxEESKcx5B3YKPT1O/HmnoD0 +Jq4mp/qO0BMnMAd5+gGgCjdibNfXJqVRIJk2jMf/APkcLr0qcptKWTQdop9N0Zhlr4lCRlV/ +CAP/AIj6cd4fGW2qtzq0uLBc7uCsDBDWSRrJLWFXZCAFOMcQONxkWGqlMNhSR2nWSo5qayWw +0UNkoZCtVMmJJW7Rp7k8VHaeNcAGjXeVYsBhRIye+aSlnsAZVu97n+XstHG00IdsGSTG8suf +YHYdhueBWUOqZncYgSOX9x+gRpAecrPh+Z4nkNw433LXn8SvxF2/VV4h02tddaTlTRdclW9B +B4tTdpk3EcGfKOpgFDtlRucHHHLdv7fp4muKEnqBewkuI3CbSTYE2EzeIXRNi7Ecyn1pEvOg +O6e/0H+EPfCTQ6v5z11Vf7XR2XQliqbk9JbqOjm8RLBQIEM9TLISWqblMwWIO/kiUuQM4AtH +RJteqzrwBTa49kDRrR8Tp1c9xhoJ0EmxIAgulJNKoKJcXOFyZm5jQRuFmzpJdawGw74qaoaJ +5NS6C0XEtJdKyGOniJfo+Voww65Hc9mbqbc7nzH04b6aYhraJpMIaAMzibBrGwTJOk38JSOi +uEdWrtY0SXGABvJ3e93ILyz/AB7c7aPTl5vU+n5oqmOw2uokaVBgVFTk9MZPc9UngJ/7Q3vx +8vOj+wm9JOkdV7bjEViJ0sXEude9mT6L634fag6OdGnV6g/5NPNBO5jYYO97yAvP1N81T2sJ +dauWe73K5zVdTOBkyRQx+IxyO3VI53J9uPp7hMExoDaYhjAABw3AeAC+Z+0MdVqF3WOl9R0u +PHeT3Eko5umn7pdU5dWS20y1VVLQtVNHF/xI5S7nLegztudvMu424j6A7VUbx8oS6r5FPn9/ +8earFyq0Ndb/AMwKRK+zVX6JoJp/nlmDQq+WWEQljg+Z2IbG4RZGGOnI6Bji1mGAdyVOwonE +ZuBM+S35y66nreRfLCnPgNTVsluu9LTKiqlLbyZo6KONRjpj8O3U8gTsDUbfiyeV7TE1nRqR +fyj6q4bLswECRMDnqfoqDcy6f9KXCM1h+YeCoinMZIYTSGNulWz+wDufXbHEjsYZdLED6obb +rgWDvnxAVXUt0f6Rv+pavqqJpZZKmsI3cqPIqoTtv+FcercXU4txptpMtNh9/uqUKDetdVPM +nuC76VrxR36prY2DwSMYqqNGbwhS+GOqPK9kHl6d92K8O0KANENBg8d8zYn3oovHl5eb8/Ia +fZPT5D9K223X3RM9DJcqW4/MURqJ1PUFUusEo26j0o475BUnGBkv0MUHyTYxDhx3EjddVvHU +DTMsNpkfP09U3NHaysWqrTT0NRy2tFLUUVLJFV0i0FOsM6JMlS0cokBgjYspYP04ZFPYgZF2 +jTbTpOGYmXTMkOBiLR2iQLCIgckKK+IqOiiwWEGwyxqZm0SZKIbl8MvJ3mB/tCKmvuMtFcbj +NUz01NXPKlRMc+FUwPIglRjljgB0wcDOBiLxvTbaWFLAaA7AAaYi0XBi1zxh3cnKGBDmnNWB +kyRB4wI36XOvgFru5pfCLze5XWy8XjS1IeYFkhkcAvHmrMQY4EkDLiRunu0bYwfTfi79HvxM +2finNp1ZpPdx+Gd/aGl+IEIfFbGqtEtId3TJ8+KVVVFb3tNbqapmrrXVP4ANPS4SamcKFaKE +gER9WEUtucZxvjiyNqVM3UmIbPcfusrtDWdZcE+lkvq2dNK1GpZZ7hbYpaWskhSipa0MaeQA +AqiMjMyjqJ6wQTj034KdhG1mtZe4mSPrPomf1HUvJkWMQD+1xzRFT1EeuNPQzNEKys8NkRwv +4mByVJPo2Mj0BJ4qVekcHiC3Qaq44ZzcVRFQapVXqmMcb2a5pLHOh6rfUEjML7Zjkz3QjH22 +4ncM7/5KVwdR9RzUPXAP8KrZ24/QoCu1Oaml6pKeSnrocLIjbkN/pwZlHxN0Kjz2RBF0NVlQ +lMaUDAYp4mc+p7DhxgS6r72WDV3GRk8GNpFdzlyfRfpxt7JTTSRoomsqXkiYZVVUHIxn9/DY +bdOOqTaE6OT3w6a45sxrdInj0vo1ZFSa61MTOZB7U8Y3kOPUEKPU8Qm2OkNDCPFKM1QiQ0fM +ncPUo7CbOqVm5/hZx+w4ra1yu5H6F5F8uedNps8NdearUunae23OquTiXrghrIqvw2hAEa9T +QDbfcKCeODdKa+I2xtbZ1d8AYaq54A/qdTdTBneBm5ceC6l+G/Q6ljNv7Pwgualek0k8C9u7 +QWklXE5G0tvotS3l7a6VcbYZQrdRAYFsk+uSGx9Bxxb89GDbS21TFOzHU2keFvT6r7K9EtqM +2hi34gu7UMn/AK3VHfIBIf44bRpql516Nvt0oXqKlNKNbp0MJIljFWsom6sYPSswz69OTggb +z/5Thia/RqvQYYHWtcDO8siPGO6YG9fPn839Ggzb2Fr1LzSeAI/pqmfonn8DmqIKrRmv9FVq +vQiluEd0ttLGiLHFTNiCoQ9OD4qzCIuAMYeNgWDg8cw/Ob0MdQxGB23Qu1zXUXk65h26Z/2u +bnA3ggi0LqX5H+m4rUcbsSe00io0cndl3iHCT3iEqPi70hSaF5y0t4hkhSDUlNFdbdG0HizP +W5ME8MSqDIBJ4ZRlUEiRoJd+gDj0b+Uvbr9pdEKNIS5+GlhO7IDLZ0HZBkEn4Q5mi83/AJxN +gfoOllTFTDMSM3/XADo7xHKTdIu3UvNTW1pvl90FpjT9TUW9ZquGS4SvJcKqphd3eBoFVoxX +dcKVAgU9MHmGSZjE3rI08Jhy04l8mBmiA0NIsZNyyJbpLhH9Mrx9NSpIpthugnWbT4zEnQEJ +l3a32Hlfpjkr8RFk5lz60ut2rp/kbP4UDVNDRmKdeukjikZzUwSpMskjn/gEOuFZerKLuurV +8G6nlgTcgzcXdE2cLhsCXRJ1gCp/CYys52bdpBE7t3G53XCRWmtX8v8AmLzH1VLqKaq09yvl +ra64w2mkrJEtdL8xEDLRwuOos03glWVBll8CJn8NJH4H2q7EUMLS6psmRcjtENBAcbbhpMRN +gCQttIfVe97r8J3ncL7/AJzzVS7jdb7ry7mtp6K51ETyVUsVJS08kn6O8aV5yECjIXYnC+X9 +UdsA8XjZ2FZQYHNGgAPCQOG7jGu9V+sTUdAAN7dysZyxset9G0VRqCtobrZNQ3eJtD6dpaqR +oKmZ6j9XUzoJCGko4YxURP4flWSbDYAY8QW3dtUQThoORo617gJaA0jsn+5543LR3SZgdnPy +GofiPZAJvebju1nRWi1zbuXUGn+X9kl5z8zLFeqLRcNBHqKGlKWi6NFFNBGkB60mENOJGhao +J6JIpVCdJIWSsbMbiKtariamHa7NUBcxwDnsBDXS52gc6GwwfCYkkzEhixTZSZSFQ2abgw11 +yLd2hdabwLyqtcl+Q145oeBetRXKLSGkJFjkjlmheaW6lpQhgpulH8MqA/62TA8hVep+lOLf +t7pZSwLXQQXtE308XaA6HKYkXkKI2fsR1ctLpyk6jUxOg36X1HIpx6u1pfNH631TZOQl10vy +30ZTSQUc9XRKDJeq2GFIpnM4ikaaFGTpRiI162nYIC7k1FzmY4B+0mms+5EHIA13w9kEAFwG +Yi5EgE2gSgyYcxRhrYAveSJm5nSY8F+jfRiy6S07adPaZpKe026JRFEsS9ONuy/UnJzxPPY1 +rY0CQ5zWsDWjsaAcUy9Ixx00BqZo2ac75UHLHPb3P+fFdx+PLjlZqpDC4djGlz7D3ZOxOq32 +5bld5RSgLkRnAK8RlXLRZmce0UWxxqukiBuVZLxWxatvdbeXhkntSyeFCzbCRh3YA/sj34gK +BFWa7hLTp5/JWBgcBlG/3/lVc5wa3qtWx1egdM1Uz6eRil5rYzgS4/8A7eJvb0JH29+KntrH +fq82HpGWA9sibncBy4q1bIwopu61949/5Ws7mxb9W1lRNoDQFjqNQa9qmSnpaanVcUryDEaM +SQqLjzM7EBUBJ3xxRqeAq1ahoUWy+2m6dG93E7hdXipjmUKPXOm1wBqeAHMrbb8L/LvTvw+8 +o6GhIpKyrt1HHDdLkMI1+r85k+XzjEfiM6r7jJPfPHXsFhWYfDNpU9G6nidTHKSY5eC5Pjax +q1nVn3J9e7kNB4kWhVT+P3mpOtRarbJd5bPWzmOaakCdTSLF5grMR2MksIyNj4YHoePO/wCO +22xQ2XUklvXFlOOU53+OUEcLgaL0H+AXR44nazXEZhRa554T8DB/3OB5wvIf8e3NigtjpajH +NV1t6rpr1K7HJalhYxQA/wB4SSq8mPXpUcce/LF0TNbEVdqPbanLG/73dt58AWt816N/Mr0v +/R7Lo7Ia67xnf/sYS1o/6nAnnAVItVJU0VFSWGrZBd4KGelquvYpUOED7+hUucj3AHpx7M/S +5GudroV4wdiA6qKZ1uDyMfv5hGnMy6T2ql09RIXpEWGnt7RAkeMY4IyHlX1YNnA99++/FcwD +C+q87zPlP2hT+KeBTp5d1r8gLpTckbIbrqrVFsmvYs9DWXarp5q2RGZaCjC1ctVUsACcR061 +TbeoA9eLftAioGMdYQD6CFVMG80hUeR/MR5ErZ3Dqla7SXL3wfGpKSGwWBIaaRi7wItujnjg +Y/8A8qIqv1wDtjigYqk41ahI+JxPgIH3VowbopNGkAeZE/VVz1NU0yvD4mfESKM+GhyS6llB +b3OM9/pxN4NgBdwIhRe2qnYZmOhlJvmLTmzUGlKeYmgo6tTXy9QUvIillAwu5O5YHOPON9uJ +fBYeqyo7fltO7cqvi8UxzW8Dfn73jis26TUb6YlrqanFFd6mIwmmUkP0AJl2PcMQm422A278 +O7PL3Ph57I/f5JjGQW5mC5H2SbseutV8r9Qtd7LNPV2wyItVSFOpZw2BJ5WGTkZOPXqGfUcW +CtsujiaeV1nA2I1CgHPex2dtx7HirKaEveh+bphWy3a6aD1ZTqhcpUM6Mykhf1BYZRuoliRh +ekAYGFMRi3V8K7/i2iozRrtHDjJgg8tDzUTVoU3sy05B1jcfCbRqrC6D+ImDlrqQ6S+IJ009 +MZmNPWv4htt0HQ6ZjnHT4TZKlVY9OVwPxZD52Fh8VSDqO+9tRytrzUeMbVa5XMt+u+UtxpKe +sqoLbaUHUkypVyvFKzRFvEbpdEKgRs3UdyEySquqrA4ropUDIpdqOMTvm59e5DP2hVd2tDy+ +2nNDmtfhl+GnnLQ3CtrNL0VtuVTTCX5uz1EtLM6tEJCzoC6sAviDpZWZQoJUEMeGMBjNpYJw +awktGgiROsfMwnn48vkZtePcteXMr+yjs9JUtd+VvNBoaKUl6KgvadYBRQxAqYTl0O25jzv3 +HFywn4jV7DE0uNxy5cu+E3TZSEGdY8lULUnIPnJyrmqf0tysvFBa6briettM61tBIerBLeF1 +Mm4Y5KqcgZxniTftLC4oSKgJ4EQ4edvVT2ysdkIawR4oA1tpIaksRvNDDHLdaZTHXRdJBKDc +SdHcHcgjbBz6HgTZ+NdRq5H/AAu04TwVm2jg212Z6dyIlVWerhnUQVR86ZSObG+B3VvqMevp +xcqlItGcaFVA1hU7O9Nvlv8AB58RnxAU8dy5W8rNQ3rTyRu8l3fop6CIKdx8xKyIWPYKpJO+ +23Fb2z0y2bsxwbjqwY47tXeQkxxKMw2ycRXvRbPyT0h/srPjDeapjrdM6MtdLEgb5ie/QtDK +ekEgFckEA5OR+eTgwv8A+quw3HsVZPDKZ9QEeOjOMIIgW5pzaK/szKrRd3guPNe/6c1CkaZj +oKYSNTvIclfEcgdQOMdO4ycE7HiCxf4o06wy4FrtdSIPgL3/AGhSVDoqWjPXOm76+CfWqhLy +8oLeYau0QiNZKeJj0qlFEqnpZaROl5UBKqwQEoCHOFUkxWzMB+uqublO4ni6TcZrgGLgmxMD +VGV39Q0OGh0vpzi0ieHebJD651/U3GOitFXNX1oqnaqp5qaQOsTRyslTDIFC5ZGlKHbDjwnw +CduhbD2FRouBpgACAZESIBab8YBjVpzC66P+Xyu89JW7SqzlwrH1OWcgtYPAucba5QVb74Rb +5Df7nqiI0FdS1VNWQ0NSkydJiZaYvjHp/wAXGP8ACD6njxr+eWq92Lwb84c3qiRHN8H5L6Hf +lq6QjaNTaFVpgsqUGX/tozFubihz4/8ATGqtQcwdN3HS1ZJ8/RWClhFqASOask8VyWhc+fxB +HIwCoOoqzKuOLp+S/EMobCrsxTJaas5rmAaYIkRpIEkmBEryn+dHC1MRtXBvpO0pvtxPWu04 +n6lKjkFdeVvLjmZoLmPpDmHX1FluzPpm6W67V7yT00VXHGkcTKi9PixSwQMT+Hpj77x9XTvz +AdF9p9IeimM2fXw0VKI6+mWNsXUyXEAm/aaXiYBJIA1K5R+W7phg+j/TDBYoVuxiCKLwSLB9 +gY3Q8NubAHVbLue1Zqi26Q5dczNK2yiuN9sFwfx6dpvCkkinTowjg9UbLUw0zF1yyj8OQ7I3 +kv8AJxtrDtxmP2Lia2SnUa2oySQMzTBMCC7sn4dJAmwXrP8APF0cLtnYfa9FhcadTIbT2Xgk +X3XsHa6jgtQ2uuenMC18x9SahsktBy9vl6SE1FlsEklZX0Msah0Z16mWnk6idyX8oHUsjZZv +pps9+FrYVtJrSW03Htu7II0gF3aeBYD0gQB8sNoVazKpc4jMRoI36yBYSlXzPsNDYeXlivjf +pQXfURe5TQoI2NB11MgmMxVgVWRwqIoSNcLJ5X61YE7GqZ8U9urKYDRfeBbQxMXvJiNEDtKR +TE2cb/WPXuuUj1r72LRXabihnoqMH5urgjjA62QdIeRiOrwxnqAB6SDk5AB4todRe5tUEEiQ +DOk6jhJ81CU3HL1YHZJ+n2VxeW3P3lly107DRWvS+q6OFYQ1b8jNDA1dOPEcSzFsszdXQFQs +UjCn6njnuK6LY/E4g1cRlfO4k2GkAAQBvJHaN73AU9R2xQpMDGAg6aDdrJ3/ACFkltS81Lzz +75j6cbVFZQWqwyyrQxQu7TJTQOwQLLNFCXll3ClyvSdlRI0HSLXs3Y9LZOFezBt7UEjcN8QC +QABrxNySXGVE4jHPxdYOrmPt8zOibF05t3S20Nn5b3ilrU0pWR1tDW6ZjoEFXR2vMcdMOnYt +VIsCyLI7dBMUUmCIlHEdSwtCviXbQLyYiHFzspfF+zMATALQNB3ovFVHNaKYbaTaJMbr+cH0 +uuNDzPrOZtXpTlfo7Td/0xpOlopKGvVIJSbRQdck0tNTMDIyiUsQ8jHLNKQqKzFjF4jZIwWG +OLr1M+UyJiC9x1O6Ae0G6NidwT5x5qO6ikzKN8agAR4d4udEVWvXlm0OK2waR5Y2TmHdKed4 +bsKO0mugtkq7LTwSKRiGMExDOepoZHB6XXiqbUxWd4di6pogjs5n5S7WXERqbEj+UEDUFSOF +wouA0OIsTEieA7vVfoo8ua2963lfVawPPRySGC2Uq75XOOrPbJx39uLRj8Sc1u4KD2dnqk4h +5to0ct5PfuV7NHaUotN0SVt6miatReshn8sZ7nGeAGU+rGbepLEOA+K3L7oB1VqFNUVNS8sr +01jiyM5I8b7fT/XiGxjA9wfUNlI7OaXHOBy/wqSa75g3jXV0uvL3lzVrabLQDpvl6AylAn/+ +PF6NO3/xByeKJtXaNXEk4bDHI1tnO/pHBo3uPpqVe8DgRSAdU1+n7+96XGtHsXLfSEtzrah7 +dYaYMYafvKzbdOc/iYnfJ3OfqBxG4h9OhThtqYvCnMPNQl3+APepQN8PXKO9aj1E2udXu2l4 +K9ZZI4Zn62oIh5pqmZxjrl6PLnZEyEHY8TXR7ZjqTevrdnNMDeL3JO8xbgLNG9RO2sXmcKLT +J46buHcb8AQLElNmr5oQ80ub+luVOjqWT/03srpcJpAx8SvWLzrEc7CMkxyOxOSCq7AgcSNG +scRVyNbFMX8OHcJl3OBoAoeqxrKQJ3iN2mvlEE8raCFQ/wDtLYL2efMd/vVJN/sxS6TpxQTY +KxVs71DCRA/qVmCo47oIh/eHHkr80rH08Th6tYfwmNc/kXOIZHeIcIF/Ney/yq4fraOJFE/x +Xvps7mtBee6XOHKwleOXX2pLpzH5v37nPL8vqLR1mvaUNlgqR0wVlRGWNHT9HrDElP8AMyD1 +GB+0ePQP4S9ExszYeHwZbFQtzP8A9z+04+seEblxz8Zelbdp9IMRiqRDqLH5KfAhnZZ3jsmo +7iDG9L+G4z6qv+nVkqv0g09RG9VOzf8AHCzeLM4I7ksH3+nF0xsMpPI3D9guf4Fhe5hBk8dZ +3k/NGXOoteLba6ukLUVW90krc74RJIfEUqd9sspA4q+ymijXcXcI9VZdpPz02hvH5hLhru9F +U6nq6CPrqLjaqh3CeVDLJCGkOBueoO4x28xHEtg2ksJcdCB6qPxDwx0j+aT4wD6lXTju01Db +bj4czrU0ctFSRgnqUmOzspP3ICgD/CTxDVKZe4Ej+r1cpBlUtBA/t/8AXXzCC9QXa10FVpvU +ktHVXuarlMFPbIKnwhUuPE6TLKASo6lACIC5O/VGMEzuxMNTc91N/BQXSDEPFEPpibxdE1dS +0WvL7dLNap7JY7nTxxUkdJTxj5iOOMJGEZn6pHYMzA9TnOSRsOLTUwrm0G1XN7O+NLzfxXPK +2J/4jI03sPIAR5/Pgk3zE0NqKw3GjnpaeWOBYac+GMqiupADxufXIYnOM5xv6VnAYlrTUpu0 +v5WU9Vq9ZkO+B58UFCjhr50qfCj6DI1O0aocK+B1AY/xKT+f75XC4kQWtPP34WTWKw7jB01/ +dGR5fpcKBtQ2mraz3+g6Z4quI486kEL6ZyMgrvnqBxtw/W2w2epe3NPvge9Bu2axwmYPl74K +at/NCza+p6zltzR03bEq40qI3nQCfpZ26i3Q5PVGWT8G/SMhOgOchswFek1tehVlv9JAE8Jc +BmBG7lYyoPFFudzTTAje2ZnxsZ3/AEQ7cuTWs+WLVd55N6r1JSaNlcSU9Eaoik8NwxWMAk+E +4YSqQcrsD+0OJvAbcp1nClXA6wi438yDo4DfEEDUaqKqUMzM7PhkQeZ3Ebj6HcmZofm7f6F1 +TWOr7ro26tKKtqW8ReLSzAuJOsH8MmSC5OR19Cg5Hl4OdRo1AXUzaff78dFEVGlpyltvU+Su +Pb+YXMGKilvtRUpqC0yyEpVwTIC6kENKzFirHbJySgMeFXY8ReKwNIj+J3afPu3LKj3bt5Uf +Wc4KK4UkTxTeHDFCPDgcGSSHDbELnqGRv1koO3pvwGdmtntC3iffpdIp4sERNvv6/RK/Vldo +3VslJNfrHbKmlnWoPzPgowcdIUqsowzkEhjiQ5xjJzjhT9m2lunfp3c/PyUjh9pV2OBYSO73 +dDnKP4DeQ+pNRwc5NZWDUtq0RQV3zK2OouUkdJqKoQFvl1aROsUyFVMpWQlv+EMl8rV+mfTj +G4Wg7ZuAObEOESGyabTbMd0mYYDvvoFa+i+zv1T/ANRihFNu/TMYJju4lbJLzzPorbSUdFRQ +xWaGkgiWGipEWngpKdRgLHTKPJGgJOQoVhGAMB1J4nS6IYg4g1KkkuJkn+o3u42PnIkk/C6O +l/6rTDCxkCBbw9+94HX8xTc60rTmSGVo1d5o5PDhA6j04OHA26cgBSTjHTkji0bL6N08O7Kd +SdDrwI/lmCOJ36lomPq7T66b9kaxp9e8nu3FD14ae909UaivlleCHxCtISijdti//EjAMIUh +5U6UVj0EwqeJpuGFEipSZAkEbzG+BYG2kMmTGb+JZDsW0gZ3a2O7hrwnhPO0Gamc8LbQJa7H +eAlDUWqmndJK2akSb9CGSJlhqZX26I+sGOWNQ6yRvUIfwKeLt0cwhFZ+GElxFhMB4aZLBvkg +5muOU5gxw+JQe1sQTTFUxEjdJvv+kaQb6KtE3LDVWrtcWgaXsdypNT2yzXG40FItQZhK9MT4 +1tncZROjLKtTkmRXhc9P4hdW7TwlDDRiHSypUa0mP6xLXt33jtNtlId3ETY+2MbhMR1mEMHK +Z4EDcdJ1seBCt/8ACwtfK1r1RX09NT1t/pqO7MKenWCnJMBj6Y8EM5HQep3VSW7AqAx8DfnB +LTj24cG1Fjm3mfjJkzOsiItHOV9M/wAj2INbYWIxNYy6rXDp/wD8bQB4Ir+Myz6Pv3xITWfU +2j7DU2uls9uSK5VVXULVfO1AzFT0scbASSs1LkxllLQiUdWWyl1/Kdi8a3opVqYWsWk1cpAa +02YBLi5wOUAOiSDBggWg8T/NiKJ2tghUaD/Ce4Ekj4qhAAAIzSQTA1Wsq/XfmxpieE8trTo6 +qu8Smm+d0nZkpqzxgrVDdYVMxrBJCxKqRHG4yAelCvtbZFHAveBiHVBGjaj3EZdJgm+aYl3a +cBuBK8P7QxOJaC6lkJ4tA13cdOVp0uFus0nOvOP4cNSRQRN/tHWacjucELyNDipMAdonOSUH +ioEPfZt/Xj5I7NoHoh+IdNlYxTo13UyRvpuJaCP+lzTyX2h6VVf/AL26BirSg/rKAcOVRozN +8nAj0Wk7UlOLVe9D80aW61um47387WT6jt9JLJ0SrSlVpIaYjrfw/C82QS3X1bqAx+vWyhNO +pgqrCS3LFMPAcGz8ZM9nNM9wIvK+IuLYWPFV9gZkxaeA4xf0R58S9rVp+ZQ0uZr1U0FVbLjq +uprzKjiOQMLfRwRDZREJ5ZZVbxCjv4niKWaPjOh1A4doFdmUZnBgBnm97jvJNvCIOpb2wHOE +ZptflpA7o4btVN8ruZfKe7WPSdj15Zqu/wB+s9D+jKarrEaaqqaWTCy08PgspZVSJfK4fIk3 +JIUh7G7AxrK7q1BwyvJdlAMNIiCe6NAALblqhtegWtbUHabaeJ4DcJk3+qacvw+2ek0hDom/ +3jRMnNK2UlTqDSpgvBSnjpZKynql8VDlkkaVKuPokw7OwCoOjzR1XpjU/W0jhqVQ0nkNJ7MA +xEtE9qBBMkAW1Tp2NSDXBz2h4vo6Y4HcB4E81XrmTc+RfMbXl21VWSXS2WOkskfiJbpI0zIj +BYZF6ICqllIgSFepmdw7vGsbYsOE2ltHDNbSq0i97iYLnCeO4RA1JIA4TIUdXo4Z789KpDQB +uMep1J08yl/UaPhrKlOYVutfNi+UdRIah77XslspGgwuTJJHBgRFQy9WRsRhQSM7q4oU2HDN +c2mIswAvcD4m5JJjdM33potL33BjjMCPKRA5Kbn5wBrvquk5dWyntd0r7jUXdZqFHiprXHGh +Ra6od+mYmNBLUBGJUkQIFBVgYh2wxhcPTfiXmoYDSCZLiTOUNHZEmGki8EkmLo6jjTXqFtMB +o5bgN8m/PvWXZeWfLVNG6W1nQVHOmiN8FRNP+hWjqo4pI5CiwSrGvXHKsfgu3WMMZj0kqNjM +DiMa6o+jUp03uZEud2QSRJLZBlsmBB3X1TeL6kBtRjy1rtAL2FhNxfw+S/VJ00umOV2nKSkp +oIJapEENNDGAekegHt24jMMy0+4RmIxDKcNbusLbvulhedQXzUepjZGrylQxSeSCJiwEOezn +9kfT1x7caruAGUfEhaOFz1gH66kamPkFXH4iNfa0utRR8qOU060eoKx1Stu7jqjtdOSQ7IOz +SYBx6Due3HN9v46vXqDC4UwB8T7QBwHE8PVdJ2VhGsb1rhfd6oysOhtKcstCW60CoMVhtsPz +NU7v57lVscmSRjuzsd8/XiNxFKjh8OADDG3jeSePElSFIl7oHsqq/MuOXWF40/ctRW66XOwx +3amFLbKMKZ6+skJ8GKJTsXIB6c7JhpW2jGWqeEENrVxIkQBqSfhAHHhwu4wBcvFVzSDm07EC +/rpz3NB1MuPZaU2uYlwrNGaKTlpJXWa2azudJLd9TVcRK0tmtkefDg6zusCDIyd5WDNjzcW0 +tIbkrOAIu6LAcNdw3f1HtFVQmXmBc6/QTvG8k3cbnVJr4e9YW+h01ry81VgvVBWS3yO0R3Bg +FaptayxFJaQMBj5l3jULnqBYuxCog4b2XWZTw7nZSCSQZ4TYDvkTzuTEBL2pRqPrmD2RAm+8 +C3Ikxa8DWwE61/jx5oWHmfV84dX0F9uFLbZbjW09TB1p025Ig0YMbA4A2Zt8HZWP4uPG340N +G1ulWD2c1xIrVqUt3BuZ5kbrgOJ8NxC90/gTX/0rovitpuAApMrOn+4NGvdaOS8jfxLc5dPQ +09Nyk5TUSWnRFrkeijqX2qLrUSIqyzt//DU9KoAN+lBk7nj3HgKLZ6yNflNl4exuIeQac6SO +ZMQe69u4XvKmOXqQaU0/bLxVSxGS3wSxB33BJjJO3/ulPb/LiobUeatUsZvVz2dSbRpdY7+U +fREVpgqL3y7uMtY3jVND4tb52/WJT+IoVM5wVX9YBtkB8HYZ4gtoVgMQMvIKT2cwClLzfXuv +p9krtN1KzX2yPWOhpGilapyuehFYuG9wOgdJH2+nEzRJFNzW6yPf1Uc8Fzxm0+k/sE8dOaiq +q+16hgMglq/0LZ754THGJCvgmM+xKtjOckY43+mZI5OePWUKzFOJzE3ysP0UDR6pShW03dPC +qZrXW01zp1lBXMZQEDI7ZIIJG+e3BbsKcxgxIg/VNV64cyHXhNOiW28wr3bpKCmaqnqLyt61 +BO6ESBPDeZIqeUHqjjyscRVCGwQACASbhgcSaWGdUD4AblaOG4k6ieFtVzfHYMOrinFycxPy +A0tuMXjxV5aXT1k1PBSJXq8lK/RLOvQCsMS7oHHsB0k7Dp3AAG3HE9q7Rq0sS6m2x0HMnWPk +OUTcyugbPwTX0G1XXG/lw8tfFAt3+G3Rmomql0/qOt0nUNgSkurp1FmXraM4xtgkj8IB79hG +N6TYnDua6qzPbdpYaA99o3yPF5+z6b2kMdEcfG9/dkC1nI7mRpmkW42V7fqyhMUc3y9LIVn6 +QsTSDwgy5P6+FcKzEkkAYBzKjplgq1Usq/w3AkXG+XAXIt8DjutEm6GOzqjGGDmHffQSNY3x +3pJ6l5YUmrLVNd18TTWqqHxpYX+XxLEVEZbxULDuI5i4K75UA78TzOk4o4oMYMzHRN9RcCPN +sQY15KNxOyc1C5hzfQ23+c9w5oC0xra/cvLxPauYdroqKSQ1NNVNA3VFcKdmIIV5VCZJgXER +CgKCAM9J4tn8PaGHnCPyuIBaTYtMTuM6HxnvVFr4WthMR1jwDHkb3B3brj0TmqLxoLV1Gpon +pKrT7LFIrsAY5HdCXYOwDxlskEsdj07EEEjtr1m9quMrhY7zOk2sWnUb9eCx+Hp2LDb3biPt +3oUtU2s+SOqLjLyTmj1Lo2WBa2ts1yiaS3xnzYaPoYmEExkeIoQHBDKwZlWWpY9tejNTXT/H +HmNeahcc3qqkARKe1B8QejddSSaa1b8JmpKvVcjRRv8AoqleSKuYM6JJHV0vuVC9ti22w6eI +jF0WUKfW0sT1Y3ybW5O4C50mVmDwr6py0wHDxlN+zaP5VUFqptR6p5fHR8awNJFY46+qqLjO +vQQIqioMn6sHJwsTKzsHXyOnQKzids7RqVHMwNQuGmeAAJ3tG8jna4JkGVbdn9H6TG58SLcA +fQ8Bx3qn2oPiqrKi+U81tkmpNMQVMgofkacUjm2LTtNTwrEp6lKmFUZVDMvQMtlcm+7P6G06 +dMmo2ajg2ZdmAfmLXXdIg5rd5gXEJq7Xe5wDbNGgFrcwN9jz4o/s3Mqm1fWWemp44HnelUpE +9cp6A0YbqxGHjUguAzE9WDnGVLATEbGqUwar5AabuMzN9CTmM3IAMHTR0KRbjpOT+qLePlpZ +GEmu6xqhJKGqMH61BA6yOxlVcId+pyy4BGFMa5Zs99wMFsqjTcCRrrYb9P6RuJBOY9lpA7SW +/Hucwhxuff7bgAeSIdPVFffapaWd6iUUx6VkBM+IgyZaKNlfwwSjyEF9yD2JBImL/gtBpDKS +ZMWM6wSILjMCwiAwGxKfot6wAm8DQgRPjbTz7R3KF5nVFDYbhpj9MXRIamAVLQ5tkj1KVCZW +WoiqQxFQpiZknoxGMxdckTeIvTw70Wc6sx5Y25Df5hlyH4WlsAMktBZVMkOyggC6Y2tXy5cv +ygzvvvibjTVV3i54Dl5zRqtYR01BqTTtJYI7Fe6NhG4rLXUlBLNBUYJlgjZoWWR365Ynhiyi +s/R0Kp0Xp4nZ7aL3Zajqhe0gEHM2SMzTYOIBkABuftQVV3bQqsrFzQCA2D3HhyJtxFxwKf8A +8KepW1BpnRlT838/HCJKanqBUGUvEJZyqYJPQqbAI2GAwTnIZvA35z8CyntovaAC+mHEcLht ++JMElfU/8idd7+jlYG4FeP8AxDj4QR6oe+OLUVVc/jcobTbrBbLxW3fRFogjlr48w2lQWknq +8EY68RdKsCrISD1YYq3TPyk1Q3oJi3klrv1FQQIkkMYABPfK87fnFeWdJcBSAkDDyN9jWq38 +oFlrD09zm1NoC8a1FJCaSju1dE9fFMEM0EcckmEidenBIkkyRhW6s4AHHt52yWV8MxhMhotv +ExAJ3n5rxQzG9XWJAuT6T4AaBbZv7N3nJT3aa/2OpoK2j+TvNRMtJVVL1B+VqiZgrO3mYCUT +IMnOMAnIzx8ufzsdBamzdq0dqU4irTbcCO3S7P8A65SeK+sv5I+mDdq9E62x3u7eFqW45H9o +X5HMPIJQ86OX96uvPuw6I0TqU3Gq0ZfKmasSeBaZrbRV1YGhnQyH5do0pp4ISFAcpGWKSYLH +2v8Ahp0pw+M6N0tp1GFlLEUmnNmEuqAHMP6i4uHcIiQAvn9+MHRWrs/pPitnM+KnUJyxYNIz +Aj+0SeZ11TX06lxuNgqrVzmTQV21NU1cU1bAimnoKk0aHwaapkGGnBBAEDljlxGSAwTiUG1K +bMZTq4FopsEkuccxGYGcjZgA73njYaEUt+EcKDm4h2bdDQRaRqYnuAva/PXlz8o6bS3MvSdX +yqht9g/SNPAbbQ22peOWhnWIRM/iKQAroGLSI3TnxPPlWz03o10l/UUKrcQbMdBJAAM30BMa +6G97xKpm1tmuZWbk+I+m7f8APjuRhpfRupquz6qXXnNnUVxiroXqbtSW+omkM6KIQwlqGkBc +COmVcAeZQAMIobiPxO36lWoG4eizK09nMRqL2ABi9xPfc2RVLZrWMl7jJ1j5euiWi8qZrfdY +tT6de28wtCG6LBLF+kI1jhYHop5KuXMiiPJQ9LHzMzJ0sFzwVX6U4apmpVs1KrlucrpG85ZA +k2t5mEMzZ7mkFkOaTYT5SmDz05rm36HrOTNheDUV8uU9KsrUhKfLwo5YokMcaqitKFVdizhG +IDAg8U3o3s4HGN2lVBptYHwJsS7e6SfhHMBswpzadUmmcPTIJJF9+mg019dYUxy/5B2/S+jO +aOmdcwappOYFNpZ9UzTyn5KmhjjPU9LFEMtJ0GPolkZlzKY4lH4g8lS2m7GY2ltCmA6i15bY +hxuIDj/TmJhjZkAlxFxANfC9VTdhyIcRN5GmoHGBJJ03KY0X8RDcj7NDoLS1x03Lbljhr6ut +LrPHPXzQo00UPRKF8KICGMOQJGYOHClQod6T7MOJxJfUcbEgCS2AIE6Gcxl02sQhcCDSphrA +OJMAkk8bWgQIX6G2qeaNbR2C3VtHR3GTWN2PTardIvVOiH/nyp+yAN8egIB34dNctGn+OJ+y +apg5Q+4JuJ1A/qI3D+kanVM2zrScn+WldedR3GpqNVV8XXWVtQeqZv8AAB7knpAH0A4qW3se +3C0yJudeIHdxOgVv2NgmwToNSTwF7/Tghvlvoi61D1mtdWSRWaV4vEqY5Fw1PCd1gJPZ8YLe +35cVWlRdkmr2QB2hy3N7+O9WkPJMNEE6cv3PyKR3O7mpbr8l31DPDMeV9jVQkaIxN4rMgJBG +FyXySo23PVgbsBxC1njFVnV6o/gsjXedw7uMXG7UKWY9uFpmDDuZ0tcz3eI14SZQ1R+HXlaO +d3N/Tz3fmjUwNFpyyPGPFprnVjK0MCjOal0CLLL2ihjZAQOrquoY7C0xiMQJqmQ0RHadu74H +aOjWjKOKp2Jrda6WAnkRxHDjESP5W9kXJWvjmvek0vyz5gXHnRrKll09dKmG+671Eaglq6qD +daW6FSQEo40RUCL+M5OMMcwm1MZTw+GdnMtJBJ3vdMwOXAeOgU1szZXWvyt4ZnHhG/cIBv8A +3OJjshamda/GnrDnm93vtytl85ccldM1lNUWCxQO1OdQUUFLK1GhnLdSRSVLeNLOwC+DSgL1 +ZyIj+JWoddidSQA2bBokAXvxJO+PKc/StZiGtpDsgEg/1an/ALbS52hgxMWpdze5q3Ki+B6/ +6lvd2oLrf7hc+monoYTFTySvOjBIgcM6dSkeId2wTgA444bjtldd+JWAyiWtpufMf0B49C4X +XpHo/tNtD8MMe465wy2k1H0z5WInfrvWhLTFjqdW32Krr+p4PmHmkzuSFO2fbJz9Tx7Cx2KG +GpRvXkfA4f8AU1eUq2VzpkuVo/QtMG+WjqTHUY7HIQ/w24o3WuY7rH6nRXJ9NtRppN+Eaph2 +SooZoLPTSxssN1qKyhmRVwUV0Ygqf7pKED/txW6tMueTPwwVN0ntaAAPit80n7faXpJteTVl +UY6ahjit8B2xVyyxIxA9ivQAw9OsDuRxa8I6aDHcZPkVXKlQis9v9MDzCmNB6kKx2W7BwIa/ +SFK2JlBDtBc5B09QHYeEwz7bcSmJofE3e159Wj5z6KLw9ZpyHUFl/Bzvoga3agooaums9VUK +9uqIpaMtIpzTsrN09R9QrxAfZs+vB1Sg5wLwL2KFp4gWad9vJNjRGuaWC3U9tqomRoGhjzMn +idNbGxEZZT5TG6sUZjuoK4O2OC9nsqXyukGbcjw4EfdQ+1Cz+YXkX5z8j6K4uh+aa3azUF1l +nV6uJRTdDyfrllTOS/YlxjYEjPWMMPOeKz0g2CHuc6mLm/iYtOok8PImIM2RtKGQTYW8Pfvj +YewavttzgejnrFq1kKsoSfHTEY1LortjPUrMVA7g9WyjxDRMTsXEAdZQEGTII3g2mM3iYncC +86SzcU1zstU7rR3HSYmeXpqWrYblT1iQx0dbXVksESio8WkCrJ1+ZoutunpUiZwSTkCqiI8q +Flpe1cI6mXCuxusAg3EAgEwToWg8DlfvIBOpVRUlwMcbTrqO6/HeDoujXFk5RVkc0mra+htN +8KtBHW2xUiaXrjmIb5cN4k/lj6yoGVFQ6nHhBSFsnZ+0HP8A+CJcBuMk9lzbTEMiYvqaYNw8 +kOYrGUqTR12+fVp0E318JkxCrDzI0ToiWzXC5114v9wjNPPIaaroIYuv9VNOYwwcRvIBJJ1E +NnKxjcuo4670Y2Nj6tbKcjdLtLtAWtm4BAMCLbyNxVP2ztSlTZNzcyLczqCRN/QJKcr/AIeN +Hagv2m7lLrvU9FT1NC92uVFbWjC2+kYAxxySt4mJXMsUeFVV6oZlDZxxads4mvhqdQMaHfyt +LpaXGYJAMdkAEzr22E2MKKwdGlXLQTG8gXtrzH+DvCulYdFcj9OQxpbtDx3OZHiDPWu9yfxS +y56Vd1R26SRhAGkABjbrLxjmuKdtYguFWJk5Qck+hiTFyYBOV0DK42OjgcCSAWyLXN+HGOF+ +6eKmbxzX6IrlYbdUUlhilXqNPSQrTpVRkmR+plCrJkSAMDgSdSiTokKSM3hOjBGWtXl8HeSY +NhaSSIIkTJb2gMzZCOdjGgljAGzyA+Q/zxuqF85daLf7JNSXC5VtPQ1ccsTw+N0MlQMEzkhR +1hPI7HAfHmZWIZ+OxbB2e6nUBpai+loJNuRN2jWOIblaqdtTE03CXG53aE6X7ue/vVSbhfZI +7rA9l0lVXeokaoq6yCAS9cVM3iFunID9KyTVSqWIBTDYI7dIw2GBpl1V+UDKAT4Rra4a3xBn +RVYvc1wDLj7I0oNeCugqJp7pFZaxlMj2/wAiTu3hRzSYgVCzP108oEjEAeKmN2HEdV2XmvAL +ZEOvGpA7W8Q9vlwRHXNB4FMK3cyBYqkmvulLfBFJ4clRJUsxijEjl5ZpgoVAY5YZVjjJboRy +R5ADDV9jNqUwGyLWERuEQOTg5snflRtLaLwb6dyzxz61bTxW6io7NbY7iVWOpEURj6JPEWPq +iSQsWVZcIXfp6vGjx0jD8IqdGqBkucY/lO+ImDEboIAmC3fonH7TqQQBr6fb9ylHrHXt3v1D +UXK4363irjp0pzVRAwRtIHJVXf8AZf8AWM4O7B45ITkMgFj2fs5lIimxpDZ7zEAHwgCeRa6x +BQOKxjnNlxuPvPzQTH+kNH0Woa3UNpp6i6XqwYtkTwFoqaYuc0aqCywjomjmyxQrnpHSRjiR +dRp4nJSpOllN0uvrF5n+aSBxBgyhadXqmkvFzp4/LfZbBPhGtNPYrbbdP0ssZlpa6SObw4yv +TVeEniglgCzKWVCT6oQNgOPmf+bDaLsZtZ2IOjqbI/2lxy+l/Hivrp+SbANwnRUki7q1QnvD +Wg/JJT46r9XWD4q7nrCapvVrt8mmhZaaakYqkjB3Vo2bB6kwVLLhttjjuPQH5VMO2r0SqUGA +Z3VnO8C1gdw4EBeRPzh13N6R4Y5rNwzB51KjgPUKpMV35P6T0kKRKGfWeoJKZoapaiF1UykK +CYJCPJGuWfrwXPUABnLceoKtLaGJrAZera3S8+gNzNoNt5XkqhWwjaZe7tH38ldT4beblIvO +vT1BBpShtVxq9PCOtqaGctFRzrIs8NO8QRVTp6lQkjZpQq4BIbyZ+Z/oRiMd0Tfjg/MMPVkC +P5DNNztSbmD3CdV7U/JX02o4Lpd/pT+y3F0i3X+dpztH/bm8bK73xc2WwaZ1vpzXNnptNUs2 +srHT0tVcZpmmkUU2VjAhJ6FCJVJhlIOQuRlVYUX8qO3alboqcLWd1jsFVdlYY1cM0km4/mAA +4cyDOfm+2H+n6SMx4Bb+pphrnc2EjxJsZ1ueRVf5qyloJhOlfou/yCiHT1qGXwWIMeFGyLly +vmxKxYhsKuD6HFfEPmm9rRJmJLu0QLm5kgCbQG2AvdeQMTlb2w5wtEwBaffedVrC1dTXnU1b +y5lvVvvdXdLrPU3R0QK00FHNUlowJXjwAojkcTthFTpIwoOO2bPFLDdeGPY1jcre5wABkA75 +HZEnjc3pGMc6oWlwOa58J48t8o/sEPKdLpfzqG4az5lWijhjFQ1XUPHSq/iACOldGR52llMM +YLYUpmQ5VcmLxjtqUwOrYxjnTH9Vh8UwQA1sutmMwBBKcpDDOu8ucLd3dzmw1G9AVfzE1RqL +UFm0vpTS1juWtVrqq4PbqSlAorfVH9VGoRHCy+EMsZZCTJI++VVQXXbJw1ClUrYmoS0tDS5x +7RaO0SSdC47hoBbeUkY2q97WgaXgAROmgsY57zvVueSuiG5K6i5XXHmTLZanXuqK240dxlqm +edbEfD8Ja0SwP/vNUryGPojYJAy+HswkIp2KybXZWNFv/D02tc1pbHWCZAuLU3RYw4uGZ0EF +qn6ROEfTY89t0zBnLI9XAX3AWHFI/nNr64y2HTtDZHqaG+PZK20XStw1OZLW1UVhopcKgnGa +clIj4kSjB6mICxXLr8PSq1HUY6uWuhpkdZEu0sGi0neb2UJiGE5abviuL27INjxn3zSVsHLY +XumguNzuMK+JToyRSUbsYz1yBulRuEyNmIHUQ2M44icRjDVcXReePv8AaVptY0gALyv0nfg+ +1Drj4jdRXXmzd9Ppp3R7ENQyTRFZGTGRjP7OOwyfc77BxlYvBfbvSsJTe+oXAgg79ST3nUDc +PFXIvWnqrVes7dqK70vjaaoH/wDotIwwKypU/wD3Tr28NN+nOxIz6DjnuOa6ti21SbD4R3av +PIXjmr3go6rs3H/sePcPU2VYfiB5j1+stW6b+GnljdJjfrnUme/V6b/o+jUdUsjEeuNgPqBx +Ttr4l2LxDdl4V1jdzvUz74DVWjZ+H6mmcXVHdO8n9rnyRJyq0/pXmXq+O6WunVOS+g5pqShq +2YCK63OnX9bOD2aGFwR1/tSg4/ADxf8AZOGovAcwRSpSAdJI18iNd7uQVQ2liXFx3H3buBEn +mInshJTn/f6zmVr256ruV6qbNYbPbnhsyt5jY6GbHzFb0HY19WMIhbPhwrtgu3AO2ape81Hn +La3FrTwH9T//ABaOJT2zMOQQ4C+7kDvP9zu6w5kLzg/HP8Z+m9ZaotXLSxU2nbFyq0+4eCS6 +yisi+YHl+fmiUnxpFA8sAV2LeqAbQFJjarg7LEWE3jdMbyR5K3uw5ogNgRqdb9/haIOm7fqc +1j8T1ZzOv190toCgqqTlBbKW4Vs1ddx13HVFfJTCNq+uHU0Ydy0aJAuY4Y40ROzEy+1cM1lF +oG8iB43J524wBAHFA7Mc6rWcaomcznXmTEX7pAjQABokCSC8zuYFfqb4T7XoGnus9be4ddx1 +EjyHyxxyRVEjOzewkdMe2QANhxWsJsI//clLabhanRqMn/c9h+hV+xfSIM6O4jZDT2qlam// +ALWvk+ZHpwVe9OWim0daA0Z6wArO7filcDb+PYcXDF4l2IqX0CpGCo/p6ZyjVNbSlA3+x9TJ +PKTUS10sr4bdixTBJ/6fy4gdpYgddbcFObOw0UsrtSZKl4ZwmotO21J1kpYqyjppAp6cZkwx ++4DE5+n14BwjM1NzzvBReKec7WzOg9Un77fKiHUvNqhqZWiiEtO0KJ/w4YYZEcH/ABM3iSEk +7nwx+VzwOHzYSgO/1n9lUcdiS3E1i7l5DRRWmtQ0cWkuXddEEpnMtztdQItlhT5qaTp6ScAH +qb27j24NOHf19Vp/tPoAotlVoo03AR8Q9SUIagrIRcUhhkgqIpJ5MlW6QsrIyMMHABzHnPrn +iTwrTlBOsIPFPAOXn6rJpNQ081vhhuXSjMBTPMx6GjfB6fE9OlvMOr9k7djs5TwxpVMzExiX +tqU8tTu996sNypptXT21Ltb7Tda2naSKKsNUqw/NRDqTxRJKVDAN0KzKcYP3zI41rKjQHGCd +O/h43UNhXPpOMi/sT4K1tkul8pKiE1NNBVVOVxHFWQTB42IUgxIxDYYjydixjDZEW1Ix+Dyg +tNpnz+0a8hG9WPDOY6CDJHqP838eSlzr3UunYpJf0dW21zTGKRI6aQhEjkC5VyCvRjqBY4Z/ +1j5Jm6kMo7BpYlxY89kE3tqRreb6cgQAAA0BRGJ2g6mJbGY68vlx79+pQbq/nraKO2Q119qr +pdr3WUc9sompURXePpfxFDO2Y4xJO0rdOPO5/Gx4sWyOijGOyUIaxsE+l7G5gRJExGir20dr +VModUkuMx73X4If1Hc62Sw82qnWNTZbZreQrRUlM9a0SWdLj4Uj04Q+XxAs8iSSnHUFdWGIw +DJYfBk1ML1APUtMukXOSwcbkiYBA1G74jAri3JW68fxIgQT/ADajQX3SudLrKa22ykt1L4qX +a2+JSTxoRO3XGtYHjjWVQoDkL5jk9PScK3Uoafs9r6hFsrjY2Fj1dxEnSflpBT9PEnKHs1E/ +I25eymsmso623JOjT0gZHicSAAq+euXELIMqFkDEtkSFozjLNI9XxGyyKliC06RNtTrMg8xB +ABuZAFipYklpLRc+W7dA7j36C8wFRq+moYqwz1ZhRUZakUkck8a7M2zuw6gFjcg5JISTzyK4 +Xhn/AEtp/hgSbRmga23C3MCBOjW5QlurkdpxtyP3/wA33qsesNd2WW41lZR0cU/6tR1PWCVI +kDNLgrCv6wYknUydUYZZpehFcOOLxgsEWUwwmTyEaiDEzyNwYLRfLCr2Krlz5b7+XDTnxSZo +NU8wbTaK/mTpXTVspdISzrb4fFAdvIyqks/Q5aQqUjUyEgAxnAUd5rE06NctwLpBbJkaSdYn +SfuLoKg51OawuPcaR71XOLSmpP0xV3nVlq07eau5QxVNxsFtlEVeiMJMziMsSpA6WOSS5mBA +JBwFSx9E4cUsNUcwtmHOBLTyzRBjlbdITrqVR1WajQZvA18uPHgoi8UvL6xaoAih1jHZJoxC +0UsFRSzWipEfT1Rg5EkfmkUR7EFMdXSd5HBPxL6WrHP1sQcwPlEHv8028MY4GCG/L7qd01Zr +TcdU0lnqddXH/Zi5p81R1UdzjjEwSPzU8/WcR+UGLLsoymRnbDOLxtenQdXFIB7TBGU7zYje +fD0WhTpueGF0tPvw493eu6Kn0zWJfdA3bUdPqKelbNmuEbfMNV0zHqXwQgYqzFfOIx4jDrLE +iMDjWIxOJYxlZjSJ1abcoMmI3DNyhLZTpODhPdB5+yiOHU+o6/8A2HrOYdNbjWTNLYKWHpDq +gmVQ1XVK4aNJ+r9YkKL4hKvkqQq8QWLqMZ11LCE5XNDi4jUTdrYglsCCdBaJR9AFxa6oJvA5 +c77+A81fH4W7HWaFotPw3G9U96kFVV11TWqxPjO0vmdid+rPUCcncE+vHzm/MjtJuN21ieqb +GUU2AQRGVosB+y+wH5XdmuwXQzCsqfFU655Os53kT4qj/wAcOtp9Y80xa3uk0tPQNKrxoMkO +SnV1dWdzuchQD9SOPX35WdlVMP0Xo5xGaSPFxPvXcF4B/N7tGnU6Z16NO/VtptPIhgPpPzVe ++VNu0Sb585r6tpbbZqZTKYDTSSSV79LeUKgIVQYwp6ty0kQGAXZPQW0zi+qDMJ8Tt53D9zv3 +XO4LzRghSDg6teN3FW+oNYcuOV2o9H6n0dpi6UUsTi33O4zRslDZoJmhEy1vgxFXmU9J6I8h +SUyS3lPO9udGcbt7AVcJjHAUXtgWkuN4iTppciZ3RBV86M9LWbF2ph9qYMEVKTw/WIANx3kT +MHQ+C2Tc49Sxam+G/l9zEtE9HWWy310aSvNT+MPAnXpTIznGTETjsfbGePnR+X2nWwPS3HbC +rsGd7JGYxDqbrgczJEcBzX00/ODs+hjujFDbmHcSxrmvBbvbVbEzprC1Yas1XfNSaq0/drHq +WyAWj/d7RLP4r0b1xDB5BEsJWsqVYqm3VEGdSWZsRr9I9j7EpUsO9pZDTBfAAIbHwkyC1tpJ +MEgxAHaPyoxuMdUfmB003iePM8PHVCepdZfpi6VejdT8xaqPl1ba8RXatmjYV2pW3ZyIxEC8 +atHIqROQsasjEs744mtjbHpYamMZQw4650lrQbMaTa5MTEFxFybWCjMVj3VH9U55yg3nUxc2 +79Pqu+g1ZcubuvdKcu+TtLf6fT9FWJUwQ0kRL1MkTDwGlCM0cZhUqWPUyhiwBO2WdoVGbPo1 +MXi39ojKCTx3DfLzuHAIqm0Yio2lSbYX98hxKe1g0VyQ5Fazumi9d6m1Ladf1cM73K+xU3h0 +lkklhYx/LoQ1Q+7FWqXQ4YN4asA3EJs920tqYVm0WsDabfgpmHF8WzPvA0kNmw+K6cxjqGEq +nCm7jq64A32tJgAyYNyIVVtWc7bzeeX+i9B6frr1TWLTt7rrlQGZ2FPS9bqY46aJnkAYuWnb +beRwMtgcXzEzSxVTEvdd4AA32mST4wNwCr9Ifw20z/KSbjwHp6oy5R8p9R61vNJf+Y0lzrBX +V7Ujw1tWUlKAI7tJIGMit4eVzjrUumBgA8UXH4xjJZSADGgmGjhOgsOG/vUqHSWkmXON55cT +qrfWumqdGWy3/I11m0nfa6P5m4xSiITEBmSFJYyxVGWNFwR5mVlL5bc1bH0xXLWG7GAAGTJJ +u6fE7rJ3Duy0mviXOufd1+lTyx0jadGaKitxVKDSFvpkjmqFUA1LgbogHuTjb7cWfauPZSYX +VD2G6njyHf8AVSmBoOqGPX7fTgqi/Eh8SEegaCSntEL3HXlxhNPb6CPB+TgBwq4HY/tE9tu+ +Bxxzau3qjSWtvXeNP6W7h7+S6TsrZHWG9mj36eqpFy7teoeXmlqex2+puNT8SvNWaSGouijx +ZNPWjqUzzoO46FkUJ/fnkj9EOCejuyX4Wi2kJ6+vcu1yt1PiJtxeRuCZ2/tAPf2DDGWA+Zje +T6kgaK9muNQaH5N6MsPI7RgttClJb1gS30562+XjAJLnsI0x55HOGYknJJ4v2Px1HDUxhKEQ +0AR3ceQ4qq4LBuqVASPDWw08BxOpuvKp8evxvXHXi8xOVPJbUzW3TcVbJbrvqWWt8OW5VZyJ +aWjCgvKVUdLSAbZIGBxQyypXqCtVd2DJvv8ADfPuyvlJlOjTdTb8WhO8k3MWvz89Lnzlaskg +givNzvF5hjgjHgLCF8wY7E77scbb9s778XShhspYxrbm6iq2IaQ6o4oo5cRodC6ouTQw21Z6 +WWGmjx1OIfGhBdj/AHulGAA9W4idrunF02C8G/kfqjdkUwMO9zhFjHdI+iytBwfp2i1LYugT +UDTTTyNjqb5hIVkQr9EEUhP0zwVjWluV7TcfLem8K+aha/Q/MaIWvsgjmpbR4ii5GQmZm/BT +EHzH2yoGM+n58BYUOc4u3KTxTmAAE96b1kdDpHTbIirHW1cfy8ZI/wCCo2Zh/jfDfY8Qm0RF +RzeAKP2e9pYw6yf2QNdbgx1bcZoGgYJVkp0A/hRfLg/Xc5+3BOBpRQaCNR80xtB81y4m8/LR +LLmmj0l5vdZ5GjuCRCRsYHhDqdzn03lk/ILxdNhOmi1u9sqo7akVXP3GPLehOzSKeWepaBlE +lTRaqSTpXGUilV1OP8Qcx49NzxI1Q5uLa/c5nqLqMa4HDFu8O9D+6HtRS9V1vMkyoYpPDqIy +p2dih6mUem8bnB9c+/BmC7LBxuhMSBLp339+Sg7LXxoZhURpVN0MoSQdSE5HmZDs5XAYA5B6 +QTntwe8OcYmECKoBzOEpjUt+uZudwvFTJUXK4NCvjmZxLJWQMDnDtnLAK2Mf3Bj8I4Dw1SBk +0j0T2LlzpF7XVhbLqelqrW9VVV5e3lTUfMKxWJFyvSSQpO3U79ypBK9xniWa1tQjKO1oVDOL +6YkmRqFhzatqaW5XBNCVd91NLOoqKJIo5CqdShMyv6qv+EE4QnbBwXSoNyTiCBFj8kJVqS+G +yQdO5YjXG+1dBWaqv9Z8/V3Co/RkppYvFaiMsatRvSRKSZcnKqiAhH8EEkg8PkEkUcOIAiOZ +BMg+F+YsmZaAXVr6+HAhd931hY9V2u9a11rpC33jUlZRw0i2oXN4pWpKYK00seAJPHeVHLOD +npWVMkvs4zEmk4YPBH+Ylzi2Q3l4k3P0TTqQINWsIMWE681yvmokm/RV1o4Q+qKaOOmr2Msi +w6qMchAhrUUCSmrx47oyHKyvMAjYXhGGq1HNIc05Dx1bpdh3sJE8oghKc1jYc0338+/nG5QF +u5lX2hjq6ShkMRuBFT4dXEi+M34VdBjKsMdXc+bqJGVA4ZxmzWuuRZu8T3x3T5wOKew+KIAy +m6z63W1xvsEdDc6yktydSoyQhmVvN5UUAMT/AMOBMfhHhHOR18D4bZLGmYmJ18PuT49yfdiy +bg+XOUubjAl3ttfU0iXCu0rSyL+lbhTBi5AlczRwq4HWMBJWZiAPKMEglp3PTpuALgKjvhHh +b6jgoyajjAENGvvxUq1T1XC+2LTtZV2Pleq01+r/AAFQB3jVkUIoYL0SN1J5zhsFsEtjgRlV +/UDEVP8AmtOUTe5NuJMctO5EPbfqxdpv4AX970rxfNJ6hvF3umr3r0qZpAIEijPSiegd4+nf +9gufUyNntxKDD1qDGto9rWZOp1Ov3sEK17HuL3mAFJW2q5gypf7toSa/1+j4pXjgadwylF8x +/VPlWJ2wuCcmNe+eIs1MK0NZiwBVIvlGk2iRceifIfmlhJboJ9bLF0xqrWWpZ56KzHRFLdKh +DJNLU0FJC0uCckGROnCpI+SAPKG9SMlV8JRoDM4vyDdLiINrgfeybpve+zQJ7hPh5JkXWtj0 +tRwac1DqCt09eZKd6uuo6GohpKWpjeQM9PV1MMZqAGPiMUA6WC5DbjiBwTBiMQ7EYcZmNiC7 +MSDH8oJy2Gjkfif4bOqfYnhHfdGFy0RQ02huUmjdX1ldbI6gySWd7XSu1DS9cnWsYEzBiziU +OZmHQvmbP4gRqG0av6qvWptnqwA/O7tGLmA0GANA0XJgap+rh2MoAVHzmMtyi06C5IuY8lf7 +Qa1sFjq7PVXaK43GlssFJNWgf8edlPVLge+Af+oZ4+aXTTFjGbWfjni1Ws9wH9oNhfyuvtd0 +M2a3ZWwKOzmf/DQpMP8AuLczvUz8lr15n6Ht+rdecy77Z9RT3a+tVTO9MtEoRqzyhaZGMnnP +4fMAQACDjtx9Cfw1xlXZnR3A0qtMNphguSZy6lxtbXTfI4L5O/jMBtLpZtLFU3yTVduG6GgD +jpfQa8kW6X0ry40JdtA3G7XHTEVLeLPNTV9DVztVMa8GPo8DKSI56lYeIMwo3UOrbp4tb+kF +fEUqv6cFrqdwYtG8OmIMXj4jI0XMqezqTHU+sIIOo5zY8728EHTX7SugbBqPTWiK+o5i1T1C +Q0FDdaRPkKdw6mSqELL+tZXjSMNL0BiHCoyliWazq+MqtxOJp9S0ASQ6XEfyg7hYknLMSJM2 +SQxtNhY05je0QJ4jl5Sr2cgr5c+a/wAE3N/lfquConvFNbquN4E6FeojgkEqdAXZSDHGABgD +oI7HjwX+KGGZ0W/FPA7cw4DaVV7HchnGR8+Mk96+pX4SVR0y/CKvsmsc1ajTq0SN8tHWUT4i +w7uS1d3bm7PcKv8A/pigqbBU14UfNySKJqdUD5SlaONRBEBIerwwDvgdIGD9FsPs1zGZMW4O +vMAQCeLrmT3z4r5RVcVmI6sRI47uG6Fj6R5SXTU0T6hv9bbNP6NpVVq2qdnaCBmXrSnxHvUV +zrjopIj1bgu8ShmUjE7WvkpiapByt0Lo1N5ytBsXERwDiQC3+lEF7jYanXwtqd8Dxi6uroTV +Nm5eX/TEtJqDTFis9rpGutXZ/GlNxbpgdkpq9VWOCJkKiQpFIqxs6FpJJOh1pu0qTHYU1azB +WqEZWuiGS4wcoJzGBbMRmcLCASFK4R7+sy035G7xvtEZtw7hbjuVedS3fmp8TU9jtAtFBWWm +iq5PBu6Qykzo/SoR3/E5VUjUkA56Fyw3LSdDEswLLPMQBlJECOAgRN7czZR9d7XCSBqTI1M8 +ePenLy05M2XTupRS3u2z3WuFOfkLpUCE0SyI58Tw/NkN09IBAMgKNkjB4rW1doVKtMvBvwvM +Ed3frbQ3TNJzqT4e2Gmd8++fBPKo1haNHVdukgpqZZaVq4zVlTMrIsIgIkX5UeI3VMZ2j6sd +ZAJOyqeITDYZzmuIddwuPHebaACALTvuVK1SXFgOjQ4fXTx13qhWtviJa33CmttLXS1s1LEK +Vvl0eMwRJtFE+HTJRcLg7gAAhfWe/wBKq13Go6wOnlHDl+5SKgs0N1A7/JfqMfE78RdBp2Sh +0npIJDbKTKwrGcByBjIHqxIwPYnPHJelXSV9XEAMHZbMe+O7lMrqnR7YzQyXWPy59608XfW5 +vevv0rqe7tFd2jN1vDyHy0NAmVSAk9vEYMSNspEf73FU2ZRc+tNcyR2nHcBub3E3P9o5q4Yq +mWUurpaafeeV78rKz+itS0fKW2Xj4r+aVZNR6lvFtWlsFrrSEe1WgMTExB/DJKXMpGxy/wBu +OmMr/pm/q6s9Y8aHc376mOJcOCojwMQ/qqVwNOJ93850gjz0fHT/AGl1zvlr1DpjlvqistNT +dqlotQX2HAlMPQW+XgIx3yQANvXiEweFq4x3W1BDP/bv5fNTNVlLCM6ukQXmJI3d3vffitFN +XzBSyaNaqoI5oIpRUTmR5M1DgkKqK5/BkDLsNznvvxO1cOauLyAw0QB80ujWZTwuYfEZ7+77 +qtdS9bqCntLVzhjUMsnSo8qgnPb2AA++OLcyGvMblVHszU25t6tVYIn/ANiILVFCymrp62sd +ur/g00bRJAmPQkCR8e7DilYx/wDxDn7wQPEzKtmCY7qGs0Dg4nusB6SsvRGrf/S2/wBJqCzU +VFc6qgqo6qSnqMtA8RV0kgcDJJlillQnuAxI34c/UOdUFtEQ3BtYJB1VcNVVstxmpqOjlkeo +qRFDWOp8yhV6Rk+pb9rHr34sGBwopMzHQaKvY/EuqOLae/XuVv70tLp+gs1tKQE0NoVogBlX +lZAo39Ok9P378c9rzVqudxKueEY2mxo5JCafqhUX2+xxOZIk8QK5PZEgO/59JP58WCrRim0j +eommJqOHD7IH5nOtwtQLsImkp2XxC5xHI0QRV226SQM/Ug+nE90fJa4t3D7qG2+QWgj3ayGt +HvLUW/W6ZMck1PT3DIUeUrlWOPfI/I8TWMEOpuG4kKEwYLmuGlgfJBmqKqVLtDNSkL5OlSP7 +wcYB/NCMfU8G4VvZ7XuyAxDu2Of3UKs0sdZT1dHMYgSHQnBAzggH37n+XBzYTDxIkapm07i5 +acNbakkp7nT1CTxxr+yMN4kan0wyBlHoCeI+qSKsHQiE/SqTTtrP+V02vV1XaBUVdMhmoTE1 +XHT56Q2HTxoQO2M+cAdjn0O79GAYJjd9j9EBXaTcC2v3Tbh5qVwNmrLebOrxThqKedSYt0yj +N0jpJZXKMTglSw2JJ4LpUReZPEcdx+/egalR2WBbh3KfpIrTNSXC7aRuOlK7XD3bxYmn8aB7 +WZXbpWlgbP6sdcw/ujrVjgoG4VW2vVa8Ne1zKQE2i8CO0deFvBM0sC2DkIc/nPoo+G43W+cv +aq2au0nTa0rortWJLcaamSqrbezKkjThurqkCvCvkUhRGSdiQxKe5tHENFBwa0gQNJPPmRxQ +7G/wyXAkzBOun0UFaq6zs1e97vFxoKSaFYIdQLS+PRXlEkQLHXwZYGRVYIrM2VdxkjHVwS+o +/NmY2TvaDDmzva7hbSLpiBJzmDGu48iPFfYa/T9utkdtvdgrtJmoZ5vlr1SS1VtqXYMviQzp ++shDHz9I6lxDFuw343+rNW7X9YAdWEBw5Ft557+QT7gGgtc3LN7gkd49wsq2vQy6RFBQaXkq +bpRVriKqpKyGupK7LRlKeXLYjeRY28oIDnqfBHWOMq7SHWdX1haxwuCC094tu3nuCTSw0U9J +cDqIjfztrosWnvNwsd4nexVkGlTXokFbRTwrWSqA6Hx4aSJZmEpZQAHCL506dgSRC9jmOD+3 +lNj8I7i4wI3mL+aJq0wCA20+931hClTprU1fcafl/a6rTumrMyxPU+NXwzVUwYg4lIwzOvQC +IVChR0jBLZK3Y1rQ7FvBe4ExAIA3WGkcSbnkE0aRc7I2Gjv17z9tF803Z9f8tJtU00tDX0VB +ua9Y6iCOup4VcIJdwxRCGbfoOyk+XGeHK9bC7QYwMeCdwIOUmNN0kcjqmG58O5xe23qPsmHS +ak0nLQV2qLjqy6VF7o6U0tus4twppZnLMVDyQsEKIwJZwoJdx2MYw5X2ZiA0YelSaGvMufmM +jnDpnSAJst/rWAdY5xJGggX8fH0S+0/U3rltNdIqagqbdq4NT1EdweQLUU0ePFOASVIlDxHJ +8xBC75IE0/A0cblql2anBtuPM8eW7go39U+mCy0jfwHAfVNjkZpbR/MfmTeNQ80L3TU8NBH+ +mGokPRDWssqIFeQI4WnVmj6sYJjV/wBljxH7Yr1sDh2UsE21xmO60iBvJPIwBojcAw16rqlT +y5zz3R6wpvnFrK76r5sx8ozqB7tp6n1KwoVki8I06TSI7UzRgKoSAGdRhQAS6g9BUCsY7E0N +mbExG1mNhwpF2tyQ0we9zjNouVcuiGxam1+kOC2XPZfWY3kBmGbwDR5BWlvuuF0poS660jii +hoZpKyqUuSoWCGBniO2/SwjXb2YbZ4+eGw+jz8btWns4mXtyN/6nuAd5ZjPcV9gOmfSangtj +1tqC1P8AiVP+ljSWf9waLawVq6vGur7rOCpsulbfcaelac1lbPBI6SVTspBEhLkspw7AHfzE +YwAOPpLgdkswrGmqZDQAAbgAXG7dyXxo2ntipiqrqg1cS48SXa/NZdhviaPrrTrXULUX6XoO +mit1qil6ZaNUOOtu7IVBchchupgQV2PDWKp/qGHCYcnKbud33jnO+0d6Ca7qyKr7kWA99ygr +DrO11ddUTXrT89XV1VXJUBKAsCruTsoByXBJxvtjYd+Jp9B7BLHCwi/L0Q3XtMgg+C2sfB9r +2Gj1fQ2qQxi0PQiGrp5JpZJYI+sIAwPUFjAdkHUwJI7b4Hh782PQypidiDaTBFSm+ARA1BI4 +GZEmBable+PyNdMv023cTsVxltennb/vpGb97SRxtAVd9ZcodIcoKjmZb9R3av1FRUN3WO0W +qk66KEyNM7gVFSELyvGpjZqaJusrKjqQWJj9HdA+meK21sjAbRpRSbWpgueYeZa3K4AaNlw+ +J1hpHHy1+LPQynsXpHtDZzhmFOo4tboMrznZJFyMrogaxu1Fb7pctccyL1Z7HYLG1fJTL8jT +0tNFFS01GCQDHCqYSHZR1OxZywZpGZs8dQbj8Lh6bqjTBNy51yY3k7/kNwC5I7D1Kju2O4DT +9uasTovkfHcqCW7X4W+oMkqJFbrXD8xB1ksoaWJctI5dR0s3Uq+ciNywBqWKx2Ie5pa0mf53 +WA8Br3CJ0JAT9SpTEsDrjc28+O7mbqyWn79pW126tprjZKa1UdLBFHHSQXBpYqwlWVuuQhJW +cCNZSFXAQyAfjBSCx76jKmWJdNyLEWtAu0XMa6g2EIjCU2Ppuc0Ed8a/M8xGirXzb54UtqvF +JMtwmtNNTw9T9USx4bBwkaKemOI9KYA6ySvde5Ow2zzUouBvmPpxJ3n5IQtPXCTds+v2VRr/ +AK/1NzDlaK1S1dh0zTKQa6qPT4CkAE/4dlUeregPm3l8JgW0xLrkn33p/QwlnS3ihtqfJWKx +Ud0RAPFqqqneTx233TDKQu2cnvnsOJj9M5wDjb33Jl9Uiy/Sg+JK/T6bqblLd7paabUU9HC0 +stS4WnsEPQCvUxwPFZ2P17ceWds4c9cW2DiAJOjBFv8AqJN969BbHeCzMdB598b9w5lVY5KU +GijbdR8weaFcKrTVPWC/6grXVvlalwoWjt0PXvIEiAZ2bHnlIxvkS/R/B0abXPrHMwHMTeC6 +Oy0b+y3UnebDgFtjGV3O6qnabQNw/cfPeIWi3+0u/tIdZ8+9WXDTtgvdVaeXVDNIiQwOQk0m +QojU/tKAMe2QeJzCUK2NrddX0vA5JDRTwdK3xH58uXNaa6u732ut1urb3SVsFsqql56ZZ4WR +ZYjiPxYmYDrLEOnUuRsR6cW2tRydhpvCgqVQEkkb1I8wKSni05RtSxtJBHReHDEQDkGUqNvr +jP14jNmSaxB4qQxpaKUgbpHmo7TWmXeot1Xc2WmstFSmarkZdn9Cm2/m6lQDvkng/E4kAOa2 +5JUWKGYtL/hAurIVNWlBHDDVxCG5S0Mh+XZcSU4YBizAdjhgAvp0jip1Lku3SrVRa4tAPDy4 +eiROu9XW21CSjhjipKWNWYQdRMs8pB6fFbvudyO57bDib2Pgaj+28XKD2zi20zlZoAgDkjRV +N/1lamujEKtRM7hhkybjqGPYL1N/7uniZ6Q1hSwxy8gq9sSX1QHc1ZzX17M1dfJ4UjWGODAJ +3bJZVXq37jpIP2Pvxz/B0hlaeJV7rVgHkDQCPkkboqR2uN5WQLHkTnuRlTEU/mCfqeLNimNb +SCg8OZrO7yh7X0TGzarjHnWCGhmUZGVIqIwR/wDqzfu4ldiCHtJ3yPRRO2STTc2eHzQzp6vp +6S5aQtqy9FXfaeqtrOfwoJI3MX/zaM/9P14msYw9W95HwQfI39FBYeuA5rTbPI89PVBuppZ4 +6uMTp4FTI7xtG+P1UsfhsQcbDBkP3AHrng3CPa5si418DKBxRLSJ1+oj7odujNbqpZUjZIsh +XjOwCM5P/wAW6l/d78FUbi6YxDyLb0xdPV4pHWaKTpp56XrlBzjrR8gj6gp/8iPXgWqwxfcU +uhUFy3eF332Klo52kiYR2urbxo3XtBKylW29RjOR6/u4agm41CUT6oUpIZ6ahusEu6R/q6mI +ksqYOVO3dM9eG9iB7cSFPEhrwdxUfWpS0705aGGWDTtHeKOve7R0UMElVFFMytSMwcBoWO24 +BynZgCBgjgip235A3XfxuEI6wkmY3LLjsms7Pa0vumTd6GmdUrZ5IGaOiqOpCpYRgbOFLEk/ +THYDhtuKoPf1dWNYvrbnwSnUHhudkxqeHkoiyWC92C03M3vVlHQ6ZnaRKilETTQTEAYEuwPS +ylSJEJwMjZtgVi9o06lQMptl45wRf3CapYYtGZ5hvv33oOTU+lgJtO1dtqK3Tq4alqjM3jwP +0lmbHbd2ZsZwPL3A3kxha5IqggP3iLe+aDNVg7Mdn1XLTd+tmmKyptFbdLbetMV6K8kvy7uI +mXIVZIXUHIBKbY8rbHc4axuHr1qcsBa9u6dfEe+SXh6tJj73BXdPq2klpdTW55L3PQpFH+h6 +WvkZcIGXMbFMFlK4KqSQBvnqI4aw2zXNLX2DjOYjf3T68Vj8UIOsbgf2TBntXLjmLrTT9LZ9 +Qy6djqaZpvDkjjC0xXp6qcKFRY2OJOly2O5OyAnVHFYrB0nVKjQ6D58/uI+q0+nRquGQkW9U +tdYWbVNkuBp/01SXikhiECzwy4MUaglogrHqVVbIwcjOPY8S2E2oyq0PIynhr6ofFYMscRqi +3Q18vMdspklXQupbFRhZfCrosS0v426fFROtBmSfHWSuS3SOps8Rm0XUy4w57XOtYiD4G3lf +wT+Ha7LoDHHd3Qsye2UWotTV+pNUyy1VRU1wnqKOjLwQUaZBk+YqJEUZ/YAUAkszDPY6/V1a +FDqaNoEAm5J5NHz0GmicGGaT1lU33x8/FLmz6ovunbrfLbploaeCoqgxrYIZKh46dWJUR5xm +MjpJDLluhc9scH4lorUg/EbhGWQJJ1mN/cYTNJ5Y6KfmmNyn5d1ycxbdU1TyXKztQzTpVxFo +n8Ix4kfolHWPKzRgkbswIPrxyf8AFnpIxmxKjRZ5cwQbgmZaDBgiRmPIXXdfy+bEdW6TUnAW +ax7p4NiHHvglg/ucIVqPiOvdvpuWdPomWokoRPEXIgUsyxxjL9XYKmWjTuMk4Hfbzv8AgN0e +r19tu2m1uYM3ni49nx1PKJXrP81XTClhOj7NkAw+sQ239LLvjxyjxVCaCjpLjXUlttAsdpr1 +PV860b1bSOd1CQwqydQwfMQwBI3ONvbX6aq2kTVJAO7Twk39Qvmz1rM8MEnRP7Rnw1aYu1BZ +9Waj1jcodMEvPdbjLAsNMI0YmSVXYjpjY4jTOZJpMhExkrA4rbldnWUqTAXtAAFyZPwiGgkn +edA0XJ4m0cGx4DnmBqdBYam/lxJ0RPQvbKVqzWujOXtqtsVL1Q0FXfK+PooyH6opIIVESO6A +hnY+InnwTjKumngXUG/p8dWmQC5rG6zqCTJAJs24cRMcQh2IFT+LQZABgEkem6frCI5viM5m +19Bo6nlrYrm9PdkrLtKsMcVOtOsixpHF0ZL/AIRuB0RsZCAjzzM9V6U9EcBjsJiMDhqQax9M +hsC5eb5jPCAOcXkNaF0D8O+n2I6Pbbwe2XvOahUa43J7AsWiOLS5Ojnzy2suveZOm+a81O95 +t1wsiNU06yt0VVRB5UAQEAlkfJyRso3HHAvy29IKmF2ZiejzzFSjUJAjRjvivycPVeqPzv8A +RiizamC6SUD/AAcRSySN7mw6nHfTeB/0obsP6DsEkdrpLalCZIosx0rp4axBWYiSYRkZdR15 +EgClF6mHUDx6RFalTOao6TxN4jgNdeUncvBT6VXECaZ8B7AtvldOoedNmtdjpZKCstgvYpZa +eSoo5DJTxCQlmVWYyMSUA6hkozEeUrGpK4Nd7XPZla0yAdZAgEjzIG7jKfZhxSaWU5c619Bz +4SNO+/FUv1bzhu90q6q3aaoq79IVj4lwWZ5nAVVGAAT5UjHSAowB5O3BNPZwc7rKpmNOXs3v +e+qU05Whje+28pa1lipbLVw3XmFcGud1GWjtSTAurdXaZs/q/tuRkD0IEmzMbU0kkRmKh7hX +Xi9T0tTWtR0tugYtTW2KMGnUY7lT+I+bOTk/kMcSFLDAXNygqmLkwFKUGkDdbfS1Yq41gyyo +DC5CkHcbA+p/j678EurtachGiTSw+doebyvcX8bGob5ded2itFXG6VVZYbtHFf66NyCZqoyE +AdseGoA6VxtgceQtpvdUxoa8yHAOPe43P24L1F0Zot/R54vKrP8AHJzI1PpTlTpfQthnp7fY +q8CeoCKQ7M2YyM5xjpHtnc78WKuJa2j/ACtBPqR5KDwN6zydbepgrzHc5K6eq1saFisVFSxh +IYkGFXdtyD3P14vexWAUc28lQ+13k1Mu5osoegmlm/2ZsUrySWye4QyvGzE4bzqCu/lwB6fX +vxI1rVHO4A/RRrKTYDQNSCnNeKSGi5dSSwqPnEpYoo6hgDJGpmbPTtj+HFeouIxR5kqYxjpw +07wBHmudjhSjoLrWxDrlp6qlpIA/mWPCg+Jg95MsTk5GcYAwOMxddwAA/mmUzhmB0uOohdF6 +r6sW7XGofHkN3ZJU8Yk5AMnScflxE4NodWp0T8M/up3GDq6D6jdVTjWFRLPeKGmkPVCMSkZP +nZxliffjp2zqTRoud4+qZ9Va74eIIo7pqqu6FeqoLYYKd2GSAR1lj7sSAM+oAHFN6WvJp028 +Sp/o80dY88AB6ypOsJlo740hMjTrSSPnfDdYbb/9jxAsYA5o4SrSwdlxO/7/ALpdcuh4jain +clpo6cdLHv8AjYfy4sOPaOw3cT9FCYE/G4agfdYGtir1OvonjRkMQBGO4CggfkQDwds11qR4 +lRm09ajeASIUs2odJxMzMtPXq8W+6lJYwP3jvxbjem88j8iqqy9RnePmFP8AMRvGWurXVfmY +7/csMB+L9cV399gB+XAWyRHYGmVvyH3ROPaHVHE/1O/9ihK6DqiooXJkTwWh8256QG9ff9Wh ++44k6O9R2JNi7eiTTJM1uuMMhJUW4Sgg7q2NyD/1HjVRoLgeaGYSGwOCInVanlvc5ZlDPTKZ +YT7EOox9Rv8Ay4ZeMtYRvRrTNIyh6ydU90o4ZJH6XgmpJCO7xiFgAT9OhD91HCMUcrTG6D6o +Wm45vP5Kb5aFa/U1DYaxPHtVR0+JF1sAQylsYBGwYAj6jiX69zGS3co11JrnS4K5nKKjkqIN +R2We43OaO3NA9LO0365Opjlc9sDp222yfU8VnaVdxqNdxtG6xie9S+BYAMvC/wA7d1kE63tF +PcbpoPx562KJ6yooZI4ZjGJIxEJPMVwerLEZz+Hbtw7sl3VnEBu4Nde95jfu5JnaDZ6p06mP +Sf27kg75bLLBpiliSxWsVLIIxUhGWVOnG4IIBJLFjkHJA9ABxYsFiqr65DnGJ0UbXY0UZAuo +zljZqCpJu1REJqkGoVFcApH0Q9YIUjfPYg5BGRjc5kdpYp7WFrTEx36obBUgXCUXXp6JqTUl +fcbNZrxc4mlYVNRBiRmDFcnwyoOQvbGPMSADgiPwtR4gNcQI96yi6jRlLyLqvsESV7M84AUO +pCKAFGdth/0ji0tpjUqDD5cG7lZnlVyu0rcdUX8XSKrusVHpmsu0Uc7Kymo+TDgsAoyA0hYD +3Azn1j8aZw5PBwGpFvAp1tch3gVCX/R1s0tpfQ9/stVdqS5XGmlknZKgoF6cYC9ONt+xz2H1 +43g6wxGJrUajQWsyxbiJOq1iAWUm1AbkT6LhZtMUmotDarvV5uF9r7hb2RKRpK2Rlhyz5PST +gnyAZIPc+u/DWPq/p67WUgAHa28ErCkuaXOMn9pWHyv5b6d1PWXVLo90MdNRyVarFUFOtw2M +MRvjA9CD9eH9vYt2GpMNMCXEC905gKIqPhx3fUK5PL6C0U+rtXWm2aesVlpadaPrNJB0PVkr +1gzMSS2CuB2GCe+2PJn4242t+jwrHOJzOqOM8bNFtLAmLb17d/KXs+k7F7QrRDmtptHdLnnz +c1s9yTnxK3av/wDUyvsSzKtvoBb4oVKK3UZYBK7t1Agt1SNjYAYG22eOtfl42Lhx0bp4yO3V +c8u8HZABwADR6rk/5nds4iv0rfhah7FBlMNH+5jajieZc4yeAA3KcuT3jTWhv9uLDqS92m8/ +ot69UpjHFAjxReMqiJEC9HWASpyDgZ467h9i4VzDRcyW8ySbkDUmd64A2u8Oa8G5ST53aiu0 +82mpoquehor5RpqasoIZHFIlyl6xJPFESQrNv79IJVelfLxDbGxT+reCZLXFoJ1gaAnenMXh +mF0+MbpU3y20/QauuGjKDU5qb3Q1axUggllKx00QdsCJU6QMY2znGTjvwHiMU8Z3A3mULXql +lM5dysxbNN2OomfFtpKWuttuoZ6OrgjEc0LSupOCB04GThcYOSWDE54h2OqEOfnOptuMWvv9 +e6ya/Wl2UOaDAtZT9Veai8/D3p2+3KGCpro6yCeMkuAjs0gJBDZ274z3AznjzF0dzYP8RcTS +w5gPD50vZrvndfRbp5VG0fwRwGMxgDqlI0w08MtR9If+FlVzUN1uXQKmrrai6SyxsymqbxPl +yzb+Fn8Gdht7D1yT6YrAuqFsxB3Wnv4rwBSeGRkAEpN3etqaiipGeTCyTdLIOxBJ9/Xyjfvw +bRpNbccFj3k+aINd183L9qbSek1itMVWkKVlei/77UrPAkjq03cJ5ioRQq9PcE+bgrDUQ/8A +iPvBsNwgxMceevCEy50Nt7kJcaf09b59W11tqjU1UERmlDO/ndlBI6nGCdxxJYxxp0g5liYC +DZ/Eq9W7SD8k1tR2ezWu70dNSWqlSjntpmELM5WCRlfLxkt1KfKPXH0PEXs7GVXYd1RzpIdH +hb7onEYSm2oGgWI+6qDdq2qmqVVp5VAQN5WIyT3z/r34sZeSSk0BDRC//9k= + +--=-/wKNlseqdbBnOf3qd253ow==-- diff -Nru gmime-2.6.22+dfsg2/tests/data/smime/certificate-authority.crt gmime-3.0.1/tests/data/smime/certificate-authority.crt --- gmime-2.6.22+dfsg2/tests/data/smime/certificate-authority.crt 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/tests/data/smime/certificate-authority.crt 2017-03-11 15:20:39.000000000 +0000 @@ -0,0 +1,38 @@ +-----BEGIN CERTIFICATE----- +MIIGrTCCBJWgAwIBAgIJALvovXIr0jwtMA0GCSqGSIb3DQEBBQUAMIGVMQswCQYD +VQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVzZXR0czEPMA0GA1UEBxMGQm9zdG9u +MR8wHQYDVQQKExZFeGFtcGxlIEF1dGhvcml0eSBJbmMuMRQwEgYDVQQDEwtCcnVj +ZSBXYXluZTEmMCQGCSqGSIb3DQEJARYXYnJ1Y2Uud2F5bmVAZXhhbXBsZS5jb20w +HhcNMTcwMTI4MTQ1NzU0WhcNMTgwMTI4MTQ1NzU0WjCBlTELMAkGA1UEBhMCVVMx +FjAUBgNVBAgTDU1hc3NhY2h1c2V0dHMxDzANBgNVBAcTBkJvc3RvbjEfMB0GA1UE +ChMWRXhhbXBsZSBBdXRob3JpdHkgSW5jLjEUMBIGA1UEAxMLQnJ1Y2UgV2F5bmUx +JjAkBgkqhkiG9w0BCQEWF2JydWNlLndheW5lQGV4YW1wbGUuY29tMIICIjANBgkq +hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA55DcNo5tcbS8VPM1mBj9L+x+9cNqFTlM +4u/v4pE8K5SkYdEUqo/kfhtEoZ7fmj0cv8UEGo1Ffsc1t6UFZWPwWhEFXNdJ65fS +nrSVzRWdxcR9rr+LCEJgOr801Jy8LonTEQUkTmk/oQJ59RTRjtEClLDRaxHh8ANf +zaqVXO5tY8dRpSdG53UjZTccwPKtWOkftNgXgkEE2B5E6MXPdvVolmF86LFvR1xi +yB3Dhu2OkVHFX07pVclcgiKJZQR0/WellC8khXhjsaliWt3ivt3Fv+0CNLBNNLAW +36B4JviT3L/5GF3ffTdje57Hs8kgJDBoVgYp31eutYzk+GTuVhKP3R5SX86tE1d+ +rlsblMKfAB5Q25IodZqo/XKeElYK6vNWjlECAdkp6EJIxaC4wGQRzkBerfta+jTy +2jPwQg34ESm6ZPab+bwsx3ZDF2+GiwRjJPrpJr+NJcB4lDgp9Z16FfiheYeq50Qq +q31CX6PGC73W8ocwzR3caEgBJaGSGPH9ZcpApqr+T9KltiGsrDSHpKQhRrwknZPf +9WVadanYDyf4b73tnvs59y76NTFymlFamYKBNcIUHFQxoDBtT2jWM/aDvAt2xrOL +ebNB7NkkN4mff7/nfeF/kw1w0TVejWuCs+uBN+06ticTJKYG0UW5HjAy96Gfcl9Q +MIfJQXk2kjsCAwEAAaOB/TCB+jAdBgNVHQ4EFgQUVlmZCKclCwDrx/1ENd30uUR8 +4hUwgcoGA1UdIwSBwjCBv4AUVlmZCKclCwDrx/1ENd30uUR84hWhgZukgZgwgZUx +CzAJBgNVBAYTAlVTMRYwFAYDVQQIEw1NYXNzYWNodXNldHRzMQ8wDQYDVQQHEwZC +b3N0b24xHzAdBgNVBAoTFkV4YW1wbGUgQXV0aG9yaXR5IEluYy4xFDASBgNVBAMT +C0JydWNlIFdheW5lMSYwJAYJKoZIhvcNAQkBFhdicnVjZS53YXluZUBleGFtcGxl +LmNvbYIJALvovXIr0jwtMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggIB +AGLfgfX3g9VY5lrrbN6JfG5maB8P2lW6ntwhh9uwXdAL0LqfhQ/5tmIYOiz5oEM7 +q9bbvEZDU1xktN6FW2Os7wKP4PACW/pvyKeAw33+SbWeT/HCZ5LmvnlFZfdmVBBi +pTAjHtoV7rlzr1XABdHRqKvLBmWw4qITGJzSDOZ+ArvoxU3QPjSNag1DKa47aoMu +wtu8c7rYmPADwMOH1sSJTblTJa2gksw3SYz0f5uSRfonTn3Jtc4tMrtyB6PLsEbz +T0w809fW/BhH2b+s10jlh8HpLE52TknCmeJJnDuOMQ7rFy2Q/aDMTWx4Iys6bbWi +e45NCEogKFmiRJfmV0vAVO45U0nsEOHgtgDCHsLqqUJG/ivZb3desrs/041SWuDr +5QQFuTpRkoM0q51V0RZGRqrRhJRr7DK3KuAW6zlrP4TEeMzj+vA3Vy7OE+rP8Gvn +qFPnFz61O193776BwMJTn2ta4G4EQD4eyKqV29BCykmbFq+hLIDYJgy//oc9CQcM +yUdgBMkW0Cx0nldlnSFpxmgP/G5HM+qT1+ZBxRAE7ELCRyfgNLneZd+KN0rnNybi +75WX0IvcdHsbq2dXEqYtvd3bsxwBJtwAnA0R3Fy1OxnxloEDWulJnWuQVs6cIpAz +zH0TlUX3wix3pNKoje2+ObkVliTzYGZnVk5dqbUgII2t +-----END CERTIFICATE----- diff -Nru gmime-2.6.22+dfsg2/tests/data/smime/certificate-authority.key gmime-3.0.1/tests/data/smime/certificate-authority.key --- gmime-2.6.22+dfsg2/tests/data/smime/certificate-authority.key 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/tests/data/smime/certificate-authority.key 2017-03-11 15:20:39.000000000 +0000 @@ -0,0 +1,54 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,6BC13F6FCDF6F5A3 + +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 +-----END RSA PRIVATE KEY----- Binary files /tmp/tmpIS_RQQ/UDbh1D_L26/gmime-2.6.22+dfsg2/tests/data/smime/smime.crt and /tmp/tmpIS_RQQ/lUbmpdA4HT/gmime-3.0.1/tests/data/smime/smime.crt differ diff -Nru gmime-2.6.22+dfsg2/tests/data/smime/smime.csr gmime-3.0.1/tests/data/smime/smime.csr --- gmime-2.6.22+dfsg2/tests/data/smime/smime.csr 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/tests/data/smime/smime.csr 2017-03-11 15:20:39.000000000 +0000 @@ -0,0 +1,28 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIEuzCCAqMCAQAwdjELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDU1hc3NhY2h1c2V0 +dHMxDzANBgNVBAcTBkJvc3RvbjEaMBgGA1UEAxMRTWltZUtpdCBVbml0VGVzdHMx +IjAgBgkqhkiG9w0BCQEWE21pbWVraXRAZXhhbXBsZS5jb20wggIiMA0GCSqGSIb3 +DQEBAQUAA4ICDwAwggIKAoICAQDiL/fSE7edtgFG4Hl0Ym0fJR1Cr3ydhbR2e2eZ +ywZ7VryZjnUSh9wbh1O0DlStUq1sxa7GXONtWKOshNLWRXfmvP9FRKCBM8fawPAd +zt1BehT2VqK7XbI29W/zO4HBP17ODRnYqsYwtw+NE7K+Qb6dOD9Lb3DE/vSiNATj +yz/5J48j/0B5adG598a5e7IOFRoSWYip8uMqVvWz7Sn4i+e4dW3r1ef2Mns8Fis4 +0pqGHoa4ZXbgDXZ5b++HbOZXLPtLNMWDNFMjRBKQiplS7F1nu21GtDKTFMBhoLrx +8buKRF2tZVAdOqEXlolabUfu9BuYomcg8DiZymgI1ly38RxlGgMEv23h+b+oYmLI +1eU1V1SnLBUFFC4zYxulfqZ8gaxuwQMmEpZ2ILANzddhcmTky6Re7TTSHhFwzk7m +4ir7wAHYtUxc7Jy1N2vTojrPJHIkz75LRjgcKU4//gHL7vjEbRhqXUcUsjpTIWB/ +i76RLS8fBeogOi2BR2AzZsHaf+K2ZjZqRfPmrPHvefZJlX8V0RkEkXzRLcJdV7Xs +4y0Zm6iDyoRc38CHB4Z96jgqA4Iol2ih0tvG2PxGh0uTkCCU3pOvYGrWi7wSQjmu +/TkbbkgQEtkiRUGPu89w3sO3841UrzA/8KoTNTAtu4cw9a8jxeIRI5CWRJBuSe6P +FYYnpQIDAQABoAAwDQYJKoZIhvcNAQEFBQADggIBAODwn3Na2aUqGkB3xoszYVcf +LbA1M+B6Yl9UGzxzEsd6CxAud81uDMiZ3a453VH4MOXe1lO5+/lAhDOIwglpOi0v +jvpgd4aA0UQaccGgwFGCXAvl1MndojGFK0YnoXguH10ifQOjgH2mPn4q48+vw+yI +PPi8pcDTEVYm/vQ7zL7pUacUKf6VR5nNce0VqXW8ZVantxwRfVSDhyTi+BTpxAu0 +AysKxpg9swfb2TVqBC8r21b8CiIAgcoEpTY7bfW/780N/jRD18ONrmlWpvvWPNln +qzsRae7fob0bEkszxWbJ7lrbggnWwQ7EBnKszIkxnDMtyb5CRWLGJ8paCVhWerJR +5r7iJ9/tWaxqjWB9E08a/YTsmvro9icOXJGGr/+NBPgiVNYO9rzvVlzIL1vlEE4E +yO0rxkzLMselZx8/jlxPfQ/vKHEavG9MDmN1hWXAOibM2N44Q8PbLLcO4Hiz90m2 +muh+dimtnjTM3SvOO86xzWq8XE/ME6Zlk8zzU/C7Wpf7zIz8rJSzBYdIJZRd1dwl +kayFX9nHF5E0WppQArTh2bR7I7IPmrPHolNtZ0ZVlH9UYbHcT7b0rMWaLlH9HMfj +i9lxxOGMpKo1Yjo1PJCIaJBrltmWWz8YQzyHMJ0lfwXqi28XzL8w1hcl+//UnDQU +ISZ8a4bBphS3h96mSegw +-----END CERTIFICATE REQUEST----- diff -Nru gmime-2.6.22+dfsg2/tests/data/smime/smime.key gmime-3.0.1/tests/data/smime/smime.key --- gmime-2.6.22+dfsg2/tests/data/smime/smime.key 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/tests/data/smime/smime.key 2017-03-11 15:20:39.000000000 +0000 @@ -0,0 +1,54 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,8C17FBD133F443B3 + +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 +-----END RSA PRIVATE KEY----- Binary files /tmp/tmpIS_RQQ/UDbh1D_L26/gmime-2.6.22+dfsg2/tests/data/smime/smime.p12 and /tmp/tmpIS_RQQ/lUbmpdA4HT/gmime-3.0.1/tests/data/smime/smime.p12 differ diff -Nru gmime-2.6.22+dfsg2/tests/Makefile.am gmime-3.0.1/tests/Makefile.am --- gmime-2.6.22+dfsg2/tests/Makefile.am 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/tests/Makefile.am 2017-05-06 14:11:44.000000000 +0000 @@ -14,10 +14,11 @@ test-streams \ test-cat \ test-headers \ + test-partial \ test-mbox \ test-mime -if ENABLE_CRYPTOGRAPHY +if ENABLE_CRYPTO AUTOMATED_TESTS += \ test-pgp \ test-pgpmime @@ -26,11 +27,10 @@ MANUAL_TESTS = \ test-best \ test-parser \ - test-html \ - test-partial + test-html -if ENABLE_CRYPTOGRAPHY -MANUAL_TESTS += \ +if ENABLE_CRYPTO +MANUAL_TESTS += \ test-pkcs7 \ test-smime endif @@ -85,12 +85,12 @@ test_iconv_DEPENDENCIES = $(DEPS) test_iconv_LDADD = $(LDADDS) -test_partial_SOURCES = test-partial.c +test_partial_SOURCES = test-partial.c testsuite.c testsuite.h test_partial_LDFLAGS = test_partial_DEPENDENCIES = $(DEPS) test_partial_LDADD = $(LDADDS) -if ENABLE_CRYPTOGRAPHY +if ENABLE_CRYPTO test_pgp_SOURCES = test-pgp.c testsuite.c testsuite.h test_pgp_LDFLAGS = test_pgp_DEPENDENCIES = $(DEPS) @@ -112,8 +112,9 @@ test_smime_LDADD = $(LDADDS) endif -EXTRA_DIST = $(wildcard empty*.msg message.eml message-partial.*.eml rfc2060.msg \ - data/pgp*/gmime.gpg.* data/mbox/*put/jwz.mbox data/mbox/*put/substring.mbox) +EXTRA_DIST = $(wildcard empty*.msg rfc2060.msg data/pgp*/* data/smime/* \ + data/partial/input/photo-discuss/*.eml data/partial/output/* \ + data/mbox/*put/substring.mbox) VERBOSITY=-v diff -Nru gmime-2.6.22+dfsg2/tests/Makefile.in gmime-3.0.1/tests/Makefile.in --- gmime-2.6.22+dfsg2/tests/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/tests/Makefile.in 2017-05-21 16:38:03.000000000 +0000 @@ -0,0 +1,1045 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +@ENABLE_CRYPTO_TRUE@am__append_1 = \ +@ENABLE_CRYPTO_TRUE@ test-pgp \ +@ENABLE_CRYPTO_TRUE@ test-pgpmime + +@ENABLE_CRYPTO_TRUE@am__append_2 = \ +@ENABLE_CRYPTO_TRUE@ test-pkcs7 \ +@ENABLE_CRYPTO_TRUE@ test-smime + +noinst_PROGRAMS = $(am__EXEEXT_2) $(am__EXEEXT_4) +subdir = tests +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gpgme.m4 \ + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/introspection.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/vapigen.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +@ENABLE_CRYPTO_TRUE@am__EXEEXT_1 = test-pgp$(EXEEXT) \ +@ENABLE_CRYPTO_TRUE@ test-pgpmime$(EXEEXT) +am__EXEEXT_2 = test-iconv$(EXEEXT) test-streams$(EXEEXT) \ + test-cat$(EXEEXT) test-headers$(EXEEXT) test-partial$(EXEEXT) \ + test-mbox$(EXEEXT) test-mime$(EXEEXT) $(am__EXEEXT_1) +@ENABLE_CRYPTO_TRUE@am__EXEEXT_3 = test-pkcs7$(EXEEXT) \ +@ENABLE_CRYPTO_TRUE@ test-smime$(EXEEXT) +am__EXEEXT_4 = test-best$(EXEEXT) test-parser$(EXEEXT) \ + test-html$(EXEEXT) $(am__EXEEXT_3) +PROGRAMS = $(noinst_PROGRAMS) +am_test_best_OBJECTS = test-best.$(OBJEXT) +test_best_OBJECTS = $(am_test_best_OBJECTS) +am__DEPENDENCIES_1 = +am__DEPENDENCIES_2 = \ + $(top_builddir)/gmime/libgmime-$(GMIME_API_VERSION).la \ + $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +test_best_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(test_best_LDFLAGS) $(LDFLAGS) -o $@ +am_test_cat_OBJECTS = test-cat.$(OBJEXT) testsuite.$(OBJEXT) +test_cat_OBJECTS = $(am_test_cat_OBJECTS) +test_cat_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(test_cat_LDFLAGS) $(LDFLAGS) -o $@ +am_test_headers_OBJECTS = test-headers.$(OBJEXT) testsuite.$(OBJEXT) +test_headers_OBJECTS = $(am_test_headers_OBJECTS) +test_headers_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(test_headers_LDFLAGS) $(LDFLAGS) -o $@ +am_test_html_OBJECTS = test-html.$(OBJEXT) +test_html_OBJECTS = $(am_test_html_OBJECTS) +test_html_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(test_html_LDFLAGS) $(LDFLAGS) -o $@ +am_test_iconv_OBJECTS = test-iconv.$(OBJEXT) testsuite.$(OBJEXT) +test_iconv_OBJECTS = $(am_test_iconv_OBJECTS) +test_iconv_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(test_iconv_LDFLAGS) $(LDFLAGS) -o $@ +am_test_mbox_OBJECTS = test-mbox.$(OBJEXT) testsuite.$(OBJEXT) +test_mbox_OBJECTS = $(am_test_mbox_OBJECTS) +test_mbox_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(test_mbox_LDFLAGS) $(LDFLAGS) -o $@ +am_test_mime_OBJECTS = test-mime.$(OBJEXT) testsuite.$(OBJEXT) +test_mime_OBJECTS = $(am_test_mime_OBJECTS) +test_mime_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(test_mime_LDFLAGS) $(LDFLAGS) -o $@ +am_test_parser_OBJECTS = test-parser.$(OBJEXT) +test_parser_OBJECTS = $(am_test_parser_OBJECTS) +test_parser_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(test_parser_LDFLAGS) $(LDFLAGS) -o $@ +am_test_partial_OBJECTS = test-partial.$(OBJEXT) testsuite.$(OBJEXT) +test_partial_OBJECTS = $(am_test_partial_OBJECTS) +test_partial_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(test_partial_LDFLAGS) $(LDFLAGS) -o $@ +am__test_pgp_SOURCES_DIST = test-pgp.c testsuite.c testsuite.h +@ENABLE_CRYPTO_TRUE@am_test_pgp_OBJECTS = test-pgp.$(OBJEXT) \ +@ENABLE_CRYPTO_TRUE@ testsuite.$(OBJEXT) +test_pgp_OBJECTS = $(am_test_pgp_OBJECTS) +test_pgp_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(test_pgp_LDFLAGS) $(LDFLAGS) -o $@ +am__test_pgpmime_SOURCES_DIST = test-pgpmime.c testsuite.c testsuite.h +@ENABLE_CRYPTO_TRUE@am_test_pgpmime_OBJECTS = test-pgpmime.$(OBJEXT) \ +@ENABLE_CRYPTO_TRUE@ testsuite.$(OBJEXT) +test_pgpmime_OBJECTS = $(am_test_pgpmime_OBJECTS) +test_pgpmime_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(test_pgpmime_LDFLAGS) $(LDFLAGS) -o $@ +am__test_pkcs7_SOURCES_DIST = test-pkcs7.c testsuite.c testsuite.h +@ENABLE_CRYPTO_TRUE@am_test_pkcs7_OBJECTS = test-pkcs7.$(OBJEXT) \ +@ENABLE_CRYPTO_TRUE@ testsuite.$(OBJEXT) +test_pkcs7_OBJECTS = $(am_test_pkcs7_OBJECTS) +test_pkcs7_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(test_pkcs7_LDFLAGS) $(LDFLAGS) -o $@ +am__test_smime_SOURCES_DIST = test-smime.c testsuite.c testsuite.h +@ENABLE_CRYPTO_TRUE@am_test_smime_OBJECTS = test-smime.$(OBJEXT) \ +@ENABLE_CRYPTO_TRUE@ testsuite.$(OBJEXT) +test_smime_OBJECTS = $(am_test_smime_OBJECTS) +test_smime_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(test_smime_LDFLAGS) $(LDFLAGS) -o $@ +am_test_streams_OBJECTS = test-streams.$(OBJEXT) testsuite.$(OBJEXT) +test_streams_OBJECTS = $(am_test_streams_OBJECTS) +test_streams_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(test_streams_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(test_best_SOURCES) $(test_cat_SOURCES) \ + $(test_headers_SOURCES) $(test_html_SOURCES) \ + $(test_iconv_SOURCES) $(test_mbox_SOURCES) \ + $(test_mime_SOURCES) $(test_parser_SOURCES) \ + $(test_partial_SOURCES) $(test_pgp_SOURCES) \ + $(test_pgpmime_SOURCES) $(test_pkcs7_SOURCES) \ + $(test_smime_SOURCES) $(test_streams_SOURCES) +DIST_SOURCES = $(test_best_SOURCES) $(test_cat_SOURCES) \ + $(test_headers_SOURCES) $(test_html_SOURCES) \ + $(test_iconv_SOURCES) $(test_mbox_SOURCES) \ + $(test_mime_SOURCES) $(test_parser_SOURCES) \ + $(test_partial_SOURCES) $(am__test_pgp_SOURCES_DIST) \ + $(am__test_pgpmime_SOURCES_DIST) \ + $(am__test_pkcs7_SOURCES_DIST) $(am__test_smime_SOURCES_DIST) \ + $(test_streams_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DB2HTML = @DB2HTML@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DOLT_BASH = @DOLT_BASH@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMIME_API_VERSION = @GMIME_API_VERSION@ +GMIME_BINARY_AGE = @GMIME_BINARY_AGE@ +GMIME_CFLAGS = @GMIME_CFLAGS@ +GMIME_INCLUDEDIR = @GMIME_INCLUDEDIR@ +GMIME_INTERFACE_AGE = @GMIME_INTERFACE_AGE@ +GMIME_LIBDIR = @GMIME_LIBDIR@ +GMIME_LIBS = @GMIME_LIBS@ +GMIME_LIBS_PRIVATE = @GMIME_LIBS_PRIVATE@ +GMIME_MAJOR_VERSION = @GMIME_MAJOR_VERSION@ +GMIME_MICRO_VERSION = @GMIME_MICRO_VERSION@ +GMIME_MINOR_VERSION = @GMIME_MINOR_VERSION@ +GMIME_VERSION = @GMIME_VERSION@ +GOBJECT_QUERY = @GOBJECT_QUERY@ +GPGME_CONFIG = @GPGME_CONFIG@ +GPGME_PTHREAD_CFLAGS = @GPGME_PTHREAD_CFLAGS@ +GPGME_PTHREAD_LIBS = @GPGME_PTHREAD_LIBS@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBIDN_CFLAGS = @LIBIDN_CFLAGS@ +LIBIDN_LIBS = @LIBIDN_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTCOMPILE = @LTCOMPILE@ +LTCXXCOMPILE = @LTCXXCOMPILE@ +LTLIBOBJS = @LTLIBOBJS@ +LTP = @LTP@ +LTP_GENHTML = @LTP_GENHTML@ +LT_AGE = @LT_AGE@ +LT_CURRENT = @LT_CURRENT@ +LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@ +LT_RELEASE = @LT_RELEASE@ +LT_REVISION = @LT_REVISION@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MV = @MV@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM = @RM@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHTOOL = @SHTOOL@ +STRIP = @STRIP@ +TAR = @TAR@ +VAPIGEN = @VAPIGEN@ +VAPIGEN_MAKEFILE = @VAPIGEN_MAKEFILE@ +VAPIGEN_VAPIDIR = @VAPIGEN_VAPIDIR@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = . +AM_CPPFLAGS = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/util \ + -DG_LOG_DOMAIN=\"gmime-tests\" \ + $(GMIME_CFLAGS) \ + $(GLIB_CFLAGS) + +AUTOMATED_TESTS = test-iconv test-streams test-cat test-headers \ + test-partial test-mbox test-mime $(am__append_1) +MANUAL_TESTS = test-best test-parser test-html $(am__append_2) +DEPS = $(top_builddir)/gmime/libgmime-$(GMIME_API_VERSION).la +LDADDS = $(top_builddir)/gmime/libgmime-$(GMIME_API_VERSION).la $(GLIB_LIBS) +test_best_SOURCES = test-best.c +test_best_LDFLAGS = +test_best_DEPENDENCIES = $(DEPS) +test_best_LDADD = $(LDADDS) +test_mime_SOURCES = test-mime.c testsuite.c testsuite.h +test_mime_LDFLAGS = +test_mime_DEPENDENCIES = $(DEPS) +test_mime_LDADD = $(LDADDS) +test_headers_SOURCES = test-headers.c testsuite.c testsuite.h +test_headers_LDFLAGS = +test_headers_DEPENDENCIES = $(DEPS) +test_headers_LDADD = $(LDADDS) +test_parser_SOURCES = test-parser.c +test_parser_LDFLAGS = +test_parser_DEPENDENCIES = $(DEPS) +test_parser_LDADD = $(LDADDS) +test_mbox_SOURCES = test-mbox.c testsuite.c testsuite.h +test_mbox_LDFLAGS = +test_mbox_DEPENDENCIES = $(DEPS) +test_mbox_LDADD = $(LDADDS) +test_streams_SOURCES = test-streams.c testsuite.c testsuite.h +test_streams_LDFLAGS = +test_streams_DEPENDENCIES = $(DEPS) +test_streams_LDADD = $(LDADDS) +test_cat_SOURCES = test-cat.c testsuite.c testsuite.h +test_cat_LDFLAGS = +test_cat_DEPENDENCIES = $(DEPS) +test_cat_LDADD = $(LDADDS) +test_html_SOURCES = test-html.c +test_html_LDFLAGS = +test_html_DEPENDENCIES = $(DEPS) +test_html_LDADD = $(LDADDS) +test_iconv_SOURCES = test-iconv.c testsuite.c testsuite.h +test_iconv_LDFLAGS = +test_iconv_DEPENDENCIES = $(DEPS) +test_iconv_LDADD = $(LDADDS) +test_partial_SOURCES = test-partial.c testsuite.c testsuite.h +test_partial_LDFLAGS = +test_partial_DEPENDENCIES = $(DEPS) +test_partial_LDADD = $(LDADDS) +@ENABLE_CRYPTO_TRUE@test_pgp_SOURCES = test-pgp.c testsuite.c testsuite.h +@ENABLE_CRYPTO_TRUE@test_pgp_LDFLAGS = +@ENABLE_CRYPTO_TRUE@test_pgp_DEPENDENCIES = $(DEPS) +@ENABLE_CRYPTO_TRUE@test_pgp_LDADD = $(LDADDS) +@ENABLE_CRYPTO_TRUE@test_pgpmime_SOURCES = test-pgpmime.c testsuite.c testsuite.h +@ENABLE_CRYPTO_TRUE@test_pgpmime_LDFLAGS = +@ENABLE_CRYPTO_TRUE@test_pgpmime_DEPENDENCIES = $(DEPS) +@ENABLE_CRYPTO_TRUE@test_pgpmime_LDADD = $(LDADDS) +@ENABLE_CRYPTO_TRUE@test_pkcs7_SOURCES = test-pkcs7.c testsuite.c testsuite.h +@ENABLE_CRYPTO_TRUE@test_pkcs7_LDFLAGS = +@ENABLE_CRYPTO_TRUE@test_pkcs7_DEPENDENCIES = $(DEPS) +@ENABLE_CRYPTO_TRUE@test_pkcs7_LDADD = $(LDADDS) $(GPGME_PTHREAD_LIBS) -lgpg-error +@ENABLE_CRYPTO_TRUE@test_smime_SOURCES = test-smime.c testsuite.c testsuite.h +@ENABLE_CRYPTO_TRUE@test_smime_LDFLAGS = +@ENABLE_CRYPTO_TRUE@test_smime_DEPENDENCIES = $(DEPS) +@ENABLE_CRYPTO_TRUE@test_smime_LDADD = $(LDADDS) +EXTRA_DIST = $(wildcard empty*.msg rfc2060.msg data/pgp*/* data/smime/* \ + data/partial/input/photo-discuss/*.eml data/partial/output/* \ + data/mbox/*put/substring.mbox) + +VERBOSITY = -v +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu tests/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +test-best$(EXEEXT): $(test_best_OBJECTS) $(test_best_DEPENDENCIES) $(EXTRA_test_best_DEPENDENCIES) + @rm -f test-best$(EXEEXT) + $(AM_V_CCLD)$(test_best_LINK) $(test_best_OBJECTS) $(test_best_LDADD) $(LIBS) + +test-cat$(EXEEXT): $(test_cat_OBJECTS) $(test_cat_DEPENDENCIES) $(EXTRA_test_cat_DEPENDENCIES) + @rm -f test-cat$(EXEEXT) + $(AM_V_CCLD)$(test_cat_LINK) $(test_cat_OBJECTS) $(test_cat_LDADD) $(LIBS) + +test-headers$(EXEEXT): $(test_headers_OBJECTS) $(test_headers_DEPENDENCIES) $(EXTRA_test_headers_DEPENDENCIES) + @rm -f test-headers$(EXEEXT) + $(AM_V_CCLD)$(test_headers_LINK) $(test_headers_OBJECTS) $(test_headers_LDADD) $(LIBS) + +test-html$(EXEEXT): $(test_html_OBJECTS) $(test_html_DEPENDENCIES) $(EXTRA_test_html_DEPENDENCIES) + @rm -f test-html$(EXEEXT) + $(AM_V_CCLD)$(test_html_LINK) $(test_html_OBJECTS) $(test_html_LDADD) $(LIBS) + +test-iconv$(EXEEXT): $(test_iconv_OBJECTS) $(test_iconv_DEPENDENCIES) $(EXTRA_test_iconv_DEPENDENCIES) + @rm -f test-iconv$(EXEEXT) + $(AM_V_CCLD)$(test_iconv_LINK) $(test_iconv_OBJECTS) $(test_iconv_LDADD) $(LIBS) + +test-mbox$(EXEEXT): $(test_mbox_OBJECTS) $(test_mbox_DEPENDENCIES) $(EXTRA_test_mbox_DEPENDENCIES) + @rm -f test-mbox$(EXEEXT) + $(AM_V_CCLD)$(test_mbox_LINK) $(test_mbox_OBJECTS) $(test_mbox_LDADD) $(LIBS) + +test-mime$(EXEEXT): $(test_mime_OBJECTS) $(test_mime_DEPENDENCIES) $(EXTRA_test_mime_DEPENDENCIES) + @rm -f test-mime$(EXEEXT) + $(AM_V_CCLD)$(test_mime_LINK) $(test_mime_OBJECTS) $(test_mime_LDADD) $(LIBS) + +test-parser$(EXEEXT): $(test_parser_OBJECTS) $(test_parser_DEPENDENCIES) $(EXTRA_test_parser_DEPENDENCIES) + @rm -f test-parser$(EXEEXT) + $(AM_V_CCLD)$(test_parser_LINK) $(test_parser_OBJECTS) $(test_parser_LDADD) $(LIBS) + +test-partial$(EXEEXT): $(test_partial_OBJECTS) $(test_partial_DEPENDENCIES) $(EXTRA_test_partial_DEPENDENCIES) + @rm -f test-partial$(EXEEXT) + $(AM_V_CCLD)$(test_partial_LINK) $(test_partial_OBJECTS) $(test_partial_LDADD) $(LIBS) + +test-pgp$(EXEEXT): $(test_pgp_OBJECTS) $(test_pgp_DEPENDENCIES) $(EXTRA_test_pgp_DEPENDENCIES) + @rm -f test-pgp$(EXEEXT) + $(AM_V_CCLD)$(test_pgp_LINK) $(test_pgp_OBJECTS) $(test_pgp_LDADD) $(LIBS) + +test-pgpmime$(EXEEXT): $(test_pgpmime_OBJECTS) $(test_pgpmime_DEPENDENCIES) $(EXTRA_test_pgpmime_DEPENDENCIES) + @rm -f test-pgpmime$(EXEEXT) + $(AM_V_CCLD)$(test_pgpmime_LINK) $(test_pgpmime_OBJECTS) $(test_pgpmime_LDADD) $(LIBS) + +test-pkcs7$(EXEEXT): $(test_pkcs7_OBJECTS) $(test_pkcs7_DEPENDENCIES) $(EXTRA_test_pkcs7_DEPENDENCIES) + @rm -f test-pkcs7$(EXEEXT) + $(AM_V_CCLD)$(test_pkcs7_LINK) $(test_pkcs7_OBJECTS) $(test_pkcs7_LDADD) $(LIBS) + +test-smime$(EXEEXT): $(test_smime_OBJECTS) $(test_smime_DEPENDENCIES) $(EXTRA_test_smime_DEPENDENCIES) + @rm -f test-smime$(EXEEXT) + $(AM_V_CCLD)$(test_smime_LINK) $(test_smime_OBJECTS) $(test_smime_LDADD) $(LIBS) + +test-streams$(EXEEXT): $(test_streams_OBJECTS) $(test_streams_DEPENDENCIES) $(EXTRA_test_streams_DEPENDENCIES) + @rm -f test-streams$(EXEEXT) + $(AM_V_CCLD)$(test_streams_LINK) $(test_streams_OBJECTS) $(test_streams_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-best.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-cat.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-headers.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-html.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-iconv.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-mbox.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-mime.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-parser.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-partial.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-pgp.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-pgpmime.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-pkcs7.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-smime.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-streams.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testsuite.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-recursive +all-am: Makefile $(PROGRAMS) +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-local distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(am__recursive_targets) check-am install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-am check-local clean clean-generic clean-libtool \ + clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-local distclean-tags distdir dvi dvi-am html html-am \ + info info-am install install-am install-data install-data-am \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-html install-html-am install-info install-info-am \ + install-man install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +check-local: $(AUTOMATED_TESTS) + failed_tests=""; \ + failed=0; \ + passed=0; \ + \ + for test in $(AUTOMATED_TESTS); do \ + testdatadir="data/`echo $${test} | sed -e 's/test-//'`"; \ + testdir="$(srcdir)/$${testdatadir}"; \ + if [ ! -d "$${testdir}" ]; then \ + testdir="$${testdatadir}"; \ + fi; \ + ./$${test} $(VERBOSITY) $${testdir}; \ + if [ $$? -ne 0 ]; then \ + failed_tests="$${failed_tests}\n $${test}"; \ + failed=`expr $${failed} + 1`; \ + else \ + passed=`expr $${passed} + 1`; \ + fi; \ + done; \ + \ + echo "Results: $${passed} tests passed; $${failed} tests failed."; \ + if [ $${failed} -ne 0 ]; then \ + echo -e "Failed tests: $${failed_tests}"; \ + exit -1; \ + fi + +distclean-local: + rm -rf tmp data/streams/input data/streams/output + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff -Nru gmime-2.6.22+dfsg2/tests/message.eml gmime-3.0.1/tests/message.eml --- gmime-2.6.22+dfsg2/tests/message.eml 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/tests/message.eml 1970-01-01 00:00:00.000000000 +0000 @@ -1,2439 +0,0 @@ -From: anonymous@mit.edu -Date: Tue, 28 Mar 2017 18:40:37 -0400 -Subject: Photo of a girl with feather earrings -Message-Id: <6MCVORPHW0U4.BCPTXD0EM9BT3@mit.edu> -To: photo-discuss@lists.nesop.edu -MIME-Version: 1.0 -Content-Type: multipart/mixed; boundary="=-/wKNlseqdbBnOf3qd253ow==" - ---=-/wKNlseqdbBnOf3qd253ow== -Content-Type: text/plain; charset=utf-8 -Content-Transfer-Encoding: quoted-printable - -Hey all, - -Took the attached photo of a girl on the subway. Just thought her earr= -ings were really cool looking. - -What do you think? - ---=-/wKNlseqdbBnOf3qd253ow== -Content-Type: image/jpeg; name=earrings.jpg -Content-Disposition: attachment; filename=earrings.jpg -Content-Transfer-Encoding: base64 - -/9j/4AAQSkZJRgABAQEASABIAAD/4gxYSUNDX1BST0ZJTEUAAQEAAAxITGlubwIQAABtbnRy -UkdCIFhZWiAHzgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA -9tYAAQAAAADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAA -ABRyWFlaAAACGAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRk -AAACxAAAAIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAA -ACR0ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0 -AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAA -AAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAA -AAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQ -WFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z2Rlc2MAAAAAAAAAFklF -QyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAA -AC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAA -AAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0 -aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRp -dGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAA -ABOk/gAUXy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAA -AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQA -AAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACB -AIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwEN -ARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJ -AdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLB -AssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5 -BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3 -BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9 -B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglP -CWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuw -C8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5k -Dn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFt -EYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTO -FPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiK -GK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyj -HMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEc -IUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3 -JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2 -K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDb -MRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbp -NyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1h -PaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RH -RIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0ua -S+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1Nf -U6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuV -W+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RA -ZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1g -bbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4 -d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEK -gWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuW -i/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaf -lwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqIm -opajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4t -rqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1 -uy67p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/ -yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO -1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj -4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/ -8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t////7Rpm -UGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAI0cAgAAAohxHAJQAB5QaG90b2dyYXBoZXI6IEpl -ZmZyZXkgU3RlZGZhc3QcAhkADW1hc3NhY2h1c2V0dHMcAhkACXBvcnRyYWl0cxwCGQANMTAw -IHN0cmFuZ2VycxwCGQAMbm9ydGggcXVpbmN5HAJ0ABtDb3B5cmlnaHQ6IEplZmZyZXkgU3Rl -ZGZhc3QAOEJJTQQlAAAAAAAQjGjE2Zu5v42TrLLrKSzP0zhCSU0D7QAAAAAAEABIAAAAAQAB -AEgAAAABAAE4QklNBCYAAAAAAA4AAAAAAAAAAAAAP4AAADhCSU0EDQAAAAAABAAAAB44QklN -BBkAAAAAAAQAAAAeOEJJTQPzAAAAAAAJAAAAAAAAAAABADhCSU0nEAAAAAAACgABAAAAAAAA -AAI4QklNA/UAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAAAAEAMgAA -AAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA/gAAAAAAHAAAP////////// -//////////////////8D6AAAAAD/////////////////////////////A+gAAAAA//////// -/////////////////////wPoAAAAAP////////////////////////////8D6AAAOEJJTQQA -AAAAAAACAAM4QklNBAIAAAAAAAgAAAAAAAAAADhCSU0EMAAAAAAABAEBAQE4QklNBC0AAAAA -AAYAAQAAABs4QklNBAgAAAAAABAAAAABAAACQAAAAkAAAAAAOEJJTQQeAAAAAAAEAAAAADhC -SU0EGgAAAAADRQAAAAYAAAAAAAAAAAAAEpAAAAxgAAAACABJAE0ARwBfADIANAA0ADAAAAAB -AAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAADGAAABKQAAAAAAAAAAAAAAAAAAAAAAEA -AAAAAAAAAAAAAAAAAAAAAAAAEAAAAAEAAAAAAABudWxsAAAAAgAAAAZib3VuZHNPYmpjAAAA -AQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRv -bWxvbmcAABKQAAAAAFJnaHRsb25nAAAMYAAAAAZzbGljZXNWbExzAAAAAU9iamMAAAABAAAA -AAAFc2xpY2UAAAASAAAAB3NsaWNlSURsb25nAAAAAAAAAAdncm91cElEbG9uZwAAAAAAAAAG -b3JpZ2luZW51bQAAAAxFU2xpY2VPcmlnaW4AAAANYXV0b0dlbmVyYXRlZAAAAABUeXBlZW51 -bQAAAApFU2xpY2VUeXBlAAAAAEltZyAAAAAGYm91bmRzT2JqYwAAAAEAAAAAAABSY3QxAAAA -BAAAAABUb3AgbG9uZwAAAAAAAAAATGVmdGxvbmcAAAAAAAAAAEJ0b21sb25nAAASkAAAAABS -Z2h0bG9uZwAADGAAAAADdXJsVEVYVAAAAAEAAAAAAABudWxsVEVYVAAAAAEAAAAAAABNc2dl -VEVYVAAAAAEAAAAAAAZhbHRUYWdURVhUAAAAAQAAAAAADmNlbGxUZXh0SXNIVE1MYm9vbAEA -AAAIY2VsbFRleHRURVhUAAAAAQAAAAAACWhvcnpBbGlnbmVudW0AAAAPRVNsaWNlSG9yekFs -aWduAAAAB2RlZmF1bHQAAAAJdmVydEFsaWduZW51bQAAAA9FU2xpY2VWZXJ0QWxpZ24AAAAH -ZGVmYXVsdAAAAAtiZ0NvbG9yVHlwZWVudW0AAAARRVNsaWNlQkdDb2xvclR5cGUAAAAATm9u -ZQAAAAl0b3BPdXRzZXRsb25nAAAAAAAAAApsZWZ0T3V0c2V0bG9uZwAAAAAAAAAMYm90dG9t -T3V0c2V0bG9uZwAAAAAAAAALcmlnaHRPdXRzZXRsb25nAAAAAAA4QklNBCgAAAAAAAwAAAAC -P/AAAAAAAAA4QklNBBQAAAAAAAQAAAAbOEJJTQQMAAAAABO+AAAAAQAAAGsAAACgAAABRAAA -yoAAABOiABgAAf/Y/+AAEEpGSUYAAQIAAEgASAAA/+0ADEFkb2JlX0NNAAH/7gAOQWRvYmUA -ZIAAAAAB/9sAhAAMCAgICQgMCQkMEQsKCxEVDwwMDxUYExMVExMYEQwMDAwMDBEMDAwMDAwM -DAwMDAwMDAwMDAwMDAwMDAwMDAwMAQ0LCw0ODRAODhAUDg4OFBQODg4OFBEMDAwMDBERDAwM -DAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCACgAGsDASIAAhEBAxEB/90A -BAAH/8QBPwAAAQUBAQEBAQEAAAAAAAAAAwABAgQFBgcICQoLAQABBQEBAQEBAQAAAAAAAAAB -AAIDBAUGBwgJCgsQAAEEAQMCBAIFBwYIBQMMMwEAAhEDBCESMQVBUWETInGBMgYUkaGxQiMk -FVLBYjM0coLRQwclklPw4fFjczUWorKDJkSTVGRFwqN0NhfSVeJl8rOEw9N14/NGJ5SkhbSV -xNTk9KW1xdXl9VZmdoaWprbG1ub2N0dXZ3eHl6e3x9fn9xEAAgIBAgQEAwQFBgcHBgU1AQAC -EQMhMRIEQVFhcSITBTKBkRShsUIjwVLR8DMkYuFygpJDUxVjczTxJQYWorKDByY1wtJEk1Sj -F2RFVTZ0ZeLys4TD03Xj80aUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9ic3R1dnd4eXp7fH -/9oADAMBAAIRAxEAPwDtFR6sP0A+KvKl1X+jj4pktiuDjlUgYttb4ulXVS/7UWfFNCVGlrjL -hKm2hm36Ijw8VJjXPcGtEucYA81fr6c8saXOYxrvbLid2h9zmtH9tycLKHOFTBw0DwhOAr3U -XdMxseS5tba3APeSSSD9FrnBY93Vsf1a8bEac3NvcGU0UzIP/CO/Mr/qselSm4oZF1GKA7Je -KgYA3TOv8ke5YfV+tZ+DZZhusaMqtxbazEAdsdMGizKa+zbZV/hK6vfv/nbPU/RrnXZzjY4u -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 -Dta6A36exrP0+Q/b7P0dP0/UVbrn1kpxHXZuTFjMcmrGxm/n2f6P/ime37VZ+f8AzH+FXn/V -ep9Q6xlHIyn7nWkjya0f4Nn37nfvqvfEbZhGhTa691jI6saDa9zmNc51gjbIaKvs9ez81v8A -IcqN7tgBcfcHHXzd/wCcqD7GuvbQ0/ScHvI7Bo/6nah5Ly9lh49wH3QkBsPM/wCMV5O/0H+K -E9Wc6rIkawZAWuM7Fe3dkMBgTuESI/lt9y5ex/6XcNQYPycjNvc1wY6HMmQTpGqeYRlVsRkR -dOyx2F6pbD20vGtO4bSXfvDb7P7Kjn5rfTGPSSxjolgc5x0+iJe4+387ZvWY9zw0FzDsI089 -TwxqH6zSwH6IiJMlsg/vEH6ScICwddFlt+vqFrYENcRxuMxr+d/5k9GwMiy3qVNj3TD9xA0A -A1P9b6ayRsI2loJYRsc/XcAT3/Ob/VVvEyXNrde1u1tVTjud+fa48/1PoMYxNzx/VTAGsgYf -4/pZeWP67GTtCQmfLH65f9FngZbGdSGXpFdpJeS6XMLnTtrZ7f5sv+mi9SfVXuwZDK67YMgF -riD7fHc7Z7n+yzes8faHMDbbA1j+a+XEfnRU3b/4I9XMlrLLmZW70jY0b7HCXywek7Yz/Bbm -1ts/64kYgZInoY8P1h6of9LKji4sUh1jLj/wcnoyf872WLnbHD12bnWBrq8Vo97x+ZZfG32t -/wAHX/24i7Oqf6QTu9WNI9T/AEf+Z7lVtzmVS3EZ7nHW9wlzoG3T85//AFCp+vkzO907t3In -dG3/ADtv5qfqxP8A/9k4QklNBCEAAAAAAHkAAAABAQAAABgAQQBkAG8AYgBlACAAUABoAG8A -dABvAHMAaABvAHAAIABFAGwAZQBtAGUAbgB0AHMAAAAcAEEAZABvAGIAZQAgAFAAaABvAHQA -bwBzAGgAbwBwACAARQBsAGUAbQBlAG4AdABzACAAOQAuADAAAAABADhCSU0EBgAAAAAABwAH -AAAAAQEA/+EZm1hNUAA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2lu -PSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4NCjx4OnhtcG1ldGEgeG1s -bnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYw -IDYxLjEzNDc3NywgMjAxMC8wMi8yNC0xNzo0Mzo1OCAgICAgICAgIj4NCgk8cmRmOlJERiB4 -bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMi -Pg0KCQk8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczpkYz0iaHR0cDovL3B1 -cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOk1pY3Jvc29mdFBob3RvPSJodHRwOi8v -bnMubWljcm9zb2Z0LmNvbS9waG90by8xLjAiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2Jl -LmNvbS94YXAvMS4wLyIgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEu -MC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxu -czpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZl -bnQjIiB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIgeG1sbnM6 -cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiBkYzpmb3Jt -YXQ9ImltYWdlL2pwZWciIE1pY3Jvc29mdFBob3RvOlJhdGluZz0iOTkiIHhtcDpDcmVhdG9y -VG9vbD0iTWljcm9zb2Z0IFdpbmRvd3MgTGl2ZSBQaG90byBHYWxsZXJ5MTQuMC44MDY0LjIw -NiIgeG1wOmNyZWF0b3J0b29sPSJNaWNyb3NvZnQgV2luZG93cyBMaXZlIFBob3RvIEdhbGxl -cnkxNC4wLjgwNjQuMjA2IiB4bXA6UmF0aW5nPSI1IiB4bXA6TW9kaWZ5RGF0ZT0iMjAxMS0w -Mi0xOVQxOToyMjozOC0wNTowMCIgeG1wOkNyZWF0ZURhdGU9IjIwMTEtMDItMTlUMTU6Mjc6 -NTItMDU6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMTEtMDItMTlUMTk6MjI6MzgtMDU6MDAi -IHRpZmY6c29mdHdhcmU9Ik1pY3Jvc29mdCBXaW5kb3dzIExpdmUgUGhvdG8gR2FsbGVyeTE0 -LjAuODA2NC4yMDYiIHRpZmY6T3JpZW50YXRpb249IjEiIHRpZmY6WUNiQ3JQb3NpdGlvbmlu -Zz0iMiIgdGlmZjpYUmVzb2x1dGlvbj0iNzIwMDAwLzEwMDAwIiB0aWZmOllSZXNvbHV0aW9u -PSI3MjAwMDAvMTAwMDAiIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiIHRpZmY6TWFrZT0iQ2Fu -b24iIHRpZmY6TW9kZWw9IkNhbm9uIEVPUyA1MEQiIHRpZmY6TmF0aXZlRGlnZXN0PSIyNTYs -MjU3LDI1OCwyNTksMjYyLDI3NCwyNzcsMjg0LDUzMCw1MzEsMjgyLDI4MywyOTYsMzAxLDMx -OCwzMTksNTI5LDUzMiwzMDYsMjcwLDI3MSwyNzIsMzA1LDMxNSwzMzQzMjsxQTYyQkI5MkE0 -M0NCRDZCODQyNzc1QTBFMjhBNkI1OSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpCMDMy -Qjk4NTg3M0NFMDExOEU3NkIyQTQxQzBBNDE2NSIgeG1wTU06RG9jdW1lbnRJRD0idXVpZDpm -YWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtcE1NOk9yaWdpbmFsRG9j -dW1lbnRJRD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIGV4 -aWY6RXhpZlZlcnNpb249IjAyMjEiIGV4aWY6Rmxhc2hwaXhWZXJzaW9uPSIwMTAwIiBleGlm -OkNvbG9yU3BhY2U9IjEiIGV4aWY6UGl4ZWxYRGltZW5zaW9uPSIzMTY4IiBleGlmOlBpeGVs -WURpbWVuc2lvbj0iNDc1MiIgZXhpZjpEYXRlVGltZU9yaWdpbmFsPSIyMDExLTAyLTE5VDE1 -OjI3OjUyLTA1OjAwIiBleGlmOkRhdGVUaW1lRGlnaXRpemVkPSIyMDExLTAyLTE5VDE1OjI3 -OjUyLTA1OjAwIiBleGlmOkV4cG9zdXJlVGltZT0iMS8xMDAiIGV4aWY6Rk51bWJlcj0iMjgv -MTAiIGV4aWY6RXhwb3N1cmVQcm9ncmFtPSIzIiBleGlmOlNodXR0ZXJTcGVlZFZhbHVlPSI0 -MzQxNzYvNjU1MzYiIGV4aWY6QXBlcnR1cmVWYWx1ZT0iMjk3MDg1NC8xMDAwMDAwIiBleGlm -OkV4cG9zdXJlQmlhc1ZhbHVlPSIwLzEiIGV4aWY6TWV0ZXJpbmdNb2RlPSIzIiBleGlmOkZv -Y2FsTGVuZ3RoPSI4NS8xIiBleGlmOkZvY2FsUGxhbmVYUmVzb2x1dGlvbj0iNDc1MjAwMC84 -OTQiIGV4aWY6Rm9jYWxQbGFuZVlSZXNvbHV0aW9uPSIzMTY4MDAwLzU5NyIgZXhpZjpGb2Nh -bFBsYW5lUmVzb2x1dGlvblVuaXQ9IjIiIGV4aWY6Q3VzdG9tUmVuZGVyZWQ9IjAiIGV4aWY6 -RXhwb3N1cmVNb2RlPSIwIiBleGlmOldoaXRlQmFsYW5jZT0iMCIgZXhpZjpTY2VuZUNhcHR1 -cmVUeXBlPSIwIiBleGlmOkdQU1ZlcnNpb25JRD0iMi4yLjAuMCIgZXhpZjpOYXRpdmVEaWdl -c3Q9IjM2ODY0LDQwOTYwLDQwOTYxLDM3MTIxLDM3MTIyLDQwOTYyLDQwOTYzLDM3NTEwLDQw -OTY0LDM2ODY3LDM2ODY4LDMzNDM0LDMzNDM3LDM0ODUwLDM0ODUyLDM0ODU1LDM0ODU2LDM3 -Mzc3LDM3Mzc4LDM3Mzc5LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3 -Mzg2LDM3Mzk2LDQxNDgzLDQxNDg0LDQxNDg2LDQxNDg3LDQxNDg4LDQxNDkyLDQxNDkzLDQx -NDk1LDQxNzI4LDQxNzI5LDQxNzMwLDQxOTg1LDQxOTg2LDQxOTg3LDQxOTg4LDQxOTg5LDQx -OTkwLDQxOTkxLDQxOTkyLDQxOTkzLDQxOTk0LDQxOTk1LDQxOTk2LDQyMDE2LDAsMiw0LDUs -Niw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwyMCwyMiwyMywyNCwyNSwyNiwy -NywyOCwzMDtBOUI3RTk5REREOUI2Nzg0NUE3MTNBNTY1RkY0NTUwNSIgcGhvdG9zaG9wOkNv -bG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIj4N -CgkJCTxkYzpzdWJqZWN0Pg0KCQkJCTxyZGY6QmFnPg0KCQkJCQk8cmRmOmxpPm1hc3NhY2h1 -c2V0dHM8L3JkZjpsaT4NCgkJCQkJPHJkZjpsaT5wb3J0cmFpdHM8L3JkZjpsaT4NCgkJCQkJ -PHJkZjpsaT4xMDAgc3RyYW5nZXJzPC9yZGY6bGk+DQoJCQkJCTxyZGY6bGk+bm9ydGggcXVp -bmN5PC9yZGY6bGk+DQoJCQkJPC9yZGY6QmFnPg0KCQkJPC9kYzpzdWJqZWN0Pg0KCQkJPGRj -OmNyZWF0b3I+DQoJCQkJPHJkZjpTZXE+DQoJCQkJCTxyZGY6bGk+UGhvdG9ncmFwaGVyOiBK -ZWZmcmV5IFN0ZWRmYXN0PC9yZGY6bGk+DQoJCQkJPC9yZGY6U2VxPg0KCQkJPC9kYzpjcmVh -dG9yPg0KCQkJPGRjOnJpZ2h0cz4NCgkJCQk8cmRmOkFsdD4NCgkJCQkJPHJkZjpsaSB4bWw6 -bGFuZz0ieC1kZWZhdWx0Ij5Db3B5cmlnaHQ6IEplZmZyZXkgU3RlZGZhc3Q8L3JkZjpsaT4N -CgkJCQk8L3JkZjpBbHQ+DQoJCQk8L2RjOnJpZ2h0cz4NCgkJCTxNaWNyb3NvZnRQaG90bzpM -YXN0S2V5d29yZFhNUD4NCgkJCQk8cmRmOkJhZz4NCgkJCQkJPHJkZjpsaT5tYXNzYWNodXNl -dHRzPC9yZGY6bGk+DQoJCQkJCTxyZGY6bGk+cG9ydHJhaXRzPC9yZGY6bGk+DQoJCQkJCTxy -ZGY6bGk+MTAwIHN0cmFuZ2VyczwvcmRmOmxpPg0KCQkJCQk8cmRmOmxpPm5vcnRoIHF1aW5j -eTwvcmRmOmxpPg0KCQkJCTwvcmRmOkJhZz4NCgkJCTwvTWljcm9zb2Z0UGhvdG86TGFzdEtl -eXdvcmRYTVA+DQoJCQk8eG1wTU06SGlzdG9yeT4NCgkJCQk8cmRmOlNlcT4NCgkJCQkJPHJk -ZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOkFG -MzJCOTg1ODczQ0UwMTE4RTc2QjJBNDFDMEE0MTY1IiBzdEV2dDp3aGVuPSIyMDExLTAyLTE5 -VDE5OjIyOjM4LTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3Ag -RWxlbWVudHMgOS4wIFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4NCgkJCQkJPHJkZjps -aSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOkIwMzJC -OTg1ODczQ0UwMTE4RTc2QjJBNDFDMEE0MTY1IiBzdEV2dDp3aGVuPSIyMDExLTAyLTE5VDE5 -OjIyOjM4LTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgRWxl -bWVudHMgOS4wIFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4NCgkJCQk8L3JkZjpTZXE+ -DQoJCQk8L3htcE1NOkhpc3Rvcnk+DQoJCQk8ZXhpZjpDb21wb25lbnRzQ29uZmlndXJhdGlv -bj4NCgkJCQk8cmRmOlNlcT4NCgkJCQkJPHJkZjpsaT4xPC9yZGY6bGk+DQoJCQkJCTxyZGY6 -bGk+MjwvcmRmOmxpPg0KCQkJCQk8cmRmOmxpPjM8L3JkZjpsaT4NCgkJCQkJPHJkZjpsaT4w -PC9yZGY6bGk+DQoJCQkJPC9yZGY6U2VxPg0KCQkJPC9leGlmOkNvbXBvbmVudHNDb25maWd1 -cmF0aW9uPg0KCQkJPGV4aWY6SVNPU3BlZWRSYXRpbmdzPg0KCQkJCTxyZGY6U2VxPg0KCQkJ -CQk8cmRmOmxpPjgwMDwvcmRmOmxpPg0KCQkJCTwvcmRmOlNlcT4NCgkJCTwvZXhpZjpJU09T -cGVlZFJhdGluZ3M+DQoJCQk8ZXhpZjpGbGFzaCBleGlmOkZpcmVkPSJGYWxzZSIgZXhpZjpS -ZXR1cm49IjAiIGV4aWY6TW9kZT0iMiIgZXhpZjpGdW5jdGlvbj0iRmFsc2UiIGV4aWY6UmVk -RXllTW9kZT0iRmFsc2UiLz4NCgkJPC9yZGY6RGVzY3JpcHRpb24+DQoJPC9yZGY6UkRGPg0K -PC94OnhtcG1ldGE+DQo8P3hwYWNrZXQgZW5kPSd3Jz8+ICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -CiAgICAgICAgICAgICAgICAgICAgICAgICAgICD/2wBDAAEBAQEBAQEBAQEBAQECAgMCAgIC -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 - ---=-/wKNlseqdbBnOf3qd253ow==-- diff -Nru gmime-2.6.22+dfsg2/tests/message-partial.0.eml gmime-3.0.1/tests/message-partial.0.eml --- gmime-2.6.22+dfsg2/tests/message-partial.0.eml 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/tests/message-partial.0.eml 1970-01-01 00:00:00.000000000 +0000 @@ -1,865 +0,0 @@ -From: anonymous@mit.edu -Date: Tue, 28 Mar 2017 18:40:37 -0400 -Subject: Photo of a girl with feather earrings -Message-Id: <4KN8PRPHW0U4.IO0XMYJCHITO2@mit.edu> -To: photo-discuss@lists.nesop.edu -MIME-Version: 1.0 -Content-Type: message/partial; id="6MCVORPHW0U4.BCPTXD0EM9BT3@mit.edu"; - number=1; total=3 - -From: anonymous@mit.edu -Date: Tue, 28 Mar 2017 18:40:37 -0400 -Subject: Photo of a girl with feather earrings -Message-Id: <6MCVORPHW0U4.BCPTXD0EM9BT3@mit.edu> -To: photo-discuss@lists.nesop.edu -MIME-Version: 1.0 -Content-Type: multipart/mixed; boundary="=-/wKNlseqdbBnOf3qd253ow==" - ---=-/wKNlseqdbBnOf3qd253ow== -Content-Type: text/plain; charset=utf-8 -Content-Transfer-Encoding: quoted-printable - -Hey all, - -Took the attached photo of a girl on the subway. Just thought her earr= -ings were really cool looking. - -What do you think? - ---=-/wKNlseqdbBnOf3qd253ow== -Content-Type: image/jpeg; name=earrings.jpg -Content-Disposition: attachment; filename=earrings.jpg -Content-Transfer-Encoding: base64 - -/9j/4AAQSkZJRgABAQEASABIAAD/4gxYSUNDX1BST0ZJTEUAAQEAAAxITGlubwIQAABtbnRy -UkdCIFhZWiAHzgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA -9tYAAQAAAADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAA -ABRyWFlaAAACGAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRk -AAACxAAAAIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAA -ACR0ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0 -AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAA -AAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAA -AAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQ -WFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z2Rlc2MAAAAAAAAAFklF -QyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAA -AC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAA -AAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0 -aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRp -dGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAA -ABOk/gAUXy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAA -AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQA -AAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACB -AIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwEN -ARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJ -AdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLB -AssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5 -BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3 -BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9 -B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglP -CWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuw -C8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5k -Dn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFt -EYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTO -FPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiK -GK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyj -HMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEc -IUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3 -JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2 -K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDb -MRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbp -NyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1h -PaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RH -RIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0ua -S+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1Nf -U6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuV -W+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RA -ZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1g -bbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4 -d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEK -gWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuW -i/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaf -lwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqIm -opajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4t -rqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1 -uy67p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/ -yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO -1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj -4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/ -8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t////7Rpm -UGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAI0cAgAAAohxHAJQAB5QaG90b2dyYXBoZXI6IEpl -ZmZyZXkgU3RlZGZhc3QcAhkADW1hc3NhY2h1c2V0dHMcAhkACXBvcnRyYWl0cxwCGQANMTAw -IHN0cmFuZ2VycxwCGQAMbm9ydGggcXVpbmN5HAJ0ABtDb3B5cmlnaHQ6IEplZmZyZXkgU3Rl -ZGZhc3QAOEJJTQQlAAAAAAAQjGjE2Zu5v42TrLLrKSzP0zhCSU0D7QAAAAAAEABIAAAAAQAB -AEgAAAABAAE4QklNBCYAAAAAAA4AAAAAAAAAAAAAP4AAADhCSU0EDQAAAAAABAAAAB44QklN -BBkAAAAAAAQAAAAeOEJJTQPzAAAAAAAJAAAAAAAAAAABADhCSU0nEAAAAAAACgABAAAAAAAA -AAI4QklNA/UAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAAAAEAMgAA -AAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA/gAAAAAAHAAAP////////// -//////////////////8D6AAAAAD/////////////////////////////A+gAAAAA//////// -/////////////////////wPoAAAAAP////////////////////////////8D6AAAOEJJTQQA -AAAAAAACAAM4QklNBAIAAAAAAAgAAAAAAAAAADhCSU0EMAAAAAAABAEBAQE4QklNBC0AAAAA -AAYAAQAAABs4QklNBAgAAAAAABAAAAABAAACQAAAAkAAAAAAOEJJTQQeAAAAAAAEAAAAADhC -SU0EGgAAAAADRQAAAAYAAAAAAAAAAAAAEpAAAAxgAAAACABJAE0ARwBfADIANAA0ADAAAAAB -AAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAADGAAABKQAAAAAAAAAAAAAAAAAAAAAAEA -AAAAAAAAAAAAAAAAAAAAAAAAEAAAAAEAAAAAAABudWxsAAAAAgAAAAZib3VuZHNPYmpjAAAA -AQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRv -bWxvbmcAABKQAAAAAFJnaHRsb25nAAAMYAAAAAZzbGljZXNWbExzAAAAAU9iamMAAAABAAAA -AAAFc2xpY2UAAAASAAAAB3NsaWNlSURsb25nAAAAAAAAAAdncm91cElEbG9uZwAAAAAAAAAG -b3JpZ2luZW51bQAAAAxFU2xpY2VPcmlnaW4AAAANYXV0b0dlbmVyYXRlZAAAAABUeXBlZW51 -bQAAAApFU2xpY2VUeXBlAAAAAEltZyAAAAAGYm91bmRzT2JqYwAAAAEAAAAAAABSY3QxAAAA -BAAAAABUb3AgbG9uZwAAAAAAAAAATGVmdGxvbmcAAAAAAAAAAEJ0b21sb25nAAASkAAAAABS -Z2h0bG9uZwAADGAAAAADdXJsVEVYVAAAAAEAAAAAAABudWxsVEVYVAAAAAEAAAAAAABNc2dl -VEVYVAAAAAEAAAAAAAZhbHRUYWdURVhUAAAAAQAAAAAADmNlbGxUZXh0SXNIVE1MYm9vbAEA -AAAIY2VsbFRleHRURVhUAAAAAQAAAAAACWhvcnpBbGlnbmVudW0AAAAPRVNsaWNlSG9yekFs -aWduAAAAB2RlZmF1bHQAAAAJdmVydEFsaWduZW51bQAAAA9FU2xpY2VWZXJ0QWxpZ24AAAAH -ZGVmYXVsdAAAAAtiZ0NvbG9yVHlwZWVudW0AAAARRVNsaWNlQkdDb2xvclR5cGUAAAAATm9u -ZQAAAAl0b3BPdXRzZXRsb25nAAAAAAAAAApsZWZ0T3V0c2V0bG9uZwAAAAAAAAAMYm90dG9t -T3V0c2V0bG9uZwAAAAAAAAALcmlnaHRPdXRzZXRsb25nAAAAAAA4QklNBCgAAAAAAAwAAAAC -P/AAAAAAAAA4QklNBBQAAAAAAAQAAAAbOEJJTQQMAAAAABO+AAAAAQAAAGsAAACgAAABRAAA -yoAAABOiABgAAf/Y/+AAEEpGSUYAAQIAAEgASAAA/+0ADEFkb2JlX0NNAAH/7gAOQWRvYmUA -ZIAAAAAB/9sAhAAMCAgICQgMCQkMEQsKCxEVDwwMDxUYExMVExMYEQwMDAwMDBEMDAwMDAwM -DAwMDAwMDAwMDAwMDAwMDAwMDAwMAQ0LCw0ODRAODhAUDg4OFBQODg4OFBEMDAwMDBERDAwM -DAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCACgAGsDASIAAhEBAxEB/90A -BAAH/8QBPwAAAQUBAQEBAQEAAAAAAAAAAwABAgQFBgcICQoLAQABBQEBAQEBAQAAAAAAAAAB -AAIDBAUGBwgJCgsQAAEEAQMCBAIFBwYIBQMMMwEAAhEDBCESMQVBUWETInGBMgYUkaGxQiMk -FVLBYjM0coLRQwclklPw4fFjczUWorKDJkSTVGRFwqN0NhfSVeJl8rOEw9N14/NGJ5SkhbSV -xNTk9KW1xdXl9VZmdoaWprbG1ub2N0dXZ3eHl6e3x9fn9xEAAgIBAgQEAwQFBgcHBgU1AQAC -EQMhMRIEQVFhcSITBTKBkRShsUIjwVLR8DMkYuFygpJDUxVjczTxJQYWorKDByY1wtJEk1Sj -F2RFVTZ0ZeLys4TD03Xj80aUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9ic3R1dnd4eXp7fH -/9oADAMBAAIRAxEAPwDtFR6sP0A+KvKl1X+jj4pktiuDjlUgYttb4ulXVS/7UWfFNCVGlrjL -hKm2hm36Ijw8VJjXPcGtEucYA81fr6c8saXOYxrvbLid2h9zmtH9tycLKHOFTBw0DwhOAr3U -XdMxseS5tba3APeSSSD9FrnBY93Vsf1a8bEac3NvcGU0UzIP/CO/Mr/qselSm4oZF1GKA7Je -KgYA3TOv8ke5YfV+tZ+DZZhusaMqtxbazEAdsdMGizKa+zbZV/hK6vfv/nbPU/RrnXZzjY4u -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 -Dta6A36exrP0+Q/b7P0dP0/UVbrn1kpxHXZuTFjMcmrGxm/n2f6P/ime37VZ+f8AzH+FXn/V -ep9Q6xlHIyn7nWkjya0f4Nn37nfvqvfEbZhGhTa691jI6saDa9zmNc51gjbIaKvs9ez81v8A -IcqN7tgBcfcHHXzd/wCcqD7GuvbQ0/ScHvI7Bo/6nah5Ly9lh49wH3QkBsPM/wCMV5O/0H+K -E9Wc6rIkawZAWuM7Fe3dkMBgTuESI/lt9y5ex/6XcNQYPycjNvc1wY6HMmQTpGqeYRlVsRkR -dOyx2F6pbD20vGtO4bSXfvDb7P7Kjn5rfTGPSSxjolgc5x0+iJe4+387ZvWY9zw0FzDsI089 -TwxqH6zSwH6IiJMlsg/vEH6ScICwddFlt+vqFrYENcRxuMxr+d/5k9GwMiy3qVNj3TD9xA0A -A1P9b6ayRsI2loJYRsc/XcAT3/Ob/VVvEyXNrde1u1tVTjud+fa48/1PoMYxNzx/VTAGsgYf -4/pZeWP67GTtCQmfLH65f9FngZbGdSGXpFdpJeS6XMLnTtrZ7f5sv+mi9SfVXuwZDK67YMgF -riD7fHc7Z7n+yzes8faHMDbbA1j+a+XEfnRU3b/4I9XMlrLLmZW70jY0b7HCXywek7Yz/Bbm -1ts/64kYgZInoY8P1h6of9LKji4sUh1jLj/wcnoyf872WLnbHD12bnWBrq8Vo97x+ZZfG32t -/wAHX/24i7Oqf6QTu9WNI9T/AEf+Z7lVtzmVS3EZ7nHW9wlzoG3T85//AFCp+vkzO907t3In -dG3/ADtv5qfqxP8A/9k4QklNBCEAAAAAAHkAAAABAQAAABgAQQBkAG8AYgBlACAAUABoAG8A -dABvAHMAaABvAHAAIABFAGwAZQBtAGUAbgB0AHMAAAAcAEEAZABvAGIAZQAgAFAAaABvAHQA -bwBzAGgAbwBwACAARQBsAGUAbQBlAG4AdABzACAAOQAuADAAAAABADhCSU0EBgAAAAAABwAH -AAAAAQEA/+EZm1hNUAA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2lu -PSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4NCjx4OnhtcG1ldGEgeG1s -bnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYw -IDYxLjEzNDc3NywgMjAxMC8wMi8yNC0xNzo0Mzo1OCAgICAgICAgIj4NCgk8cmRmOlJERiB4 -bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMi -Pg0KCQk8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczpkYz0iaHR0cDovL3B1 -cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOk1pY3Jvc29mdFBob3RvPSJodHRwOi8v -bnMubWljcm9zb2Z0LmNvbS9waG90by8xLjAiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2Jl -LmNvbS94YXAvMS4wLyIgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEu -MC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxu -czpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZl -bnQjIiB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIgeG1sbnM6 -cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiBkYzpmb3Jt -YXQ9ImltYWdlL2pwZWciIE1pY3Jvc29mdFBob3RvOlJhdGluZz0iOTkiIHhtcDpDcmVhdG9y -VG9vbD0iTWljcm9zb2Z0IFdpbmRvd3MgTGl2ZSBQaG90byBHYWxsZXJ5MTQuMC44MDY0LjIw -NiIgeG1wOmNyZWF0b3J0b29sPSJNaWNyb3NvZnQgV2luZG93cyBMaXZlIFBob3RvIEdhbGxl -cnkxNC4wLjgwNjQuMjA2IiB4bXA6UmF0aW5nPSI1IiB4bXA6TW9kaWZ5RGF0ZT0iMjAxMS0w -Mi0xOVQxOToyMjozOC0wNTowMCIgeG1wOkNyZWF0ZURhdGU9IjIwMTEtMDItMTlUMTU6Mjc6 -NTItMDU6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMTEtMDItMTlUMTk6MjI6MzgtMDU6MDAi -IHRpZmY6c29mdHdhcmU9Ik1pY3Jvc29mdCBXaW5kb3dzIExpdmUgUGhvdG8gR2FsbGVyeTE0 -LjAuODA2NC4yMDYiIHRpZmY6T3JpZW50YXRpb249IjEiIHRpZmY6WUNiQ3JQb3NpdGlvbmlu -Zz0iMiIgdGlmZjpYUmVzb2x1dGlvbj0iNzIwMDAwLzEwMDAwIiB0aWZmOllSZXNvbHV0aW9u -PSI3MjAwMDAvMTAwMDAiIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiIHRpZmY6TWFrZT0iQ2Fu -b24iIHRpZmY6TW9kZWw9IkNhbm9uIEVPUyA1MEQiIHRpZmY6TmF0aXZlRGlnZXN0PSIyNTYs -MjU3LDI1OCwyNTksMjYyLDI3NCwyNzcsMjg0LDUzMCw1MzEsMjgyLDI4MywyOTYsMzAxLDMx -OCwzMTksNTI5LDUzMiwzMDYsMjcwLDI3MSwyNzIsMzA1LDMxNSwzMzQzMjsxQTYyQkI5MkE0 -M0NCRDZCODQyNzc1QTBFMjhBNkI1OSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpCMDMy -Qjk4NTg3M0NFMDExOEU3NkIyQTQxQzBBNDE2NSIgeG1wTU06RG9jdW1lbnRJRD0idXVpZDpm -YWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtcE1NOk9yaWdpbmFsRG9j -dW1lbnRJRD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIGV4 -aWY6RXhpZlZlcnNpb249IjAyMjEiIGV4aWY6Rmxhc2hwaXhWZXJzaW9uPSIwMTAwIiBleGlm -OkNvbG9yU3BhY2U9IjEiIGV4aWY6UGl4ZWxYRGltZW5zaW9uPSIzMTY4IiBleGlmOlBpeGVs -WURpbWVuc2lvbj0iNDc1MiIgZXhpZjpEYXRlVGltZU9yaWdpbmFsPSIyMDExLTAyLTE5VDE1 -OjI3OjUyLTA1OjAwIiBleGlmOkRhdGVUaW1lRGlnaXRpemVkPSIyMDExLTAyLTE5VDE1OjI3 -OjUyLTA1OjAwIiBleGlmOkV4cG9zdXJlVGltZT0iMS8xMDAiIGV4aWY6Rk51bWJlcj0iMjgv -MTAiIGV4aWY6RXhwb3N1cmVQcm9ncmFtPSIzIiBleGlmOlNodXR0ZXJTcGVlZFZhbHVlPSI0 -MzQxNzYvNjU1MzYiIGV4aWY6QXBlcnR1cmVWYWx1ZT0iMjk3MDg1NC8xMDAwMDAwIiBleGlm -OkV4cG9zdXJlQmlhc1ZhbHVlPSIwLzEiIGV4aWY6TWV0ZXJpbmdNb2RlPSIzIiBleGlmOkZv -Y2FsTGVuZ3RoPSI4NS8xIiBleGlmOkZvY2FsUGxhbmVYUmVzb2x1dGlvbj0iNDc1MjAwMC84 -OTQiIGV4aWY6Rm9jYWxQbGFuZVlSZXNvbHV0aW9uPSIzMTY4MDAwLzU5NyIgZXhpZjpGb2Nh -bFBsYW5lUmVzb2x1dGlvblVuaXQ9IjIiIGV4aWY6Q3VzdG9tUmVuZGVyZWQ9IjAiIGV4aWY6 -RXhwb3N1cmVNb2RlPSIwIiBleGlmOldoaXRlQmFsYW5jZT0iMCIgZXhpZjpTY2VuZUNhcHR1 -cmVUeXBlPSIwIiBleGlmOkdQU1ZlcnNpb25JRD0iMi4yLjAuMCIgZXhpZjpOYXRpdmVEaWdl -c3Q9IjM2ODY0LDQwOTYwLDQwOTYxLDM3MTIxLDM3MTIyLDQwOTYyLDQwOTYzLDM3NTEwLDQw -OTY0LDM2ODY3LDM2ODY4LDMzNDM0LDMzNDM3LDM0ODUwLDM0ODUyLDM0ODU1LDM0ODU2LDM3 -Mzc3LDM3Mzc4LDM3Mzc5LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3 -Mzg2LDM3Mzk2LDQxNDgzLDQxNDg0LDQxNDg2LDQxNDg3LDQxNDg4LDQxNDkyLDQxNDkzLDQx -NDk1LDQxNzI4LDQxNzI5LDQxNzMwLDQxOTg1LDQxOTg2LDQxOTg3LDQxOTg4LDQxOTg5LDQx -OTkwLDQxOTkxLDQxOTkyLDQxOTkzLDQxOTk0LDQxOTk1LDQxOTk2LDQyMDE2LDAsMiw0LDUs -Niw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwyMCwyMiwyMywyNCwyNSwyNiwy -NywyOCwzMDtBOUI3RTk5REREOUI2Nzg0NUE3MTNBNTY1RkY0NTUwNSIgcGhvdG9zaG9wOkNv -bG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIj4N -CgkJCTxkYzpzdWJqZWN0Pg0KCQkJCTxyZGY6QmFnPg0KCQkJCQk8cmRmOmxpPm1hc3NhY2h1 -c2V0dHM8L3JkZjpsaT4NCgkJCQkJPHJkZjpsaT5wb3J0cmFpdHM8L3JkZjpsaT4NCgkJCQkJ -PHJkZjpsaT4xMDAgc3RyYW5nZXJzPC9yZGY6bGk+DQoJCQkJCTxyZGY6bGk+bm9ydGggcXVp -bmN5PC9yZGY6bGk+DQoJCQkJPC9yZGY6QmFnPg0KCQkJPC9kYzpzdWJqZWN0Pg0KCQkJPGRj -OmNyZWF0b3I+DQoJCQkJPHJkZjpTZXE+DQoJCQkJCTxyZGY6bGk+UGhvdG9ncmFwaGVyOiBK -ZWZmcmV5IFN0ZWRmYXN0PC9yZGY6bGk+DQoJCQkJPC9yZGY6U2VxPg0KCQkJPC9kYzpjcmVh -dG9yPg0KCQkJPGRjOnJpZ2h0cz4NCgkJCQk8cmRmOkFsdD4NCgkJCQkJPHJkZjpsaSB4bWw6 -bGFuZz0ieC1kZWZhdWx0Ij5Db3B5cmlnaHQ6IEplZmZyZXkgU3RlZGZhc3Q8L3JkZjpsaT4N -CgkJCQk8L3JkZjpBbHQ+DQoJCQk8L2RjOnJpZ2h0cz4NCgkJCTxNaWNyb3NvZnRQaG90bzpM -YXN0S2V5d29yZFhNUD4NCgkJCQk8cmRmOkJhZz4NCgkJCQkJPHJkZjpsaT5tYXNzYWNodXNl -dHRzPC9yZGY6bGk+DQoJCQkJCTxyZGY6bGk+cG9ydHJhaXRzPC9yZGY6bGk+DQoJCQkJCTxy -ZGY6bGk+MTAwIHN0cmFuZ2VyczwvcmRmOmxpPg0KCQkJCQk8cmRmOmxpPm5vcnRoIHF1aW5j -eTwvcmRmOmxpPg0KCQkJCTwvcmRmOkJhZz4NCgkJCTwvTWljcm9zb2Z0UGhvdG86TGFzdEtl -eXdvcmRYTVA+DQoJCQk8eG1wTU06SGlzdG9yeT4NCgkJCQk8cmRmOlNlcT4NCgkJCQkJPHJk -ZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOkFG -MzJCOTg1ODczQ0UwMTE4RTc2QjJBNDFDMEE0MTY1IiBzdEV2dDp3aGVuPSIyMDExLTAyLTE5 -VDE5OjIyOjM4LTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3Ag -RWxlbWVudHMgOS4wIFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4NCgkJCQkJPHJkZjps -aSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOkIwMzJC -OTg1ODczQ0UwMTE4RTc2QjJBNDFDMEE0MTY1IiBzdEV2dDp3aGVuPSIyMDExLTAyLTE5VDE5 -OjIyOjM4LTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgRWxl -bWVudHMgOS4wIFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4NCgkJCQk8L3JkZjpTZXE+ -DQoJCQk8L3htcE1NOkhpc3Rvcnk+DQoJCQk8ZXhpZjpDb21wb25lbnRzQ29uZmlndXJhdGlv -bj4NCgkJCQk8cmRmOlNlcT4NCgkJCQkJPHJkZjpsaT4xPC9yZGY6bGk+DQoJCQkJCTxyZGY6 -bGk+MjwvcmRmOmxpPg0KCQkJCQk8cmRmOmxpPjM8L3JkZjpsaT4NCgkJCQkJPHJkZjpsaT4w -PC9yZGY6bGk+DQoJCQkJPC9yZGY6U2VxPg0KCQkJPC9leGlmOkNvbXBvbmVudHNDb25maWd1 -cmF0aW9uPg0KCQkJPGV4aWY6SVNPU3BlZWRSYXRpbmdzPg0KCQkJCTxyZGY6U2VxPg0KCQkJ -CQk8cmRmOmxpPjgwMDwvcmRmOmxpPg0KCQkJCTwvcmRmOlNlcT4NCgkJCTwvZXhpZjpJU09T -cGVlZFJhdGluZ3M+DQoJCQk8ZXhpZjpGbGFzaCBleGlmOkZpcmVkPSJGYWxzZSIgZXhpZjpS -ZXR1cm49IjAiIGV4aWY6TW9kZT0iMiIgZXhpZjpGdW5jdGlvbj0iRmFsc2UiIGV4aWY6UmVk -RXllTW9kZT0iRmFsc2UiLz4NCgkJPC9yZGY6RGVzY3JpcHRpb24+DQoJPC9yZGY6UkRGPg0K -PC94OnhtcG1ldGE+DQo8P3hwYWNrZXQgZW5kPSd3Jz8+ICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -CiAgICAgICAgICAgICAgICAgICAgICAgICAgICD/2wBDAAEBAQEBAQEBAQEBAQECAgMCAgIC -AgQDAwIDBQQFBQUEBAQFBgcGBQUHBgQEBgkGBwgICAgIBQYJCgkICgcICAj/2wBDAQEBAQIC -AgQCAgQIBQQFCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI -CAgICAj/wAARCAH0AU0DAREAAhEBAxEB/8QAHwAAAgICAwEBAQAAAAAAAAAABgcFCAQJAgMK -AQsA/8QAShAAAgEDAgQEBAIHBQcDBAAHAQIDBAURBiEABxIxEyJBUQgUYXEygRUjQpGhsfAJ -UmLB0RYkM0OC4fEXcqIlNHOSU2MmRFRltP/EAB4BAAEEAwEBAQAAAAAAAAAAAAQCAwUGAAEH -CAkK/8QASREAAQMCAwQIBAQFAgYBAwMFAQACEQMhBBIxBUFRYQYTInGBkaHwMrHB0QcIFOEj -QlJi8RVyJDOCkqKyQwkWwhc0Y1Nzg8PS/9oADAMBAAIRAxEAPwD0yFSVIYd/pxDqR7lw7nHS -B9c8aSi2ADK/lBI2C9X1/nxkRcpOYFfCpwScY9PrxrLayyBN0utaRk0VQcdx7fTgXFtBBlP0 -TuWuHmQCtylHlGGPf14pOLBzxxUpRAykHeli/cZ6fT7EfX24xjZMlJywZK6Ok5YkMAT3P34L -YbW1WngarGqELKxZTnY9tx9OCGNg8kkQltrZAbTWAqpYg78LaSD2UgGRIsq6aMPg38yFRjr9 -9u//AJ4PpETKFpHtEjRPe51XihQCm2TkZHp/W/CY3TdPSJg+CFquMFTgEN7H7fv42wkrAztA -SlneaESkoFBK9vv/AKf9+JjD3Eod7RFkKJpATnDRkgk4IG2PbgwVzuQnUgm6z6bQcAI8VBj0 -AH+WPtw2cbvnROmgLAiyM7do+iixmFSwO49D9OA3Y0kTvW+qAhSc+k6SSNgYcNj0Gx+314S3 -EHNMp/8ATwCoCTl9TSFz4Ix3BPY8Oux2kIf9NIIKmbZyypJomr50iobahw1Q6562xska7GRz -7DsN2IHG6mKJJk6JTaI05rNt+iaNpWVYkUIrSFiuyqB/Q4HGLc7RP9WwCCpilsFFCVZYo3U4 -zt/D9/DX6gvBWZTEqVht1LGAPCUg4BPr+XGjVMpynScXEOUjBDTgpiMDcD7f9+EguIhZLTAb -ostQuGwq9Oe2CP3cY2dFokC2se7rKx0sQVORtjGcDPfhBZvlJm+Ybl/Fl/DhlGRtjII/04X1 -ZIkLdQtNgNFxc9KjJJYDGc9/6/y4xrCTBTYaN66hHgj8Jb0H+n9evC3G/csBcTZfyq3U3T1A -E+/9Y4csTzW8xF12qcgZXqIyMkHhsU7yVp7gGRvXWwy/TjB6s5znPCwwgwkkgCeCyI8EIMYx -2+w9frxhBcBJ5LYIBkFdhQ+cbMoBOO5B4cDYsBosquB00K4ZYgHLEbYztn6f9/rw11e9L0GX -iushs+ZVVcE7eo4fa2LJtoEyu4IGBCgb9tz9fXhljSddywOAJi6xGDnAYYYZxtnbheQQYSwb -5iV1unV1EDJIzkA7jOf38Yxp1Kxr4GU71jmMkA/XI3/hwp1O9+CwkgLHfK9JKnqz3Izv3yOG -ajZ0WCToo6chfD8mCRk7+vCWMJ+EpZdw0XpA2YAlifTiTQWYHRcCcNjPSO/bvxocFsXXwYA3 -9du3YcaBAssg6LkRsFIJGNsjhSSWhL/WIzQTNjJwSOBa92yiqGq1vczEH6Ulz2DHJx24pOIs -48lIYc5RLilW2CWJPTnhGS0jVY9pFvd18cYweluruPfg2k8gEBJAhY8pUqCScAZwMd9+H2AE -hYG5rBLrWMZa2zqMl+k9hnJxw5TYCCdE3RsLqstsmFNdyoJUFtt+CsNBMBYxoaSQm7HOJ3X8 -LHGw4x87002MxXGZBLGqnY9PtjhYtdZkMXUO9rDk9QQAnGCM/Xf+vfgtuJE2SJiXeysyltSq -pPQACuewyRv34Q+qCl9WMoy6rK+UAKjpJB2J+vDL3Tos7RE6grLggw2CMEtuMD24yeCyoAbT -opOGkmqI5Wii60iAeR2IVI17ZZuw+nqfTPbjAeK01976LMqEhoi0EUTz1g2Z5kx4Y7+SM757 -eZvyA78JPApyAdNSoqfxahiZTLJJ2HUxYgfTPp/DjbTdNMuZKy4EEFFVySMI5ZemKJOohipO -WbHtsB+fCjDQkhztNSsRUdiuHCb74XOd+FsIiFjQfiWT0gKSDkkA4Aztn3/z4SXhO9au1FDn -cq/t075PCpcEwReW6LKGQQT1DO2Ccj04waRwTuSxtqu5WOBgMdtznbv/AA4TlE8Fj4NxouYQ -geZTjPvt+f04d1dAKQSGDMdV8aNWABBbO2cbN9OEulosnCARLtVxIDFs9JXGx77fbh0NLQmg -DlXFUJ6W6d+kdRI7/f1400B1itgiDCyQqlckkrnO+eHy2TKS47t64NEHKt0nHZdu+3C3OGkJ -sPLYssgYAzkn8v6+vCWgC4SrxdcSijpwAG6skEfT1/l7caeDqdVjRJuvnS3SMkknPfvxs3ML -WXhoushVZyQVGcD7cbZIF1sg7lkdIIbuI++3sM7cYCLgb1uIEhYjkswP4cE4wNse/CmDswdV -mR2qx2AAGCWAGVyNj9f48JAvbcsAtJ1K6HQv1MQF37gfw42ROu5bi8cViOm/7SgE579uE5bk -cVvNaVHugdySzqO/rj8v4cMuqFltVpzl6O2BKgBiPTiRCGIkWXUc7KwJYnH343xhbBhcl6VA -GwGTtnjQSXEalcCRtsSM9z/lwpLiAgnV4PyMhI3wdwOBK9mlOMI3LW7zNJN0kOTjr+3FPxjR -nR9N82lKxyT1Lj+Hb6nhlkEyU7IOi6CAwPmKr9d9zwQ0AaarUhcHU9JVgqk7Ee/9f58EsbBJ -GhTeYaFAWrkBttSApPl9Pbghi2wzcqpW4vgwcDqGN8Hv/wBv48OUCTPJNOAJIN7JvUL7J14J -znPv9eHXkapDRBhS0agsoIB6hgkDGfvwnKYMJUhwhu5ZEcZRQBhcent/rxhgGyW2zbLuwCfL -+X34wC0SmS3U71/CNWOThhnOQMjH9Y4zWyUWD6qQt9sq7hW0dBb4fHrql1hhjBx1O2wBPoN8 -59ACeNtg2GqwEzKLzJaoLsKWk6K2wWpGmTqXAuNQoA8Vh7PJjpB7RgD1OVhwDsw3Ju7Wxu93 -97kO/Jiojlud5rpE8V2ceXrnqW7sQNgBnOWJx7Z42xt+1ZabPG6xaaiiq63wYjL8qvU7NIAr -CMbkHHr2Ax6442GtLraFbdmiXLhWwyfMyTSL4RyAEBz4YPYH8sDjRaJgLTwA2yxmQxOI2KI2 -ex7jb1425oDTmSnNyiJ1X8Y3LCN4m6z5QAM5PsB/lxjDeQtFhHZ4rOZvk1NKCpqWGJWG4T3U -f5/u4ce6NU41xBPLRfyDqDhSWHYt2z9uEkHLJSQ8kiTZciBlsAADA9v634XTuYKS4yspIwxX -JDDPfPfPCXDK5IYQDELr8PJTK4IHp7998d+CHNJkaLbrhSlDaLhdoJ5bdSzVqRn9fKAFigX3 -llJCIPfqYcE4bAVa/ZpNLo4bu86DxTDsQymcznAe96VesebfKXQ0cyXTWlTqi5ICGt2kLLVX -+qU+zSQqlKp/91RxK0ujhEGvUa08B2j/AONvVRx2qHD+Axz+4GPMw31VJr78fGo6fmFb7Haf -hp5t03Lh50jqr5daFRVwIThpEoYJmV8DshmUn1I4S/ZTBUAzW4x9J+qfo4itkLuqM8JE/OPV -Xfl5m8ublyU5j88tEcwbPq+1aPdZL/p662K6acvy0xdFapo4quKSlq408QuyrUKwWN8AkBWk -cR0aPVGtSfma3UxEd959PFRjekAGIbhn0y1zo/zIkRx7QPIi6zuWvMHSfNXRll1zoqva46eu -ERaJnXpkjZTho3T9l1IwR9iNiOK69mQlp1U8KhcM0I3f16SD2xnfb2z7cNvjMAU8xus8F/A/ -tDOexwN+EW1Nkm4tvXHo8xQBwT2AOdt88byyUpryuzoIBdmG59vxf9+FBnFNOdayxpFILlSB -nbvwpvAJIN5KxZB5mZsZLY2GD9xwhhBdKU+pAC6HYkdBAGds/wCueFgBZEQsGQl8YXMfc+nT -v34TOY2Ss0aqNcRlsnofO/btwioYMQtlrtF6POokZI6T6nPc8GQmTyXWBuVLEnjRSGsMSV8z -s2Cy4OA3v+7jSUO5fDk5Jz1fUfv42tCdQgvVin9Hy4znBzvwxX0IOicpgla3OaCsLo4GSerb -J4peME1JKlaDBEpTt1DG7d8DYe//AI4ZLrWTmtxZdanbcnPt78E0rGEwTcuXx1PnByW3GD6/ -f/XgwGLNCwyZBGqBtWD/AOm1g9QDvjse54dmUlgsqhnJvoBYtlthn6+37+C6UApFUQeHem7Q -t+qDDLOSANjt7/z/AIcIe06LbmTKIYukqF2yBtttjHtwnfZYJuF2h9w2WXbufX34UWEBLcez -AXJcHBZSxxkDHbjbY1CadAMTqu5Tgk5Yjvj3/LjIkpWcu7IRha+q1WS438ErWT9dqoTjcMy5 -nlHrlY2EYPvN9OHAMslaaBGV3v39Vk2myAvTWh4Jaq7VLeK9OiljTU6gnzqPMWJGy+mB3PZt -rZcAtF3ZAKGK2WoqquaSrp5EnU9LII+hogNgCv7JGAMH6cbcCTOkLVnOklObR/LS/VFokuVD -Sw/pCXCGasISCnTY9IO/VIc/hAJGBxKYTAVXjsC/y/dC1MQ1ol/v3vWDqDlrqLQlmul1u8dH -PSyRxlamKTxk8RpR0qWGyuAT5Tg8arYB9Fsv19+4Sm12uMNSloqSoudXDRUKSSTucA7nC+rM -QNlHcn04j/iMDennkNJAGuikJ2pqbx6S0x1NXMrFfmyuDj1RB6Z337+nCgRozRZmdEFRj0VZ -RSQrU0dVTlwGXxIygP26vpxj3EWeCspsbOcGy5xSxAhcks25PUME+23bjf8ALYJ0MsGneuxU -diCFKpkAZ3UcOTLreSZYBlIcURXSzf7KaetmsNfXG36D0nXEmgqriel7ko2Z6SkUmeoX060X -ozt154ksNsqrUYKlTss4n6DU+CA/WsLi2mC4jW1p79DG+JjfCq9zN+N3lFyt8WDQnLep5g3e -INmt1avXC22OqO0U7qMAnI8aZj2yvccSs4WgYazrDxdYeDR9SmmUa1QS50DgNT3kG3mVrJ51 -fGZ8YvO6vtVp05pkSWxmEFBR1NF4FKfbwKKIQ06n/E3Ufc8R2L6WUCCatQEN3A2Hg23pKIbs -J5c3K0ydJH3t4gBVo1Lqf4gdM3hLfzx1/YOWkkY6zQUkgqa2RfpHTSSKn/Vj7cRZ6TvxFPNg -WZwe8D1go8bO6p3V4h8evysgm4889DwzSB9Rc6b8/bxJb3PTxk59Ilzj93AwpbYeJdUDTwCP -/UbMFmsM8SVmyc0Zk05f7Rpe464t1JdKJ1uFve/1csVwhyCiTU7MsbAMocyOrY6QFO7EE4Cr -jnv/AE1SsXA68ANTyJPoNbpvF0sKxvXspBpGh3z9P8LbH/Zq2XUdk5E3fUV2Wf5C9Xl5rZCW -IBhgj8FpkU+jyB8HuRGDxLbXe1tUMGoChsBSJYSTr9P3WxSGsEqt0wvK3c9LDI/LP0PEYx4J -uiarSD3Lv8WIg9TyU7HOA46fb39O/C2RqtVLGw1Ui6ZVSASenv6Hh0u3lNBx3roIJwScY7dx -+X8uNQTqEsiAukh1BLHcHfA2+3Gpg2SCWkwsSQDDZLLsAM99/b340GlLbrELDZQek5zvgZ9B -wqZAPBYDuKj3IQ58wwdjj19uMA1gLYEiVHzgMVLBG7/i2xxuCdUljgJGq9HDZxgAL6bDglqa -tNl1npX8RyT340tgncuOX3bOASc/17cJtvSQQV/MCQxzkd8H04UQltse9Ceqh/8ATZScnc54 -HriWlOU7Fa2eagxeJQCoPXg8UnGnt6qSpuix1KUOTgKcuw7Y/Z/rHDOa6U4g6WXBQCAPKfb9 -3vwcwCJTTQQeS+OSB28x7Z75+vBjGwSmn1HRewQRqxwLdVjcYU7Y37bcOtYspkl0FVFnyL8P -N1MXxnHf+v8AXheHFoWntJeS7RNq3/h7HP8ALt/rw/VZCzIwtNtFOKNh1DA2z6Z224Z00W21 -N/NZEYYqM9I+wIyff+GM8bLiCtPjNYQshc+TpLKT39x9M8bATJN51A+qz7fbbhdKumobbSvU -180qwwqv7cjHAH29z7AnsOMY0kwLp1kzJTit9LaY69q2XrlsVlpWhtwWFmNYyFnmqQu2C8nW -VzsB0k56AC62nOu5MdaR2tZ9z7+i6bFfNQajp9TVRWaGmelEESRqxSPqcbKVAGQAPrw+2m94 -INgnH5SYtKffIXl4mu0vOseYdyt9bo+ymKOrrHp5GqhKCOmFXYKZnJKAR+YZK5I4PwVAuOeo -6QOVxyQj67Q2NPfvvVurFfLBZ9SWr5a3w2aaMzi3WwSrO7RKOqTpyAzSgbnfc5A6uLTgKzG2 -Ag3sga7XkydJ3KvvxGxtdqhmsWIkq2gqJmjYCAskjMHTbygggkbYPb6wW2quZ5a3eQpDB0AW -h28qnEpodP6buaW6XAmf5aWdcBrlJkl1jPdKdfw52LHP5RLWhrT5d/7J1hzOjegWrrKwx0jB -IKB2bqijpSyJAo/ZxnPUc++dvfhp4EBwEJectM7kTUN5kt9quNor6q43S3VZjEkDTu/g4z+s -TJ2lGRjHoCD34eoVIaQ+SDCYrAugsF5VJ+enxf8AKnkHWpaLtPNry8CVY/l7VIh8RiMr0tuX -JyvlQEgtg4PD4wR+J+nz/b3qtNxDQYGvyt6x/lUs1Bz/AOfWs9WXDW2urjd+U1ihhSCh5X6Z -kzJGp2WW7V7ZdXkIyYlxjODgbcHVKFNl3jLbQfWffcmKfWkwDOvdr7lQFbQfEjzWs9y1LBZb -Zyw0fSp4U95r6xKGiSMbBJKuYrgrnISI7jPl96TtTp1hqDuoa4ufua3tH9lZMDsGq9nWVOy0 -byYb3Sqca71VoPQlZLQR80JOYGpM7zWGnlSFm7kJOwSSUfXAX6nheEZjMW0Pq0sg/uInyEwm -qxo0HZWvzf7ZA8CYJ8gq26t5ymr8aOOKFncAFZqn5mVNzs2MjP06j7cT2H2QGDXyEKLr4tzm -z87oB0/Sai17UXJNPUNI1JRxiouNXLJDTUVqhJwJaypkKQ08Z9GkZersuTgcHValGg0GoddB -qSeQ1PghKdKpU+HQa8kxIKDlZpSjt95r+Yev57WZRBU6n0romGro4JgEZo6CW6VlD826LLG7 -PHEAoeMh2WRZCPXoY+tTNWnSGSSAHOIkjccjXRukSdbjcn6dTDsdlLjmgaDj3/buQnYdMcsN -YfEJDYNA8/75y00S/hRTa45n2nwJqypkAV3nobc9SIKZnfHnmlKxgyO+R0getjMbhcJ1tSgH -1BMMpnQDm6JPcBOgCcbRw9WvGfKze5wnxgd8r0v8m+YlgpOW+lNOWsR6RrrDC+mq60z1nipb -K+ikalqYRIFAdPFhd1f9tXVvU8AVMQKobXBkVAHDudcH6HgVItw4a7qjALJB8NfP5J4xalqa -mlNURbqqIeUT004fH0z2/I8JJfNlgaAOK7KTUwqHFPJdFdT3+Y8qH6bf58KbUJ8UmpSOuiKK -Ks6nUiUQAnvC3VGR7lvTH14NpguEA3TNSm1qmhJclbCVVJLGd1Mg/F+Y/dw7SD96FeARZcJa -6ppsCtoyYs460PUN+HQSNVssANlzSojmICOfEx+HGMdvQ+vGhEmFjhN1wdT1t0nc5AJ9PqeM -Y0LTh2YKwJAWJZSuM5H1+44SJkpAdJuoyVVDYJC+22c8Nhg/mRAII3L0cZyCRj6b8SI0QhJP -wrh+ycBgcd/z4bIMpQuvilRkZAwPfOeMcszbyF8xhSAScjtjc8KmUhz+CFNUAG3TDpVdtse3 -+nDNbQp+nGaFrZ5pk/pWVcMR1Ehfrnii41pa4yFI0B2QUnnYDAOMEZ2J4bDRqnXm6/lIKkkh -mIxkbhvvwbRMmIsmzEwVyb8Lbqy/v34Kdqkkg9lAWrGzQVQK4HQcEZ24eaLapIILpVR3UG/R -goGbq9/xffhykLwE250k5U3rcvUnmVDnfGdh+fvw8TaE24bplT0YQgYHl7ZP88cIAISyARby -WdTUs1SJFp6eecxRSTydIJ8ONfxOT6KNsntuPccKAcTZZWEEZiuChQA7YRSfX0400EGy0IYZ -CthonlnW2jR9JVXSX9BaivFUYUnedYpaCgERaWIOT+qqJT0J1EAqjFMguxB1Ki8NB0nwEfSU -O+o0kTf7Xnz/AGVhuTXLvlmlBb6/mHPqCC/VVUIKaqiqA7W9mlTwi1XT5i6sxqATlQrdPm34 -ldlYQsYXVyC4ndNuF7++KHxNQOdLRHv9k1bxS8kdL2ttLLoaiFpVWppKiB368+NlhIqsBIqu -ynJHWCScsMcT9RmHYA0iRuj6oUNdw0UklfpOwadt+h9N3ii07RxVc9wmSsZTM1YWKQoB3fEj -ltyNgmM7cDtoBpygwBJTrszbjmfGCB85SV5o81rDYqu/2u22qkW4W+Q09XUQKySvEqh0kEm/ -S5YgknZyBtjYtYuoB8Lb+4W6VKZG4KvnPHnNarfy+l1Db8pRKrinKvgSKsEkxIY+gBTBxxSM -ftOdodUP7fnB+as2HwZGGJ3EOjwBK1j3n45NAyVVNa6rSNzqdQJ4k0dMk0TRtAhAkAA7MAwY -H1BzvxP1A3NdRLMM7LYrhcfjZ5VaanqDqSKGNZIEe3zU0T9UqeIemRQSOlsKwcMCQUPqOEua -wGY7kp1JxETzWsv4sPjl1RrjTVRbNDajvGndPtWS23wLWCLhf6liuIKfpy6jLYLd8EAZYgcP -08NT0BJP+UI7O1uZ3ZGnM/URv8lYn+zl/s9ec/Na4WXUVJoP/wBRedVtVaWmp1p1qKXSNLLJ -4ny0RkYRPMjFvEqZWWKNmKB2KksZTe+rJpRDLSdOP3QNevSw4HW/E7QASY4Ab76n4Qd+9bBv -is5CfCt/ZW6Grbr8VHPimrviiv1ulqrDyw0BRUt7v9Q7qxhqK+vr42paGm8Xo65Wpm6sOIfG -YYMYej7agL8RUcZ3A5R9z32HiorFdJsY55w+z6bQ9tjmGbLIsXn4QY/kbneQZEDtDyzc2Odn -OPmXZaW980uYmqNSXGJ+ilp6qoZ5HibZ1p4EUU9PErnGEQNv0+nDezdgYHBiMPSa2d8XPMk3 -PiVZquKrVfjeXH3oNAqw1VDqy4vb6JLZcrdFcKlaOmhSGQy1kx/ZCAGaZsYJAB+g34kP1FME -wdBfl46IU0zad6I00xonRjVVXre7tf66F28HT9sr4qWdwpIxW17Fo6Un1gp1nqf2T4B83Ar8 -VWqENoiAd5E+Q1PCTDd8OCeZRY2c5nW33P0F+5B195p6t1pUWakW36Yt+lrXMZrVpqgoBHZL -bNgjxjTOz/MVG4LT1LTzyYAd2Hl4WzZ9GkHEklzhd09o8pGg5NgDdCbbWe5wLQLaCLeW/wAV -HVi69q9OVtrj1pcLjQz10t1qKF5D4T1siBJJyGyBIyqqlgBkKoOyrgmntIsaKLRDBoNw7vIJ -b8ESS8mXHzKwrXPXz3Wz2DUrUsqUVGWdqRQamSnD5MYyVSWRF6yoYgBdurA2LZWNRhyi40n6 -ocMDHQ/Qrd9d7/pH4b6j4eLv8N3ODWnNX4cOZuj5rvam1VS0UU+n9QUdQ0V0tksVMFjjlUyR -SPFjI8ZW6pOvxDzXB7Wx2LZiKWNYG4jDEWbMGm6S0gHxgjXldWynhMNSfSNAnJWGp1Dwd/eN -UeWn4nbbDLJNfLLW0FZEd5KJ/BBG3mUdiN+xz6cAMxpzBzxrw9FLO2ey5baFYHTPxYWGqgpq -a3xU12gzhxVoqTgeo6l2J9N+CcPtGBDRpuNimq+zs8Fx11Kf+k+aGktRvGtora+jqyMvTpUo -siD6L6j6b8SGGx1N5ytMHgoh+EfTPa0TYpr5JGfFpKmoqYiAfDmXw+3ofTPB7XGJmyHFLKZI -RXbdT09VAAYY6oYAOJh1Lk7hlP8AW3BNPESCHBM1KIBEWUhKKKZ+oeMDswR0K9OfVfc8PZBe -EwS4QHLnFM0fUrjxYuwfG4+h4xhywBcrIgydVzlKSYMeCSchhvwuLpuNZUewGenIUjbvnjVW -mSbCUpo4hejQYHmBP14OTQcNQupgMYbJH8eMPJZeLr5uvsPtwgiVsPBX07AAg9vT0HGRCQCP -i3IQ1RKPkJ8YOB7flwziGy0wnaZEyN61t81cC6TZ6Q3V9vvxScaSXqTpCwBSZc5JA6gO3b/L -37cN0SYkapYvdc0GGbZcngtkwBwSC61l2OQV2LAevr/Dglxm0phrYueCBtU5NDUjpOSDw61s -LfWZjlCqPLH03xWVsZYAjO3f/tw/T1umJuZTctxxCAWOenBz3Prn3zw9UbySiwTyU6jDG4AJ -zsfX24biCnGNm+qM+iGgtGpnpGTwZzb4oy25KM7ysPr5oF//AF4dEQ4A6pAJeQRrf36on5ZW -2nkudNX1K9dY9UlHRbZMDBDLLOM7dSRoFUnIDShv2eHMOxpMkx9t6YqVHER79x81sC5W266X -nRlHqeG96fWkjjjrA8jw1AWBf1ctRNTMruaQOHjY4GQAWOVUicwge6kKkjju000Qkicp1Pz9 -7t6en6e0poy2XHS+n7RZrFPSQRKtNKiLDdY5JMFx0fiOHLLIvbIJO3Eu5zaYOQCRu4jkkU2l -x7Xh81TTV2paGLUSSSmfwoq54WFT0yBqtFMkbSMpHT1rGwztlVyeOfYva4o4k0tzzaTv3X3X -jzVsw+znVKQdvbr3D9p74Vf+feuY49O36toLwlRXpAZ4J/mMZqY2UzJLhT0sAUIb0KEDBGeJ -DDbUbUe6lNzcePsoc7PdGeLaFa/+ZXP6+Ga8Vhq5Kumq7UlFJ0uydRFbkgM24fw3kC/9JwBw -5W2nJawmTHy3+icZgm5cwEyftbuQF8QHPStg+GblJHVvQ19wuEdzgRIgXaWNPmIoZMgY6hGY -EZcnOCdtuOf19piptupuYxrT45gY8gVYsPhMmAYTq7N8iPmfRaPL5qarMlouNqqZoJZklaLp -bpIjzgJn6LkDHfpzxdcdiMpDwoShhyWkCLpdaq5hXe7rS3CpqppaiCQtI4HT4niMT0H6dRft -tvt34VSxMumU1VoljS0WP1Tb/s9eWt3+I7+0R+Gr4erPX2aiq73qcWhqm5qXjtqGGWWoqEQE -F2RIpOhAVLydAJUHIsOEodY3Lx38lUtt49+HaaurgQ0A8XODRJFwJMnfa117Sv7TX+0m5K/2 -LnJQ/BX8Btr0xWfFDPQ09RqC83DwqhtJQzRssVwuOMCouMir1QU3T4cKBWZFQxRyyjWCm1si -BuH1PH69yqVClUxVWpSpPP8A/JUsCSP/AI2bmwDeLUwYAL3EjwDa656621xr68czNW6ouutN -d3WqNRdNRagJr6+6VTkgyzvKSXkbJCjOdlGwAUMmoS/MblWihhmUWdXQblaNw53PnqSZJNyS -brjBfLlo262q+atn1D87FGXggrKRaV44sbGKBiCoyT5pOgD654jcTRfWaWC0+SNpVWs7SOqn -nVyZ0lTVVy/Rw5q69qqbwXtcccptilslhW1ZaKSpRfL+oTpp3Y5eJwo6pbA4LB4Noe8dY4cf -hHMN0JHF0nkmMTiKtV0NOVvKJPeb+kd6qTqW712r73U368W+wWpmjjhjpLVRRUtLDGihVTpi -VRsPpudyTwPitoOqOJCcpYcNF7rqipmRkNCzROoA8ENtj/D6H7cRx5ohovZGNpuUZdfmZUoZ -FPSTJkmU/Qeh29cD68Cvp3hFMq/1HRYOsLYpMOprG7Je7eVlyo2mQYJBHuN/oRkZPD2Brmm7 -K7esxdJrgXDUI0sfNi92HQ6aas9FBeNKzX6l1fbaOYti2XSKMwVCwn0Wop2NPKvZxHA34o14 -OfgKf6pmNA7TQWnm0wYPcbjhJ3FR7cQ7qjQGhIPcRv8AurgeBdqMQ3DS1cuo9LVFHDc6OObD -NJRzxh42WT8QbpJRs5AeNwe3HNukez2YbFuoukDVp4tN2zzix5q9bHxD62GFRt9xHAjX3wUU -lQDLG1uqRFUphnjYlJIid8OvvsRn92eI8VQTLh4o2Lywo4tGuLxb/BkrLnXQtHtT1BZuqI+g -6u4P0O3DWIZ2RkuEsZSbp2aV+JLU2n5YDW19RWxsQWNSXaFvYjc4+uNvpwThsU9pMHMOaDr4 -Fj/isVc7RnxB6T1GadL7cV0feNniq1PVDKD+z1DuO2QcH68S2F2iypB+EqMxWCNMy0SFafT2 -v4K6kgE1fA8P4HnhJZQ3+JNiM42PE1RqyMwOqj6tEtAI3JqQTVTQiot90jrEO/4ckfQjh6md -8yQhBJs60qSpbhNNFJNKrQuGCyIR5Sf8uCS45ZjwTQYu/wCYhk3kKoe/vn8/Xht7+cJtzWmF -6PQcgHGTjbbiQNkg2uNFxJBPoPpjjaVBlcMDA2OPb140eCbgari7beUYb68aI4pzfCDdU4+R -qACDtvg44YqnsklLokE3WuHmon/1GXcFerYe/FKxvxlHUHG0lJiTf1YL6bevsOEgmE8XAGN6 -7FACnAPrgZOB9+CKMJtxA7Wq5EeUkjuDv6f9+DKbwSbJpzhmkIG1MQaOrADdj9+HGgAJJcDM -hVQqX6byrZz5jsfp6fvxw7QiQEhol1tyadEPIJMk9vU7Z4cDk40HNIup2MnZCVyBgn0/8cIm -0lJpvdlkm6LqKmeutFJa/m6Sm8aWateaUsEjSJOgdRUE4JabAAJJ9OHqbZfZKe7KCR7snzpn -RF+03ZdH18mnTWC4perdT3KJxUU0FXL0QqVePKgqjq3UcD9YAN1I4JZh3ZASLXCCfUkjLrf7 -KzWh9S6al0TYdOV9w09phrMrWyzVbWWVajwMyCeLxoZA0ozuzMpEgkKMAQrCbwVZhpDM4Aiw -Ma8p3pqvQmpDRI4ef39Vmc+6yCg0xpmmsklHRzy04NNUxT9SCoVus9LMx6FdT513wJAf2TkD -aWMFFgeR2Ra3qpbAUDVJaddffvctcdz5uf7TXmy1NRZY7fPfJJrPJDOyoTXU0zrCJFJHTIpa -NC2+UmYk445FtvEtc6tSmXUyHtPFh/aY5tG9XvZmGjq3OtmBB4gga+fzKQvMTVU/y2oq+of5 -Cj+ahWsVwEPyVUfAOE36WiqUOVIzkEE9+INm36v6wV2GOsDhA0kQ4eBExClv0Tf05pG+U+hl -voYWsvmNqC9XjTkNII6dK221Ekc9HI2CrK8SFSCPKgZWO/8AeJzji17T2z/xFJwFnDwggn9l -F4XZbTTdTNiD+y6Oflzmt3wz/BXQVc1ZV3eS0X2tWUjEMjxvHUyKn9/bxFwdz1ex4oexcT1m -2tovnsNLB4G3hdS2MphmDw8/EZPldaxKiO4PaamdwXqaC4xU7Ed5MFkBH+EoFHb0+vHU8Xja -biAD8QVTpUHgGdQUOXK3IouseWMPgq8andTg9Qx6d844ZwmMhwjWUvEYaAY4Ka+GStoOXvOP -SfxNWX40uSfwqcytG6pFxsSajs2pblcZaiJjItRTx2yz11LLEBL0mKolRjggqVOeOpbPflaH -AgR704LnO0qDaoLKoJE+MgyIPIiRzTA5ycxvhT1Dr/VXMPmb8VfPv4reYt7qJLlc5tMaBWww -XSukfrd6m8XypknyWyPLbm2JxgngjElr5LjmPl/hM4Omyi1tKk3K0bvX1Jk8SSTqqp3j4i6e -yV9dRcmeU2kuU8WXiFxSomut9ljPo12qMNCpXYrRx0ikE5Bzwwxwygm/v3vTtRpkpJ36/an1 -1d59Q6qvNddLlOAs0pcFmX0XOMKo7BQMAAe3GqmLk5U4ykD3LuprcUjVaVI4iw/aXqDfc9x+ -/gJ7ybuuiadhZc0geJz4gmoSc5B8y5/nxhI0C03S6l6SKLo/Wo0inu6br9z6j93CTKcbCmXt -sNVGqVILxuoWOYkZ+2ex+x4ZdINksMmSV8hlrLLIkdxdZaTdYqjBK47dLjvjf8vqDsh7Q42S -6buKg3oktVZNQxoY7TWMaikOf/t6hRlkGfQjzD3GPbiVwWIzAscboTHUchDhaVdrkpe5Lxyv -ulAKdquu0fItYngyFaoWStqOhjEw/Zpa+RQVIICXJe2OInpTsv8AV4AVm/8AMomDwLHHfyDv -/ZH7Ax7aWI6lw7NSSP8AcBceIv4FFwj07qNDT1M8FPcT1eHWQ9KMVzuZFHfBxnA29R68ctd1 -lMTB5hXmGvnQfNdVTPddMTLbtUU7XC3xDoguMKqxRTgqky9pIj6NuRnv6cM02Mqguo2dwPux -Sgx7T29PDfx5L6jLRQSVVDFJ+jwwaoopAP1TE7FMndT7jb04fp0yeyTfj90h+UGW+Sz6a7ik -RZbJ0VFI5HXTHPSCe4A7I3pttw60k9moII3puoxre03emroTnhfNPzeHRXq4pCPL8vUk+Qf3 -DnsPbiWZWqMaCDYIatSY6zu9W30l8VV4p6qKKuLJT4ABO7qPb6j7/lwTT2i6ZKjnbNkydFbz -SHOuzajmo1td7iS5zr5aapwPFI7gN2I/j9OJajihUhwMEqOrYfKSCE56G5QzQLLUwP1nuqHZ -D6jHBTmGdJQk20Xpz7YIJz9DxME7lHOEmy+HOd9vrxtONNl1lts5JOM4znPGoWnE6roZtjnb -0I4yFgfOiEtTEtQzlmB8p4HrCAYTlNwmCtdHNYBblKWOHLD04pWPb2iVI0QASCkqzZ8hIUk7 -YHDTGt3JcHUr+Tpz04I29u3twdSpAAXTTnRML7kYCjrAx3Hb+u/BTQblIdcoM1NvQ1QHm8p2 -x9OFcloB02uqjVSr+m1AJz1bk/c78EUSU2D203rcrNQ+MTFF4RVCFXDOG6j1H3IIx6bY4U4j -NAT7RLi4eKlkwAPNnA99ht/XfhAM6pDb9ngjP5WippEeSrubTikVYWpo1CRTbHolJOW/5mQN -8lRuM8LblAk6+/om5LnCE2rPqZYBy8rrZXnpSiSir6SBivjdFSzrjBHnUuuMdwzDcbEuiQAA -BIjTuO7mEgtMzMEfc+ynnpCwmp1TaGr7cs90o69cGsdqqmWHpeSNj4Sr4Ts7RjIYhekK+eon -gzCYVkgaEc/IpPWPDbXB9+aAOeGrKe/WWkrqG3i0JUBYP0aISopo0RyYkI/CxQuVx9AMZ4qG -3sa29MmA4QfIwfkCrhsjDEQQLtgyte14Nv1PoaS5UklNWXGz3mgr/GOAykdSSTJJnJSSNKfr -6tsqx9uOSPxsYljh/M1zD6ET3FXQ0IY4eM8pH0lC3O6lj1Po3mINO26d9R3Oz16RvKwyt0Cw -1yHwm/YMkayjPdqtz9OK9ha7cLiqTXu7NNwPhOQ/+Lo7mhHVKLn0nxqQe/iPULXxr6Wg1VNY -rzF0G33hmqJI1PUamqiVlkhXY56ugsd+z/QDi216wbR6s/8AxSOYaTIPhPooyl/zbm7gD4jU -Lu+M+hqaHlH8OcdBNFSVunLR8gVRlUUtTUR03iyM2cAnwJ1+u4UcUr8O8W1+0MWDpUeTvuGz -b1ClOktBzcNSLbQ35x6KkF00lR1l9vVPT0lTR0EtG1TSvCesh0qiGhAYgs4D4B22B+h4vNLa -Dm025tQ6D3Ftiog4UF9hut5pbXu2p/s89fTW6p6moJZfEM/SR0uGX9WFGAPEVc5bOQfpxM4P -Fg1g0nePfzQ9ai5tIvN7T6qtXMDQVvbWF6s1NbVpXlqTUL4lVMYZH82MEfh82Uz/AD24v2w9 -tO/SNqEyAOU+4uqVtHZA/UFp36cPcpXVeh5577MtLYWskrSs0MBqZJgxBJwrPknPTsdxxYKW -1Gind08dyiXbNcHREFRV1oPBl6nt0okUlQpfDADGMH/2kDH0PD9Mg70NWpODtFjU9RQO2fkp -I5AQCol8pPsQR68OGyRaUR22utMhkgSWst8oU9St0uB91ONs+u3CXB2pS2lsc0Qw06eChZqa -aDBwMErJ+R2z9m4QXFPtpggXnVdDWeJZVkgIom7fiPST9CR9uNhxSRSzAELPRqmhBiqY08Fv -M2BlG+rL2H3H7+NG6UxpFypSilRYpIxEKmDAzTsMtuNymfxYGPL+7hp1O8pdN2YlpURW2Wlq -bdPSMD28ajqYz5qWYbrlT3QnIIG4z+9FKq5rhUB0198U47Dh7ch8OSOfhw5qWXl5zO0jqHWi -VZ5dVBnsurIIWIkNjrYzTXAJ/wDzI4n+ZT2lpIj34tWCqs62Kv8Ay3gtd/tdv8NRzCq9cOy5 -mfGwhzf9zbgeOh71ZXXOl73y817qTQOsWgn1FZLtNa3r6Z+iKukichZlI/YlQxzIceZJVI2P -HLdp7KqYau/C1PiYYP37juXRNn49lem2u09lwkeP23qKp9Yv009BdIoaqmbqTDKfD6ydlZfY -ggjBxntg7cQx2e0klpgqQZiSBDhIWNUSiKB6uyxyCFHbrt65MlOfXwc9wMZ6Dv8AThNOm4HL -U8/utuNiG+X2QtLe1B/SVmro6SqVR1g56JD69Q9O+Dn134kGUJ+K6Hq1B/KYUobhQ3WbEcpo -boqBniB8zodx0E7Eff8ALjTabmNk3CxxY+AESWXWE1FUNS1niSRZCopJHQcbnPv7+h42/DF1 -1oPDNE79P6olnpYPlK4s/ieInWxVkIHoR9sgj1HA9OQcrko0G1Lq12ifitv+lbfLZ9QUhvMs -fT4UxLdRXB2Yjue2/EpRxpaIfdR9XCtF2le6olsbDzZxxdAJVSm0BcMknJzufTjHclthtK45 -wNiTvxolLFhBXVJsGG49M54xILrX1CEdRk/IznJDdOcd+GazZCdYNxWunm1vcZN0PmIyTxS8 -c0l9lJ0SJSQkbIK4AHt7cMsFoW3OvBX8jeU5JGe3Y7fb14NpX7QSMg3Lkc4YE4HbIPfH/jgp -p4powLNQdqQgUdRgAjGMe+3r+7jMt5WBgIjSFUqsJF6B/B5t/wDXginBMJsgB0BOTTUIqoLp -THAVqKWQdRACNGBIO/8A7SPzHD1Vm/gtl0HkpyyWuuulxioqbE6D9Y7MQohhXBd3YnCoq5JY -9vqSAWmtJOWNUunl0Cc2h9JvqWpqKaw1VuWoqa6jpRV18UqxZnkOPAUKQQVDlS3ncRSNiNd+ -Heqa8RofcrTXODy52is3yy0pRapWy32moLZQaaSguFRTVENAIGhpp2eONmcrkugWaNSfMzHq -G6gk+hTBLYAAv6pgukHNv9OSYOpeWlNbpNJT6Noay3tbi5tdW7tI8VPSjpdn8w6jJK0iBQME -Jvtw/wBXlcHU7Ab+XDxT1MzZ58FWLmBbotLvcbBV29LLb5RPc0eQGR5J0JnSRDIrFY+maQFF -I6cY3JOOddMaJFMEaEnx4K57CqDOT6cFrfju0tu5iXnTNzpGSz3SirYXhgiJKPG3WAu46vOY -SrDGyj1bHHF9oVXmk6DcOG/WbfdX9pDiARqN/Aa+hSo/2sNr1/pC21Pj+NVwUiZ8UmOWaCpE -T9s5DU8wUb5ACjvjAWLoGvh6jhun1Fr8iJnxWsMA2r2e7T3uVC7JFNZtVcydDSvI1HpvVTVU -a52jplqFhZQScqvgy07lhk+bse/FxxdUVsLRxLb9bTg98SO+8jyUPQYGV3UgNHa8FYr42bCa -6h1Bap4IYYEhs91pzGcSPEbhPSgnA38gGcb5cZ78c1/Dd5aRUGsvB78od85U/wBJYeOrI/lb -fxhVF0NZIRNXRyTtS1MkM5opjl3hDKkpyp3AzFE2exOBt1Hi9bWqk5TukZhx1H1KiMKQGHN4 -eUoZ1xooU2m6+6Iq1j/oq4wx9CMvROkq+QoBt+ErjJwVHBeDxf8AGDBbtNPhCbqgdUQeDh42 -SQ1po2trK+z1NJFGtYJnFM2OqWV8iQHI7rv2O3334sWxsZka5jtIvw4FRe0cPmyv37vmh9LG -lbb46Wpp5IbjChekkjVS6eYAxTE7gdQCqTuT0j0PEq6vkqZmnsnXy1Hz80A2mHMIOo089EFc -xtIWmoqqm9QWgxQ1Yjlkp2IQJVKFEieyg5BGRjcb78TWx9oVAwU3O0tPEbio3aWEZmzNETu5 -qsuptJSWqYViU7midiFBBDwNjISTbsd8HcH34ueGxee3sqtYnDllwF02ew2264pBWVtkvKMs -1NUOuVQ7ftLnqTGWz7D17cLxFdzLxI3pyhhs5y7xoiWCaqsU7Wu/UFNBcQ5R0ijK/M9P/MQY -6XX/ABKRvkfQZTqB7c7DIPoscDTd/E1RNQxwTI80YSpgXyuEXq8M57MvdfpnY/XhBcQ4A6p5 -gky1ZwtFPWU5NM0LqqlmjUHEZJznIGV9twR9Rxt1bK6DosNDMC0IfqLaUwkYk8rdWMYPbuvf -29Mg+3Dzas6pipTyutYrFo6mojk8GR/P263GFb/DKPQ/4htwipSFyEulWJEHVCGoaAWy9xvJ -EtNBWHreNwGEco79vxIwwc+vmzwds+sHNLNY+SA2lRLHB7d6vDf7pU8weSnKTnLcrrV1d8ts -g5W6nkODLDU26kjks1VL6v41rAgLt3a0ycPdKsK6tTpY5t3HsO72gQfFseIK10bqtpiphnWA -7Te50zHc6bcwlDLUVtKstNMYqqlBIi83UrqfN0MfTv1K3cg+uOKKaLX9rQq21Kjm6aLtiuFT -E4aGSYFN3ZnAYAdg5Ptv0uN87EkbBl9JrhdO03uBMd6xroy1FR+kKSZqSvJPUzABKz3Vx2D7 -4yRg8OUGkdl1/p3IasSCOJ9whmeol8WN6YVUFfA3hGJicqR6J6rsfw/u4OAEQbhMFvb5hE9s -uUlwhDK0or1OwBx1Y/uHsGBz34YNIMdG5ENylkoosmoqqlqZoTTvVT565ad2KfMA/tJ/dkHc -gbN34GqUmxc20SqbzMNHv7poQ65rqSGJmgNfC65jk7sMd1bHqO3AxpmLIqmA2ZX6VGdjnYb/ -AJ8dAB4Ln5MngFxJH+EgfXHGASVuRovh3xk7DHrsRxqQsJkSdy4sAUJGANthxgWRoI1QjqJA -KOb12ODnfhqroUpmsOWuXm6o/SEp9eo4zt/LimY8w5STSPiSKkYH1DD0xvjhmiC4wnDBuvqk -dJYgMRgd+/BdN14O9NFhIHFdqjpVsA5P+fBbRzTN0I6lQiiqCd1C47dh9TwpPUmgqnVykVb6 -oyAevB3+vD2H+JNOiJBlOXT9NLcgUhUYXoDN0lujJCgADdmJwqoN2JwPcO1IGtwlEA34pr3G -potPwx2mmpYaujjlZ6mN8OLnVKSpEhX/AIlNC2UCg9Mkgkxt5gnMWuDR7/wsYQIJEbv38Va3 -4cbLW1V9guWoJo6uy0VJX19bLTVaeLPUVAkaWNJI84n+Xt/y6kAeEruVxtwbhm9vl90w8knM -OMeavdyWsUNmFloqh7PNqCnsclzqEihJow/RHAsNMrZBjidYURxtgbZLMxLoukx4/RaJBJPv -d+wVg6/TE9+QRy0Nve3W+khpI0kYIhkhUglQASVMpYknv0DGe/EkJeDAsm2jLE6lawuelFAL -rfai3U1vp7PTyCpkf5cmqrT5gsQBGIVZZndsHuUBIAwaXteiKtOqwi0GDzHaCt2zCRUYZ4eW -hWmavuL2vWVLXXNkjNsuhopqgDrqBC6MkMwDEnpBkeNvVgQCM9JHm/atNz3Pa3VwBHCRE+kn -2V1dk5WgXg7/ACVfOYaTUdyhWk6xX267LWWypo5FKwRhw6HYbLmkcdGxAZQQDtwvZ9NzqfaF -iIM937/NM4kAW5/L39kguc0KXLmm2prRSCOHmDpKkudvqaZcKlZE0UFSkg2616li2749wBgv -ZJ6vCmlVP/7d5Bng4Ejx15IHEUz+oBiM4+Wvjomt8YdbE99sZjnkmnuukKWOKo6lURzLXNUg -sPRAyk9WQcM3cY4q34d2pVd2SobcZbl984Ult4y5k6FvyMqm1m1pTUlzqLXMCK6nNVRRYHUx -YUio8YONz4gcdwNg3pg3yts0upip3H/ymfL1UBTe0uyxxHoAs6+65tlRarpbqn5U1L2+uZej -JjXxqhJHlx+0FAZd/VxtgcKw+zXCuH7swnwBAHqPAJLsWMpvuOvHeh3XNNTG66Zr6irRZfn6 -qocyAdE0Xyzs24xnChellI6WGwwTwdsgOhwA3DTkfcobFPLmttvPyVbb7dBSpR1NwjcuryJN -04AlXbxQ528/lRs4yCpI4ueHw+cEM3+nD6qCr1+rcL71H6kvsFVSLIiw+IqJI4kQ4kOyttk+ -UIyBj9m9OFYfClr8u72Uqq4ZecpDzXappHjmmMddaalXh8CZwzBlbDKB3DAnJAODkHvxahSn -sCzgoYtAGc6FdZjt9Oy3KizFBE4MiBAzIpO7Jn2ySRjuR6E8O5nxkSGsAAc1dtxqafWdBHQ3 -145bxbgyRTqxjAQHytEQMKrDJ6QMK64xg8OMzU39Y02cm6jQ8ZXfEEEwxXGxOlU9TKzw4NPW -wDpeRA26uRnDDbbcH2OOJMPD7IBzS0apsU9ys14jje6PJS1HSGjqqZAksJI/5iqQGXPqDg7c -Bim5pMCVIh7XWJ14LKksdXLF4br+lYWUMs9IgbrA7iSMbhh3JC+3bvwM6plMssUSGCZfcIDr -6WWlbxDKKqJScEMOuMe3V9iNm/lvxI0K4cIdZR+IohpB1UddKVb7YaujVFmqY18SkYYHhuu4 -6R+zn8JT1BOCeH2tyVA9vim3xUolv+bJ7fB3WQ8xL/rH4fri9Qf/AFFsTW+xoHCiPWFv66qy -vj+/Mwq7bn//AGZ+3Fqw1AYilUwf/wDUHZ/3tu3zu3xVZFUUKrcQdGmHf7XWPkYPgUE0csMN -ImICLdUoJIJlUo1KCdw6/soxOGX/AJUvsCRxzF0uJO8ajjw8RuO9dCcIEAaruaWmo7lBb6j9 -cky/7rMUPROp/YkXOzd19RkduB+qdkzDXf8AslBwDy067ln1FqqaKdxiSooJenEU27xeyMO/ -/sbtsVONuMbUDhP8wSqlAtdB+E+i6LhY3ukMdfS5W7mPeM7pWIvp7iQDBB7+h9+N0sRETp8l -upRmw1+Y+6GzTTCVauMzUtXkq3V+KT0KOvbqH971/mWIdzCEbSDSER0lTFc4Y6yNuipRwpwP -MSP67bEcMBkAtddO1HEnM2ynaWqWATFblSQ9blisjlSD/W/CMhIBTgqDiv1Acjbsw9M8XVom -4VE5L5udznjTxuC2AQAV8B2AIBOcnP34S8pRIAAG9cm3Xtjf12HGzEyUobzCDNTSAUU2Rt0n -v/nwzVsCVkxcrXHzdI/SDj/Fk+pPFLx4/iQdFI0gCEipcdZfGdu2e44baDa8J99wJC+Q9WwB -Bwe3BjQGlIeQTBWdGPLkD3G/r6/5cENgpAcC3uQrqYg0NVhR+E9j2+vC2ssmWk3IVKb1IsV+ -d+kAAdew323x9zjh2jxJSiBNuCttb7RHpaGN6yV4vlKeORTGQHaSWIE1K+0shaSGnz+GOKSf -GFXrKxbMhyj3zSWPa4CdPdvvzQ6jvcKvxpEiiXAAjiBVIYlGFjQf3QAFA3/MkngR0LHOOiuf -yTv9JWXbS9mtv6Rp6qlp2uLRuzDro0patTI3SdyzVDydGCBGIu+GPBNMjNkGn7Lbf6ju9/Jb -eOT2go6qgoYLbQzy+NZaOmjklm6o4KaOmD7Y9CEiO25x334msNTLiMqHL2yTx8tVYHmRRW7Q -ej5rdRTLPX/JRIZuoYcyAncn2boUfQkd+DcSW06eRvxG3P3ZZgxnqNdu+y0789bra7bYqisu -ElTJUVkNcnm6euONpfEbpUAlcpkYwceGgzkE8UPHY9tNhDtXEj7eiuODwb3Plu4BaD+bl0ns -3MWS+UjiqtV0aRkSFsZi8NOpQSD0nJLjIzlVPHEtpYVrrvOnsfNdSwdSGiQZj9volBf5qc8x -2o2quiy3WTw1qCRGGFSssUTk7hWJmXrJH7W59eBNmycPI1A79IJ+SYxLrgkWOqSNuSfUPK+y -W6vqlhv+hr91TrOhV47ZcoJGbHTn8MpgwP74IByN8xYFLGOeB2K7SLf1Uz9gfZQlIZqYjVhn -zG708kTfGxJT1eoeVTUafJ2ipskyLFE4ZUWFnp2Trx5lWBNyP7oOAM8V78NGObRrkiSCPMwQ -fOPNH9JAczJPH5LVw15moeYGlOuokpzHLUPcVk7eIZDGTj/Eesg/cg4G3ZzRD8LUMcAPC/8A -lUttXLVZ5lR2oNTTVFsuwaDFSoro4+lR5P8AhbAbFgOljn1J4dw2HAe2NDlSK1UgOLhe/vwU -/rzWtZLpS33egrWRVorfJE5UNFTSyo6fgPcMyMNu2D6cK2Nsxjaz2uG8j6/VB7Qrk0gQdw9Q -ga43qkvtJTVRhFLT1L9agtlaSYmMPGQQSUwzHfcBgQTjHEjRoGkYBuLd4vHjomnEvbI19/NA -VzqbjHPV0007RmPLI4lDBulvC61YbMrDwyT9PTGOJNrGOaCN/wDlAkkuIQrengqrZdXWApFF -WM0vSuDA2yM+MbjBXPr9e3EhhxlqCd4tzQ7wHNJ4G6HrdW1FIOimdXK5JWRMrKCQvT7juBse -7D34OfTBN0xRJBssx50qDBe7THGamMq8lPlgWGxYD3B33/hnhNNuUljiklhd2lKO1PWxtW0j -9NKxyG26lAyAWU/iIxgj7+m3DzRBylN1Gh11hm1PTy2+Wm6aWPwwIzDKoAzv0xt2ZT1Z6D7/ -AEzw6asOlJibncjGkrpYIhBVB1mY9J6o+pGP+MDdSR2kUKP7y583A1WlmMhFsrluqLLpW3ho -KiSSh09qSFoxN8veqb5h5AVxmKrQrUJgAYxLjYDB3HAtOpbK7zG5OPw4zB9PyVcbpWGhlMsE -dTRVY2lgZhsfcHAzn7ffidovJsbhQ1doabWULp+/XGzavo7xYbrLZ70KmO42+ujyrUNcjiSK -ZT6NHMkUgx6jiYwtQshzTdpkd4uFE4mnmJDtDr46rY1zat1n1jqC284dJW5aTTXMS3LrpLZT -xhFtlZPPJDdKanXs6U9ygr4ii9o2g6hgqTUumVIUMb1zbU6oDmncJ+JvLK6QPRWzo1VFbCgO -u+n2XeGh8RBKUVy0jTzW0xRzQyWWdwkFSE81HOBukgOWRhjYnYhQPxKQa9SxIOtnjdxHJS9S -hBJBkH580N6cuU7XGrsV+qPCq41YI8myq2Mbk9kc9IOfwP0t2JPD9VgDetZ7/cJNCoc2Rx98 -0TTWsR1kFNWyYoaqVmpK4eQLMo3Vh/y5lwcr2Kgn34F6wFpLfiG7l9kX1UENqC3FRdVZzWPd -rfcKNaW8ogM0S7irRc4mjPbIBGQO4IPG6dfJlc09n5HgkVaRcTTcIMeyhR6Srt8qVtQiTlgp -bo28ZR2kHuQO/rjiRzB+mqB/5bu1oUSx2uC4Zmp5KFDgBwRkZ9wdtj7cBOrRYos0BMr9QZQO -wY+n3PF/XO98LkT0gqxzjb78ILRK3I0JXzBIwTgntn14TMFbc2y4sp/CQ2PpxmaZKwCSgvUe -BRz5wBg9/Y8MVnCJTtMaArXPzcx89ITjGST+/inYwdqVJUWD4kjHBz3XPf1G/uD/AF34ZgEE -p0kEWXBFAbIMg/LsP6HBVMpGXM4xYhZyA9OGwMDfHBNIbkIZAgoS1NtR1C5VAVbuPT7cOgGI -TlJ0WO9U5q7PLdL7VSvU01rtUOWqa6oBMNMvtgeaSQ9liQF3PYAdTKRh6UknRY4EOF1YHUFy -FwvlxSGKSnoIZysEb7u5EaRmSQjIMjCNAcZChVRfKoyvEA5iSNUkU2n4LSuqjUuZ0DMGaMqP -oeGC66fMtlzuKv78JXLu76q5oUzWWknmmhrJY3YLvJEEMKxY9FIx1Z2A27ng7A0HVKkAIKrW -DWR7ncPSe5ejW06atHLOxQ2W3xxrOYohOypnASMJ0gf3OkDb1IPvxaCW02xxQbWGobKm/PLW -ctRpqKSnMj1KQtICjZZgoGCSMb9bJ5fXYY34rG1doxTmb7lZtnYLtkH3P7LSx8Q97nqbWaMx -yLTVVtvCO7Meo/q51YdQOWx8uT5QF8/0xxyja1eoSDeLn35LoWy6LZ7iLeIWoTmm8r27Rl/u -oiiCXX5OqkkGGLNUIikkeX8NQGJ9ABnHFRxozOfSIuQSPD/EK0NDWtAYbJNa+hqKnT4ppnpv -01SUP6VtKNhFM1G0MAh6sbLI8YGd8E+meBNgVGlxD7tmD3GSfQoTHhwPZNju8Er7Uf0jzgoX -aveGi5hWqnki60CfKoo/3VmBGAyVtHULgjIVFz34b2yC3Ane6g4nvm7vDI4eKZwLR1oDrB1v -fiuz4sayom0TyF11FSxJWW3UlYstOVEZVJa2rQxOx3KMygkH9lj6EcRfQdjW4jE4d3wubHiA -0go7brC5jHcD87FaoNbQqmobLd6aqnuNHT0a0tS77STU61rxpIRjZ0kjeNvZlHoRntezj/w7 -6bhBJkd+UGPEEELn+IBNdjjMR9YWDrY1NI1eHkkWU3CSVGGcrGyswfPplRnhWyg0uA3QPsnN -o5gCeZCxNQTGq5TaZ6lVRUtb4TJkdaKkk7YUeuMHP0wfXiRwbAMa+eJPoPuo+u4nCsjSwQXJ -fP0PVTVHQ9VSNATV0y5PS2Q+VJOOtOs4Prgg7HiT/T5xlFiDYoBtXJfcuVHGyVokylfZalWL -NGuchoyfFTPuEBKn7HcZ4ZfOWNHBKYAXzqCug0swmiaZiYqx5YpZmTqScnylh6EL+r6gfSTf -h8OtzERyWObDu/35oRq7VJTJ8vClQrL1eGxz/wBUZJ9QBsfXA9uD21J7R8UIQBIGq7KOUx08 -lXTN1QNGJZFAyyOGx1D2B6mOfQnfvwqpTkw7VIAtm4qRoKlaWeKujaGnfrYSx9PkLjGWC+nu -R24UATIN7JLSAQVJ1EDU0ZnpKd5LLJlZ6KRS3SRkEYP8Ox7HPC2PMQ7XisqWEgSpalFKsFMG -p/maQf8ADEh6WT/CG79WOytn6E8IEl2t1kAwER0yVlIsa0tWtwtjJ1pG5HjwH/AT+0MnIOQd -x7ZaeGndBRAkNQpq/TlLdqI11JDGw6T1tGhx1Y9j+E+pU/ccO0C5pQ9akHiQqw18VTarhTzS -xkmKVX6l3BXbO3vjPE9QeIlQGIZqFfPkZqJtTcm9caLlukkN10NcW13ZG6AfCtdXJBQ3dQc5 -6UcWirKAY6RVMfXgnamFOL2e5sS6kcwHFpgOHgYPmtbIxv6fGg/yvEf9TZIPiJHOAm5LTSVt -JVVM1qJqPlUmqoEVjFWop/40Wc5cDBwN/LnzbY451bmHKDafEHgupue17Q8jVDWpuW8tdZaS -+0FVSVlQMvQXIMuJ1AX/AHapA/5iqc5P4kPUMhSAVQx4D8j7HePkR71TT8FIlpnePsfd9yhN -KxxXqnnsF2tkq1KE0z0zsQ/Unm8LqwSJUVSY2G7psCSo6lYvLTOdjo3z6eU68DdNYLM8ZXDw -/f5cRZTX+zwpkOKuZ3pn8a21hj85gB3Vx/eUHq6ezJ4mPw7BDEQ4NdvsRz4+KN6jK3snS47v -ZURcLWehkpoIoiHaQxRnz0UgOR0hieqM5z9VI9+CKWIyHK/T5od2GLxO8ahBv6PqQ7tQ0MaS -HHjQ+sTfTH7J7j93pwfVMmQg2uiZC/T7HSN9h9MfTi/wQFzkr6SNyAFPfHGELDxXzK+XzY7c -aJ3JWtpXXJ1BSCOn079vpwngUmYsEE6n/wDs5T15PT678M1xYp6kN610c2wxuDZG/Wckntvt -xTsX8dtykqOl0lGVWznJ32/z24bpvi0WKWahaLrguQwGPXc/l/44Lpt3pLpJtZZCMOlip6SM -5we3D1OE085RlQtqFlFHOxwQFPpv/W3DsLKILtFSXUJL3rwvFYx+IxALEhM7EgdgTsD7gcO0 -RcApmcokCU+p3iq6mO6RgLFVxR1Aw34W6QrqfqHVxj7H14deXC25LkDQIn0xba29X612e3wm -eunnWKKMnsSdy30AySfpw01pdAbqVqo5rRYyV6UfgO5P2XS+nrtzk+Tip6epWW3WFpPMZoRI -TPWlh6SyeVfZY/rxa9nUI7Xh4fv8lDkB9SW6Cw5neftyVh+Yurop3NGlVC1zkR0VCx8qr5WZ -iOwBb0O/fsOANr4sAho1Vk2ZhCW5jpZa4Oe+oa2loEkt9HLJQFFjY9IfpUyd1HqD8uxGfXA2 -6sjnu28aRTtp+8+sK6bLw4L4O6/p+618/EWz3Gx6U/RkElXSyVldSo7LgxxVExG3uelOwwMZ -J2yOK9tB2ek0Uxx8pU5s6nkees4A+IGh8/HRakObdnNZyw1rapDT+LZ7jS1MvhMf1xcorsdt -gPMucfsgj34q2LblxDXjfM+KsjKrj2YnSJ18VWX4gbpXrpC46mpDAlXJQydak79Mk9FOFUDc -KQHXI9OIjoqQMXk1g+ozBN4pjXMI3j/H1SO5iailqtP6a5g2hkF9t1HZK+IJGRHTx1UUbshU -DCsJaeYZOctVE5y2DZqOGaXuoP8AhdmB8J08CJ5NhQectAc2xGnvz8lbPnfaqDXvJmuit6Uk -lQKV79b1VVx1eIapVTct1MY3BON/FGMbZ5Z0eqOw2Mhx35T6tk+atO0WCpROW49wtD+sE/Rm -paesoqWXEvzkEsUpK/NQPUNIO/ruxwdwyggcekNnOFSi5pP9J8QAPfkuXYxpbUB5fWUQ8zWo -Vjv7Sxyw25zT+FPjLRBqcqwcdwRgdS+uCV+o2xGHM0g3v809tQQHSFC6ogSj5d2W3+EPEgmg -WSRXJUkQySqqejL+uYdXuDtxL4b/APdOJ3j7BBVHg4dpalrHEtVLc4WkibxkL5JwVygBH3+u -/bg92oPBBtbII3Lny4rxIstuqSwiSPyxuc5GCCB/E/8AfjNpUDIckbPInKVN3enFuutDEjGa -COqMXQd+lumORiD65LgYPsOEsGZh4kfslvID5A3rGWlannr7fWxyGhMnhqc5eJS3UjD3GBjb -sVU+/DrXNIBCacO2WlYNTap6eqpJ4AhV+tJFUYB6iw2x3R16vsdvbh3rAQZF7JpwJbA5qJhh -ikiSZCTTuhUkjzL07Bj7MNwfp9+CHBwTTQA210RUE/yjos4jTzeCHYHwxJ2UN9HXAHpkDGOM -LQ4QFk5Tf2FKSww0aQT1U8dPZ53IUyEMI2yPIzYwpBwQTgHHbPGB5cIGqccALjRZzRC3Hw6m -pkoqlXBSdU8WGQZyDgHqX2yM5wfpxr44AuEgjL2T/lGVDRgOPFlpYa8xdTeF19Mi9/N1KOoY -7N+WTtwyDBEmQE+1peINkiOaughJHNeLZSxR0zEY8N+pCSCQBuekEehPcbHfHEvhqmWAVD4x -gIzD2FD/AA98yaTlhzR0dqrUdJLctJQzvRahoDv8/ZKqJ6S4wY9S1NPUdPs4jPoOLHszEtZU -Bfpof9pEH0VfxlIwYF9R3i498yrXaZ1LU8uNT6h5a6hraW4UtkuM9raqYkoyxyeSsjcb+DMn -hT5/ZWUehyaL0h2KW1X094t3x+1+au+w9q5mhzRY+kp6UP8AuctU9pmhFM6ior6HqZY5Sd1l -jA8qvvnrXY9Wce9NrgZe1fgVaqb3ZgG6G/LvQhrDQ8FTBTatsTSm6Ixi/VAocR4ZY5mA/VSo -RkMBhenqUlSQqMFiXBxo1B2T9eHHml4im2A9tncuVx4g6KYsF4odVW+qpKuCRr+ylHSVF6qk -q2fKFx4cmSSrDbrUr2YcDYmg6k6AezNvfDj90/QrNe0l2vr3rGvOnQlBDVUyQ/NCIPFIFwZo -xkMuPR0zgp6KcY2HDbKjnEsOh+fFOVmj/mDcEHVdtorhMamSll8QgdQDlMH/AKdj7/x9eDcP -X6tmVxQlSlmdLhdfpUYyAQO/cj146xC5JK+nbIABI3x+7/TjJkLe5cQMuwwScHjUGVto8Vxk -wRuCAPTjHC1lgG8IH1P/APZ1GDt0kdu54GqE3S6ZK1182Cf0hKwbLdR9O4z6fu4p2OZ2pIUh -QdcnRJhsH+7nPtnPA9P0REgmSsRhktkk7kbjuf8ALgprpuE28nKTC7IwwyO5J3yeCWDemXEC -YQpqRiKacbklcYx9P/J4fixSpJENsqT3yUNf1wWH6z0H1HC6I7UFMl3aAHBOaxlTArBGyFGQ -PXb+hnh8tkEBJa906K7vwlcr9TcxNcWqw6dpSlyvsxssNeyFltlPjrrKnbt0xKVB/vMB68G4 -PDlzrb7dw3nvj1TGMPZMamw5E7/AfNen27T2LQ+mrTpbTNHBb7PbqWOiooEIURRInSo+mApJ -P5+o4seJrCmyAE5gcJnPAKlGp9XyT6pt1K04kgkr1iqmz0hVmVounq3x52g8u+3fHHN9o7SJ -xApk2kT4/ayv2HwDeoc4CCGyPC/ylVd5wmngotP01+hRJ4LjDUZjkZXqoTUyIoI6cDIibIXO -Quds54r+1IbRaH6Az4SYUlgSXPcae9sab4B+3mtffNPUpj0PpWnnlo541EEr3KaEBnb5ITA9 -GMIgkMqhcd8bnO0AKx6ll50vEblaBggcTUixEmP+oDXeYvwla69VtDXUfO+2dcVXS1drNeiC -LeVS0JGQf2ghJPcdTg9hxXcc89UCNQR81JFjmvbaJH0KqNzspY5+S1Q90cR1Ys9F4A6AzTDJ -ifL+nYN6DIAPFc2M51PaPZ0JdPzCzGjsRoqf0lfVRxak0jTVcVbUf7EWXw4pBnpmS3QVKADt -t0OuDuJIYh3cZ6PimBrmVCLZjPcSQffAlVt9QODmDdPoT781f7kHNFqjlFb7hTfI1FDYrVb7 -ikFXDkyUcEg+Zi6cfhRYZM+6gbHI45Pt/BupbQcG7yR4uFvU+asWFrg4doJubSNAQPrZaRed -+np9D8xNZ6KucQutJRVchjd89dZSGplMFQDlf1nhSIc7dQ77YPHbOjmKGIwjK7LZvQwMw8wV -QtrUslYtPsHRfOZdJLHSXOvgo6a8UNRbrc8kTu5ZgEKns3UO7N5snf8APgjYwLnNAMXKTtGQ -JN7AoCuVXQV3LgieCvio4rtTydQmB8LxEqfNkrkpmPGPXbf3nGNcMZmnUEd8R91FgD9NfjPz -QVTpEbtbVFMIXenaPPidXWQVxsQADkDf24MqTkLhrKYoQ1wadFAWOI2bWNbG6j5dZHQKRsQW -yNsex9PT24Nq/wASg0oeg0NrEAWlMDmIBTaiqIDIksL1ZZzgqCXjjHid9sOuB9NuB8GDlB5f -VO4txBPes6625axpB1imrHo4pVONjlVJLDcEKwLdQ/un34GovLXQRIlOV6WbtN13c0Ow1Py0 -dDTTsoogOmJ2jLGkcscq+fxJ2bb0Ix6cSr2Zp4j5IJkiOH7qOrrdPYKwzSUoa0VT5iLtnw5P -VS2Nxv05/ulT78LouFRuV2oSHsIIOgKzJ6B0WOnqEc0Eg+WkDkZQdkY+zA5Uj1H33XTeJk6r -TwIB3KTtNZFa5Z6a6U8VTQ1HVBMsy9SwFh0+f/CfRvQnfY8MvYCBGoWYd+WQdCs2ptUlmR6a -JZqmxklYShDGA+iODny9sN6gj64SX5jOjktwLW2uCuEEVWKVBbl+cp4T5o4iUkjOfN0g9iCM -7HG+47HhbWjN29VjXEWF0fwUFDq+1VKLTwz1pyJEVM/NxnGT0gAiQftIQM7EAbMSKDMpI3Jq -qM0neqUa201VaT1RHCruaaVmlpJSSUlXqx5Se4BXBzggjBA4mMJW3G6hMbTAILUzKnVcl2ud -ougMsdZNaKaPxNsvJTL4G3uyokab/iCYPfhW0T1gDnXsB5aeiRs2plJaFZblfr63VtNT2a6V -dVQp4fSjiQtHAWOzIh7wkHdTuhz6Yxz7a+EfS7YuPp91e9nYwECmdArR0UNUk1ZHTyPS3+BI -1qoU2S5RBQ6NkZBkAPWjAE42I4qT3Gw3HQ8DwVnaA+/H1H+EG61tUGnq+k19bPGpdNysYL1B -Snq+Ryer5qFR3j6gGaMfhxldthJ4HEsrf8O4dsaTvjd5KLrUTScHgy3eju1XSiumnK7UZVqy -hRoZbjLTkP8AJM5Mcdaid2OQA648yMDsccA18E9tUBuo9wfGwRlOq0tjUb+4b/e6UE3bSBSs -kip46yKRSTJHCwYISerKnI8h6upfufQDhRqktDo1TWVoEnev0VkBBwe/b1247I0zouRF1jC/ -mGMg7b7bcYVtpELiAd/XbuPbjRK0AZXyRfKxJ7cYFpxugTUZ/wB2nG2MevpwzXFk6x5Gi14c -2lxXEsBu/rtjim48y6N6kgYN0lHPTlfMVzkAe3DNNoNynX1ovCwsZ7gs3sR/LgkNAFkikdZ3 -rvRGwfMFbbtw/TN0M9slCWo42+Wn6VUPgkeu/DxMm6eqEzbQKkmoCF1B2AIkyWB+vC6Alybf -VGaYTqsjSLSo3Y9IOPf6bcGuBBmFqmIIOq9P/wDZ78m4OXHKCx8yLtbp6LUdzoGp6MTL0vHT -M4d5SO4Mjhf+lV9+LFs3DdXSD3C8IEnOZHP11+gHcnPzN1bDTU1fXLLIwUNggjdCT3xk7kDY -d/tniF2tjmsaXq2bLwpLmtWu5NUNdNbWi1zyLBDVVkSxM4GI5/FVwMAE+YADJ+n4Rk8cTpY8 -OxrKTrSfWZ9dF1PE4DJhDVZqAZ7oPyWF8SVsZbbU6kWtNuoadJWghIdTLEtPJUxrnBxg7Bcb -gHzLvmx7YozTe82A+USq9sKr/EZTAkm3qGn/ADe50WuDm7d4Y9JWS5QSQVJoK3olTpJWQmAq -iSdvLkZ2/YV/YDipmqOqYG7vfkr1Qw+au8G2YeVxp71VHaGSkvWqbXRVP6qsrrfcKKpmjYku -wZceKg2yymPAGNmG3biMxrs1B4O8IrFMy9rcCNeF/ldVl5w0VTU/D7dKGlNPWo2nbjHE8sYb -omjZmU4Oy48PPv0sw2zxXNjOnaPa4jTuCFrUDmLSNFrS1rqSXTPP3mVLFHV0MFLXS26FWHS4 -kjihh3BAx5oFIyNuhfXv12vRD8Pldf8AyqfRc6QeN+XFbPPgvvdopLalbJLF/si8Aq2hmbJW -hkVYqmBxueuLxSu+zBY2GxOOWdLsIOsDzc3ab8NDyUzgar3sdSAvqPnbRUC+PjlRV6W1vpSV -qd6WWeyT6d8SQ5SWstxEMfS57iWnWkKnO5I754t3QPHQypTducHeD7mw4EnzUHt+mHubUboR -+4+yrVrSl6NN3uq6ZhVx0FLJEy5BGGlH4e/bKjPsOLLstx69jQbE39ELtKTTcTw9/NKyaaW7 -6F19bq6FZq6Cks06yw4SQSBppD1AYD+UuPQ/Xbiz1WRiaVRukuHnAVdYS+i6mdQAfJDKR06z -UfzJjmiSVCGKk5QsjBSvqD+8cEtaLwmASWgkrjV0j0ur6F2jjDzQwyOCQ4ZnQIWBH2Jz9ccJ -p1A7DkcJTtRpFYHcUfcw7WlberI7UrIlTQwRE7efEh6JMZ2xkA/bhWBqHJbj/laxlMOf2TyX -2RIl05o+vep+ZqIYq+219MVGY4ounpIIOcEM3fsR9N8dSlzrcCO9IbU7LeIF0BXO1zpVVVHN -HULWU6xCIAeaeNVwMEZ86ENjPoSvoODW1RAQ76RvwCnbZDQ3y2Ggu9Ygp1bpBJJFKrbdRA9M -lSCN1yQdjw1UDqbszQnabutbDjcem5YdPT19rrKq1XeE1LQhY5kffx48kK6t27AD/wDU+nDj -ntc0PYbptrMkgLKrbXPTwmGRvmKB41McxUDxFJ2L+xBH17MPTd6m5oOYG6adTcJDeS4UVbNS -QwUVU6x04BQknpaDDHy9Z7LuOknOD32Y8IjMcy0KhBsp2CGWjrop4pZKG55ISoA6Ov2SQZ6d -s7HORnB2IPDD3Wg6IunLe03VMCzmGmr6WaOnorXcZQAjTqy01Y6jBizt4cmc+xHpjuTcO+0F -B1aEy4Je8+9L2q9Qyi50v6NqzhokqZ+krUYwQJPQdgzeuQ2cgcGuc5pzs3aoCq0Olr+cKqVu -eaaiko6p5KK/W6rE3TUL0OVOI5Ubfp2AicMDg9H1zwd1gcJGhUX1Za/KmBRVUlDUh5I3gmhm -6XTHSY2PqM9hnf75HbiIxVEEQrBhamWHHcrscq9XUd6hp7bK1XT3dFMdJLTylihJwelfxCJy -UwM/qn3B6W2oG1ML1biT8O8e94471c9mVA8CRfd9VYe0Xg31KOgltpm1HHJLFVQiQQLqJN3B -px2jrly6lGADsikAOSjVevRNJxq03dnUciOPEHd9lPte0iXiTaeBB+u5Ctko63lpNXVdkqrT -UcqtQI9DRVkiIkVpqXmQmkrIyf8Adv1kajzYEUnr0P5Z1u0m4phZH8YC44i128fDUcwoT9L1 -Lxf+GTY8N3gOe4qalq7ZDHFT3Cz19ZFEWihEZHXTgHeJwAd1Pbc9/YDhFN7XCZgoztMNhIX6 -DCkZG2/rx2MCTdcX0F1xcHBByx/jxt0TZYIC4gHPuMcancEo6L+kwwIyCDwtoETK1vQHqIdV -LL7kE9vXgSqbJ2mRK1782VBrZCO3URgDioY+nBEo+nrG5JCRMblVI+m/5/XhmjJHBPkgy4rq -KjOS3lPcY78O0zBhIdTBML70gKcnc7nbvwVTdBTD7CdUJ6jRfl6kAdI6Se3bh9vFyW0X7VlS -DUgA1Fk9JbxMZ99+F0wAe0tVGw6Cry/CPyWrfiA5x8v+WkCSi1VNStRdpgQDTW+LDzt9yo6B -9XHEphaHWVGs3e5QdapDMo1Nvv5D1Xqz1bqO3aft/wCi7XHTUlso4FpYYIm2hhVQqjHt2Hvt -xNYzGBoMI/A4EGAFrt50a/HU9OqTKYwA+W8skhG+D6DBA99uOSdKtrAgsFoXS+j2zBq5VEsG -pqem1xp+7SNH8tQSy3KZm8uFp4ZKg7/eFRt7jjmuxHOdjWVH6Nl3/aCfmF0DHYcOwr6bf5wB -x+Ihv1JTM5xXqe78o6yzyzw+Ak96opZ8NMzLHCJYYiV2CvHUevcRMPQ8X3EVS/DFp35vTT0K -ouGptZjWvA1yGNLkwT4FvqFq+5jmOLRFpkISVfBkudQvVgSAsgEZ9Sx8Xp+nU3bB4pI7NFo3 -710OnJrPHcPLeqi6dWJ+YFquD1IjemvDVLE7Ho8Ikj6fgj/dw1UdnYeY/wALeMpEsIOkfX9y -g/V+nVuvLWg08iPK88t4tEqlRiJp5JVQqD3AMgP06R78UvZxjHBxOhbfuQGNqAkk8j5R9Fo2 -5j08cWpdaXSk+aqoVvFYkZqGy7xxzv0tIR3Y4UH6jjuOGrA0w3kPX3KqFag5rgHbuGmivx8F -mp4KC96Q8Rum0rUSafrI5j+rWGrAkQuR7Kvf0zJjfPFD6U0W9qBJMO78tvr8lI4UkQd4n5fd -WI+L6xS82OQep4KG11ly1Fpu30mqKGRYGM1RBSPJRXClxkYlhETuNicRD0K8RmwKn6XEse42 -ccpnS92O7jaU1jZdIGh0HDeI89e/gtTvNCno6626g+WLTRVNlgaKSPZZcqkrNj0IaSTBG249 -Rv0TY/Zqsjc7TxIUPjmzTcW6xZV0tdaHo9X3eWEPPi2ics3T1/qpVbGPdeoEdsji5VKZGVg0 -h0KtU7Au32lRtfa5KUx0yiaRxVxxLnzEog6wfqSAT+Q4JwrwQSeH7JrE0yIAUpbrcZKjTLpG -08BglhZV3Ysj/st3BII3/nsOBqZBztPH6IhzSMp13IqvMcNRUWiSONeg216jPUTglpFGcbAh -ljG++4xtnh3AF2WDcz9k3iRldyjVf2s4BZLjpCGWcPTR2+a5VjIuERa1InA6WHdSXY7YJR8Z -AzxJURIcAbzbwUbVcA4Ei37oaarrK6x080KGnrUkkSUrjxFcNuhbbDYK49+kHfJ4GdTDXk7i -nw89Tl4Ifp3WiuRneKmjSZSssaDpVOtcZQdvDc9Jx+ywxsDwURnpxwTDpa7RGNNMK5KeklaO -SmiiPhq3mMaEYKZHmIG5C/iPYeYAEKwM8UUCcsSpa3pFRVKWuscXC3uvQrHA60ZcYZgD+IH8 -Q22BwMcKaSbgR7+63c9lA9/tc9jrVopJVq4AGhbqIG23SUbthlwfYbjGCOHxUJ7Q1QrqAbcr -jQvW0sEdIJzLay2KeojB/wB3Bxs/+AE7g7r6HGAN1QHQRqlsc4fELJj6ZuVdYaiWiNxgqaCr -OflWk8WkqPUMFbKnG7ALv6oQRjjcBwk2I81k9vLuKnOagjvWl4Ka5QRV9reIinITomtTAfiR -ezQnB8uAQDnYjHEiwkNQNamJjVUCmaO2XWopawStlWjx1dSTxFSrBW7hgCdjsV/9vBFB5I7K -h69MNN0W6cvD1dsWOqLXBqXMDSAfrVVdulvRtsEeu/5cNYmiZlSGDe3RMvT11uVgqKe6Wuu8 -PoYSxOvS24GcFSPbII9ie4JHEDiqLX9l4U9hq5aMwMK7WjdWW7X9tmr6iv8Aka9ooRUsqFli -nQnpaYKC4Rj09M3mwfKxI6TxQ9pYN2HcGsbLb2+32Vx2diW1bnXu99ysHo95dQ3O4/P0tquV -2uCCgvluqkX5TUqFQAtV/cqWXHTVDKt5SWPVnitYkuY3MwxB7JGre7lxBUsKbXMyOGuo5Ips -vLLU1mo5U0fZOYOrtJPMxpltzwNVWqUKoko66JvMksfkAf8AC6FSNwwBL8a3ERULgx2/geY7 -0M2kaXYguG6N3L3uXu3XYDJIHHoPLcBcLLV9PctlR9BxjmnXRbFlxycnODvvxqJstXXGTdfT -AHoe/GDRaFrID1Fk08xDBtj+fDNQJ5gErX5zZANZK2cKWxt68U7aDgHXuj6QMghI7BHYg7Z7 -be3DDDIun3uM8QulmP554ep3MlNudu3riGIBdCBk+n1/8Hghgg3STpMW3oWvoHy1SxO3STj1 -P+g24fBJGVaaQ3cqO6pXo1EgXHT4mffIzw7Qcc0rVVxc+NF6If7IPlmtr0bzV53XKKJWqOjT -dsk6ssEQCWoIx+HJMa++x4sWzKeVr3nu+6HyB1TsjS31P0Vx+ZmtWpKSsHjurIS7oG6AxxsM -H2zjiD2piuwROiuuzcKS4HitafMTVBq61V+ZZj1ZJIOTncn7ZPcex78ch2oesqQZXUdnUwxm -kJWW6vNTDq89CMr2qS3wupJKy1csVOGHptG85H2PtwHgcNlDz/bH/cQPlKkq9UNNPiHT/wBj -S755VZmWppdV8qL0tK1JTCsqLhdadYfMhEUrUZyuxCMshXc/hwcZ4tLsQ12HOXmbd8KiYqm6 -jjBJ0AHoHDxB3cZWrHWxabT0UEUnVIsVe8hAyT01DBV27dK5/N2PtxRMY8EDhf5rpOHkvc47 -w3/1mfHTwCrYtGY9XUM/WiQyVKhz+yVdWQjv9FUffgao/skjmisSwdWY3j6/ZZ2poWWwUyOk -rRJeLhcVUrk9AaCfo98edj+/04rDKI/XEDl9Qq3XeCxxPD7gfJaHdd0cDHUU0CjwZIpahV3I -87s3bufMcfUDjsGBJLmjgoXF0nNZMJxfDXdlt1zmt9TUR09umvFE07y9kRUaEsPXy+I5yDtj -6cQnSSlIbU1sR8il4epqeVlslsOqbjRc2dH0tRNB8vqS1JdaWGdx4FVXRj5O528knHhVC0on -IAw7049HJ4r7MGythXBurTB4xq094keZQWLq5akEWN/e/wDytcfxL8rqDlbrGp0vpsTy6Tlo -cW15nEkkNK1M8ccbvndl6Ick92Ru/TvZdhY11ZnWPPbBE8JkTHK580jE0zGnxA+aoDpajWs0 -/qmtrY8weBA02dxvDVDt3yG6fz+/HTcQ/K9o7/oqQ0EtdHKfNd11SoMejLg/SJ6eZYqjbBBW -HpDP9SiDf/CfY8KwhLXPbuOniVqs8uDXcFNaP8VbN8y/zMD0VG1VE65XPlbOfzf9+PpwjFgN -rBw0NkVSdLSNFntT1Btck4jlFPNTU9MxUk+GsdSsxyMYYZKLgkDzE54c2eQKltxPy/ymMVmL -IjX5WS81bfJmfwHkkaSOhp6NCWLNGqQrGV6dicZc/wDUOJynTgyodz5OUoftN3eguE8NS71V -LUwCR0x1MQFALoDsXUMGHuFI9uG8XQztAFkujWcy8ItqSlU8MDQU8UsXnXMY6J42IBYZGSrj -BP8Ai32yeAqUi/sImoRUsFiUHzENRV2+YLI8AbrR8q0i9WCGx3PY7dwcjcHh14kB4SOruQmB -b/8A61RxUasj1LMYoH2QzSqC/hN+ys+ASp7Sdxgk8DVHCmczt2v3HLjwRLJcMqzzDSass9F4 -00DqY2pFqSvV1lSeiOZMhlkA6h77bHcHhpznMdYe+SebQDxdKqqpLzo6s+ZlimmtTsAZg3jL -jPZ+xBGPxbEevtwUxzagtqhHB1IEbveqZ2m6iyVFJKsEcJt7DrIDBo4x1Et0EfhJJ3DdK+uc -7Ft7nTMwUluUiGiQpvVduudLptZWnqKxVBdGV8pgbFW6M9MmQDk7Eb/UydCrIk6oau0kxqPV -Us1fFRVymrpRPQ3OmfrWWGQsrgejKw7jOCD3Bxw5Slp5IGu0O11QxbJkt11Wuo4ibfXp1hqe -UFY5l/En0ONxkDIxxIBwcMpUeDkOYGSN6aNsuz0sySARturoYhhww9MHb0yD3ByPXiIxWHlT -uDxRAkpraV1JU2OuivFg/wB7hlYtJFCp8QIfxKV/bTIzjcqQDxAYzDCo00qo00nipzD4hzTm -p71cfT2rIUWhuwKQ2+RTT/ql6hQqf2eg+YLucxsNj+BiDjih7SwTmjK3/KtuFrSczR74K2Ol -deyaioRI36QmuNOq08txttQqz3CMZMfzLO+X6AWRSdwAVJPTxUsRhy2AGgclN4d5gw5e5ZOw -ww9gePUcXsvPHcuTYyQe2x74242XDQpAsuI2JGSu/CNDZYSQVxZdtwGH8uN6SAszIA1KQIJx -g9t9+GKwT1Mjetf/ADYkHzUxDZXqwdu3/fio44B25SDAR4pI5/ExOfXIPbbgFvww5PyQZJWF -1nJIIOBvv29OC27pTdQmZNv3X1dxlsnJ7/n24JaJMJDiAdYCFr7j5aoDDygHbO5GM8PCmNSV -jiQVTG6Wm5X3V9FabPRzXO7zT+HDBArO0zk4ACjJ7443SbL8o3pLuy6eC9hfInQlPyV+GPlV -oCDwmraW1hq3CFfFq5VMkjMO/wCJiPfygcXFlPq6QYm8AL311VM+et+WlhqTGx6lU4AXbrz0 -gL/Fv+riibaLSCV0nYzNAVrnv2o4qiu6i8hj6wikEeYnfbH3A9+KTUw5Du2FdqVXKyx3IU1B -zT0zoLQ9wqrrdaaiuddcvloI2cDoWCEg992lZq5FRB6nJ3KA5+lIo5RcuPy/ymxXDsQMxs0T -3lx07uzffu0TP5Zc7dDJfByht2p7ZdLzHZ6ymIikWaJ53qa6mqQrDOUSrhEJzjdFxnY8HUMC -W0TTO+fqPoFXtsYoPqHEHSQecQ0j0JPitf3PHmXSaS1VebLVeNNTzS18lLiPJPUIpAGKZ3PV -g4yMtnsc8VKrhS45e9XTZW0B1LXi5hvpPp9lWex826S6X2itkkRjhSqpv1mNmHiRNlc7nAO4 -O/ftwBUwbhII1lGY3aYyBwEHd6yrCXy3/OaQt80ZarLDUEUhUkHq/Q8pRgw2P6ymRs+2B68V -CzcQHDWAfUW9So+pUzSDoI/9v3WhC5T082kLfVSfjIoYM4w3T1xkj77N+/78dWwrYqQ3n8io -baNQhna3lZHLZpKe6XSjcSzyyCVoYzIQGILnY9lx1Mcnb8XfPDG2BYEJulBMEq5UFA195OV1 -vjuT0esNF3OmvFlrxP1NT0VyZCqqBu0KVRbOMFFaQDvjiIYDTxIMWqWI3EtHocvmQCgcVMzw -9I1j3wTG1hUpz15TWDUt/tkFJrW2KomUBleOTq6SjEAAnMEuzbEqCu7LkOlTGGquFM9k/VOs -JZ2iZj3PhI8+S001Vuns1t1zZ0eSGWKpkpGD7HpLgdLd84GT1DPoQd+OwUazappvGhE+ipla diff -Nru gmime-2.6.22+dfsg2/tests/message-partial.1.eml gmime-3.0.1/tests/message-partial.1.eml --- gmime-2.6.22+dfsg2/tests/message-partial.1.eml 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/tests/message-partial.1.eml 1970-01-01 00:00:00.000000000 +0000 @@ -1,850 +0,0 @@ -From: anonymous@mit.edu -Date: Tue, 28 Mar 2017 18:40:37 -0400 -Subject: Photo of a girl with feather earrings -Message-Id: -To: photo-discuss@lists.nesop.edu -MIME-Version: 1.0 -Content-Type: message/partial; id="6MCVORPHW0U4.BCPTXD0EM9BT3@mit.edu"; - number=2; total=3 - -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 diff -Nru gmime-2.6.22+dfsg2/tests/message-partial.2.eml gmime-3.0.1/tests/message-partial.2.eml --- gmime-2.6.22+dfsg2/tests/message-partial.2.eml 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/tests/message-partial.2.eml 1970-01-01 00:00:00.000000000 +0000 @@ -1,751 +0,0 @@ -From: anonymous@mit.edu -Date: Tue, 28 Mar 2017 18:40:37 -0400 -Subject: Photo of a girl with feather earrings -Message-Id: -To: photo-discuss@lists.nesop.edu -MIME-Version: 1.0 -Content-Type: message/partial; id="6MCVORPHW0U4.BCPTXD0EM9BT3@mit.edu"; - number=3; total=3 - -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 - ---=-/wKNlseqdbBnOf3qd253ow==-- diff -Nru gmime-2.6.22+dfsg2/tests/test-best.c gmime-3.0.1/tests/test-best.c --- gmime-2.6.22+dfsg2/tests/test-best.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/tests/test-best.c 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -38,7 +38,7 @@ if ((fd = open (argv[1], O_RDONLY, 0)) == -1) return 0; - g_mime_init (0); + g_mime_init (); stream = g_mime_stream_fs_new (fd); istream = g_mime_stream_filter_new (stream); diff -Nru gmime-2.6.22+dfsg2/tests/test-cat.c gmime-3.0.1/tests/test-cat.c --- gmime-2.6.22+dfsg2/tests/test-cat.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/tests/test-cat.c 2017-04-23 16:04:05.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -47,6 +47,39 @@ #define d(x) #define v(x) if (verbose > 3) x; +static int randfd; + +static unsigned char +randc (void) +{ + unsigned char c; + ssize_t n; + + do { + if ((n = read (randfd, &c, 1)) > 0) + break; + } while (n == -1 && errno == EINTR); + + return c; +} + +static float +randf (void) +{ + size_t nread = 0; + unsigned int v; + ssize_t n; + + do { + if ((n = read (randfd, ((char *) &v) + nread, sizeof (v) - nread)) > 0) { + if ((nread += n) == sizeof (v)) + break; + } + } while (n == -1 && errno == EINTR); + + return (v * 1.0) / UINT_MAX; +} + static GMimeStream * random_whole_stream (const char *datadir, char **filename) @@ -58,7 +91,7 @@ int fd; /* read between 4k and 14k bytes */ - size = 4096 + (size_t) (10240.0 * (rand () / (RAND_MAX + 1.0))); + size = 4096 + (size_t) (10240.0 * randf ()); v(fprintf (stdout, "Generating %zu bytes of random data... ", size)); v(fflush (stdout)); @@ -76,8 +109,12 @@ while (total < size) { buflen = size - total > sizeof (buf) ? sizeof (buf) : size - total; - for (i = 0; i < buflen; i++) - buf[i] = (char) (255 * (rand () / (RAND_MAX + 1.0))); + + nwritten = 0; + do { + if ((n = read (randfd, buf + nwritten, buflen - nwritten)) > 0) + nwritten += n; + } while (nwritten < buflen); nwritten = 0; do { @@ -328,7 +365,7 @@ } /* calculate a random seek offset to compare at */ - offset = (gint64) (len * (rand () / (RAND_MAX + 1.0))); + offset = (gint64) (len * randf ()); if (g_mime_stream_seek (whole, offset, GMIME_STREAM_SEEK_SET) == -1) { ex = exception_new ("could not seek to %lld in original stream: %s", @@ -385,9 +422,9 @@ } /* calculate a random start/end offsets */ - start = (gint64) (len * (rand () / (RAND_MAX + 1.0))); - if (rand () % 2) - end = start + (gint64) ((len - start) * (rand () / (RAND_MAX + 1.0))); + start = (gint64) (len * randf ()); + if (randc () % 2) + end = start + (gint64) ((len - start) * randf ()); else end = -1; @@ -449,12 +486,13 @@ gint64 len; int fd, i; - srand (time (NULL)); - - g_mime_init (0); + g_mime_init (); testsuite_init (argc, argv); + if ((randfd = open ("/dev/urandom", O_RDONLY)) == -1) + return EXIT_FAILURE; + for (i = 1; i < argc; i++) { if (argv[i][0] != '-') { datadir = argv[i]; @@ -466,16 +504,25 @@ if (stat (datadir, &st) == -1) { if (errno == ENOENT) { g_mkdir_with_parents (datadir, 0755); - if (stat (datadir, &st) == -1) + if (stat (datadir, &st) == -1) { + close (randfd); + return EXIT_FAILURE; - } else + } + } else { + close (randfd); + return EXIT_FAILURE; + } } if (S_ISREG (st.st_mode)) { /* test a particular input file */ - if ((fd = open (argv[i], O_RDONLY, 0)) == -1) + if ((fd = open (argv[i], O_RDONLY, 0)) == -1) { + close (randfd); + return EXIT_FAILURE; + } filename = g_strdup (argv[i]); whole = g_mime_stream_fs_new (fd); @@ -483,6 +530,8 @@ /* use path as test suite data dir */ whole = random_whole_stream (argv[i], &filename); } else { + close (randfd); + return EXIT_FAILURE; } } else { @@ -492,10 +541,14 @@ if ((wholelen = g_mime_stream_length (whole)) == -1) { fprintf (stderr, "Error: length of test stream unknown\n"); g_object_unref (whole); + close (randfd); + return EXIT_FAILURE; } else if (wholelen == 64) { fprintf (stderr, "Error: length of test stream is unsuitable for testing\n"); g_object_unref (whole); + close (randfd); + return EXIT_FAILURE; } @@ -504,7 +557,7 @@ left = wholelen; while (left > 0) { - len = 1 + (gint64) (left * (rand () / (RAND_MAX + 1.0))); + len = 1 + (gint64) (left * randf ()); n = g_new (struct _StreamPart, 1); sprintf (n->filename, "%s.%u", filename, part++); n->pstart = (gint64) 0; /* FIXME: we could make this a random offset */ @@ -550,6 +603,7 @@ unlink (filename); g_free (filename); + close (randfd); g_mime_shutdown (); diff -Nru gmime-2.6.22+dfsg2/tests/test-headers.c gmime-3.0.1/tests/test-headers.c --- gmime-2.6.22+dfsg2/tests/test-headers.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/tests/test-headers.c 2017-05-21 16:29:14.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -57,219 +57,157 @@ GMimeHeaderList *list; guint i; - list = g_mime_header_list_new (); - for (i = 0; i < G_N_ELEMENTS (initial); i++) - g_mime_header_list_append (list, initial[i].name, initial[i].value); + list = g_mime_header_list_new (g_mime_parser_options_get_default ()); + for (i = 1; i < G_N_ELEMENTS (initial); i++) + g_mime_header_list_append (list, initial[i].name, initial[i].value, NULL); + g_mime_header_list_prepend (list, initial[0].name, initial[0].value, NULL); return list; } static void -test_iter_forward_back (void) +test_indexing (void) { - const char *name, *value; + const char *name, *value, *raw_value; GMimeHeaderList *list; - GMimeHeaderIter iter; - guint i; + GMimeHeader *header; + int index, count; + size_t len; list = header_list_new (); - /* make sure initial iter is valid */ - testsuite_check ("initial iter"); - try { - if (!g_mime_header_list_get_iter (list, &iter)) - throw (exception_new ("get_iter() failed")); - - if (!g_mime_header_iter_is_valid (&iter)) - throw (exception_new ("invalid iter")); - - name = g_mime_header_iter_get_name (&iter); - value = g_mime_header_iter_get_value (&iter); - - if (strcmp (initial[0].name, name) != 0 || strcmp (initial[0].value, value) != 0) - throw (exception_new ("resulted in unexpected header")); - testsuite_check_passed (); - } catch (ex) { - testsuite_check_failed ("initial iter: %s", ex->message); - } finally; + count = g_mime_header_list_get_count (list); - /* make sure iter->next works as expected */ - for (i = 1; i < G_N_ELEMENTS (initial); i++) { - testsuite_check ("next iter[%u]", i); + /* make sure indexing works as expected */ + for (index = 0; index < G_N_ELEMENTS (initial); index++) { + testsuite_check ("headers[%d]", index); try { - if (!g_mime_header_iter_next (&iter)) - throw (exception_new ("failed to advance")); + if (!(header = g_mime_header_list_get_header_at (list, index))) + throw (exception_new ("failed to get header at index")); - if (!g_mime_header_iter_is_valid (&iter)) - throw (exception_new ("advanced but is invalid")); + name = g_mime_header_get_name (header); + value = g_mime_header_get_value (header); - name = g_mime_header_iter_get_name (&iter); - value = g_mime_header_iter_get_value (&iter); + if (strcmp (initial[index].name, name) != 0 || + strcmp (initial[index].value, value) != 0) + throw (exception_new ("resulted in unexpected value")); - if (strcmp (initial[i].name, name) != 0 || - strcmp (initial[i].value, value) != 0) - throw (exception_new ("resulted in unexpected header")); - testsuite_check_passed (); - } catch (ex) { - testsuite_check_failed ("next iter[%u]: %s", i, ex->message); - } finally; - } - - /* make sure trying to advance past the last header fails */ - testsuite_check ("iter->next past end of headers"); - try { - if (g_mime_header_iter_next (&iter)) - throw (exception_new ("should not have worked")); - testsuite_check_passed (); - } catch (ex) { - testsuite_check_failed ("iter->next past end of headers: %s", ex->message); - } finally; - - /* make sure iter->prev works as expected */ - i--; - while (i > 0) { - testsuite_check ("prev iter[%u]", i); - try { - if (!g_mime_header_iter_prev (&iter)) - throw (exception_new ("failed to advance")); - - if (!g_mime_header_iter_is_valid (&iter)) - throw (exception_new ("advanced but is invalid")); + if (!(raw_value = g_mime_header_get_raw_value (header))) + throw (exception_new ("null raw value")); - name = g_mime_header_iter_get_name (&iter); - value = g_mime_header_iter_get_value (&iter); + len = strlen (raw_value); + if (raw_value[len - 1] != '\n') + throw (exception_new ("raw value does not end with a \\n")); - if (strcmp (initial[i - 1].name, name) != 0 || - strcmp (initial[i - 1].value, value) != 0) - throw (exception_new ("resulted in unexpected header")); testsuite_check_passed (); } catch (ex) { - testsuite_check_failed ("prev iter[%u]: %s", i, ex->message); + testsuite_check_failed ("next iter[%d]: %s", index, ex->message); } finally; - - i--; } - /* make sure trying to advance prev of the first header fails */ - testsuite_check ("iter->prev past beginning of headers"); + /* make sure trying to advance past the last header fails */ + testsuite_check ("indexing past end of headers"); try { - if (g_mime_header_iter_prev (&iter)) + if (g_mime_header_list_get_header_at (list, index) != NULL) throw (exception_new ("should not have worked")); testsuite_check_passed (); } catch (ex) { - testsuite_check_failed ("iter->prev past beginning of headers: %s", ex->message); + testsuite_check_failed ("indexing past end of headers: %s", ex->message); } finally; - g_mime_header_list_destroy (list); + g_object_unref (list); } static void -test_iter_remove_all (void) +test_remove (void) { + const char *name, *value; GMimeHeaderList *list; - GMimeHeaderIter iter; - guint i = 0; + GMimeHeader *header; + guint i; list = header_list_new (); - g_mime_header_list_get_iter (list, &iter); - - testsuite_check ("removing all headers"); + testsuite_check ("remove first header"); try { - while (g_mime_header_iter_remove (&iter)) - i++; + /* remove the first header */ + if (!g_mime_header_list_remove (list, initial[0].name)) + throw (exception_new ("failed to remove header")); + + /* make sure the first header is now the same as the second original header */ + header = g_mime_header_list_get_header_at (list, 0); + name = g_mime_header_get_name (header); + value = g_mime_header_get_value (header); - if (i != G_N_ELEMENTS (initial)) - throw (exception_new ("only removed %u of %u", i, G_N_ELEMENTS (initial))); + if (strcmp (initial[1].name, name) != 0 || + strcmp (initial[1].value, value) != 0) + throw (exception_new ("expected second Received header")); - if (g_mime_header_iter_is_valid (&iter)) - throw (exception_new ("expected invalid iter")); + /* make sure that the internal hash table was properly updated */ + if (!(header = g_mime_header_list_get_header (list, "Received"))) + throw (exception_new ("lookup of Received header failed")); + + if (!(value = g_mime_header_get_value (header))) + throw (exception_new ("getting Received header value failed")); + + if (strcmp (initial[1].value, value) != 0) + throw (exception_new ("expected second Received header value")); testsuite_check_passed (); } catch (ex) { - testsuite_check_failed ("removing all headers: %s", ex->message); + testsuite_check_failed ("remove first header: %s", ex->message); } finally; - g_mime_header_list_get_iter (list, &iter); - - testsuite_check ("empty list iter"); + testsuite_check ("remove last header"); try { - if (g_mime_header_iter_is_valid (&iter)) - throw (exception_new ("expected invalid iter")); + /* remove the last header */ + g_mime_header_list_remove (list, "Message-Id"); + + if ((header = g_mime_header_list_get_header (list, "Message-Id")) != NULL) + throw (exception_new ("lookup of Message-Id should have failed")); testsuite_check_passed (); } catch (ex) { - testsuite_check_failed ("empty list iter: %s", ex->message); + testsuite_check_failed ("remove last header: %s", ex->message); } finally; - g_mime_header_list_destroy (list); + g_object_unref (list); } static void -test_iter_remove (void) +test_remove_at (void) { - GMimeHeaderIter iter, iter1, iter2, iter3; const char *name, *value; GMimeHeaderList *list; + GMimeHeader *header; + int count; guint i; list = header_list_new (); - g_mime_header_list_get_iter (list, &iter1); - - testsuite_check ("iter copying"); + testsuite_check ("remove first header"); try { - /* make iter2 point to the second header */ - g_mime_header_iter_copy_to (&iter1, &iter2); - if (!g_mime_header_iter_next (&iter2)) - throw (exception_new ("iter2->next failed")); + /* remove the first header */ + g_mime_header_list_remove_at (list, 0); - name = g_mime_header_iter_get_name (&iter2); - value = g_mime_header_iter_get_value (&iter2); + /* make sure the first header is now the same as the second original header */ + header = g_mime_header_list_get_header_at (list, 0); + name = g_mime_header_get_name (header); + value = g_mime_header_get_value (header); if (strcmp (initial[1].name, name) != 0 || strcmp (initial[1].value, value) != 0) - throw (exception_new ("iter2 resulted in unexpected header")); - - /* make iter3 point to the third header */ - g_mime_header_iter_copy_to (&iter2, &iter3); - if (!g_mime_header_iter_next (&iter3)) - throw (exception_new ("iter3->next failed")); - - name = g_mime_header_iter_get_name (&iter3); - value = g_mime_header_iter_get_value (&iter3); - - if (strcmp (initial[2].name, name) != 0 || - strcmp (initial[2].value, value) != 0) - throw (exception_new ("iter3 resulted in unexpected header")); + throw (exception_new ("expected second Received header")); - testsuite_check_passed (); - } catch (ex) { - testsuite_check_failed ("iter copying: %s", ex->message); - } finally; - - testsuite_check ("remove first header"); - try { - /* remove the first header */ - g_mime_header_iter_copy_to (&iter1, &iter); - if (!g_mime_header_iter_remove (&iter)) - throw (exception_new ("iter::remove() failed")); - - /* make sure iter now points to the 2nd header */ - name = g_mime_header_iter_get_name (&iter); - value = g_mime_header_iter_get_value (&iter); + /* make sure that the internal hash table was properly updated */ + if (!(header = g_mime_header_list_get_header (list, "Received"))) + throw (exception_new ("lookup of Received header failed")); - if (strcmp (initial[1].name, name) != 0 || - strcmp (initial[1].value, value) != 0) - throw (exception_new ("iter doesn't point to 2nd header as expected")); + if (!(value = g_mime_header_get_value (header))) + throw (exception_new ("getting Received header value failed")); - /* make sure that the other iters have been invalidated */ - if (g_mime_header_iter_is_valid (&iter1)) - throw (exception_new ("iter::remove() iter1::isvalid() incorrect")); - if (g_mime_header_iter_is_valid (&iter2)) - throw (exception_new ("iter::remove() iter2::isvalid() incorrect")); - if (g_mime_header_iter_is_valid (&iter3)) - throw (exception_new ("iter::remove() iter3::isvalid() incorrect")); + if (strcmp (initial[1].value, value) != 0) + throw (exception_new ("expected second Received header value")); testsuite_check_passed (); } catch (ex) { @@ -279,99 +217,33 @@ testsuite_check ("remove last header"); try { /* remove the last header */ - g_mime_header_iter_last (&iter); - - if (!g_mime_header_iter_remove (&iter)) - throw (exception_new ("iter::remove() failed")); + count = g_mime_header_list_get_count (list); + g_mime_header_list_remove_at (list, count - 1); - /* iter should be invalid now because it couldn't advance to a header beyond the last */ - if (g_mime_header_iter_is_valid (&iter)) - throw (exception_new ("iter::remove() iter is valid when it shouldn't be")); + if ((header = g_mime_header_list_get_header (list, "Message-Id")) != NULL) + throw (exception_new ("lookup of Message-Id should have failed")); testsuite_check_passed (); } catch (ex) { testsuite_check_failed ("remove last header: %s", ex->message); } finally; - testsuite_check ("remove middle header"); - try { - g_mime_header_list_get_iter (list, &iter); - - /* advance to a header in the middle somewhere... */ - g_mime_header_iter_next (&iter); - g_mime_header_iter_next (&iter); - - /* we should now be pointing to the 3rd header (4th from the initial headers) */ - name = g_mime_header_iter_get_name (&iter); - value = g_mime_header_iter_get_value (&iter); - - if (strcmp (initial[3].name, name) != 0 || - strcmp (initial[3].value, value) != 0) - throw (exception_new ("iter doesn't point to 3rd header as expected")); - - /* remove it */ - if (!g_mime_header_iter_remove (&iter)) - throw (exception_new ("iter::remove() failed")); - - /* make sure the iter is still valid */ - if (!g_mime_header_iter_is_valid (&iter)) - throw (exception_new ("iter::remove() iter isn't valid when it should be")); - - /* make sure iter now points to the 4th header */ - name = g_mime_header_iter_get_name (&iter); - value = g_mime_header_iter_get_value (&iter); - - if (strcmp (initial[4].name, name) != 0 || - strcmp (initial[4].value, value) != 0) - throw (exception_new ("iter doesn't point to 4th header as expected")); - - testsuite_check_passed (); - } catch (ex) { - testsuite_check_failed ("remove first header: %s", ex->message); - } finally; - - testsuite_check ("resulting lists match"); - try { - g_mime_header_list_get_iter (list, &iter); - i = 1; - - do { - name = g_mime_header_iter_get_name (&iter); - value = g_mime_header_iter_get_value (&iter); - - if (i == 3) - i++; - - if (strcmp (initial[i].name, name) != 0 || - strcmp (initial[i].value, value) != 0) - throw (exception_new ("iter vs array mismatch @ index %u", i)); - - i++; - } while (g_mime_header_iter_next (&iter)); - - if (++i != G_N_ELEMENTS (initial)) - throw (exception_new ("iter didn't have as many headers as expected")); - - testsuite_check_passed (); - } catch (ex) { - testsuite_check_failed ("resulting lists match: %s", ex->message); - } finally; - - g_mime_header_list_destroy (list); + g_object_unref (list); } static void -test_header_sync (void) +test_content_type_sync (void) { - InternetAddressList *list; - InternetAddress *addr, *ia; - GMimeMessage *message; + const char *raw_value, *value; + GMimeHeaderList *headers; + GMimeContentType *type; + GMimeParamList *params; GMimeObject *object; - const char *value; + GMimeHeader *header; GMimePart *part; - part = g_mime_part_new_with_type ("application", "octet-stream"); - object = (GMimeObject *) part; + object = (GMimeObject *) (part = g_mime_part_new ()); + headers = g_mime_object_get_header_list (object); testsuite_check ("content-type synchronization"); try { @@ -381,41 +253,92 @@ throw (exception_new ("initial content-type header was unexpectedly null")); if (strcmp ("application/octet-stream", value) != 0) - throw (exception_new ("initial content-type header had unexpected value")); + throw (exception_new ("initial content-type header had unexpected value: %s", value)); /* now change the content-type's media type... */ - g_mime_content_type_set_media_type (object->content_type, "text"); + type = g_mime_object_get_content_type (object); + g_mime_content_type_set_media_type (type, "text"); if (!(value = g_mime_object_get_header (object, "Content-Type"))) throw (exception_new ("content-type header was unexpectedly null after changing type")); if (strcmp ("text/octet-stream", value) != 0) throw (exception_new ("content-type header had unexpected value after changing type")); + header = g_mime_header_list_get_header (headers, "Content-Type"); + if (!(raw_value = g_mime_header_get_raw_value (header))) + throw (exception_new ("content-type raw_value was unexpectedly null after changing type")); + if (strcmp (" text/octet-stream\n", raw_value) != 0) + throw (exception_new ("content-type raw_value had unexpected value after changing type")); /* now change the content-type's media subtype... */ - g_mime_content_type_set_media_subtype (object->content_type, "plain"); + g_mime_content_type_set_media_subtype (type, "plain"); if (!(value = g_mime_object_get_header (object, "Content-Type"))) throw (exception_new ("content-type header was unexpectedly null after changing subtype")); if (strcmp ("text/plain", value) != 0) throw (exception_new ("content-type header had unexpected value after changing subtype")); + header = g_mime_header_list_get_header (headers, "Content-Type"); + if (!(raw_value = g_mime_header_get_raw_value (header))) + throw (exception_new ("content-type raw_value was unexpectedly null after changing subtype")); + if (strcmp (" text/plain\n", raw_value) != 0) + throw (exception_new ("content-type raw_value had unexpected value after changing subtype")); /* now change the content-type's parameters by setting a param */ - g_mime_content_type_set_parameter (object->content_type, "format", "flowed"); + g_mime_content_type_set_parameter (type, "format", "flowed"); if (!(value = g_mime_object_get_header (object, "Content-Type"))) throw (exception_new ("content-type header was unexpectedly null after setting a param")); if (strcmp ("text/plain; format=flowed", value) != 0) throw (exception_new ("content-type header had unexpected value after setting a param")); - - /* now change the content-type's parameters by setting a param list */ - g_mime_content_type_set_params (object->content_type, NULL); + header = g_mime_header_list_get_header (headers, "Content-Type"); + if (!(raw_value = g_mime_header_get_raw_value (header))) + throw (exception_new ("content-type raw_value was unexpectedly null after setting a param")); + if (strcmp (" text/plain; format=flowed\n", raw_value) != 0) + throw (exception_new ("content-type raw_value had unexpected value after setting a param")); + + /* now change the content-type's parameters by clearing the params */ + params = g_mime_content_type_get_parameters (type); + g_mime_param_list_clear (params); if (!(value = g_mime_object_get_header (object, "Content-Type"))) - throw (exception_new ("content-type header was unexpectedly null after setting params")); + throw (exception_new ("content-type header was unexpectedly null after clearing params")); if (strcmp ("text/plain", value) != 0) - throw (exception_new ("content-type header had unexpected value after setting params")); + throw (exception_new ("content-type header had unexpected value after clearing params")); + header = g_mime_header_list_get_header (headers, "Content-Type"); + if (!(raw_value = g_mime_header_get_raw_value (header))) + throw (exception_new ("content-type raw_value was unexpectedly null after clearing params")); + if (strcmp (" text/plain\n", raw_value) != 0) + throw (exception_new ("content-type raw_value had unexpected value after clearing params")); + + /* let's try this in reverse... set the header value and make sure GMimeContentType gets updated */ + header = g_mime_header_list_get_header_at (headers, 0); + g_mime_header_set_value (header, NULL, "text/html; charset=utf-8", NULL); + type = g_mime_object_get_content_type (object); + if (!g_mime_content_type_is_type (type, "text", "html")) + throw (exception_new ("GMimeContentType object was not updated")); + header = g_mime_header_list_get_header (headers, "Content-Type"); + if (!(raw_value = g_mime_header_get_raw_value (header))) + throw (exception_new ("content-type raw_value was unexpectedly null after setting value")); + if (strcmp (" text/html; charset=utf-8\n", raw_value) != 0) + throw (exception_new ("content-type raw_value had unexpected value after setting value")); testsuite_check_passed (); } catch (ex) { testsuite_check_failed ("content-type header not synchronized: %s", ex->message); } finally; + g_object_unref (part); +} + +static void +test_disposition_sync (void) +{ + GMimeContentDisposition *disposition; + const char *raw_value, *value; + GMimeHeaderList *headers; + GMimeParamList *params; + GMimeObject *object; + GMimeHeader *header; + GMimePart *part; + + object = (GMimeObject *) (part = g_mime_part_new ()); + headers = g_mime_object_get_header_list (object); + testsuite_check ("content-disposition synchronization"); try { g_mime_object_set_disposition (object, "attachment"); @@ -424,30 +347,63 @@ * value is "application/octet-stream" as expected */ if (!(value = g_mime_object_get_header (object, "Content-Disposition"))) throw (exception_new ("initial content-disposition header was unexpectedly null")); - if (strcmp ("attachment", value) != 0) - throw (exception_new ("initial content-disposition header had unexpected value")); + throw (exception_new ("initial content-disposition header had unexpected value: %s", value)); + header = g_mime_header_list_get_header (headers, "Content-Disposition"); + if (!(raw_value = g_mime_header_get_raw_value (header))) + throw (exception_new ("initial content-disposition raw_value was unexpectedly null")); + if (strcmp (" attachment\n", raw_value) != 0) + throw (exception_new ("initial content-disposition raw_value had unexpected value: %s", raw_value)); /* now change the content-disposition's disposition */ - g_mime_content_disposition_set_disposition (object->disposition, "inline"); + disposition = g_mime_object_get_content_disposition (object); + g_mime_content_disposition_set_disposition (disposition, "inline"); if (!(value = g_mime_object_get_header (object, "Content-Disposition"))) throw (exception_new ("content-disposition header was unexpectedly null after changing type")); if (strcmp ("inline", value) != 0) throw (exception_new ("content-disposition header had unexpected value after changing type")); + header = g_mime_header_list_get_header (headers, "Content-Disposition"); + if (!(raw_value = g_mime_header_get_raw_value (header))) + throw (exception_new ("content-disposition raw_value was unexpectedly null after changing type")); + if (strcmp (" inline\n", raw_value) != 0) + throw (exception_new ("content-disposition raw_value had unexpected value after changing type: %s", raw_value)); /* now change the content-disposition's parameters by setting a param */ - g_mime_content_disposition_set_parameter (object->disposition, "filename", "hello.txt"); + g_mime_content_disposition_set_parameter (disposition, "filename", "hello.txt"); if (!(value = g_mime_object_get_header (object, "Content-Disposition"))) throw (exception_new ("content-disposition header was unexpectedly null after setting a param")); if (strcmp ("inline; filename=hello.txt", value) != 0) throw (exception_new ("content-disposition header had unexpected value after setting a param")); - - /* now change the content-disposition's parameters by setting a param list */ - g_mime_content_disposition_set_params (object->disposition, NULL); + header = g_mime_header_list_get_header (headers, "Content-Disposition"); + if (!(raw_value = g_mime_header_get_raw_value (header))) + throw (exception_new ("content-disposition raw_value was unexpectedly null after setting a param")); + if (strcmp (" inline; filename=hello.txt\n", raw_value) != 0) + throw (exception_new ("content-disposition raw_value had unexpected value after setting a param: %s", raw_value)); + + /* now change the content-disposition's parameters by clearing the params */ + params = g_mime_content_disposition_get_parameters (disposition); + g_mime_param_list_clear (params); if (!(value = g_mime_object_get_header (object, "Content-Disposition"))) - throw (exception_new ("content-disposition header was unexpectedly null after setting params")); + throw (exception_new ("content-disposition header was unexpectedly null after clearing params")); if (strcmp ("inline", value) != 0) - throw (exception_new ("content-disposition header had unexpected value after setting params")); + throw (exception_new ("content-disposition header had unexpected value after clearing params")); + header = g_mime_header_list_get_header (headers, "Content-Disposition"); + if (!(raw_value = g_mime_header_get_raw_value (header))) + throw (exception_new ("content-disposition raw_value was unexpectedly null after clearing params")); + if (strcmp (" inline\n", raw_value) != 0) + throw (exception_new ("content-disposition raw_value had unexpected value after clearing params: %s", raw_value)); + + /* let's try this in reverse... set the header value and make sure GMimeContentDisposition gets updated */ + header = g_mime_header_list_get_header_at (headers, 1); + g_mime_header_set_value (header, NULL, "attachment; filename=xyz", NULL); + disposition = g_mime_object_get_content_disposition (object); + if (!g_mime_content_disposition_is_attachment (disposition)) + throw (exception_new ("GMimeContentDisposition object was not updated")); + header = g_mime_header_list_get_header (headers, "Content-Disposition"); + if (!(raw_value = g_mime_header_get_raw_value (header))) + throw (exception_new ("content-disposition raw_value was unexpectedly null after setting value")); + if (strcmp (" attachment; filename=xyz\n", raw_value) != 0) + throw (exception_new ("content-disposition raw_value had unexpected value after setting value: %s", raw_value)); testsuite_check_passed (); } catch (ex) { @@ -455,10 +411,24 @@ } finally; g_object_unref (part); +} + +static void +test_address_sync (void) +{ + const char *raw_value, *value; + InternetAddress *addr, *ia; + InternetAddressList *list; + GMimeHeaderList *headers; + GMimeParamList *params; + GMimeMessage *message; + GMimeObject *object; + GMimeHeader *header; message = g_mime_message_new (TRUE); - list = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_TO); + list = g_mime_message_get_addresses (message, GMIME_ADDRESS_TYPE_TO); object = (GMimeObject *) message; + headers = object->headers; testsuite_check ("address header synchronization"); try { @@ -468,7 +438,11 @@ /* now check that the initial header value is null */ if ((value = g_mime_object_get_header (object, "To")) != NULL) - throw (exception_new ("unexpected initial address list header")); + throw (exception_new ("unexpected initial value")); + + header = g_mime_header_list_get_header (headers, "To"); + if ((raw_value = g_mime_header_get_raw_value (header)) != NULL) + throw (exception_new ("unexpected initial raw_value")); /* now try adding an address */ addr = internet_address_mailbox_new ("Tester", "tester@localhost.com"); @@ -476,26 +450,37 @@ if (!(value = g_mime_object_get_header (object, "To"))) throw (exception_new ("address list header unexpectedly null after adding recipient")); - if (strcmp ("Tester ", value) != 0) throw (exception_new ("unexpected address list header after adding recipient")); + header = g_mime_header_list_get_header (headers, "To"); + if (!(raw_value = g_mime_header_get_raw_value (header))) + throw (exception_new ("raw_value is null after adding recipient")); + if (strcmp (" Tester \n", raw_value) != 0) + throw (exception_new ("unexpected raw_value after adding recipient: %s", raw_value)); /* now let's try changing the address name to make sure signals properly chain up */ internet_address_set_name (addr, "Eva Lucy-Ann Tester"); if (!(value = g_mime_object_get_header (object, "To"))) throw (exception_new ("address list header unexpectedly null after changing name")); - if (strcmp ("Eva Lucy-Ann Tester ", value) != 0) - throw (exception_new ("unexpected address list header after changing name")); + throw (exception_new ("unexpected address list header after changing name: %s", value)); + header = g_mime_header_list_get_header (headers, "To"); + if (!(raw_value = g_mime_header_get_raw_value (header))) + throw (exception_new ("raw_value is null after changing name")); + if (strcmp (" Eva Lucy-Ann Tester \n", raw_value) != 0) + throw (exception_new ("unexpected raw_value after changing name")); /* now let's try changing the address mailbox... */ - internet_address_mailbox_set_addr ((InternetAddressMailbox *) addr, - "evalucyann@ximian.com"); + internet_address_mailbox_set_addr ((InternetAddressMailbox *) addr, "evalucyann@ximian.com"); if (!(value = g_mime_object_get_header (object, "To"))) throw (exception_new ("address list header unexpectedly null after changing mailbox")); - if (strcmp ("Eva Lucy-Ann Tester ", value) != 0) throw (exception_new ("unexpected address list header after changing mailbox")); + header = g_mime_header_list_get_header (headers, "To"); + if (!(raw_value = g_mime_header_get_raw_value (header))) + throw (exception_new ("raw_value is null after changing mailbox")); + if (strcmp (" Eva Lucy-Ann Tester \n", raw_value) != 0) + throw (exception_new ("unexpected raw_value after changing mailbox")); /* now let's try inserting a group address */ g_object_unref (addr); @@ -504,26 +489,55 @@ if (!(value = g_mime_object_get_header (object, "To"))) throw (exception_new ("address list header unexpectedly null after inserting group")); - if (strcmp ("Group: ;, Eva Lucy-Ann Tester ", value) != 0) throw (exception_new ("unexpected address list header after inserting group")); + header = g_mime_header_list_get_header (headers, "To"); + if (!(raw_value = g_mime_header_get_raw_value (header))) + throw (exception_new ("raw_value is null after inserting group")); + if (strcmp (" Group: ;, Eva Lucy-Ann Tester \n", raw_value) != 0) + throw (exception_new ("unexpected raw_value after inserting group")); /* now let's try removing the original recipient */ internet_address_list_remove_at (list, 1); if (!(value = g_mime_object_get_header (object, "To"))) throw (exception_new ("address list header unexpectedly null after removing recipient")); - if (strcmp ("Group: ;", value) != 0) throw (exception_new ("unexpected address list header after removing recipient")); + header = g_mime_header_list_get_header (headers, "To"); + if (!(raw_value = g_mime_header_get_raw_value (header))) + throw (exception_new ("raw_value is null after removing recipient")); + if (strcmp (" Group: ;\n", raw_value) != 0) + throw (exception_new ("unexpected raw_value after removing recipient")); /* now let's try adding an address to the group... */ ia = internet_address_mailbox_new ("Tester", "tester@hotmail.com"); internet_address_list_add (((InternetAddressGroup *) addr)->members, ia); if (!(value = g_mime_object_get_header (object, "To"))) throw (exception_new ("address list header unexpectedly null after adding addr to group")); - if (strcmp ("Group: Tester ;", value) != 0) throw (exception_new ("unexpected address list header after adding addr to group")); + header = g_mime_header_list_get_header (headers, "To"); + if (!(raw_value = g_mime_header_get_raw_value (header))) + throw (exception_new ("raw_value is null after adding addr to group")); + if (strcmp (" Group: Tester ;\n", raw_value) != 0) + throw (exception_new ("unexpected raw_value after adding addr to group")); + + /* let's try this in reverse... set the header value and make sure InternetAddressList gets updated */ + g_mime_object_set_header (object, "To", "fpons@mandrakesoft.com (=?iso-8859-1?q?Fran=E7ois?= Pons)", NULL); + if (internet_address_list_length (list) != 1) + throw (exception_new ("unexpected number of addresses in addrlist after setting header value")); + ia = internet_address_list_get_address (list, 0); + value = internet_address_get_name (ia); + if (strcmp ("Fran\xc3\xa7ois Pons", value) != 0) + throw (exception_new ("unexpected name after setting header value")); + value = internet_address_mailbox_get_addr ((InternetAddressMailbox *) ia); + if (strcmp ("fpons@mandrakesoft.com", value) != 0) + throw (exception_new ("unexpected addr after setting header value")); + header = g_mime_header_list_get_header (headers, "To"); + if (!(raw_value = g_mime_header_get_raw_value (header))) + throw (exception_new ("raw_value is null after setting header value")); + if (strcmp (" =?iso-8859-1?q?Fran=E7ois?= Pons \n", raw_value) != 0) + throw (exception_new ("unexpected raw_value after setting header value: %s", raw_value)); testsuite_check_passed (); } catch (ex) { @@ -533,26 +547,87 @@ g_object_unref (message); } +static struct { + const char *name; + const char *value; + const char *raw_value; +} headers[] = { + { "Received", + "by greenbush.bellcore.com (4.1/4.7) id for nsb; Thu, 19 Sep 91 12:41:43 EDT", + " by greenbush.bellcore.com (4.1/4.7) id for nsb;\n\tThu, 19 Sep 91 12:41:43 EDT\n" }, + { "Received", + "from thumper.bellcore.com by greenbush.bellcore.com (4.1/4.7) id for nsb; Fri, 29 Nov 91 07:13:33 EST", + " from thumper.bellcore.com by greenbush.bellcore.com (4.1/4.7)\n\tid for nsb; Fri, 29 Nov 91 07:13:33 EST\n" }, + { "To", + "abel, bianchi, braun, cameron, carmen, jfp, jxr, kraut, lamb, lowery, lynn, mlittman, nancyg, sau, shoshi, slr, stornett@flash, tkl", + " abel, bianchi, braun, cameron, carmen, jfp, jxr, kraut, lamb, lowery, lynn,\n\tmlittman, nancyg, sau, shoshi, slr, stornett@flash, tkl\n" }, + { "References", + "<3ohapq$h3b@gandalf.rutgers.edu> <3notqh$b52@ns2.ny.ubs.com> <3npoh0$2oo@news.blkbox.com> <3nqp09$r7t@ns2.ny.ubs.com>", + " <3ohapq$h3b@gandalf.rutgers.edu> <3notqh$b52@ns2.ny.ubs.com>\n\t<3npoh0$2oo@news.blkbox.com> <3nqp09$r7t@ns2.ny.ubs.com>\n" }, + { "Message-Id", + "", + " \n" }, + { "Subject", + "this is a really, really, reeeeeeaaaaaaalllllllllllllly loooooooooooooonnnnnggggggggggg test subject which should get folded into multiple lines", + " this is a really, really, reeeeeeaaaaaaalllllllllllllly\n loooooooooooooonnnnnggggggggggg test subject which should get folded into\n multiple lines\n" }, +}; + +static void +test_header_formatting (void) +{ + const char *raw_value; + GMimeHeaderList *list; + GMimeHeader *header; + guint i; + + list = g_mime_header_list_new (g_mime_parser_options_get_default ()); + + for (i = 0; i < G_N_ELEMENTS (headers); i++) { + testsuite_check ("header[%u]", i); + + try { + g_mime_header_list_append (list, headers[i].name, headers[i].value, NULL); + header = g_mime_header_list_get_header_at (list, (int) i); + raw_value = g_mime_header_get_raw_value (header); + + if (strcmp (headers[i].raw_value, raw_value) != 0) + throw (exception_new ("raw values do not match: %s", raw_value)); + + testsuite_check_passed (); + } catch (ex) { + testsuite_check_failed ("header[%u] failed: %s", i, ex->message); + } finally; + } + + g_object_unref (list); +} + int main (int argc, char **argv) { - g_mime_init (0); + g_mime_init (); testsuite_init (argc, argv); - testsuite_start ("iterating forward and backward"); - test_iter_forward_back (); + testsuite_start ("indexing"); + test_indexing (); testsuite_end (); - - testsuite_start ("removing all headers"); - test_iter_remove_all (); + + testsuite_start ("removing"); + test_remove (); testsuite_end (); - testsuite_start ("removing individual headers"); - test_iter_remove (); + testsuite_start ("removing at an index"); + test_remove_at (); testsuite_end (); testsuite_start ("header synchronization"); - test_header_sync (); + test_content_type_sync (); + test_disposition_sync (); + test_address_sync (); + testsuite_end (); + + testsuite_start ("header formatting"); + test_header_formatting (); testsuite_end (); g_mime_shutdown (); diff -Nru gmime-2.6.22+dfsg2/tests/test-html.c gmime-3.0.1/tests/test-html.c --- gmime-2.6.22+dfsg2/tests/test-html.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/tests/test-html.c 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -29,7 +29,7 @@ GMimeFilter *html; int i; - g_mime_init (0); + g_mime_init (); fstream = g_mime_stream_file_new (stdout); ostream = g_mime_stream_filter_new (fstream); diff -Nru gmime-2.6.22+dfsg2/tests/test-iconv.c gmime-3.0.1/tests/test-iconv.c --- gmime-2.6.22+dfsg2/tests/test-iconv.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/tests/test-iconv.c 2017-03-28 23:46:26.000000000 +0000 @@ -33,114 +33,42 @@ /*#define ENABLE_ZENTIMER*/ #include "zentimer.h" -#ifdef TEST_CACHE -static char *charsets[] = { - "iso-8859-1", - "iso-8859-2", - "iso-8859-4", - "iso-8859-5", - "iso-8859-7", - "iso-8859-8", - "iso-8859-9", - "iso-8859-13", - "iso-8859-15", - "koi8-r", - "koi8-u", - "windows-1250", - "windows-1251", - "windows-1252", - "windows-1253", - "windows-1254", - "windows-1255", - "windows-1256", - "windows-1257", - "euc-kr", - "euc-jp", - "iso-2022-kr", - "iso-2022-jp", - "utf-8", -}; - -static void -test_cache (void) -{ - GSList *node, *next, *open_cds = NULL; - iconv_t cd; - int i; - - srand (time (NULL)); - - for (i = 0; i < 5000; i++) { - const char *from, *to; - int which; - - which = rand () % G_N_ELEMENTS (charsets); - from = charsets[which]; - which = rand () % G_N_ELEMENTS (charsets); - to = charsets[which]; - - cd = g_mime_iconv_open (from, to); - if (cd == (iconv_t) -1) { - g_warning ("%d: failed to open converter for %s to %s", - i, from, to); - continue; - } - - which = rand () % 3; - if (!which) { - g_mime_iconv_close (cd); - } else { - open_cds = g_slist_prepend (open_cds, cd); - } - } - - node = open_cds; - while (node) { - next = node->next; - cd = node->data; - g_mime_iconv_close (cd); - g_slist_free_1 (node); - node = next; - } -} -#endif /* TEST_CACHE */ - struct { const char *text; const char *charset; } tests[] = { - { "Ətraflı", "utf-8" }, /* az */ - { " ", "windows-cp1251" }, /* bg */ - { "Cnjuge", "iso-8859-1" }, /* ca */ - { "Avanceret sgning", "iso-8859-1" }, /* da */ - { "Lschen", "iso-8859-1" }, /* de */ - { "some text", "iso-8859-1" }, /* en */ - { "piv", "iso-8859-15" }, /* fi */ - { "Modifi", "iso-8859-1" }, /* fr */ - { "Tidal", "iso-8859-1" }, /* ga */ - { "Fbrica", "iso-8859-1" }, /* gl */ - { "Szem-Blyhv-A ", "iso-8859-2" }, /* hu */ - { "Non c' corrispondenza", "iso-8859-1" }, /* it */ - { "$(B>e5i8!:w(B", "euc-jp" }, /* ja */ - { "$(C0m1^(B $(C0K;v(B", "euc-kr" }, /* ko */ - { "Isami paieka", "iso-8859-13" }, /* lt */ - { "Paplaint Meklana", "iso-8859-13" }, /* lv */ - { "Kopiren", "iso-8859-15" }, /* nl */ - { "ydelagd Sk", "iso-8859-1" }, /* nn */ - { "Avansert sk", "iso-8859-1" }, /* no */ - { "-Brda-A ksi-Bki-A adresowej", "iso-8859-2" }, /* pl */ - { "C-Butare-A avansat-B-A ", "iso-8859-2" }, /* ro */ - { "-L-A -L-A ", "koi8-r" }, /* ru */ - { "Pokročilé hľadanie", "utf-8" }, /* sk */ - { "Ga želite", "utf-8" }, /* sl */ - { "den nd?", "iso-8859-1" }, /* sv */ - { "Geli-Mmi-A Arama", "iso-8859-9" }, /* tr */ - { " ", "koi8-u" }, /* uk */ + { "\xc6\x8ftrafl\xc4\xb1", "utf-8" }, /* az */ + { "\xc4\xee\xe1\xe0\xe2\xe8 \xd3\xf1\xeb\xf3\xe3\xe0", "windows-cp1251" }, /* bg */ + { "C\xf2njuge", "iso-8859-1" }, /* ca */ + { "Avanceret s\xf8gning", "iso-8859-1" }, /* da */ + { "L\xf6schen", "iso-8859-1" }, /* de */ + { "some text", "iso-8859-1" }, /* en */ + { "p\xe4iv\xe4\xe4", "iso-8859-15" }, /* fi */ + { "Modifi\xe9", "iso-8859-1" }, /* fr */ + { "Tid\xe9""al", "iso-8859-1" }, /* ga */ + { "F\xe1""brica", "iso-8859-1" }, /* gl */ + { "Szem\x1b-B\xe9lyh\xedv\xf3\x1b-A ", "iso-8859-2" }, /* hu */ + { "Non c'\xe9 corrispondenza", "iso-8859-1" }, /* it */ + { "\x1b$(B>e5i8!:w\x1b(B", "euc-jp" }, /* ja */ + { "\x1b$(C0m1^\x1b(B \x1b$(C0K;v\x1b(B", "euc-kr" }, /* ko */ + { "I\xf0sami paie\xf0ka", "iso-8859-13" }, /* lt */ + { "Papla\xf0in\xe2t\xe2 Mekl\xe7\xf0""ana", "iso-8859-13" }, /* lv */ + { "Kopi\xebren", "iso-8859-15" }, /* nl */ + { "\xd8ydelagd S\xf8k", "iso-8859-1" }, /* nn */ + { "Avansert s\xf8k", "iso-8859-1" }, /* no */ + { "\x1b-B\xacr\xf3""d\xb3""a\x1b-A ksi\x1b-B\xb1\xbfki\x1b-A adresowej", "iso-8859-2" }, /* pl */ + { "C\x1b-B\xe3utare\x1b-A avansat\x1b-B\xe3\x1b-A ", "iso-8859-2" }, /* ro */ + { "\x1b-L\xc0\xd0\xe1\xe8\xd8\xe0\xd5\xdd\xdd\xeb\xd9\x1b-A \x1b-L\xdf\xde\xd8\xe1\xda\x1b-A ", "koi8-r" }, /* ru */ + { "Pokro\xc4\x8dil\xc3\xa9 h\xc4\xbe""adanie", "utf-8" }, /* sk */ + { "Ga \xc5\xbe""elite", "utf-8" }, /* sl */ + { "den \xe4nd\xe5?", "iso-8859-1" }, /* sv */ + { "Geli\x1b-M\xfemi\xfe\x1b-A Arama", "iso-8859-9" }, /* tr */ + { "\xf5\xc4\xcf\xd3\xcb\xcf\xce\xc1\xcc\xc5\xce\xc9\xca \xd0\xcf\xdb\xd5\xcb", "koi8-u" }, /* uk */ #if 0 /* this is expected to fail */ - { "ɚ尋(I>(B", "utf-8" }, /* zh_TW */ + { "\xe9\x92\xc9\x9a\x8e\xe5\xb0\x8b\xe6\x1b(I>\x1b(B", "utf-8" }, /* zh_TW */ #endif }; @@ -206,20 +134,13 @@ int main (int argc, char **argv) { - g_mime_iconv_init (); + g_mime_init (); testsuite_init (argc, argv); -#ifdef TEST_CACHE - ZenTimerStart (NULL); - test_cache (); - ZenTimerStop (NULL); - ZenTimerReport (NULL, "test_cache()"); -#endif - test_utils (); - g_mime_iconv_shutdown (); + g_mime_shutdown (); return testsuite_exit (); } diff -Nru gmime-2.6.22+dfsg2/tests/test-mbox.c gmime-3.0.1/tests/test-mbox.c --- gmime-2.6.22+dfsg2/tests/test-mbox.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/tests/test-mbox.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -58,17 +58,21 @@ static void print_mime_struct (GMimeStream *stream, GMimeObject *part, int depth) { - const GMimeContentType *type; GMimeMultipart *multipart; GMimeMessagePart *mpart; + GMimeContentType *type; GMimeObject *subpart; + GMimeObject *body; + GMimeMessage *msg; int i, n; print_depth (stream, depth); type = g_mime_object_get_content_type (part); - g_mime_stream_printf (stream, "Content-Type: %s/%s\n", type->type, type->subtype); + g_mime_stream_printf (stream, "Content-Type: %s/%s\n", + g_mime_content_type_get_media_type (type), + g_mime_content_type_get_media_subtype (type)); if (GMIME_IS_MULTIPART (part)) { multipart = (GMimeMultipart *) part; @@ -80,28 +84,37 @@ } } else if (GMIME_IS_MESSAGE_PART (part)) { mpart = (GMimeMessagePart *) part; + msg = g_mime_message_part_get_message (mpart); - if (mpart->message) - print_mime_struct (stream, mpart->message->mime_part, depth + 1); + if (msg != NULL) { + body = g_mime_message_get_mime_part (msg); + + print_mime_struct (stream, body, depth + 1); + } } } static void +xevcb (GMimeParser *parser, const char *header, const char *value, gint64 offset, gpointer user_data) +{ +} + +static void test_parser (GMimeParser *parser, GMimeStream *mbox, GMimeStream *summary) { - gint64 message_begin, message_end, headers_begin, headers_end; + gint64 message_begin, message_end, headers_begin, headers_end, marker_offset; + GMimeFormatOptions *format = g_mime_format_options_get_default (); InternetAddressList *list; GMimeMessage *message; char *marker, *buf; const char *subject; - const char *sender; - int tz_offset; + GMimeObject *body; + GDateTime *date; int nmsg = 0; - time_t date; while (!g_mime_parser_eos (parser)) { message_begin = g_mime_parser_tell (parser); - if (!(message = g_mime_parser_construct_message (parser))) + if (!(message = g_mime_parser_construct_message (parser, NULL))) throw (exception_new ("failed to parse message #%d", nmsg)); message_end = g_mime_parser_tell (parser); @@ -114,21 +127,20 @@ g_mime_stream_printf (summary, "header offsets: %" G_GINT64_FORMAT ", %" G_GINT64_FORMAT "\n", headers_begin, headers_end); - marker = g_mime_parser_get_from (parser); + marker_offset = g_mime_parser_get_mbox_marker_offset (parser); + marker = g_mime_parser_get_mbox_marker (parser); g_mime_stream_printf (summary, "%s\n", marker); - if ((sender = g_mime_message_get_sender (message)) != NULL) { - list = internet_address_list_parse_string (sender); - buf = internet_address_list_to_string (list, FALSE); - g_object_unref (list); - + if ((list = g_mime_message_get_from (message)) != NULL && + internet_address_list_length (list) > 0) { + buf = internet_address_list_to_string (list, format, FALSE); g_mime_stream_printf (summary, "From: %s\n", buf); g_free (buf); } - if ((list = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_TO)) != NULL && + if ((list = g_mime_message_get_addresses (message, GMIME_ADDRESS_TYPE_TO)) != NULL && internet_address_list_length (list) > 0) { - buf = internet_address_list_to_string (list, FALSE); + buf = internet_address_list_to_string (list, format, FALSE); g_mime_stream_printf (summary, "To: %s\n", buf); g_free (buf); } @@ -137,17 +149,26 @@ subject = ""; g_mime_stream_printf (summary, "Subject: %s\n", subject); - g_mime_message_get_date (message, &date, &tz_offset); - buf = g_mime_utils_header_format_date (date, tz_offset); + if (!(date = g_mime_message_get_date (message))) { + date = g_date_time_new_from_unix_utc (0); + } else { + g_date_time_ref (date); + } + buf = g_mime_utils_header_format_date (date); g_mime_stream_printf (summary, "Date: %s\n", buf); + g_date_time_unref (date); g_free (buf); - print_mime_struct (summary, message->mime_part, 0); + body = g_mime_message_get_mime_part (message); + print_mime_struct (summary, body, 0); g_mime_stream_write (summary, "\n", 1); if (mbox) { - g_mime_stream_printf (mbox, "%s%s\n", nmsg > 0 ? "\n" : "", marker); - g_mime_object_write_to_stream ((GMimeObject *) message, mbox); + if (nmsg > 0) + g_mime_stream_write (mbox, "\n", 1); + + g_mime_stream_printf (mbox, "%s\n", marker); + g_mime_object_write_to_stream ((GMimeObject *) message, format, mbox); } g_object_unref (message); @@ -268,7 +289,7 @@ return 0; #endif - g_mime_init (0); + g_mime_init (); testsuite_init (argc, argv); @@ -319,23 +340,19 @@ testsuite_check ("%s", dent); try { - if ((fd = open (input, O_RDONLY, 0)) == -1) { + if (!(istream = g_mime_stream_fs_open (input, O_RDONLY, 0, NULL))) { throw (exception_new ("could not open `%s': %s", input, g_strerror (errno))); } - istream = g_mime_stream_fs_new (fd); - - if ((fd = open (output, O_RDONLY, 0)) == -1) { + if (!(ostream = g_mime_stream_fs_open (output, O_RDONLY, 0, NULL))) { throw (exception_new ("could not open `%s': %s", output, g_strerror (errno))); } - ostream = g_mime_stream_fs_new (fd); - #ifdef ENABLE_MBOX_MATCH - tmp = g_strdup_printf ("./tmp/%s.XXXXXX", dent); - if ((fd = g_mkstemp (tmp)) == -1) { + tmp = g_strdup_printf ("./tmp/%s", dent); + if ((fd = open (tmp, O_CREAT | O_RDWR | O_TRUNC, 0644)) == -1) { throw (exception_new ("could not open `%s': %s", tmp, g_strerror (errno))); } @@ -345,15 +362,33 @@ parser = g_mime_parser_new_with_stream (istream); g_mime_parser_set_persist_stream (parser, TRUE); - g_mime_parser_set_scan_from (parser, TRUE); + g_mime_parser_set_format (parser, GMIME_FORMAT_MBOX); - if (strstr (dent, "content-length") != NULL) + if (!g_mime_parser_get_persist_stream (parser)) + throw (exception_new ("persist stream check failed")); + + if (g_mime_parser_get_format (parser) != GMIME_FORMAT_MBOX) + throw (exception_new ("format check failed")); + + if (strstr (dent, "content-length") != NULL) { g_mime_parser_set_respect_content_length (parser, TRUE); + + if (!g_mime_parser_get_respect_content_length (parser)) + throw (exception_new ("respect content-length check failed")); + } else { + g_mime_parser_set_respect_content_length (parser, FALSE); + + if (g_mime_parser_get_respect_content_length (parser)) + throw (exception_new ("respect content-length check failed")); + } + + g_mime_parser_set_header_regex (parser, "^X-Evolution", xevcb, NULL); pstream = g_mime_stream_mem_new (); test_parser (parser, mstream, pstream); #ifdef ENABLE_MBOX_MATCH + g_mime_stream_flush (mstream); g_mime_stream_reset (istream); g_mime_stream_reset (mstream); if (!streams_match (istream, mstream)) @@ -398,12 +433,11 @@ g_dir_close (dir); } else if (S_ISREG (st.st_mode)) { /* manually run test on a single file */ - if ((fd = open (path, O_RDONLY, 0)) == -1) + if (!(istream = g_mime_stream_fs_open (path, O_RDONLY, 0, NULL))) goto exit; - istream = g_mime_stream_fs_new (fd); parser = g_mime_parser_new_with_stream (istream); - g_mime_parser_set_scan_from (parser, TRUE); + g_mime_parser_set_format (parser, GMIME_FORMAT_MBOX); #ifdef ENABLE_MBOX_MATCH tmp = g_strdup ("./tmp/mbox-test.XXXXXX"); @@ -419,7 +453,8 @@ mstream = NULL; #endif - ostream = g_mime_stream_fs_new (dup (1)); + ostream = g_mime_stream_file_new (stdout); + g_mime_stream_file_set_owner ((GMimeStreamFile *) ostream, FALSE); testsuite_check ("user-input mbox: `%s'", path); try { @@ -454,19 +489,19 @@ exit: #ifdef ENABLE_MBOX_MATCH - if ((dir = g_dir_open ("./tmp", 0, NULL))) { - p = g_stpcpy (input, "./tmp"); - *p++ = G_DIR_SEPARATOR; - - while ((dent = g_dir_read_name (dir))) { - strcpy (p, dent); - unlink (input); - } - - g_dir_close (dir); - } + //if ((dir = g_dir_open ("./tmp", 0, NULL))) { + // p = g_stpcpy (input, "./tmp"); + // *p++ = G_DIR_SEPARATOR; + // + // while ((dent = g_dir_read_name (dir))) { + // strcpy (p, dent); + // unlink (input); + // } + // + // g_dir_close (dir); + //} - rmdir ("./tmp"); + //rmdir ("./tmp"); #endif testsuite_end (); diff -Nru gmime-2.6.22+dfsg2/tests/test-mime.c gmime-3.0.1/tests/test-mime.c --- gmime-2.6.22+dfsg2/tests/test-mime.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/tests/test-mime.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -63,173 +63,163 @@ static struct { const char *input; + const char *charset; const char *display; const char *encoded; } addrspec[] = { - { "fejj@helixcode.com", + { "fejj@helixcode.com", NULL, "fejj@helixcode.com", "fejj@helixcode.com" }, - { "this is\n\ta folded name ", - "this is a folded name ", - "this is a folded name " }, - { "Jeffrey Stedfast ", + { "Jeffrey Stedfast ", NULL, "Jeffrey Stedfast ", "Jeffrey Stedfast " }, - { "Jeffrey \"fejj\" Stedfast ", + { "Jeffrey \"fejj\" Stedfast ", NULL, "Jeffrey fejj Stedfast ", "Jeffrey fejj Stedfast " }, - { "\"Jeffrey \\\"fejj\\\" Stedfast\" ", + { "\"Jeffrey \\\"fejj\\\" Stedfast\" ", NULL, "Jeffrey \"fejj\" Stedfast ", "\"Jeffrey \\\"fejj\\\" Stedfast\" " }, - { "\"Stedfast, Jeffrey\" ", + { "\"Stedfast, Jeffrey\" ", NULL, "\"Stedfast, Jeffrey\" ", "\"Stedfast, Jeffrey\" " }, - { "fejj@helixcode.com (Jeffrey Stedfast)", + { "fejj@helixcode.com (Jeffrey Stedfast)", NULL, "Jeffrey Stedfast ", "Jeffrey Stedfast " }, - { "Jeff ", + { "Jeff ", NULL, "Jeff ", "Jeff " }, - { "=?iso-8859-1?q?Kristoffer_Br=E5nemyr?= ", + { "=?iso-8859-1?q?Kristoffer_Br=E5nemyr?= ", "iso-8859-1", "Kristoffer Br\xc3\xa5nemyr ", "Kristoffer =?iso-8859-1?q?Br=E5nemyr?= " }, - { "fpons@mandrakesoft.com (=?iso-8859-1?q?Fran=E7ois?= Pons)", + { "fpons@mandrakesoft.com (=?iso-8859-1?q?Fran=E7ois?= Pons)", "iso-8859-1", "Fran\xc3\xa7ois Pons ", "=?iso-8859-1?q?Fran=E7ois?= Pons " }, - { "GNOME Hackers: miguel@gnome.org (Miguel de Icaza), Havoc Pennington ;, fejj@helixcode.com", + { "GNOME Hackers: miguel@gnome.org (Miguel de Icaza), Havoc Pennington ;, fejj@helixcode.com", NULL, "GNOME Hackers: Miguel de Icaza , Havoc Pennington ;, fejj@helixcode.com", "GNOME Hackers: Miguel de Icaza , Havoc Pennington ;, fejj@helixcode.com" }, - { "Local recipients: phil, joe, alex, bob", + { "Local recipients: phil, joe, alex, bob", NULL, "Local recipients: phil, joe, alex, bob;", "Local recipients: phil, joe, alex, bob;" }, - { "\":sysmail\"@ Some-Group. Some-Org,\n Muhammed.(I am the greatest) Ali @(the)Vegas.WBA", + { "\":sysmail\"@ Some-Group. Some-Org,\n Muhammed.(I am the greatest) Ali @(the)Vegas.WBA", NULL, "\":sysmail\"@Some-Group.Some-Org, Muhammed.Ali@Vegas.WBA", "\":sysmail\"@Some-Group.Some-Org, Muhammed.Ali@Vegas.WBA" }, - { "Charles S. Kerr ", + { "Charles S. Kerr ", NULL, "\"Charles S. Kerr\" ", "\"Charles S. Kerr\" " }, - { "Charles \"Likes, to, put, commas, in, quoted, strings\" Kerr ", + { "Charles \"Likes, to, put, commas, in, quoted, strings\" Kerr ", NULL, "\"Charles Likes, to, put, commas, in, quoted, strings Kerr\" ", "\"Charles Likes, to, put, commas, in, quoted, strings Kerr\" " }, - { "Charles Kerr, Pan Programmer ", + { "Charles Kerr, Pan Programmer ", NULL, "\"Charles Kerr, Pan Programmer\" ", "\"Charles Kerr, Pan Programmer\" " }, - { "Charles Kerr ", + { "Charles Kerr ", NULL, "Charles Kerr ", "Charles Kerr " }, - { "Charles ", - "Charles ", - "Charles " }, - { "Charles,, likes illegal commas ", + { "Charles ", NULL, + "Charles ", + "Charles " }, + { "Charles,, likes illegal commas ", NULL, "Charles, likes illegal commas ", "Charles, likes illegal commas " }, - { "", - "charles", - "charles" }, - { " (Charles Kerr)", - "Charles Kerr ", - "Charles Kerr " }, - { "fpons@mandrakesoft.com (=?iso-8859-1?q?Fran=E7ois?= Pons likes _'s and 's too)", + { "", NULL, + "charles@broken.host.com", + "charles@broken.host.com" }, + { "fpons@mandrakesoft.com (=?iso-8859-1?q?Fran=E7ois?= Pons likes _'s and 's too)", "iso-8859-1", "\"Fran\xc3\xa7ois Pons likes _'s and 's too\" ", "=?iso-8859-1?q?Fran=E7ois?= Pons likes _'s and 's too " }, - { "T\x81\xf5ivo Leedj\x81\xe4rv ", + { "T\x81\xf5ivo Leedj\x81\xe4rv ", NULL, "T\xc2\x81\xc3\xb5ivo Leedj\xc2\x81\xc3\xa4rv ", "=?iso-8859-1?b?VIH1aXZvIExlZWRqgeRydg==?= " }, - { "fbosi@mokabyte.it;, rspazzoli@mokabyte.it", + { "fbosi@mokabyte.it;, rspazzoli@mokabyte.it", NULL, "fbosi@mokabyte.it, rspazzoli@mokabyte.it", "fbosi@mokabyte.it, rspazzoli@mokabyte.it" }, - { "\"Miles (Star Trekkin) O'Brian\" ", + { "\"Miles (Star Trekkin) O'Brian\" ", NULL, "\"Miles (Star Trekkin) O'Brian\" ", "\"Miles (Star Trekkin) O'Brian\" " }, - { "undisclosed-recipients: ;", + { "undisclosed-recipients: ;", NULL, "undisclosed-recipients: ;", "undisclosed-recipients: ;" }, - { "undisclosed-recipients:;", + { "undisclosed-recipients:;", NULL, "undisclosed-recipients: ;", "undisclosed-recipients: ;" }, - { "undisclosed-recipients:", + { "undisclosed-recipients:", NULL, "undisclosed-recipients: ;", "undisclosed-recipients: ;" }, - { "undisclosed-recipients", + { "undisclosed-recipients", NULL, "undisclosed-recipients", "undisclosed-recipients" }, - /* The following 2 addr-specs are invalid according to the - * spec, but apparently some japanese cellphones use them? - * See Evolution bug #547969 */ - { "some...dots@hocus.pocus.net", - "some...dots@hocus.pocus.net", - "some...dots@hocus.pocus.net" }, - { "some.dots..@hocus.pocus.net", - "some.dots..@hocus.pocus.net", - "some.dots..@hocus.pocus.net" }, /* The following test case is to check that we properly handle * mailbox addresses that do not have any lwsp between the * name component and the addr-spec. See Evolution bug * #347520 */ - { "Canonical Patch Queue Manager", + { "Canonical Patch Queue Manager", NULL, "Canonical Patch Queue Manager ", "Canonical Patch Queue Manager " }, /* Some examples pulled from rfc5322 */ - { "Pete(A nice \\) chap) ", + { "Pete(A nice \\) chap) ", NULL, "Pete ", "Pete " }, - { "A Group(Some people):Chris Jones , joe@example.org, John (my dear friend); (the end of the group)", + { "A Group(Some people):Chris Jones , joe@example.org, John (my dear friend); (the end of the group)", NULL, "A Group: Chris Jones , joe@example.org, John ;", "A Group: Chris Jones , joe@example.org, John ;" }, /* The following tests cases are meant to test forgivingness * of the parser when it encounters unquoted specials in the * name component */ - { "Warren Worthington, Jr. ", + { "Warren Worthington, Jr. ", NULL, "\"Warren Worthington, Jr.\" ", "\"Warren Worthington, Jr.\" " }, - { "dot.com ", + { "dot.com ", NULL, "\"dot.com\" ", "\"dot.com\" " }, - { "=?UTF-8?Q?agatest123_\"test\"?= ", + { "=?UTF-8?Q?agatest123_\"test\"?= ", "utf-8", "agatest123 test ", "agatest123 test " }, - { "\"=?ISO-8859-2?Q?TEST?=\" ", + { "\"=?ISO-8859-2?Q?TEST?=\" ", "iso-8859-2", "TEST ", "TEST " }, - { "sdfasf@wp.pl,c tert@wp.pl,sffdg.rtre@op.pl", - "sdfasf@wp.pl, c, sffdg.rtre@op.pl", - "sdfasf@wp.pl, c, sffdg.rtre@op.pl" }, + { "sdfasf@wp.pl,c tert@wp.pl,sffdg.rtre@op.pl", NULL, + "sdfasf@wp.pl, sffdg.rtre@op.pl", + "sdfasf@wp.pl, sffdg.rtre@op.pl" }, /* obsolete routing address syntax tests */ - { "<@route:user@domain.com>", + { "<@route:user@domain.com>", NULL, "user@domain.com", "user@domain.com" }, - { "<@route1,,@route2,,,@route3:user@domain.com>", + { "<@route1,,@route2,,,@route3:user@domain.com>", NULL, "user@domain.com", "user@domain.com" }, }; static struct { const char *input; + const char *charset; const char *display; const char *encoded; } broken_addrspec[] = { - { "\"Biznes=?ISO-8859-2?Q?_?=INTERIA.PL\"=?ISO-8859-2?Q?_?=", - "\"Biznes INTERIA.PL \" ", + { "\"Biznes=?ISO-8859-2?Q?_?=INTERIA.PL\"=?ISO-8859-2?Q?_?=", "iso-8859-2", + "\"Biznes INTERIA.PL\" ", "\"Biznes INTERIA.PL\" ", }, /* UTF-8 sequence split between multiple encoded-word tokens */ - { "=?utf-8?Q?{#D=C3=A8=C3=A9=C2=A3=C3=A5=C3=BD_M$=C3=A1=C3?= =?utf-8?Q?=AD.=C3=A7=C3=B8m@#}?= ", - "\"{#Dèé£åý M$áí.çøm@#}\" ", - "=?iso-8859-1?b?eyNE6Omj5f0gTSTh7S7n+G1AI30=?= " }, + { "=?utf-8?Q?{#D=C3=A8=C3=A9=C2=A3=C3=A5=C3=BD_M$=C3=A1=C3?= =?utf-8?Q?=AD.=C3=A7=C3=B8m}?= ", "utf-8", + "\"{#Dèé£åý M$áí.çøm}\" ", + "=?UTF-8?b?eyNEw6jDqcKjw6XDvSBNJMOhw60uw6fDuG19?= " }, /* quoted-printable payload split between multiple encoded-word tokens */ - { "=?utf-8?Q?{#D=C3=A8=C3=A9=C2=?= =?utf-8?Q?A3=C3=A5=C3=BD_M$=C3=A1=C?= =?utf-8?Q?3=AD.=C3=A7=C3=B8m@#}?= ", - "\"{#Dèé£åý M$áí.çøm@#}\" ", - "=?iso-8859-1?b?eyNE6Omj5f0gTSTh7S7n+G1AI30=?= " }, + { "=?utf-8?Q?{#D=C3=A8=C3=A9=C2=?= =?utf-8?Q?A3=C3=A5=C3=BD_M$=C3=A1=C?= =?utf-8?Q?3=AD.=C3=A7=C3=B8m}?= ", "utf-8", + "\"{#Dèé£åý M$áí.çøm}\" ", + "=?UTF-8?b?eyNEw6jDqcKjw6XDvSBNJMOhw60uw6fDuG19?= " }, /* base64 payload split between multiple encoded-word tokens */ - { "=?iso-8859-1?b?ey?= =?iso-8859-1?b?NE6Omj5f0gTSTh7S7n+G1AI30=?= ", + { "=?iso-8859-1?b?ey?= =?iso-8859-1?b?NE6Omj5f0gTSTh7S7n+G1AI30=?= ", "iso-8859-1", "\"{#Dèé£åý M$áí.çøm@#}\" ", "=?iso-8859-1?b?eyNE6Omj5f0gTSTh7S7n+G1AI30=?= " }, }; static void -test_addrspec (gboolean test_broken) +test_addrspec (GMimeParserOptions *options, gboolean test_broken) { + GMimeFormatOptions *format = g_mime_format_options_get_default (); InternetAddressList *addrlist; + InternetAddress *address; + const char *charset; char *str; guint i; @@ -239,17 +229,30 @@ testsuite_check ("addrspec[%u]", i); try { - if (!(addrlist = internet_address_list_parse_string (addrspec[i].input))) - throw (exception_new ("could not parse addr-spec")); + if (!(addrlist = internet_address_list_parse (options, addrspec[i].input))) + throw (exception_new ("could not parse: %s", addrspec[i].input)); + + if (!(address = internet_address_list_get_address (addrlist, 0))) + throw (exception_new ("could not get first address: %s", addrspec[i].input)); - str = internet_address_list_to_string (addrlist, FALSE); + charset = internet_address_get_charset (address); + if (addrspec[i].charset != NULL) { + if (charset == NULL) + throw (exception_new ("expected '%s' but got NULL charset: %s", addrspec[i].charset, addrspec[i].input)); + if (g_ascii_strcasecmp (addrspec[i].charset, charset) != 0) + throw (exception_new ("expected '%s' but got '%s' charset: %s", addrspec[i].charset, charset, addrspec[i].input)); + } else if (charset != NULL) { + throw (exception_new ("expected NULL charset but address has a charset of '%s': %s", charset, addrspec[i].input)); + } + + str = internet_address_list_to_string (addrlist, format, FALSE); if (strcmp (addrspec[i].display, str) != 0) - throw (exception_new ("display addr-spec %s does not match: %s", addrspec[i].display, str)); + throw (exception_new ("display strings do not match.\ninput: %s\nexpected: %s\nactual: %s", addrspec[i].input, addrspec[i].display, str)); g_free (str); - str = internet_address_list_to_string (addrlist, TRUE); + str = internet_address_list_to_string (addrlist, format, TRUE); if (strcmp (addrspec[i].encoded, str) != 0) - throw (exception_new ("encoded addr-spec %s does not match: %s", addrspec[i].encoded, str)); + throw (exception_new ("encoded strings do not match.\nexpected: %s\nactual: %s", addrspec[i].encoded, str)); testsuite_check_passed (); } catch (ex) { @@ -268,17 +271,30 @@ testsuite_check ("broken_addrspec[%u]", i); try { - if (!(addrlist = internet_address_list_parse_string (broken_addrspec[i].input))) - throw (exception_new ("could not parse addr-spec")); + if (!(addrlist = internet_address_list_parse (options, broken_addrspec[i].input))) + throw (exception_new ("could not parse: %s", broken_addrspec[i].input)); + + if (!(address = internet_address_list_get_address (addrlist, 0))) + throw (exception_new ("could not get first address: %s", broken_addrspec[i].input)); - str = internet_address_list_to_string (addrlist, FALSE); + charset = internet_address_get_charset (address); + if (broken_addrspec[i].charset != NULL) { + if (charset == NULL) + throw (exception_new ("expected '%s' but got NULL charset: %s", broken_addrspec[i].charset, broken_addrspec[i].input)); + if (g_ascii_strcasecmp (broken_addrspec[i].charset, charset) != 0) + throw (exception_new ("expected '%s' but got '%s' charset: %s", broken_addrspec[i].charset, charset, broken_addrspec[i].input)); + } else if (charset != NULL) { + throw (exception_new ("expected NULL charset but address has a charset of '%s': %s", charset, broken_addrspec[i].input)); + } + + str = internet_address_list_to_string (addrlist, format, FALSE); if (strcmp (broken_addrspec[i].display, str) != 0) - throw (exception_new ("display addr-spec %s does not match: %s", broken_addrspec[i].display, str)); + throw (exception_new ("display strings do not match.\ninput: %s\nexpected: %s\nactual: %s", broken_addrspec[i].input, broken_addrspec[i].display, str)); g_free (str); - str = internet_address_list_to_string (addrlist, TRUE); + str = internet_address_list_to_string (addrlist, format, TRUE); if (strcmp (broken_addrspec[i].encoded, str) != 0) - throw (exception_new ("encoded addr-spec %s does not match: %s", broken_addrspec[i].encoded, str)); + throw (exception_new ("encoded strings do not match.\nexpected: %s\nactual: %s", broken_addrspec[i].encoded, str)); testsuite_check_passed (); } catch (ex) { @@ -320,39 +336,62 @@ { "17-6-2008 17:10:08", "Tue, 17 Jun 2008 17:10:08 +0000", 1213722608, 0 }, + { "nonsense", + "Thu, 01 Jan 1970 00:00:00 +0000", + 0, 0 } }; static void test_date_parser (void) { - time_t date; - int tzone; + GDateTime *date; + Exception *ex; + int tz_offset; + GTimeSpan tz; + time_t time; char *buf; + int sign; guint i; for (i = 0; i < G_N_ELEMENTS (dates); i++) { - buf = NULL; testsuite_check ("Date: '%s'", dates[i].in); try { - date = g_mime_utils_header_decode_date (dates[i].in, &tzone); + if (!(date = g_mime_utils_header_decode_date (dates[i].in))) { + if (dates[i].date != 0) + throw (exception_new ("failed to parse date: %s", dates[i].in)); + testsuite_check_passed (); + continue; + } + + time = (time_t) g_date_time_to_unix (date); + tz = g_date_time_get_utc_offset (date); + + sign = tz < 0 ? -1 : 1; + tz *= sign; - if (date != dates[i].date) - throw (exception_new ("time_t's do not match")); + tz_offset = 100 * (tz / G_TIME_SPAN_HOUR); + tz_offset += (tz % G_TIME_SPAN_HOUR) / G_TIME_SPAN_MINUTE; + tz_offset *= sign; - if (tzone != dates[i].tzone) + if (time != dates[i].date) + throw (exception_new ("time_t's do not match: %ld vs %ld", time, dates[i].date)); + + if (tz_offset != dates[i].tzone) throw (exception_new ("timezones do not match")); - buf = g_mime_utils_header_format_date (date, tzone); - if (strcmp (dates[i].out, buf) != 0) - throw (exception_new ("date strings do not match")); + buf = g_mime_utils_header_format_date (date); + if (strcmp (dates[i].out, buf) != 0) { + ex = exception_new ("date strings do not match: %s vs %s", buf, dates[i].out); + g_free (buf); + throw (ex); + } + + g_free (buf); testsuite_check_passed (); } catch (ex) { - testsuite_check_failed ("Date: '%s': %s", dates[i].in, - ex->message); + testsuite_check_failed ("Date: '%s': %s", dates[i].in, ex->message); } finally; - - g_free (buf); } } @@ -427,8 +466,9 @@ #endif static void -test_rfc2047 (gboolean test_broken) +test_rfc2047 (GMimeParserOptions *options, gboolean test_broken) { + GMimeFormatOptions *format = g_mime_format_options_get_default (); char *enc, *dec; guint i; @@ -436,15 +476,15 @@ dec = enc = NULL; testsuite_check ("rfc2047_text[%u]", i); try { - dec = g_mime_utils_header_decode_text (rfc2047_text[i].input); + dec = g_mime_utils_header_decode_text (options, rfc2047_text[i].input); if (strcmp (rfc2047_text[i].decoded, dec) != 0) throw (exception_new ("decoded text does not match: %s", dec)); - enc = g_mime_utils_header_encode_text (dec); + enc = g_mime_utils_header_encode_text (format, dec, NULL); if (strcmp (rfc2047_text[i].encoded, enc) != 0) - throw (exception_new ("encoded text does not match: %s", enc)); + throw (exception_new ("encoded text does not match: actual=\"%s\", expected=\"%s\"", enc, rfc2047_text[i].encoded)); - //dec2 = g_mime_utils_header_decode_text (enc); + //dec2 = g_mime_utils_header_decode_text (options, enc); //if (strcmp (rfc2047_text[i].decoded, dec2) != 0) // throw (exception_new ("decoded2 text does not match: %s", dec)); @@ -461,11 +501,11 @@ dec = enc = NULL; testsuite_check ("broken_rfc2047_text[%u]", i); try { - dec = g_mime_utils_header_decode_text (broken_rfc2047_text[i].input); + dec = g_mime_utils_header_decode_text (options, broken_rfc2047_text[i].input); if (strcmp (broken_rfc2047_text[i].decoded, dec) != 0) throw (exception_new ("decoded text does not match: %s", dec)); - enc = g_mime_utils_header_encode_text (dec); + enc = g_mime_utils_header_encode_text (format, dec, NULL); if (strcmp (broken_rfc2047_text[i].encoded, enc) != 0) throw (exception_new ("encoded text does not match: %s", enc)); @@ -487,7 +527,7 @@ if (strcmp (rfc2047_phrase[i].decoded, dec) != 0) throw (exception_new ("decoded phrase does not match")); - enc = g_mime_utils_header_encode_phrase (dec); + enc = g_mime_utils_header_encode_phrase (format, dec, NULL); if (strcmp (rfc2047_phrase[i].encoded, enc) != 0) throw (exception_new ("encoded phrase does not match")); @@ -511,8 +551,9 @@ }; static void -test_header_folding (void) +test_header_folding (GMimeParserOptions *options) { + GMimeFormatOptions *format = g_mime_format_options_get_default (); char *folded; guint i; @@ -520,7 +561,7 @@ folded = NULL; testsuite_check ("header_folding[%u]", i); try { - folded = g_mime_utils_unstructured_header_fold (header_folding[i].input); + folded = g_mime_utils_unstructured_header_fold (options, format, header_folding[i].input); if (strcmp (header_folding[i].folded, folded) != 0) throw (exception_new ("folded text does not match: -->%s<-- vs -->%s<--", header_folding[i].folded, folded)); @@ -535,48 +576,94 @@ static struct { const char *input; + const char *charset; const char *encoded; + GMimeParamEncodingMethod method; } rfc2184[] = { { "this is a really really long filename that should force gmime to rfc2184 encode it - yay!.html", + "us-ascii", "Content-Disposition: attachment;\n\t" - "filename*0*=iso-8859-1''this%20is%20a%20really%20really%20long%20filename%20;\n\t" + "filename*0*=us-ascii'en'this%20is%20a%20really%20really%20long%20filename%20;\n\t" "filename*1*=that%20should%20force%20gmime%20to%20rfc2184%20encode%20it%20-;\n\t" - "filename*2*=%20yay!.html\n" }, + "filename*2*=%20yay!.html\n", + GMIME_PARAM_ENCODING_METHOD_RFC2231 }, + { "{#Dèé£åý M$áí.çøm}.doc", + "iso-8859-1", + "Content-Disposition: attachment;\n\t" + "filename*=iso-8859-1'en'{#D%E8%E9%A3%E5%FD%20M$%E1%ED.%E7%F8m}.doc\n", + GMIME_PARAM_ENCODING_METHOD_RFC2231 }, + + /* Note: technically these aren't rfc2184-encoded... but they need to be parsed... */ + { "{#Dèé£åý M$áí.çøm}.doc", + "iso-8859-1", + "Content-Disposition: attachment;\n\t" + "filename=\"=?iso-8859-1?b?eyNE6Omj5f0gTSTh7S7n+G19LmRvYw==?=\"\n", + GMIME_PARAM_ENCODING_METHOD_RFC2047 }, }; static void -test_rfc2184 (void) +test_rfc2184 (GMimeParserOptions *options) { - GMimeParam param, *params; + GMimeFormatOptions *format = g_mime_format_options_get_default (); + GMimeParamEncodingMethod method; + GMimeParamList *params; + GMimeParam *param; + const char *value; GString *str; + int count; size_t n; guint i; - param.next = NULL; - param.name = "filename"; - - str = g_string_new ("Content-Disposition: attachment"); - n = str->len; - for (i = 0; i < G_N_ELEMENTS (rfc2184); i++) { - params = NULL; + params = g_mime_param_list_new (); + g_mime_param_list_set_parameter (params, "filename", rfc2184[i].input); + param = g_mime_param_list_get_parameter (params, "filename"); + g_mime_param_set_encoding_method (param, rfc2184[i].method); + g_mime_param_set_lang (param, "en"); - param.value = (char *) rfc2184[i].input; + str = g_string_new ("Content-Disposition: attachment"); + n = str->len; + + g_mime_param_list_encode (params, format, TRUE, str); + g_object_unref (params); + params = NULL; testsuite_check ("rfc2184[%u]", i); try { - g_mime_param_write_to_string (¶m, TRUE, str); if (strcmp (rfc2184[i].encoded, str->str) != 0) - throw (exception_new ("encoded param does not match: %s", str->str)); + throw (exception_new ("encoded param list does not match: \n%s\nvs\n%s", + rfc2184[i].encoded, str->str)); - if (!(params = g_mime_param_new_from_string (str->str + n + 2))) + if (!(params = g_mime_param_list_parse (options, str->str + n + 2))) throw (exception_new ("could not parse encoded param list")); - if (params->next != NULL) - throw (exception_new ("parsed more than a single param?")); + if ((count = g_mime_param_list_length (params)) != 1) + throw (exception_new ("expected only 1 param, but parsed %d", count)); - if (strcmp (rfc2184[i].input, params->value) != 0) - throw (exception_new ("parsed param value does not match")); + if (!(param = g_mime_param_list_get_parameter (params, "filename"))) + throw (exception_new ("failed to get filename param")); + + value = g_mime_param_get_value (param); + if (strcmp (rfc2184[i].input, value) != 0) + throw (exception_new ("parsed param value does not match: %s", value)); + + if (!(value = g_mime_param_get_charset (param))) + throw (exception_new ("parsed charset is NULL")); + + if (strcmp (rfc2184[i].charset, value) != 0) + throw (exception_new ("parsed charset does not match: %s", value)); + + if (rfc2184[i].method != GMIME_PARAM_ENCODING_METHOD_RFC2047) { + if (!(value = g_mime_param_get_lang (param))) + throw (exception_new ("parsed lang is NULL")); + + if (strcmp (value, "en") != 0) + throw (exception_new ("parsed lang does not match: %s", value)); + } + + method = g_mime_param_get_encoding_method (param); + if (method != rfc2184[i].method) + throw (exception_new ("parsed encoding method does not match: %d", method)); testsuite_check_passed (); } catch (ex) { @@ -584,12 +671,10 @@ } finally; if (params != NULL) - g_mime_param_destroy (params); + g_object_unref (params); - g_string_truncate (str, n); + g_string_free (str, TRUE); } - - g_string_free (str, TRUE); } @@ -640,40 +725,121 @@ } +static struct { + const char *input; + int count; + const char *ids[5]; +} references[] = { + { "<3ohapq$h3b@gandalf.rutgers.edu> <3notqh$b52@ns2.ny.ubs.com> <3npoh0$2oo@news.blkbox.com> <3nqp09$r7t@ns2.ny.ubs.com>", + 4, + { "3ohapq$h3b@gandalf.rutgers.edu", "3notqh$b52@ns2.ny.ubs.com", "3npoh0$2oo@news.blkbox.com", "3nqp09$r7t@ns2.ny.ubs.com", NULL } + }, + { "<3lmtu0$dv1@secnews.netscape.com> <3lpjth$g97@secnews.netscape.com> <3lrbuf$gvp@secnews.netscape.com> <3lst13$iur@secnews.netscape.com>", + 4, + { "3lmtu0$dv1@secnews.netscape.com", "3lpjth$g97@secnews.netscape.com", "3lrbuf$gvp@secnews.netscape.com", "3lst13$iur@secnews.netscape.com", NULL } + }, +}; + + +static void +test_references (GMimeParserOptions *options) +{ + GMimeReferences *refs, *copy; + guint i; + int j; + + for (i = 0; i < G_N_ELEMENTS (references); i++) { + testsuite_check ("references[%u]", i); + try { + if (!(refs = g_mime_references_parse (options, references[i].input))) + throw (exception_new ("failed to parse references")); + + if (g_mime_references_length (refs) != references[i].count) + throw (exception_new ("number of references does not match")); + + for (j = 0; j < references[i].count; j++) { + const char *msgid = g_mime_references_get_message_id (refs, j); + + if (strcmp (references[i].ids[j], msgid) != 0) + throw (exception_new ("message ids do not match for ids[%d]", j)); + } + + copy = g_mime_references_copy (refs); + if (g_mime_references_length (copy) != g_mime_references_length (refs)) + throw (exception_new ("number of copied references does not match")); + + for (j = 0; j < references[i].count; j++) { + const char *msgid = g_mime_references_get_message_id (copy, j); + + if (strcmp (references[i].ids[j], msgid) != 0) + throw (exception_new ("copied message ids do not match for ids[%d]", j)); + } + + g_mime_references_clear (copy); + + if (g_mime_references_length (copy) != 0) + throw (exception_new ("references were not cleared")); + + g_mime_references_free (copy); + g_mime_references_free (refs); + + testsuite_check_passed (); + } catch (ex) { + testsuite_check_failed ("references[%u]: %s", i, ex->message); + } finally; + } +} + int main (int argc, char **argv) { - g_mime_init (0); + GMimeParserOptions *options = g_mime_parser_options_new (); + + g_mime_init (); testsuite_init (argc, argv); - testsuite_start ("addr-spec parser"); - test_addrspec (FALSE); + testsuite_start ("addr-spec parser (strict)"); + g_mime_parser_options_set_rfc2047_compliance_mode (options, GMIME_RFC_COMPLIANCE_STRICT); + test_addrspec (options, FALSE); + testsuite_end (); + + testsuite_start ("addr-spec parser (loose)"); + g_mime_parser_options_set_rfc2047_compliance_mode (options, GMIME_RFC_COMPLIANCE_LOOSE); + test_addrspec (options, TRUE); testsuite_end (); testsuite_start ("date parser"); test_date_parser (); testsuite_end (); - testsuite_start ("rfc2047 encoding/decoding"); - test_rfc2047 (FALSE); + testsuite_start ("rfc2047 encoding/decoding (strict)"); + g_mime_parser_options_set_rfc2047_compliance_mode (options, GMIME_RFC_COMPLIANCE_STRICT); + test_rfc2047 (options, FALSE); + testsuite_end (); + + testsuite_start ("rfc2047 encoding/decoding (loose)"); + g_mime_parser_options_set_rfc2047_compliance_mode (options, GMIME_RFC_COMPLIANCE_LOOSE); + test_rfc2047 (options, TRUE); testsuite_end (); testsuite_start ("rfc2184 encoding/decoding"); - test_rfc2184 (); + test_rfc2184 (options); testsuite_end (); testsuite_start ("quoted-strings"); test_qstring (); testsuite_end (); - g_mime_shutdown (); + testsuite_start ("header folding"); + test_header_folding (options); + testsuite_end (); - g_mime_init (GMIME_ENABLE_RFC2047_WORKAROUNDS); - testsuite_start ("broken rfc2047 encoding/decoding"); - test_header_folding (); - test_addrspec (TRUE); - test_rfc2047 (TRUE); + testsuite_start ("references"); + test_references (options); testsuite_end (); + + g_mime_parser_options_free (options); + g_mime_shutdown (); return testsuite_exit (); diff -Nru gmime-2.6.22+dfsg2/tests/test-parser.c gmime-3.0.1/tests/test-parser.c --- gmime-2.6.22+dfsg2/tests/test-parser.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/tests/test-parser.c 2017-03-18 01:31:54.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -37,7 +37,7 @@ #include "zentimer.h" #endif -//#define TEST_RAW_HEADER +#define TEST_RAW_HEADER #define TEST_PRESERVE_HEADERS #define PRINT_MIME_STRUCT //#define TEST_WRITE_TO_STREAM @@ -156,6 +156,7 @@ static void test_parser (GMimeStream *stream) { + GMimeFormatOptions *format = g_mime_format_options_get_default (); GMimeParser *parser; GMimeMessage *message; char *text; @@ -166,24 +167,24 @@ g_mime_parser_init_with_stream (parser, stream); ZenTimerStart (NULL); - message = g_mime_parser_construct_message (parser); + message = g_mime_parser_construct_message (parser, NULL); ZenTimerStop (NULL); ZenTimerReport (NULL, "gmime::parser_construct_message"); g_object_unref (parser); ZenTimerStart (NULL); - text = g_mime_object_to_string ((GMimeObject *) message); + text = g_mime_object_to_string ((GMimeObject *) message, format); ZenTimerStop (NULL); ZenTimerReport (NULL, "gmime::message_to_string"); /*fprintf (stdout, "Result should match previous MIME message dump\n\n%s\n", text);*/ g_free (text); - + #ifdef TEST_RAW_HEADER { char *raw; - raw = g_mime_object_get_headers ((GMimeObject *) message); + raw = g_mime_object_get_headers ((GMimeObject *) message, format); fprintf (stdout, "\nTesting raw headers...\n\n%s\n", raw); g_free (raw); } @@ -193,24 +194,21 @@ { GMimeStream *stream; - g_mime_header_list_set_stream (GMIME_OBJECT (message)->headers, NULL); - fprintf (stdout, "\nTesting preservation of headers...\n\n"); stream = g_mime_stream_file_new (stdout); - /*g_mime_header_set_stream (GMIME_OBJECT (message)->headers, NULL);*/ - g_mime_header_list_write_to_stream (GMIME_OBJECT (message)->headers, stream); + g_mime_stream_file_set_owner ((GMimeStreamFile *) stream, FALSE); + g_mime_header_list_write_to_stream (GMIME_OBJECT (message)->headers, format, stream); g_mime_stream_flush (stream); - GMIME_STREAM_FILE (stream)->fp = NULL; g_object_unref (stream); fprintf (stdout, "\n"); } #endif #ifdef TEST_WRITE_TO_STREAM - stream = g_mime_stream_fs_new (2); - g_mime_object_write_to_stream (GMIME_OBJECT (message), stream); + stream = g_mime_stream_pipe_new (2); + g_mime_stream_pipe_set_owner ((GMimeStreamPipe *) stream, FALSE); + g_mime_object_write_to_stream ((GMimeObject *) message, format, stream); g_mime_stream_flush (stream); - GMIME_STREAM_FS (stream)->fd = -1; g_object_unref (stream); #endif @@ -236,7 +234,7 @@ GMimeStream *stream; int fd; - g_mime_init (0); + g_mime_init (); if (argc > 1) filename = argv[1]; @@ -262,8 +260,7 @@ #endif #ifdef STREAM_BUFFER - istream = g_mime_stream_buffer_new (stream, - GMIME_STREAM_BUFFER_BLOCK_READ); + istream = g_mime_stream_buffer_new (stream, GMIME_STREAM_BUFFER_BLOCK_READ); g_object_unref (stream); stream = istream; #endif diff -Nru gmime-2.6.22+dfsg2/tests/test-partial.c gmime-3.0.1/tests/test-partial.c --- gmime-2.6.22+dfsg2/tests/test-partial.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/tests/test-partial.c 2017-04-23 16:04:05.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -27,93 +27,301 @@ #include +#include "testsuite.h" -void -print_depth (int depth) -{ - int i; - - for (i = 0; i < depth; i++) - fprintf (stdout, " "); -} +extern int verbose; -void -print_mime_struct (GMimeObject *part, int depth) +#define d(x) +#define v(x) if (verbose > 3) x + +static gboolean +streams_match (GMimeStream *expected, GMimeStream *actual) { - const GMimeContentType *type; - GMimeMultipart *multipart; - GMimeObject *subpart; - int i, n; - - print_depth (depth); - type = g_mime_object_get_content_type (part); - fprintf (stdout, "Content-Type: %s/%s\n", type->type, type->subtype); - - if (GMIME_IS_MULTIPART (part)) { - multipart = (GMimeMultipart *) part; - - n = g_mime_multipart_get_count (multipart); - for (i = 0; i < n; i++) { - subpart = g_mime_multipart_get_part (multipart, i); - print_mime_struct (subpart, depth + 1); - g_object_unref (subpart); + char buf[4096], dbuf[4096], errstr[1024], *bufptr, *bufend, *dbufptr; + gint64 len, totalsize, totalread = 0; + size_t nread, size; + gint64 offset = 0; + ssize_t n; + + v(fprintf (stdout, "Checking if streams match... ")); + + if (expected->bound_end != -1) { + totalsize = expected->bound_end - expected->position; + } else if ((len = g_mime_stream_length (expected)) == -1) { + sprintf (errstr, "Error: Unable to get length of expected stream\n"); + goto fail; + } else if (len < (expected->position - expected->bound_start)) { + sprintf (errstr, "Error: Overflow on expected stream?\n"); + goto fail; + } else { + totalsize = len - (expected->position - expected->bound_start); + } + + while (totalread < totalsize) { + if ((n = g_mime_stream_read (expected, buf, sizeof (buf))) <= 0) + break; + + size = n; + nread = 0; + totalread += n; + + d(fprintf (stderr, "read %zu bytes from expected stream\n", size)); + + do { + if ((n = g_mime_stream_read (actual, dbuf + nread, size - nread)) <= 0) { + fprintf (stderr, "actual stream's read(%p, dbuf + %zu, %zu) returned %zd, EOF\n", actual, nread, size - nread, n); + break; + } + d(fprintf (stderr, "read %zd bytes from actual stream\n", n)); + nread += n; + } while (nread < size); + + if (nread < size) { + sprintf (errstr, "Error: actual stream appears to be truncated, short %zu+ bytes\n", + size - nread); + goto fail; + } + + bufend = buf + size; + dbufptr = dbuf; + bufptr = buf; + + while (bufptr < bufend) { + if (*bufptr != *dbufptr) + break; + + dbufptr++; + bufptr++; } + + if (bufptr < bufend) { + sprintf (errstr, "Error: content does not match at offset %" G_GINT64_FORMAT "\n", + offset + (bufptr - buf)); + /*fprintf (stderr, "-->'%.*s'<--\nvs\n-->'%.*s'<--\n", + bufend - bufptr, bufptr, bufend - bufptr, dbufptr);*/ + goto fail; + } else { + d(fprintf (stderr, "%zu bytes identical\n", size)); + } + + offset += size; } + + if (totalread < totalsize) { + strcpy (errstr, "Error: expected more data from input stream\n"); + goto fail; + } + + if ((n = g_mime_stream_read (actual, buf, sizeof (buf))) > 0) { + strcpy (errstr, "Error: actual stream appears to contain extra content\n"); + goto fail; + } + + v(fputs ("passed\n", stdout)); + + return TRUE; + + fail: + + v(fputs ("failed\n", stdout)); + v(fputs (errstr, stderr)); + + return FALSE; } - int main (int argc, char **argv) { - GMimeMessage *message; + const char *datadir = "data/partial"; + GMimeStream *stream, *combined, *expected; + GMimeMessage *message, **messages; + GMimeMessagePartial **parts; + GMimeFormatOptions *format; + GString *input, *output; GMimeParser *parser; - GMimeStream *stream; GPtrArray *partials; - int fd, i; + int inlen, outlen; + GDir *data, *dir; + const char *dent; + struct stat st; + size_t i, n; + char *path; + + g_mime_init (); - if (argc < 2) - return 0; + testsuite_init (argc, argv); - g_mime_init (0); + testsuite_start ("message/partial"); - parser = g_mime_parser_new (); + format = g_mime_format_options_get_default (); - partials = g_ptr_array_new (); for (i = 1; i < argc; i++) { - if ((fd = open (argv[i], O_RDONLY, 0)) == -1) - return -1; - - stream = g_mime_stream_fs_new (fd); - g_mime_parser_init_with_stream (parser, stream); - g_object_unref (stream); + if (argv[i][0] != '-') { + datadir = argv[i]; + break; + } + } + + output = g_string_new (datadir); + g_string_append_c (output, G_DIR_SEPARATOR); + g_string_append (output, "output"); + + input = g_string_new (datadir); + g_string_append_c (input, G_DIR_SEPARATOR); + g_string_append (input, "input"); + + if (!(data = g_dir_open (input->str, 0, NULL))) + goto exit; + + g_string_append_c (output, G_DIR_SEPARATOR); + g_string_append_c (input, G_DIR_SEPARATOR); + outlen = output->len; + inlen = input->len; + + while ((dent = g_dir_read_name (data))) { + g_string_append (output, dent); + g_string_append (input, dent); - if (!(message = g_mime_parser_construct_message (parser))) - return -2; + parser = g_mime_parser_new (); + partials = g_ptr_array_new (); + dir = NULL; - if (!GMIME_IS_MESSAGE_PARTIAL (message->mime_part)) - return -3; + testsuite_check ("%s", dent); + try { + if (!(dir = g_dir_open (input->str, 0, NULL))) + throw (exception_new ("Failed to open `%s'", input->str)); + + while ((dent = g_dir_read_name (dir))) { + path = g_build_filename (input->str, dent, NULL); + + if (!(stream = g_mime_stream_file_open (path, "r", NULL))) + throw (exception_new ("Failed to open `%s'", path)); + + g_mime_parser_init_with_stream (parser, stream); + g_object_unref (stream); + + if (!(message = g_mime_parser_construct_message (parser, NULL))) + throw (exception_new ("Failed to parse `%s'", path)); + + if (!GMIME_IS_MESSAGE_PARTIAL (message->mime_part)) { + g_object_unref (message); + throw (exception_new ("`%s' is not a message/partial", path)); + } + + g_ptr_array_add (partials, message->mime_part); + g_object_ref (message->mime_part); + g_object_unref (message); + g_free (path); + path = NULL; + } + + parts = (GMimeMessagePartial **) partials->pdata; + n = partials->len; + + if (!(message = g_mime_message_partial_reconstruct_message (parts, n))) { + for (i = 0; i < n; i++) + g_object_unref (parts[i]); + + throw (exception_new ("Failed to recombine message/partial `%s'", input->str)); + } + + for (i = 0; i < n; i++) + g_object_unref (parts[i]); + + combined = g_mime_stream_mem_new (); + g_mime_object_write_to_stream (GMIME_OBJECT (message), format, combined); + g_mime_stream_reset (combined); + + if (!(expected = g_mime_stream_file_open (output->str, "r", NULL))) { + expected = g_mime_stream_file_open (output->str, "w", NULL); + g_mime_stream_write_to_stream (combined, expected); + g_mime_stream_flush (expected); + g_object_unref (expected); + g_object_unref (combined); + g_object_unref (message); + + throw (exception_new ("Failed to open `%s'", output->str)); + } + + if (!streams_match (expected, combined)) { + g_object_unref (combined); + g_object_unref (expected); + g_object_unref (message); + + throw (exception_new ("messages do not match for `%s'", input->str)); + } + + g_object_unref (combined); + + if (!(messages = g_mime_message_partial_split_message (message, 4096, &n))) { + g_object_unref (expected); + g_object_unref (message); + + throw (exception_new ("Failed to split message `%s'", input->str)); + } + + g_object_unref (message); + + g_ptr_array_set_size (partials, 0); + for (i = 0; i < n; i++) { + g_ptr_array_add (partials, messages[i]->mime_part); + g_object_ref (messages[i]->mime_part); + g_object_unref (messages[i]); + } + g_free (messages); + + parts = (GMimeMessagePartial **) partials->pdata; + n = partials->len; + + if (!(message = g_mime_message_partial_reconstruct_message (parts, n))) { + for (i = 0; i < n; i++) + g_object_unref (parts[i]); + g_object_unref (expected); + + throw (exception_new ("Failed to recombine split message/partial `%s'", input->str)); + } + + combined = g_mime_stream_mem_new (); + g_mime_object_write_to_stream (GMIME_OBJECT (message), format, combined); + g_mime_stream_reset (combined); + g_mime_stream_reset (expected); + g_object_unref (message); + + if (!streams_match (expected, combined)) { + g_object_unref (combined); + g_object_unref (expected); + + throw (exception_new ("re-split/combined messages do not match for `%s'", input->str)); + } + + g_object_unref (combined); + g_object_unref (expected); + g_dir_close (dir); + + testsuite_check_passed (); + } catch (ex) { + testsuite_check_failed ("%s: %s", input->str, ex->message); + + if (dir != NULL) + g_dir_close (dir); + + g_free (path); + } finally; - g_ptr_array_add (partials, message->mime_part); - g_object_ref (message->mime_part); - g_object_unref (message); + g_string_truncate (output, outlen); + g_string_truncate (input, inlen); + g_ptr_array_free (partials, TRUE); + g_object_unref (parser); } - g_object_unref (parser); - - message = g_mime_message_partial_reconstruct_message ((GMimeMessagePartial **) partials->pdata, - partials->len); - g_ptr_array_free (partials, TRUE); - if (!message) - return -4; - - stream = g_mime_stream_fs_new (STDERR_FILENO); - g_mime_object_write_to_stream (GMIME_OBJECT (message), stream); + g_dir_close (data); - print_mime_struct (message->mime_part, 0); + exit: + g_string_free (output, TRUE); + g_string_free (input, TRUE); - g_object_unref (message); - g_object_unref (stream); + testsuite_end (); g_mime_shutdown (); - return 0; + return testsuite_exit (); } diff -Nru gmime-2.6.22+dfsg2/tests/test-pgp.c gmime-3.0.1/tests/test-pgp.c --- gmime-2.6.22+dfsg2/tests/test-pgp.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/tests/test-pgp.c 2017-03-16 01:55:56.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -34,14 +34,12 @@ #include "testsuite.h" -#define GPG_PATH "gpg" - extern int verbose; #define v(x) if (verbose > 3) x static gboolean -request_passwd (GMimeCryptoContext *ctx, const char *user_id, const char *prompt_ctx, gboolean reprompt, GMimeStream *response, GError **err) +request_passwd (GMimeCryptoContext *ctx, const char *user_id, const char *prompt, gboolean reprompt, GMimeStream *response, GError **err) { g_mime_stream_write_string (response, "no.secret\n"); @@ -51,31 +49,29 @@ static GMimeSignatureStatus get_sig_status (GMimeSignatureList *signatures) { - GMimeSignatureStatus status = GMIME_SIGNATURE_STATUS_GOOD; + GMimeSignatureStatus status = 0; GMimeSignature *sig; int i; if (!signatures || signatures->array->len == 0) - return GMIME_SIGNATURE_STATUS_ERROR; + return GMIME_SIGNATURE_STATUS_RED; for (i = 0; i < g_mime_signature_list_length (signatures); i++) { sig = g_mime_signature_list_get_signature (signatures, i); - status = MAX (status, sig->status); + status |= g_mime_signature_get_status (sig); } return status; } static void -test_sign (GMimeCryptoContext *ctx, GMimeStream *cleartext, GMimeStream *ciphertext) +test_sign (GMimeCryptoContext *ctx, gboolean detached, GMimeStream *cleartext, GMimeStream *ciphertext) { GError *err = NULL; Exception *ex; int rv; - rv = g_mime_crypto_context_sign (ctx, "no.user@no.domain", - GMIME_DIGEST_ALGO_SHA256, - cleartext, ciphertext, &err); + rv = g_mime_crypto_context_sign (ctx, detached, "no.user@no.domain", cleartext, ciphertext, &err); if (rv == -1 || err != NULL) { ex = exception_new ("%s", err->message); @@ -90,14 +86,14 @@ } static void -test_verify (GMimeCryptoContext *ctx, GMimeStream *cleartext, GMimeStream *ciphertext) +test_verify_detached (GMimeCryptoContext *ctx, GMimeStream *cleartext, GMimeStream *ciphertext) { GMimeSignatureList *signatures; + GMimeSignatureStatus status; GError *err = NULL; Exception *ex; - signatures = g_mime_crypto_context_verify (ctx, GMIME_DIGEST_ALGO_DEFAULT, - cleartext, ciphertext, &err); + signatures = g_mime_crypto_context_verify (ctx, 0, cleartext, ciphertext, NULL, &err); if (signatures == NULL) { ex = exception_new ("%s", err->message); @@ -105,7 +101,9 @@ throw (ex); } - if (get_sig_status (signatures) != GMIME_SIGNATURE_STATUS_GOOD) { + status = get_sig_status (signatures); + + if ((status & GMIME_SIGNATURE_STATUS_RED) != 0) { g_object_unref (signatures); throw (exception_new ("signature BAD")); } @@ -114,6 +112,50 @@ } static void +test_verify (GMimeCryptoContext *ctx, GMimeStream *cleartext, GMimeStream *ciphertext) +{ + GMimeSignatureList *signatures; + GMimeSignatureStatus status; + Exception *ex = NULL; + GMimeStream *stream; + GError *err = NULL; + GByteArray *buf[2]; + + stream = g_mime_stream_mem_new (); + + signatures = g_mime_crypto_context_verify (ctx, 0, ciphertext, NULL, stream, &err); + + if (signatures == NULL) { + ex = exception_new ("%s", err->message); + g_object_unref (stream); + g_error_free (err); + throw (ex); + } + + status = get_sig_status (signatures); + + if ((status & GMIME_SIGNATURE_STATUS_RED) != 0) { + g_object_unref (signatures); + g_object_unref (stream); + + throw (exception_new ("signature BAD")); + } + + g_object_unref (signatures); + + buf[0] = GMIME_STREAM_MEM (cleartext)->buffer; + buf[1] = GMIME_STREAM_MEM (stream)->buffer; + + if (buf[0]->len != buf[1]->len || memcmp (buf[0]->data, buf[1]->data, buf[0]->len) != 0) + ex = exception_new ("extracted data does not match original cleartext"); + + g_object_unref (stream); + + if (ex != NULL) + throw (ex); +} + +static void test_encrypt (GMimeCryptoContext *ctx, gboolean sign, GMimeStream *cleartext, GMimeStream *ciphertext) { GPtrArray *recipients; @@ -123,8 +165,10 @@ recipients = g_ptr_array_new (); g_ptr_array_add (recipients, "no.user@no.domain"); - g_mime_crypto_context_encrypt (ctx, sign, "no.user@no.domain", GMIME_DIGEST_ALGO_SHA256, - recipients, cleartext, ciphertext, &err); + g_mime_crypto_context_encrypt (ctx, sign, "no.user@no.domain", + GMIME_ENCRYPT_ALWAYS_TRUST, + recipients, cleartext, ciphertext, + &err); g_ptr_array_free (recipients, TRUE); @@ -142,6 +186,8 @@ static void test_decrypt (GMimeCryptoContext *ctx, gboolean sign, GMimeStream *cleartext, GMimeStream *ciphertext) { + GMimeSignatureList *signatures; + GMimeSignatureStatus status; GMimeDecryptResult *result; Exception *ex = NULL; GMimeStream *stream; @@ -150,18 +196,26 @@ stream = g_mime_stream_mem_new (); - if (!(result = g_mime_crypto_context_decrypt (ctx, ciphertext, stream, &err))) { + if (!(result = g_mime_crypto_context_decrypt (ctx, 0, NULL, ciphertext, stream, &err))) { g_object_unref (stream); ex = exception_new ("%s", err->message); g_error_free (err); throw (ex); } + signatures = g_mime_decrypt_result_get_signatures (result); + if (sign) { - if (!result->signatures || get_sig_status (result->signatures) != GMIME_SIGNATURE_STATUS_GOOD) - ex = exception_new ("expected GOOD signature"); + if (signatures != NULL) { + status = get_sig_status (signatures); + + if ((status & GMIME_SIGNATURE_STATUS_RED) != 0) + ex = exception_new ("expected GOOD signature"); + } else { + ex = exception_new ("Failed to get signatures"); + } } else { - if (result->signatures != NULL) + if (signatures != NULL) ex = exception_new ("unexpected signature"); } @@ -177,8 +231,8 @@ throw (ex); } - buf[0] = GMIME_STREAM_MEM (cleartext)->buffer; - buf[1] = GMIME_STREAM_MEM (stream)->buffer; + buf[0] = g_mime_stream_mem_get_byte_array ((GMimeStreamMem *) cleartext); + buf[1] = g_mime_stream_mem_get_byte_array ((GMimeStreamMem *) stream); if (buf[0]->len != buf[1]->len || memcmp (buf[0]->data, buf[1]->data, buf[0]->len) != 0) ex = exception_new ("decrypted data does not match original cleartext"); @@ -197,8 +251,8 @@ const char *inbuf, *outbuf; size_t inlen, outlen; Exception *ex = NULL; + const char *keys[2]; GError *err = NULL; - GPtrArray *keys; int fd; if ((fd = open (path, O_RDONLY, 0)) == -1) @@ -210,13 +264,13 @@ g_mime_stream_reset (istream); g_object_unref (ostream); - keys = g_ptr_array_new (); - g_ptr_array_add (keys, "no.user@no.domain"); + keys[0] = "no.user@no.domain"; + keys[1] = NULL; ostream = g_mime_stream_mem_new (); g_mime_crypto_context_export_keys (ctx, keys, ostream, &err); - g_ptr_array_free (keys, TRUE); + if (err != NULL) { ex = exception_new ("%s", err->message); g_object_unref (istream); @@ -278,21 +332,28 @@ int main (int argc, char **argv) { +#ifdef ENABLE_CRYPTO const char *datadir = "data/pgp"; GMimeStream *istream, *ostream; GMimeCryptoContext *ctx; const char *what; + char *gpg, *key; struct stat st; - char *key; int i; - g_mime_init (0); + g_mime_init (); testsuite_init (argc, argv); - if (testsuite_setup_gpghome (GPG_PATH) != 0) + if (!(gpg = g_find_program_in_path ("gpg2"))) + if (!(gpg = g_find_program_in_path ("gpg"))) + return EXIT_FAILURE; + + if (testsuite_setup_gpghome (gpg) != 0) return EXIT_FAILURE; + g_free (gpg); + for (i = 1; i < argc; i++) { if (argv[i][0] != '-') { datadir = argv[i]; @@ -305,8 +366,8 @@ testsuite_start ("GnuPG crypto context"); - ctx = g_mime_gpg_context_new (request_passwd, GPG_PATH); - g_mime_gpg_context_set_always_trust ((GMimeGpgContext *) ctx, TRUE); + ctx = g_mime_gpg_context_new (); + g_mime_crypto_context_set_request_password (ctx, request_passwd); testsuite_check ("GMimeGpgContext::import"); try { @@ -344,7 +405,7 @@ what = "GMimeGpgContext::sign"; testsuite_check (what); try { - test_sign (ctx, istream, ostream); + test_sign (ctx, FALSE, istream, ostream); testsuite_check_passed (); what = "GMimeGpgContext::verify"; @@ -361,6 +422,26 @@ g_mime_stream_reset (istream); ostream = g_mime_stream_mem_new (); + what = "GMimeGpgContext::sign (detached)"; + testsuite_check (what); + try { + test_sign (ctx, TRUE, istream, ostream); + testsuite_check_passed (); + + what = "GMimeGpgContext::verify (detached)"; + testsuite_check (what); + g_mime_stream_reset (istream); + g_mime_stream_reset (ostream); + test_verify_detached (ctx, istream, ostream); + testsuite_check_passed (); + } catch (ex) { + testsuite_check_failed ("%s failed: %s", what, ex->message); + } finally; + + g_object_unref (ostream); + g_mime_stream_reset (istream); + ostream = g_mime_stream_mem_new (); + what = "GMimeGpgContext::encrypt"; testsuite_check (what); try { @@ -409,4 +490,8 @@ return EXIT_FAILURE; return testsuite_exit (); +#else + fprintf (stderr, "PGP support not enabled in this build.\n"); + return EXIT_SUCCESS; +#endif } diff -Nru gmime-2.6.22+dfsg2/tests/test-pgpmime.c gmime-3.0.1/tests/test-pgpmime.c --- gmime-2.6.22+dfsg2/tests/test-pgpmime.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/tests/test-pgpmime.c 2017-03-28 23:46:26.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -31,18 +31,17 @@ #include #include +#include #include #include "testsuite.h" -#define GPG_PATH "gpg" - extern int verbose; #define v(x) if (verbose > 3) x static gboolean -request_passwd (GMimeCryptoContext *ctx, const char *user_id, const char *prompt_ctx, gboolean reprompt, GMimeStream *response, GError **err) +request_passwd (GMimeCryptoContext *ctx, const char *user_id, const char *prompt, gboolean reprompt, GMimeStream *response, GError **err) { g_mime_stream_write_string (response, "no.secret\n"); @@ -52,16 +51,16 @@ static GMimeSignatureStatus get_sig_status (GMimeSignatureList *signatures) { - GMimeSignatureStatus status = GMIME_SIGNATURE_STATUS_GOOD; + GMimeSignatureStatus status = 0; GMimeSignature *sig; int i; if (!signatures || signatures->array->len == 0) - return GMIME_SIGNATURE_STATUS_ERROR; + return GMIME_SIGNATURE_STATUS_RED; for (i = 0; i < g_mime_signature_list_length (signatures); i++) { sig = g_mime_signature_list_get_signature (signatures, i); - status = MAX (status, sig->status); + status |= g_mime_signature_get_status (sig); } return status; @@ -70,23 +69,21 @@ static void print_verify_results (GMimeSignatureList *signatures) { + GMimeSignatureStatus status; GMimeSignature *sig; int count, i; - switch (get_sig_status (signatures)) { - case GMIME_SIGNATURE_STATUS_GOOD: - fputs ("GOOD\n", stdout); - break; - case GMIME_SIGNATURE_STATUS_BAD: + status = get_sig_status (signatures); + + fprintf (stdout, "Overall status: (0x%x) ", status); + if ((status & GMIME_SIGNATURE_STATUS_RED) != 0) fputs ("BAD\n", stdout); - break; - case GMIME_SIGNATURE_STATUS_ERROR: - fputs ("ERROR status\n", stdout); - break; - default: - fputs ("Unknown enum value\n", stdout); - break; - } + else if ((status & GMIME_SIGNATURE_STATUS_GREEN) != 0) + fputs ("GOOD\n", stdout); + else if ((status & GMIME_SIGNATURE_STATUS_VALID) != 0) + fputs ("VALID\n", stdout); + else + fputs ("UNKNOWN\n", stdout); fputs ("\nSignatures:\n", stdout); count = g_mime_signature_list_length (signatures); @@ -99,38 +96,35 @@ fprintf (stdout, "\tTrust: "); switch (sig->cert->trust) { - case GMIME_CERTIFICATE_TRUST_NONE: - fputs ("None\n", stdout); + case GMIME_TRUST_UNKNOWN: + fputs ("Unknown\n", stdout); break; - case GMIME_CERTIFICATE_TRUST_NEVER: + case GMIME_TRUST_NEVER: fputs ("Never\n", stdout); break; - case GMIME_CERTIFICATE_TRUST_UNDEFINED: + case GMIME_TRUST_UNDEFINED: fputs ("Undefined\n", stdout); break; - case GMIME_CERTIFICATE_TRUST_MARGINAL: + case GMIME_TRUST_MARGINAL: fputs ("Marginal\n", stdout); break; - case GMIME_CERTIFICATE_TRUST_FULLY: - fputs ("Fully\n", stdout); + case GMIME_TRUST_FULL: + fputs ("Full\n", stdout); break; - case GMIME_CERTIFICATE_TRUST_ULTIMATE: + case GMIME_TRUST_ULTIMATE: fputs ("Ultimate\n", stdout); break; } fprintf (stdout, "\tStatus: "); - switch (sig->status) { - case GMIME_SIGNATURE_STATUS_GOOD: - fputs ("GOOD\n", stdout); - break; - case GMIME_SIGNATURE_STATUS_BAD: + if ((sig->status & GMIME_SIGNATURE_STATUS_RED) != 0) fputs ("BAD\n", stdout); - break; - case GMIME_SIGNATURE_STATUS_ERROR: - fputs ("ERROR\n", stdout); - break; - } + else if ((sig->status & GMIME_SIGNATURE_STATUS_GREEN) != 0) + fputs ("GOOD\n", stdout); + else if ((sig->status & GMIME_SIGNATURE_STATUS_VALID) != 0) + fputs ("VALID\n", stdout); + else + fputs ("UNKNOWN\n", stdout); fprintf (stdout, "\tSignature made on %s", ctime (&sig->created)); if (sig->expires != (time_t) 0) @@ -138,26 +132,84 @@ else fprintf (stdout, "\tSignature never expires\n"); - if (sig->errors) { - fprintf (stdout, "\tErrors: "); - if (sig->errors & GMIME_SIGNATURE_ERROR_EXPSIG) - fputs ("Expired, ", stdout); - if (sig->errors & GMIME_SIGNATURE_ERROR_NO_PUBKEY) - fputs ("No Pub Key, ", stdout); - if (sig->errors & GMIME_SIGNATURE_ERROR_EXPKEYSIG) - fputs ("Key Expired, ", stdout); - if (sig->errors & GMIME_SIGNATURE_ERROR_REVKEYSIG) - fputs ("Key Revoked", stdout); - fputc ('\n', stdout); - } else { - fprintf (stdout, "\tNo errors for this signer\n"); - } + fprintf (stdout, "\tErrors: "); + if (sig->status & GMIME_SIGNATURE_STATUS_KEY_REVOKED) + fputs ("Key Revoked, ", stdout); + if (sig->status & GMIME_SIGNATURE_STATUS_KEY_EXPIRED) + fputs ("Key Expired, ", stdout); + if (sig->status & GMIME_SIGNATURE_STATUS_SIG_EXPIRED) + fputs ("Sig Expired, ", stdout); + if (sig->status & GMIME_SIGNATURE_STATUS_KEY_MISSING) + fputs ("Key Missing, ", stdout); + if (sig->status & GMIME_SIGNATURE_STATUS_CRL_MISSING) + fputs ("CRL Missing, ", stdout); + if (sig->status & GMIME_SIGNATURE_STATUS_CRL_TOO_OLD) + fputs ("CRL Too Old, ", stdout); + if (sig->status & GMIME_SIGNATURE_STATUS_BAD_POLICY) + fputs ("Bad Policy, ", stdout); + if (sig->status & GMIME_SIGNATURE_STATUS_SYS_ERROR) + fputs ("System Error, ", stdout); + if (sig->status & GMIME_SIGNATURE_STATUS_TOFU_CONFLICT) + fputs ("Tofu Conflict", stdout); + if ((sig->status & GMIME_SIGNATURE_STATUS_ERROR_MASK) == 0) + fputs ("None", stdout); + fputc ('\n', stdout); if (i + 1 < count) fputc ('\n', stdout); } } +static GMimeMessage * +create_message (GMimeObject *body) +{ + GMimeFormatOptions *format = g_mime_format_options_get_default (); + InternetAddressList *list; + InternetAddress *mailbox; + GMimeMessage *message; + GMimeParser *parser; + GMimeStream *stream; + + message = g_mime_message_new (TRUE); + + mailbox = internet_address_mailbox_new ("Jeffrey Stedfast", "fejj@helixcode.com"); + list = g_mime_message_get_from (message); + internet_address_list_add (list, mailbox); + g_object_unref (mailbox); + + mailbox = internet_address_mailbox_new ("Jeffrey Stedfast", "fejj@helixcode.com"); + list = g_mime_message_get_reply_to (message); + internet_address_list_add (list, mailbox); + g_object_unref (mailbox); + + mailbox = internet_address_mailbox_new ("Federico Mena-Quintero", "federico@helixcode.com"); + list = g_mime_message_get_addresses (message, GMIME_ADDRESS_TYPE_TO); + internet_address_list_add (list, mailbox); + g_object_unref (mailbox); + + g_mime_message_set_subject (message, "This is a test message", NULL); + g_mime_object_set_header ((GMimeObject *) message, "X-Mailer", "main.c", NULL); + g_mime_message_set_mime_part (message, body); + + stream = g_mime_stream_mem_new (); + g_mime_object_write_to_stream ((GMimeObject *) message, format, stream); + g_mime_stream_reset (stream); + g_object_unref (message); + + /*fprintf (stderr, "-----BEGIN RAW MESSAGE-----\n%.*s-----END RAW MESSAGE-----\n", + GMIME_STREAM_MEM (stream)->buffer->len, + GMIME_STREAM_MEM (stream)->buffer->data);*/ + + parser = g_mime_parser_new (); + g_mime_parser_init_with_stream (parser, stream); + g_object_unref (stream); + + message = g_mime_parser_construct_message (parser, NULL); + g_object_unref (parser); + + return message; +} + #define MULTIPART_SIGNED_CONTENT "This is a test of the emergency broadcast system \ with an sha1 detach-sign.\n\nFrom now on, there will be text to try and break \t\ \nvarious things. For example, the F in \"From\" in the previous line...\n...and \ @@ -169,73 +221,29 @@ test_multipart_signed (GMimeCryptoContext *ctx) { GMimeSignatureList *signatures; + GMimeSignatureStatus status; GMimeMultipartSigned *mps; - GMimeDataWrapper *content; GMimeMessage *message; - GMimeStream *stream; - GMimeParser *parser; + GMimeTextPart *part; GError *err = NULL; - GMimePart *part; Exception *ex; - part = g_mime_part_new_with_type ("text", "plain"); - - stream = g_mime_stream_mem_new (); - g_mime_stream_write_string (stream, MULTIPART_SIGNED_CONTENT); -#if 0 - "This is a test of the emergency broadcast system with an sha1 detach-sign.\n\n" - "From now on, there will be text to try and break \t \n" - "various things. For example, the F in \"From\" in the previous line...\n" - "...and the first dot of this line have been pre-encoded in the QP encoding " - "in order to test that GMime properly treats MIME part content as opaque.\n" - "If this still verifies okay, then we have ourselves a winner I guess...\n"; -#endif - - g_mime_stream_reset (stream); - content = g_mime_data_wrapper_new_with_stream (stream, GMIME_CONTENT_ENCODING_DEFAULT); - g_object_unref (stream); - - g_mime_part_set_content_object (part, content); - g_object_unref (content); - - /* create the multipart/signed container part */ - mps = g_mime_multipart_signed_new (); + part = g_mime_text_part_new_with_subtype ("plain"); + g_mime_text_part_set_text (part, MULTIPART_SIGNED_CONTENT); /* sign the part */ - g_mime_multipart_signed_sign (mps, GMIME_OBJECT (part), ctx, "no.user@no.domain", - GMIME_DIGEST_ALGO_SHA1, &err); + mps = g_mime_multipart_signed_sign (ctx, (GMimeObject *) part, "no.user@no.domain", &err); g_object_unref (part); if (err != NULL) { ex = exception_new ("signing failed: %s", err->message); - g_object_unref (mps); g_error_free (err); throw (ex); } - message = g_mime_message_new (TRUE); - g_mime_message_set_sender (message, "\"Jeffrey Stedfast\" "); - g_mime_message_set_reply_to (message, "fejj@helixcode.com"); - g_mime_message_add_recipient (message, GMIME_RECIPIENT_TYPE_TO, - "Federico Mena-Quintero", - "federico@helixcode.com"); - g_mime_message_set_subject (message, "This is a test message"); - g_mime_object_set_header ((GMimeObject *) message, "X-Mailer", "main.c"); - g_mime_message_set_mime_part (message, GMIME_OBJECT (mps)); + message = create_message ((GMimeObject *) mps); g_object_unref (mps); - stream = g_mime_stream_mem_new (); - g_mime_object_write_to_stream ((GMimeObject *) message, stream); - g_mime_stream_reset (stream); - g_object_unref (message); - - parser = g_mime_parser_new (); - g_mime_parser_init_with_stream (parser, stream); - g_object_unref (stream); - - message = g_mime_parser_construct_message (parser); - g_object_unref (parser); - if (!GMIME_IS_MULTIPART_SIGNED (message->mime_part)) { ex = exception_new ("resultant top-level mime part not a multipart/signed?"); g_object_unref (message); @@ -244,8 +252,7 @@ mps = (GMimeMultipartSigned *) message->mime_part; - v(fputs ("Trying to verify signature... ", stdout)); - if (!(signatures = g_mime_multipart_signed_verify (mps, ctx, &err))) { + if (!(signatures = g_mime_multipart_signed_verify (mps, 0, &err))) { ex = exception_new ("%s", err->message); v(fputs ("failed.\n", stdout)); g_error_free (err); @@ -253,9 +260,13 @@ } v(print_verify_results (signatures)); - g_object_unref (signatures); + status = get_sig_status (signatures); + g_object_unref (signatures); g_object_unref (message); + + if (status & GMIME_SIGNATURE_STATUS_RED) + throw (exception_new ("signature status was BAD")); } #define MULTIPART_ENCRYPTED_CONTENT "This is a test of multipart/encrypted.\n" @@ -264,65 +275,64 @@ create_encrypted_message (GMimeCryptoContext *ctx, gboolean sign, GMimeStream **cleartext_out, GMimeStream **stream_out) { + GMimeFormatOptions *format = g_mime_format_options_get_default (); GMimeStream *cleartext, *stream; GMimeMultipartEncrypted *mpe; - GMimeDataWrapper *content; + InternetAddressList *list; + InternetAddress *mailbox; GPtrArray *recipients; GMimeMessage *message; Exception *ex = NULL; GError *err = NULL; - GMimePart *part; + GMimeTextPart *part; - cleartext = g_mime_stream_mem_new (); - g_mime_stream_write_string (cleartext, MULTIPART_ENCRYPTED_CONTENT); - g_mime_stream_reset (cleartext); - - content = g_mime_data_wrapper_new (); - g_mime_data_wrapper_set_stream (content, cleartext); - g_object_unref (cleartext); - - part = g_mime_part_new_with_type ("text", "plain"); - g_mime_part_set_content_object (part, content); - g_object_unref (content); + part = g_mime_text_part_new (); + g_mime_text_part_set_text (part, MULTIPART_ENCRYPTED_CONTENT); /* hold onto this for comparison later */ cleartext = g_mime_stream_mem_new (); - g_mime_object_write_to_stream ((GMimeObject *) part, cleartext); + g_mime_object_write_to_stream ((GMimeObject *) part, format, cleartext); g_mime_stream_reset (cleartext); - /* create the multipart/encrypted container part */ - mpe = g_mime_multipart_encrypted_new (); - /* encrypt the part */ recipients = g_ptr_array_new (); g_ptr_array_add (recipients, "no.user@no.domain"); - g_mime_multipart_encrypted_encrypt (mpe, GMIME_OBJECT (part), ctx, sign, - "no.user@no.domain", GMIME_DIGEST_ALGO_SHA256, - recipients, &err); + mpe = g_mime_multipart_encrypted_encrypt (ctx, (GMimeObject *) part, sign, "no.user@no.domain", + GMIME_ENCRYPT_ALWAYS_TRUST, recipients, &err); g_ptr_array_free (recipients, TRUE); g_object_unref (part); if (err != NULL) { ex = exception_new ("encryption failed: %s", err->message); g_object_unref (cleartext); - g_object_unref (mpe); g_error_free (err); throw (ex); } message = g_mime_message_new (TRUE); - g_mime_message_set_sender (message, "\"Jeffrey Stedfast\" "); - g_mime_message_set_reply_to (message, "fejj@helixcode.com"); - g_mime_message_add_recipient (message, GMIME_RECIPIENT_TYPE_TO, - "Federico Mena-Quintero", - "federico@helixcode.com"); - g_mime_message_set_subject (message, "This is a test message"); - g_mime_object_set_header ((GMimeObject *) message, "X-Mailer", "main.c"); - g_mime_message_set_mime_part (message, GMIME_OBJECT (mpe)); + + mailbox = internet_address_mailbox_new ("Jeffrey Stedfast", "fejj@helixcode.com"); + list = g_mime_message_get_from (message); + internet_address_list_add (list, mailbox); + g_object_unref (mailbox); + + mailbox = internet_address_mailbox_new ("Jeffrey Stedfast", "fejj@helixcode.com"); + list = g_mime_message_get_reply_to (message); + internet_address_list_add (list, mailbox); + g_object_unref (mailbox); + + mailbox = internet_address_mailbox_new ("Federico Mena-Quintero", "federico@helixcode.com"); + list = g_mime_message_get_addresses (message, GMIME_ADDRESS_TYPE_TO); + internet_address_list_add (list, mailbox); + g_object_unref (mailbox); + + g_mime_message_set_subject (message, "This is a test message", NULL); + g_mime_object_set_header ((GMimeObject *) message, "X-Mailer", "main.c", NULL); + g_mime_message_set_mime_part (message, (GMimeObject *) mpe); g_object_unref (mpe); stream = g_mime_stream_mem_new (); - g_mime_object_write_to_stream ((GMimeObject *) message, stream); + g_mime_object_write_to_stream ((GMimeObject *) message, format, stream); g_object_unref (message); *stream_out = stream; @@ -334,6 +344,8 @@ GMimeStream *cleartext, GMimeStream *stream, const char *session_key) { + GMimeFormatOptions *format = g_mime_format_options_get_default (); + GMimeSignatureStatus status; GMimeStream *test_stream; GMimeMultipartEncrypted *mpe; GMimeDecryptResult *result; @@ -349,10 +361,11 @@ g_mime_stream_reset (stream); g_mime_stream_reset (cleartext); + parser = g_mime_parser_new (); g_mime_parser_init_with_stream (parser, stream); - message = g_mime_parser_construct_message (parser); + message = g_mime_parser_construct_message (parser, NULL); g_object_unref (parser); if (!GMIME_IS_MULTIPART_ENCRYPTED (message->mime_part)) { @@ -364,24 +377,29 @@ mpe = (GMimeMultipartEncrypted *) message->mime_part; /* okay, now to test our decrypt function... */ - decrypted = g_mime_multipart_encrypted_decrypt_session (mpe, ctx, session_key, &result, &err); + decrypted = g_mime_multipart_encrypted_decrypt (mpe, GMIME_DECRYPT_EXPORT_SESSION_KEY, session_key, &result, &err); if (!decrypted || err != NULL) { ex = exception_new ("decryption failed: %s", err->message); g_error_free (err); throw (ex); } +#if GPGME_VERSION_NUMBER >= 0x010800 if (!result->session_key) { ex = exception_new ("No session key returned!"); throw (ex); } + ret = g_strdup (result->session_key); +#endif if (result->signatures) v(print_verify_results (result->signatures)); - + if (sign) { - if (!result->signatures || get_sig_status (result->signatures) != GMIME_SIGNATURE_STATUS_GOOD) + status = get_sig_status (result->signatures); + + if ((status & GMIME_SIGNATURE_STATUS_RED) != 0) ex = exception_new ("signature status expected to be GOOD"); } else { if (result->signatures) @@ -392,15 +410,15 @@ if (ex != NULL) { g_free (ret); - ret = 0; + ret = NULL; throw (ex); } test_stream = g_mime_stream_mem_new (); - g_mime_object_write_to_stream (decrypted, test_stream); + g_mime_object_write_to_stream (decrypted, format, test_stream); - buf[0] = GMIME_STREAM_MEM (cleartext)->buffer; - buf[1] = GMIME_STREAM_MEM (test_stream)->buffer; + buf[0] = g_mime_stream_mem_get_byte_array ((GMimeStreamMem *) cleartext); + buf[1] = g_mime_stream_mem_get_byte_array ((GMimeStreamMem *) test_stream); if (buf[0]->len != buf[1]->len || memcmp (buf[0]->data, buf[1]->data, buf[0]->len) != 0) ex = exception_new ("decrypted data does not match original cleartext"); @@ -409,9 +427,10 @@ if (ex != NULL) { g_free (ret); - ret = 0; + ret = NULL; throw (ex); } + return ret; } @@ -437,22 +456,178 @@ } } +static GMimePart * +create_mime_part (void) +{ + GMimeTextPart *part; + + part = g_mime_text_part_new_with_subtype ("plain"); + g_mime_text_part_set_text (part, "This is the body of the message...\n\n" + "Does inline-PGP support work properly?\n\n" + "Let's find out!\n\n"); + g_mime_part_set_content_encoding ((GMimePart *) part, GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE); + g_mime_text_part_set_charset (part, "UTF-8"); + + return (GMimePart *) part; +} + +static void +test_openpgp_sign (void) +{ + GMimeSignatureList *signatures; + GMimeStream *original; + GMimePart *mime_part; + Exception *ex = NULL; + GError *err = NULL; + GByteArray *buf[2]; + + mime_part = create_mime_part (); + original = mime_part->content->stream; + g_object_ref (original); + + if (!g_mime_part_openpgp_sign (mime_part, "no.user@no.domain", &err)) { + ex = exception_new ("signing failed: %s", err->message); + g_object_unref (mime_part); + g_object_unref (original); + g_error_free (err); + throw (ex); + } + + if (g_mime_part_get_openpgp_data (mime_part) != GMIME_OPENPGP_DATA_SIGNED) { + g_object_unref (mime_part); + g_object_unref (original); + + throw (exception_new ("OpenPGP data property not updated after signing")); + } + + if (!(signatures = g_mime_part_openpgp_verify (mime_part, 0, &err))) { + ex = exception_new ("verifying failed: %s", err->message); + g_object_unref (mime_part); + g_object_unref (original); + g_error_free (err); + throw (ex); + } + + if (g_mime_part_get_openpgp_data (mime_part) != GMIME_OPENPGP_DATA_NONE) { + g_object_unref (signatures); + g_object_unref (mime_part); + g_object_unref (original); + + throw (exception_new ("OpenPGP data property not updated after verifying")); + } + + buf[0] = g_mime_stream_mem_get_byte_array (GMIME_STREAM_MEM (original)); + buf[1] = g_mime_stream_mem_get_byte_array (GMIME_STREAM_MEM (mime_part->content->stream)); + + if (buf[0]->len != buf[1]->len || memcmp (buf[0]->data, buf[1]->data, buf[0]->len) != 0) + ex = exception_new ("extracted data does not match original cleartext"); + + g_object_unref (signatures); + g_object_unref (mime_part); + g_object_unref (original); + + if (ex != NULL) + throw (ex); +} + +static void +test_openpgp_encrypt (gboolean sign) +{ + GMimeDecryptResult *result; + GMimeStream *original; + GMimePart *mime_part; + Exception *ex = NULL; + GError *err = NULL; + GByteArray *buf[2]; + GPtrArray *rcpts; + + rcpts = g_ptr_array_new (); + g_ptr_array_add (rcpts, "no.user@no.domain"); + + mime_part = create_mime_part (); + original = mime_part->content->stream; + g_object_ref (original); + + if (!g_mime_part_openpgp_encrypt (mime_part, sign, "no.user@no.domain", GMIME_ENCRYPT_ALWAYS_TRUST, rcpts, &err)) { + ex = exception_new ("encrypting failed: %s", err->message); + g_ptr_array_free (rcpts, TRUE); + g_object_unref (mime_part); + g_object_unref (original); + g_error_free (err); + throw (ex); + } + + g_ptr_array_free (rcpts, TRUE); + + if (g_mime_part_get_openpgp_data (mime_part) != GMIME_OPENPGP_DATA_ENCRYPTED) { + g_object_unref (mime_part); + g_object_unref (original); + + throw (exception_new ("OpenPGP data property not updated after encrypting")); + } + + if (!(result = g_mime_part_openpgp_decrypt (mime_part, 0, NULL, &err))) { + ex = exception_new ("decrypting failed: %s", err->message); + g_object_unref (mime_part); + g_object_unref (original); + g_error_free (err); + throw (ex); + } + + if (g_mime_part_get_openpgp_data (mime_part) != GMIME_OPENPGP_DATA_NONE) { + g_object_unref (mime_part); + g_object_unref (original); + g_object_unref (result); + + throw (exception_new ("OpenPGP data property not updated after decrypting")); + } + + buf[0] = g_mime_stream_mem_get_byte_array (GMIME_STREAM_MEM (original)); + buf[1] = g_mime_stream_mem_get_byte_array (GMIME_STREAM_MEM (mime_part->content->stream)); + + if (buf[0]->len != buf[1]->len || memcmp (buf[0]->data, buf[1]->data, buf[0]->len) != 0) + ex = exception_new ("decrypted data does not match original cleartext"); + + g_object_unref (mime_part); + g_object_unref (original); + g_object_unref (result); + + if (ex != NULL) + throw (ex); +} + +static GMimeCryptoContext * +create_gpg_context (void) +{ + GMimeCryptoContext *ctx; + + ctx = g_mime_gpg_context_new (); + g_mime_crypto_context_set_request_password (ctx, request_passwd); + + return ctx; +} + int main (int argc, char *argv[]) { +#ifdef ENABLE_CRYPTO + GMimeStream *stream = NULL, *cleartext = NULL; const char *datadir = "data/pgpmime"; + char *session_key = NULL; GMimeCryptoContext *ctx; + GError *err = NULL; + char *gpg, *key; struct stat st; - char *key; int i; - GMimeStream *stream = NULL, *cleartext = NULL; - char *session_key = NULL; - GError *err = NULL; - g_mime_init (0); + g_mime_init (); testsuite_init (argc, argv); - if (testsuite_setup_gpghome (GPG_PATH) != 0) + if (!(gpg = g_find_program_in_path ("gpg2"))) + if (!(gpg = g_find_program_in_path ("gpg"))) + return EXIT_FAILURE; + + if (testsuite_setup_gpghome (gpg) != 0) return EXIT_FAILURE; for (i = 1; i < argc; i++) { @@ -467,19 +642,10 @@ testsuite_start ("PGP/MIME implementation"); - ctx = g_mime_gpg_context_new (request_passwd, GPG_PATH); - g_mime_gpg_context_set_always_trust ((GMimeGpgContext *) ctx, TRUE); - if (g_mime_crypto_context_set_retrieve_session_key (ctx, TRUE, &err) != 0) { - fprintf (stderr, "Failed to set retrieve_session_key on GMimeGpgContext: %s\n", - err ? err->message : "no error info returned" ); - if (err) - g_error_free (err); - return EXIT_FAILURE; - } - if (!g_mime_crypto_context_get_retrieve_session_key (ctx)) { - fprintf (stderr, "We set retrieve_session_key on GMimeGpgContext, but it did not stay set.\n"); - return EXIT_FAILURE; - } + g_mime_crypto_context_register ("application/pgp-encrypted", create_gpg_context); + g_mime_crypto_context_register ("application/pgp-signature", create_gpg_context); + g_mime_crypto_context_register ("application/pgp-keys", create_gpg_context); + ctx = create_gpg_context (); testsuite_check ("GMimeGpgContext::import"); try { @@ -509,45 +675,78 @@ try { create_encrypted_message (ctx, FALSE, &cleartext, &stream); session_key = test_multipart_encrypted (ctx, FALSE, cleartext, stream, NULL); - if (testsuite_can_safely_override_session_key (GPG_PATH)) +#if GPGME_VERSION_NUMBER >= 0x010800 + if (testsuite_can_safely_override_session_key (gpg)) g_free (test_multipart_encrypted (ctx, FALSE, cleartext, stream, session_key)); +#endif testsuite_check_passed (); } catch (ex) { testsuite_check_failed ("multipart/encrypted failed: %s", ex->message); } finally; - if (cleartext) + + if (cleartext) { g_object_unref (cleartext); - if (stream) + cleartext = NULL; + } + + if (stream) { g_object_unref (stream); - cleartext = stream = NULL; - if (session_key) { - memset (session_key, 0, strlen (session_key)); - g_free (session_key); - session_key = NULL; + stream = NULL; } + g_free (session_key); + testsuite_check ("multipart/encrypted+sign"); try { create_encrypted_message (ctx, TRUE, &cleartext, &stream); session_key = test_multipart_encrypted (ctx, TRUE, cleartext, stream, NULL); - if (testsuite_can_safely_override_session_key (GPG_PATH)) +#if GPGME_VERSION_NUMBER >= 0x010800 + if (testsuite_can_safely_override_session_key (gpg)) g_free (test_multipart_encrypted (ctx, TRUE, cleartext, stream, session_key)); +#endif testsuite_check_passed (); } catch (ex) { testsuite_check_failed ("multipart/encrypted+sign failed: %s", ex->message); } finally; - if (cleartext) + + if (cleartext) { g_object_unref (cleartext); - if (stream) + cleartext = NULL; + } + + if (stream) { g_object_unref (stream); - cleartext = stream = NULL; - if (session_key) { - memset (session_key, 0, strlen (session_key)); - g_free (session_key); - session_key = NULL; + stream = NULL; } + g_free (session_key); + + testsuite_check ("rfc2440 sign"); + try { + test_openpgp_sign (); + testsuite_check_passed (); + } catch (ex) { + testsuite_check_failed ("rfc2440 sign failed: %s", ex->message); + } finally; + + testsuite_check ("rfc2440 encrypt"); + try { + test_openpgp_encrypt (FALSE); + testsuite_check_passed (); + } catch (ex) { + testsuite_check_failed ("rfc2440 encrypt failed: %s", ex->message); + } finally; + + testsuite_check ("rfc2440 sign+encrypt"); + try { + test_openpgp_encrypt (TRUE); + testsuite_check_passed (); + } catch (ex) { + testsuite_check_failed ("rfc2440 sign+encrypt failed: %s", ex->message); + } finally; + g_object_unref (ctx); + g_free (gpg); testsuite_end (); @@ -557,4 +756,8 @@ return EXIT_FAILURE; return testsuite_exit (); +#else + fprintf (stderr, "PGP support not enabled in this build.\n"); + return EXIT_SUCCESS; +#endif } diff -Nru gmime-2.6.22+dfsg2/tests/test-pkcs7.c gmime-3.0.1/tests/test-pkcs7.c --- gmime-2.6.22+dfsg2/tests/test-pkcs7.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/tests/test-pkcs7.c 2017-03-16 01:55:56.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,6 +17,7 @@ * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + #ifdef HAVE_CONFIG_H #include #endif @@ -41,92 +42,132 @@ #define v(x) if (verbose > 3) x +#if 0 static gboolean -request_passwd (GMimeCryptoContext *ctx, const char *user_id, const char *prompt_ctx, gboolean reprompt, GMimeStream *response, GError **err) +request_passwd (GMimeCryptoContext *ctx, const char *user_id, const char *prompt, gboolean reprompt, GMimeStream *response, GError **err) { g_mime_stream_write_string (response, "no.secret\n"); return TRUE; } +#endif static GMimeSignatureStatus get_sig_status (GMimeSignatureList *signatures) { - GMimeSignatureStatus status = GMIME_SIGNATURE_STATUS_GOOD; + GMimeSignatureStatus status = 0; GMimeSignature *sig; int i; if (!signatures || signatures->array->len == 0) - return GMIME_SIGNATURE_STATUS_ERROR; + return GMIME_SIGNATURE_STATUS_RED; for (i = 0; i < g_mime_signature_list_length (signatures); i++) { sig = g_mime_signature_list_get_signature (signatures, i); - status = MAX (status, sig->status); + status |= g_mime_signature_get_status (sig); } return status; } static void -test_sign (GMimeCryptoContext *ctx, GMimeStream *cleartext, GMimeStream *ciphertext) +test_sign (GMimeCryptoContext *ctx, gboolean detached, GMimeStream *cleartext, GMimeStream *ciphertext) { GError *err = NULL; Exception *ex; int rv; - rv = g_mime_crypto_context_sign (ctx, "alice@example.net", - GMIME_DIGEST_ALGO_SHA256, - cleartext, ciphertext, &err); + rv = g_mime_crypto_context_sign (ctx, detached, "mimekit@example.com", cleartext, ciphertext, &err); if (rv == -1 || err != NULL) { ex = exception_new ("%s", err->message); g_error_free (err); throw (ex); } +} + +static void +test_verify_detached (GMimeCryptoContext *ctx, GMimeStream *cleartext, GMimeStream *ciphertext) +{ + GMimeSignatureList *signatures; + GMimeSignatureStatus status; + GError *err = NULL; + Exception *ex; + + signatures = g_mime_crypto_context_verify (ctx, 0, cleartext, ciphertext, NULL, &err); + + if (signatures == NULL) { + ex = exception_new ("%s", err->message); + g_error_free (err); + throw (ex); + } + + status = get_sig_status (signatures); + + if ((status & GMIME_SIGNATURE_STATUS_RED) != 0) { + g_object_unref (signatures); + throw (exception_new ("signature BAD")); + } - v(fprintf (stderr, "signature (%s):\n%.*s\n", - g_mime_crypto_context_digest_name (ctx, rv), - GMIME_STREAM_MEM (ciphertext)->buffer->len, - GMIME_STREAM_MEM (ciphertext)->buffer->data)); + g_object_unref (signatures); } static void test_verify (GMimeCryptoContext *ctx, GMimeStream *cleartext, GMimeStream *ciphertext) { GMimeSignatureList *signatures; + GMimeSignatureStatus status; + Exception *ex = NULL; + GMimeStream *stream; GError *err = NULL; - Exception *ex; + GByteArray *buf[2]; + + stream = g_mime_stream_mem_new (); - signatures = g_mime_crypto_context_verify (ctx, GMIME_DIGEST_ALGO_DEFAULT, - cleartext, ciphertext, &err); + signatures = g_mime_crypto_context_verify (ctx, 0, ciphertext, NULL, stream, &err); if (signatures == NULL) { ex = exception_new ("%s", err->message); + g_object_unref (stream); g_error_free (err); throw (ex); } - if (get_sig_status (signatures) != GMIME_SIGNATURE_STATUS_GOOD) { + status = get_sig_status (signatures); + + if ((status & GMIME_SIGNATURE_STATUS_RED) != 0) { g_object_unref (signatures); + g_object_unref (stream); + throw (exception_new ("signature BAD")); } g_object_unref (signatures); + + buf[0] = GMIME_STREAM_MEM (cleartext)->buffer; + buf[1] = GMIME_STREAM_MEM (stream)->buffer; + + if (buf[0]->len != buf[1]->len || memcmp (buf[0]->data, buf[1]->data, buf[0]->len) != 0) + ex = exception_new ("extracted data does not match original cleartext"); + + g_object_unref (stream); + + if (ex != NULL) + throw (ex); } static void -test_encrypt (GMimeCryptoContext *ctx, gboolean sign, GMimeStream *cleartext, GMimeStream *ciphertext) +test_encrypt (GMimeCryptoContext *ctx, GMimeStream *cleartext, GMimeStream *ciphertext) { GPtrArray *recipients; GError *err = NULL; Exception *ex; recipients = g_ptr_array_new (); - g_ptr_array_add (recipients, "alice@example.net"); + g_ptr_array_add (recipients, "mimekit@example.com"); - g_mime_crypto_context_encrypt (ctx, sign, "alice@example.net", - GMIME_DIGEST_ALGO_SHA256, recipients, - cleartext, ciphertext, &err); + g_mime_crypto_context_encrypt (ctx, FALSE, NULL, GMIME_ENCRYPT_NONE, + recipients, cleartext, ciphertext, &err); g_ptr_array_free (recipients, TRUE); @@ -135,15 +176,12 @@ g_error_free (err); throw (ex); } - - v(fprintf (stderr, "ciphertext:\n%.*s\n", - GMIME_STREAM_MEM (ciphertext)->buffer->len, - GMIME_STREAM_MEM (ciphertext)->buffer->data)); } static void -test_decrypt (GMimeCryptoContext *ctx, gboolean sign, GMimeStream *cleartext, GMimeStream *ciphertext) +test_decrypt (GMimeCryptoContext *ctx, GMimeStream *cleartext, GMimeStream *ciphertext) { + GMimeCertificateList *recipients; GMimeDecryptResult *result; Exception *ex = NULL; GMimeStream *stream; @@ -152,19 +190,18 @@ stream = g_mime_stream_mem_new (); - if (!(result = g_mime_crypto_context_decrypt (ctx, ciphertext, stream, &err))) { + if (!(result = g_mime_crypto_context_decrypt (ctx, 0, NULL, ciphertext, stream, &err))) { g_object_unref (stream); ex = exception_new ("%s", err->message); g_error_free (err); throw (ex); } - if (sign) { - if (!result->signatures || get_sig_status (result->signatures) != GMIME_SIGNATURE_STATUS_GOOD) - ex = exception_new ("expected GOOD signature"); - } else { - if (result->signatures) - ex = exception_new ("unexpected signature"); + if (!(recipients = g_mime_decrypt_result_get_recipients (result))) { + g_object_unref (result); + g_object_unref (stream); + + throw (exception_new ("Failed to get recipients")); } g_object_unref (result); @@ -194,8 +231,8 @@ const char *inbuf, *outbuf; size_t inlen, outlen; Exception *ex = NULL; + const char *keys[2]; GError *err = NULL; - GPtrArray *keys; int fd; if ((fd = open (path, O_RDONLY, 0)) == -1) @@ -207,13 +244,13 @@ g_mime_stream_reset (istream); g_object_unref (ostream); - keys = g_ptr_array_new (); - g_ptr_array_add (keys, "alice@example.net"); + keys[0] = "mimekit@example.com"; + keys[1] = NULL; ostream = g_mime_stream_mem_new (); g_mime_crypto_context_export_keys (ctx, keys, ostream, &err); - g_ptr_array_free (keys, TRUE); + if (err != NULL) { ex = exception_new ("%s", err->message); g_object_unref (istream); @@ -224,24 +261,18 @@ inbuf = (const char *) GMIME_STREAM_MEM (istream)->buffer->data; inlen = GMIME_STREAM_MEM (istream)->buffer->len; - if ((inptr = strstr (inbuf, "\n\n"))) { - /* skip past the headers which may have different version numbers */ - inptr += 2; - inlen -= (inptr - inbuf); - inbuf = inptr; - } outbuf = (const char *) GMIME_STREAM_MEM (ostream)->buffer->data; outlen = GMIME_STREAM_MEM (ostream)->buffer->len; - if (outbuf && (inptr = strstr (outbuf, "\n\n"))) { - /* skip past the headers which may have different version numbers */ - inptr += 2; - outlen -= (inptr - outbuf); - outbuf = inptr; - } - if (outlen != inlen || memcmp (outbuf, inbuf, inlen) != 0) + if (outlen != inlen || memcmp (outbuf, inbuf, inlen) != 0) { + FILE *fp = fopen ("exported.crt", "w"); + fwrite (outbuf, 1, outlen, fp); + fflush (fp); + fclose (fp); + ex = exception_new ("exported key does not match original key"); + } g_object_unref (istream); g_object_unref (ostream); @@ -275,7 +306,7 @@ int main (int argc, char **argv) { - const char *datadir = "data/pkcs7"; + const char *datadir = "data/smime"; GMimeStream *istream, *ostream; GMimeCryptoContext *ctx; const char *what; @@ -283,16 +314,12 @@ char *key; int i; - g_mime_init (0); + g_mime_init (); testsuite_init (argc, argv); - /* reset .gnupg config directory */ - if (system ("/bin/rm -rf ./tmp") != 0) - return EXIT_FAILURE; - if (system ("/bin/mkdir ./tmp") != 0) + if (testsuite_setup_gpghome ("gpgsm") != 0) return EXIT_FAILURE; - g_setenv ("GNUPGHOME", "./tmp/.gnupg", 1); for (i = 1; i < argc; i++) { if (argv[i][0] != '-') { @@ -306,17 +333,17 @@ testsuite_start ("Pkcs7 crypto context"); - ctx = g_mime_pkcs7_context_new (request_passwd); - g_mime_pkcs7_context_set_always_trust ((GMimePkcs7Context *) ctx, TRUE); + ctx = g_mime_pkcs7_context_new (); + //g_mime_crypto_context_set_request_password (ctx, request_passwd); testsuite_check ("GMimePkcs7Context::import"); try { - key = g_build_filename (datadir, "alice.pem", NULL); + key = g_build_filename (datadir, "certificate-authority.crt", NULL); //printf ("importing key: %s\n", key); import_key (ctx, key); g_free (key); - key = g_build_filename (datadir, "alice.p12", NULL); + key = g_build_filename (datadir, "smime.p12", NULL); //printf ("importing key: %s\n", key); import_key (ctx, key); g_free (key); @@ -327,7 +354,7 @@ return EXIT_FAILURE; } finally; - key = g_build_filename (datadir, "alice.pem", NULL); + key = g_build_filename (datadir, "smime.crt", NULL); testsuite_check ("GMimePkcs7Context::export"); try { test_export (ctx, key); @@ -347,7 +374,7 @@ what = "GMimePkcs7Context::sign"; testsuite_check (what); try { - test_sign (ctx, istream, ostream); + test_sign (ctx, FALSE, istream, ostream); testsuite_check_passed (); what = "GMimePkcs7Context::verify"; @@ -364,17 +391,17 @@ g_mime_stream_reset (istream); ostream = g_mime_stream_mem_new (); - what = "GMimePkcs7Context::encrypt"; + what = "GMimePkcs7Context::sign (detached)"; testsuite_check (what); try { - test_encrypt (ctx, FALSE, istream, ostream); + test_sign (ctx, TRUE, istream, ostream); testsuite_check_passed (); - what = "GMimePkcs7Context::decrypt"; + what = "GMimePkcs7Context::verify (detached)"; testsuite_check (what); g_mime_stream_reset (istream); g_mime_stream_reset (ostream); - test_decrypt (ctx, FALSE, istream, ostream); + test_verify_detached (ctx, istream, ostream); testsuite_check_passed (); } catch (ex) { testsuite_check_failed ("%s failed: %s", what, ex->message); @@ -384,17 +411,17 @@ g_mime_stream_reset (istream); ostream = g_mime_stream_mem_new (); - what = "GMimePkcs7Context::encrypt+sign"; + what = "GMimePkcs7Context::encrypt"; testsuite_check (what); try { - test_encrypt (ctx, TRUE, istream, ostream); + test_encrypt (ctx, istream, ostream); testsuite_check_passed (); - what = "GMimePkcs7Context::decrypt+verify"; + what = "GMimePkcs7Context::decrypt"; testsuite_check (what); g_mime_stream_reset (istream); g_mime_stream_reset (ostream); - test_decrypt (ctx, TRUE, istream, ostream); + test_decrypt (ctx, istream, ostream); testsuite_check_passed (); } catch (ex) { testsuite_check_failed ("%s failed: %s", what, ex->message); @@ -408,7 +435,7 @@ g_mime_shutdown (); - if (system ("/bin/rm -rf ./tmp") != 0) + if (testsuite_destroy_gpghome () != 0) return EXIT_FAILURE; return testsuite_exit (); diff -Nru gmime-2.6.22+dfsg2/tests/test-smime.c gmime-3.0.1/tests/test-smime.c --- gmime-2.6.22+dfsg2/tests/test-smime.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/tests/test-smime.c 2017-04-08 17:01:10.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -36,33 +36,33 @@ #include "testsuite.h" -#define GPG_PATH "/usr/bin/gpg" - extern int verbose; #define v(x) if (verbose > 3) x +#if 0 static gboolean -request_passwd (GMimeCryptoContext *ctx, const char *user_id, const char *prompt_ctx, gboolean reprompt, GMimeStream *response, GError **err) +request_passwd (GMimeCryptoContext *ctx, const char *user_id, const char *prompt, gboolean reprompt, GMimeStream *response, GError **err) { g_mime_stream_write_string (response, "no.secret\n"); return TRUE; } +#endif static GMimeSignatureStatus get_sig_status (GMimeSignatureList *signatures) { - GMimeSignatureStatus status = GMIME_SIGNATURE_STATUS_GOOD; + GMimeSignatureStatus status = 0; GMimeSignature *sig; int i; if (!signatures || signatures->array->len == 0) - return GMIME_SIGNATURE_STATUS_ERROR; + return GMIME_SIGNATURE_STATUS_RED; for (i = 0; i < g_mime_signature_list_length (signatures); i++) { sig = g_mime_signature_list_get_signature (signatures, i); - status = MAX (status, sig->status); + status |= g_mime_signature_get_status (sig); } return status; @@ -71,23 +71,21 @@ static void print_verify_results (GMimeSignatureList *signatures) { + GMimeSignatureStatus status; GMimeSignature *sig; int count, i; - switch (get_sig_status (signatures)) { - case GMIME_SIGNATURE_STATUS_GOOD: - fputs ("GOOD\n", stdout); - break; - case GMIME_SIGNATURE_STATUS_BAD: + status = get_sig_status (signatures); + + fputs ("Overall status: ", stdout); + if ((status & GMIME_SIGNATURE_STATUS_RED) != 0) fputs ("BAD\n", stdout); - break; - case GMIME_SIGNATURE_STATUS_ERROR: - fputs ("ERROR status\n", stdout); - break; - default: - fputs ("Unknown enum value\n", stdout); - break; - } + else if ((status & GMIME_SIGNATURE_STATUS_GREEN) != 0) + fputs ("GOOD\n", stdout); + else if ((status & GMIME_SIGNATURE_STATUS_VALID) != 0) + fputs ("VALID\n", stdout); + else + fputs ("UNKNOWN\n", stdout); fputs ("\nSignatures:\n", stdout); count = g_mime_signature_list_length (signatures); @@ -100,38 +98,35 @@ fprintf (stdout, "\tTrust: "); switch (sig->cert->trust) { - case GMIME_CERTIFICATE_TRUST_NONE: - fputs ("None\n", stdout); + case GMIME_TRUST_UNKNOWN: + fputs ("Unknown\n", stdout); break; - case GMIME_CERTIFICATE_TRUST_NEVER: + case GMIME_TRUST_NEVER: fputs ("Never\n", stdout); break; - case GMIME_CERTIFICATE_TRUST_UNDEFINED: + case GMIME_TRUST_UNDEFINED: fputs ("Undefined\n", stdout); break; - case GMIME_CERTIFICATE_TRUST_MARGINAL: + case GMIME_TRUST_MARGINAL: fputs ("Marginal\n", stdout); break; - case GMIME_CERTIFICATE_TRUST_FULLY: - fputs ("Fully\n", stdout); + case GMIME_TRUST_FULL: + fputs ("Full\n", stdout); break; - case GMIME_CERTIFICATE_TRUST_ULTIMATE: + case GMIME_TRUST_ULTIMATE: fputs ("Ultimate\n", stdout); break; } fprintf (stdout, "\tStatus: "); - switch (sig->status) { - case GMIME_SIGNATURE_STATUS_GOOD: - fputs ("GOOD\n", stdout); - break; - case GMIME_SIGNATURE_STATUS_BAD: + if ((sig->status & GMIME_SIGNATURE_STATUS_RED) != 0) fputs ("BAD\n", stdout); - break; - case GMIME_SIGNATURE_STATUS_ERROR: - fputs ("ERROR\n", stdout); - break; - } + else if ((sig->status & GMIME_SIGNATURE_STATUS_GREEN) != 0) + fputs ("GOOD\n", stdout); + else if ((sig->status & GMIME_SIGNATURE_STATUS_VALID) != 0) + fputs ("VALID\n", stdout); + else + fputs ("UNKNOWN\n", stdout); fprintf (stdout, "\tSignature made on %s", ctime (&sig->created)); if (sig->expires != (time_t) 0) @@ -139,26 +134,84 @@ else fprintf (stdout, "\tSignature never expires\n"); - if (sig->errors) { - fprintf (stdout, "\tErrors: "); - if (sig->errors & GMIME_SIGNATURE_ERROR_EXPSIG) - fputs ("Expired, ", stdout); - if (sig->errors & GMIME_SIGNATURE_ERROR_NO_PUBKEY) - fputs ("No Pub Key, ", stdout); - if (sig->errors & GMIME_SIGNATURE_ERROR_EXPKEYSIG) - fputs ("Key Expired, ", stdout); - if (sig->errors & GMIME_SIGNATURE_ERROR_REVKEYSIG) - fputs ("Key Revoked", stdout); - fputc ('\n', stdout); - } else { - fprintf (stdout, "\tNo errors for this signer\n"); - } + fprintf (stdout, "\tErrors: "); + if (sig->status & GMIME_SIGNATURE_STATUS_KEY_REVOKED) + fputs ("Key Revoked, ", stdout); + if (sig->status & GMIME_SIGNATURE_STATUS_KEY_EXPIRED) + fputs ("Key Expired, ", stdout); + if (sig->status & GMIME_SIGNATURE_STATUS_SIG_EXPIRED) + fputs ("Sig Expired, ", stdout); + if (sig->status & GMIME_SIGNATURE_STATUS_KEY_MISSING) + fputs ("Key Missing, ", stdout); + if (sig->status & GMIME_SIGNATURE_STATUS_CRL_MISSING) + fputs ("CRL Missing, ", stdout); + if (sig->status & GMIME_SIGNATURE_STATUS_CRL_TOO_OLD) + fputs ("CRL Too Old, ", stdout); + if (sig->status & GMIME_SIGNATURE_STATUS_BAD_POLICY) + fputs ("Bad Policy, ", stdout); + if (sig->status & GMIME_SIGNATURE_STATUS_SYS_ERROR) + fputs ("System Error, ", stdout); + if (sig->status & GMIME_SIGNATURE_STATUS_TOFU_CONFLICT) + fputs ("Tofu Conflict", stdout); + if ((sig->status & GMIME_SIGNATURE_STATUS_ERROR_MASK) == 0) + fputs ("None", stdout); + fputc ('\n', stdout); if (i + 1 < count) fputc ('\n', stdout); } } +static GMimeMessage * +create_message (GMimeObject *body) +{ + GMimeFormatOptions *format = g_mime_format_options_get_default (); + InternetAddressList *list; + InternetAddress *mailbox; + GMimeMessage *message; + GMimeParser *parser; + GMimeStream *stream; + + message = g_mime_message_new (TRUE); + + mailbox = internet_address_mailbox_new ("Jeffrey Stedfast", "fejj@helixcode.com"); + list = g_mime_message_get_from (message); + internet_address_list_add (list, mailbox); + g_object_unref (mailbox); + + mailbox = internet_address_mailbox_new ("Jeffrey Stedfast", "fejj@helixcode.com"); + list = g_mime_message_get_reply_to (message); + internet_address_list_add (list, mailbox); + g_object_unref (mailbox); + + mailbox = internet_address_mailbox_new ("Federico Mena-Quintero", "federico@helixcode.com"); + list = g_mime_message_get_addresses (message, GMIME_ADDRESS_TYPE_TO); + internet_address_list_add (list, mailbox); + g_object_unref (mailbox); + + g_mime_message_set_subject (message, "This is a test message", NULL); + g_mime_object_set_header ((GMimeObject *) message, "X-Mailer", "main.c", NULL); + g_mime_message_set_mime_part (message, body); + + stream = g_mime_stream_mem_new (); + g_mime_object_write_to_stream ((GMimeObject *) message, format, stream); + g_mime_stream_reset (stream); + g_object_unref (message); + + /*fprintf (stderr, "-----BEGIN RAW MESSAGE-----\n%.*s-----END RAW MESSAGE-----\n", + GMIME_STREAM_MEM (stream)->buffer->len, + GMIME_STREAM_MEM (stream)->buffer->data);*/ + + parser = g_mime_parser_new (); + g_mime_parser_init_with_stream (parser, stream); + g_object_unref (stream); + + message = g_mime_parser_construct_message (parser, NULL); + g_object_unref (parser); + + return message; +} + #define MULTIPART_SIGNED_CONTENT "This is a test of the emergency broadcast system \ with an sha1 detach-sign.\n\nFrom now on, there will be text to try and break \t\ \nvarious things. For example, the F in \"From\" in the previous line...\n...and \ @@ -171,72 +224,27 @@ { GMimeSignatureList *signatures; GMimeMultipartSigned *mps; - GMimeDataWrapper *content; GMimeMessage *message; - GMimeStream *stream; - GMimeParser *parser; + GMimeTextPart *part; GError *err = NULL; - GMimePart *part; Exception *ex; - part = g_mime_part_new_with_type ("text", "plain"); - - stream = g_mime_stream_mem_new (); - g_mime_stream_write_string (stream, MULTIPART_SIGNED_CONTENT); -#if 0 - "This is a test of the emergency broadcast system with an sha1 detach-sign.\n\n" - "From now on, there will be text to try and break \t \n" - "various things. For example, the F in \"From\" in the previous line...\n" - "...and the first dot of this line have been pre-encoded in the QP encoding " - "in order to test that GMime properly treats MIME part content as opaque.\n" - "If this still verifies okay, then we have ourselves a winner I guess...\n"; -#endif - - g_mime_stream_reset (stream); - content = g_mime_data_wrapper_new_with_stream (stream, GMIME_CONTENT_ENCODING_DEFAULT); - g_object_unref (stream); - - g_mime_part_set_content_object (part, content); - g_object_unref (content); - - /* create the multipart/signed container part */ - mps = g_mime_multipart_signed_new (); + part = g_mime_text_part_new_with_subtype ("plain"); + g_mime_text_part_set_text (part, MULTIPART_SIGNED_CONTENT); /* sign the part */ - g_mime_multipart_signed_sign (mps, GMIME_OBJECT (part), ctx, "alice@example.net", - GMIME_DIGEST_ALGO_SHA1, &err); + mps = g_mime_multipart_signed_sign (ctx, (GMimeObject *) part, "mimekit@example.com", &err); g_object_unref (part); if (err != NULL) { ex = exception_new ("signing failed: %s", err->message); - g_object_unref (mps); g_error_free (err); throw (ex); } - message = g_mime_message_new (TRUE); - g_mime_message_set_sender (message, "\"Jeffrey Stedfast\" "); - g_mime_message_set_reply_to (message, "fejj@helixcode.com"); - g_mime_message_add_recipient (message, GMIME_RECIPIENT_TYPE_TO, - "Federico Mena-Quintero", - "federico@helixcode.com"); - g_mime_message_set_subject (message, "This is a test message"); - g_mime_object_set_header ((GMimeObject *) message, "X-Mailer", "main.c"); - g_mime_message_set_mime_part (message, GMIME_OBJECT (mps)); + message = create_message ((GMimeObject *) mps); g_object_unref (mps); - stream = g_mime_stream_mem_new (); - g_mime_object_write_to_stream ((GMimeObject *) message, stream); - g_mime_stream_reset (stream); - g_object_unref (message); - - parser = g_mime_parser_new (); - g_mime_parser_init_with_stream (parser, stream); - g_object_unref (stream); - - message = g_mime_parser_construct_message (parser); - g_object_unref (parser); - if (!GMIME_IS_MULTIPART_SIGNED (message->mime_part)) { ex = exception_new ("resultant top-level mime part not a multipart/signed?"); g_object_unref (message); @@ -245,10 +253,8 @@ mps = (GMimeMultipartSigned *) message->mime_part; - v(fputs ("Trying to verify signature... ", stdout)); - if (!(signatures = g_mime_multipart_signed_verify (mps, ctx, &err))) { + if (!(signatures = g_mime_multipart_signed_verify (mps, 0, &err))) { ex = exception_new ("%s", err->message); - v(fputs ("failed.\n", stdout)); g_error_free (err); throw (ex); } @@ -259,133 +265,147 @@ g_object_unref (message); } -#define MULTIPART_ENCRYPTED_CONTENT "This is a test of multipart/encrypted.\n" +#define SIGNED_CONTENT "This is a test of application/pkcs7-mime; smime-type=signed-data.\n" static void -test_multipart_encrypted (GMimeCryptoContext *ctx, gboolean sign) +test_pkcs7_mime_sign (void) { - GMimeStream *cleartext, *stream; - GMimeMultipartEncrypted *mpe; - GMimeDecryptResult *result; - GMimeDataWrapper *content; - GMimeObject *decrypted; - GPtrArray *recipients; + GMimeApplicationPkcs7Mime *pkcs7_mime; + GMimeSignatureList *signatures; GMimeMessage *message; - Exception *ex = NULL; - GMimeParser *parser; - GByteArray *buf[2]; + GMimeObject *entity; + GMimeTextPart *part; GError *err = NULL; - GMimePart *part; + Exception *ex; + char *text; - cleartext = g_mime_stream_mem_new (); - g_mime_stream_write_string (cleartext, MULTIPART_ENCRYPTED_CONTENT); - g_mime_stream_reset (cleartext); + part = g_mime_text_part_new (); + g_mime_text_part_set_text (part, SIGNED_CONTENT); - content = g_mime_data_wrapper_new (); - g_mime_data_wrapper_set_stream (content, cleartext); - g_object_unref (cleartext); + pkcs7_mime = g_mime_application_pkcs7_mime_sign ((GMimeObject *) part, "mimekit@example.com", &err); + g_object_unref (part); - part = g_mime_part_new_with_type ("text", "plain"); - g_mime_part_set_content_object (part, content); - g_object_unref (content); + if (err != NULL) { + ex = exception_new ("sign failed: %s", err->message); + g_error_free (err); + throw (ex); + } - /* hold onto this for comparison later */ - cleartext = g_mime_stream_mem_new (); - g_mime_object_write_to_stream ((GMimeObject *) part, cleartext); - g_mime_stream_reset (cleartext); + message = create_message ((GMimeObject *) pkcs7_mime); + g_object_unref (pkcs7_mime); - /* create the multipart/encrypted container part */ - mpe = g_mime_multipart_encrypted_new (); + if (!GMIME_IS_APPLICATION_PKCS7_MIME (message->mime_part)) { + ex = exception_new ("resultant top-level mime part not an application/pkcs7-mime?"); + g_object_unref (message); + throw (ex); + } - /* encrypt the part */ - recipients = g_ptr_array_new (); - g_ptr_array_add (recipients, "alice@example.net"); - g_mime_multipart_encrypted_encrypt (mpe, GMIME_OBJECT (part), ctx, sign, - "alice@example.net", GMIME_DIGEST_ALGO_SHA256, - recipients, &err); - g_ptr_array_free (recipients, TRUE); - g_object_unref (part); + pkcs7_mime = (GMimeApplicationPkcs7Mime *) message->mime_part; - if (err != NULL) { - ex = exception_new ("encryption failed: %s", err->message); - g_object_unref (cleartext); - g_object_unref (mpe); + if (!(signatures = g_mime_application_pkcs7_mime_verify (pkcs7_mime, 0, &entity, &err))) { + ex = exception_new ("verify failed: %s", err->message); + g_object_unref (message); g_error_free (err); throw (ex); } - message = g_mime_message_new (TRUE); - g_mime_message_set_sender (message, "\"Jeffrey Stedfast\" "); - g_mime_message_set_reply_to (message, "fejj@helixcode.com"); - g_mime_message_add_recipient (message, GMIME_RECIPIENT_TYPE_TO, - "Federico Mena-Quintero", - "federico@helixcode.com"); - g_mime_message_set_subject (message, "This is a test message"); - g_mime_object_set_header ((GMimeObject *) message, "X-Mailer", "main.c"); - g_mime_message_set_mime_part (message, GMIME_OBJECT (mpe)); - g_object_unref (mpe); - - stream = g_mime_stream_mem_new (); - g_mime_object_write_to_stream ((GMimeObject *) message, stream); - g_mime_stream_reset (stream); + v(print_verify_results (signatures)); + g_object_unref (signatures); g_object_unref (message); - parser = g_mime_parser_new (); - g_mime_parser_init_with_stream (parser, stream); - g_object_unref (stream); - - message = g_mime_parser_construct_message (parser); - g_object_unref (parser); + /* TODO: verify extracted content... */ + if (!GMIME_IS_TEXT_PART (entity)) { + g_object_unref (entity); + throw (exception_new ("extracted entity was not a text/plain part?")); + } - if (!GMIME_IS_MULTIPART_ENCRYPTED (message->mime_part)) { - ex = exception_new ("resultant top-level mime part not a multipart/encrypted?"); - g_object_unref (message); + text = g_mime_text_part_get_text ((GMimeTextPart *) entity); + if (strcmp (SIGNED_CONTENT, text) != 0) { + ex = exception_new ("text part content does not match"); + g_object_unref (entity); + g_free (text); throw (ex); } - mpe = (GMimeMultipartEncrypted *) message->mime_part; + g_object_unref (entity); + g_free (text); +} + +#define ENCRYPTED_CONTENT "This is a test of application/pkcs7-mime; smime-type=enveloped-data.\n" + +static void +test_pkcs7_mime_encrypt (void) +{ + GMimeApplicationPkcs7Mime *pkcs7_mime; + GMimeDecryptResult *result; + GPtrArray *recipients; + GMimeMessage *message; + GMimeObject *entity; + GMimeTextPart *part; + GError *err = NULL; + Exception *ex; + char *text; + + part = g_mime_text_part_new (); + g_mime_text_part_set_text (part, ENCRYPTED_CONTENT); + + recipients = g_ptr_array_new (); + g_ptr_array_add (recipients, "mimekit@example.com"); + + pkcs7_mime = g_mime_application_pkcs7_mime_encrypt ((GMimeObject *) part, GMIME_ENCRYPT_ALWAYS_TRUST, recipients, &err); + g_ptr_array_free (recipients, TRUE); + g_object_unref (part); - /* okay, now to test our decrypt function... */ - decrypted = g_mime_multipart_encrypted_decrypt (mpe, ctx, &result, &err); - if (!decrypted || err != NULL) { - ex = exception_new ("decryption failed: %s", err->message); - g_object_unref (cleartext); + if (err != NULL) { + ex = exception_new ("encrypt failed: %s", err->message); g_error_free (err); throw (ex); } - if (result->signatures) - v(print_verify_results (result->signatures)); + message = create_message ((GMimeObject *) pkcs7_mime); + g_object_unref (pkcs7_mime); - if (sign) { - if (!result->signatures || get_sig_status (result->signatures) != GMIME_SIGNATURE_STATUS_GOOD) - ex = exception_new ("signature status expected to be GOOD"); - } else { - if (result->signatures) - ex = exception_new ("signature status expected to be NONE"); + if (!GMIME_IS_APPLICATION_PKCS7_MIME (message->mime_part)) { + ex = exception_new ("resultant top-level mime part not an application/pkcs7-mime?"); + g_object_unref (message); + throw (ex); } - g_object_unref (result); + pkcs7_mime = (GMimeApplicationPkcs7Mime *) message->mime_part; - if (ex != NULL) { - g_object_unref (cleartext); + if (!(entity = g_mime_application_pkcs7_mime_decrypt (pkcs7_mime, 0, NULL, &result, &err))) { + ex = exception_new ("decrypt failed: %s", err->message); + g_object_unref (message); + g_error_free (err); throw (ex); } - stream = g_mime_stream_mem_new (); - g_mime_object_write_to_stream (decrypted, stream); + g_object_unref (message); - buf[0] = GMIME_STREAM_MEM (cleartext)->buffer; - buf[1] = GMIME_STREAM_MEM (stream)->buffer; + if (result->signatures) { + g_object_unref (result); + throw (exception_new ("signature status expected to be NONE")); + } - if (buf[0]->len != buf[1]->len || memcmp (buf[0]->data, buf[1]->data, buf[0]->len) != 0) - ex = exception_new ("decrypted data does not match original cleartext"); + g_object_unref (result); - g_object_unref (cleartext); - g_object_unref (stream); + /* TODO: verify decrypted content... */ + if (!GMIME_IS_TEXT_PART (entity)) { + g_object_unref (entity); + throw (exception_new ("decrypted entity was not a text/plain part?")); + } - if (ex != NULL) + text = g_mime_text_part_get_text ((GMimeTextPart *) entity); + + if (strcmp (ENCRYPTED_CONTENT, text) != 0) { + ex = exception_new ("text part content does not match"); + g_object_unref (entity); + g_free (text); throw (ex); + } + + g_object_unref (entity); + g_free (text); } static void @@ -418,11 +438,11 @@ char *key; int i; - g_mime_init (0); + g_mime_init (); testsuite_init (argc, argv); - if (testsuite_setup_gpghome (GPG_PATH) != 0) + if (testsuite_setup_gpghome ("gpgsm") != 0) return EXIT_FAILURE; for (i = 1; i < argc; i++) { @@ -437,25 +457,16 @@ testsuite_start ("S/MIME implementation"); - ctx = g_mime_pkcs7_context_new (request_passwd); - g_mime_pkcs7_context_set_always_trust ((GMimePkcs7Context *) ctx, TRUE); - - if (g_mime_crypto_context_set_retrieve_session_key (ctx, TRUE, NULL) == 0) { - fprintf (stderr, "GMimePkcs7Context should not have allowed us to set retrieve_session_key to TRUE, since it is not implemented.\n"); - return EXIT_FAILURE; - } - if (g_mime_crypto_context_get_retrieve_session_key (ctx)) { - fprintf (stderr, "GMimePkcs7Context should have returned FALSE for get_retrieve_session_key.\n"); - return EXIT_FAILURE; - } + ctx = g_mime_pkcs7_context_new (); + //g_mime_crypto_context_set_request_password (ctx, request_passwd); testsuite_check ("GMimePkcs7Context::import"); try { - key = g_build_filename (datadir, "gmime-cert.p7", NULL); + key = g_build_filename (datadir, "certificate-authority.crt", NULL); import_key (ctx, key); g_free (key); - key = g_build_filename (datadir, "gmime-cert.p12", NULL); + key = g_build_filename (datadir, "smime.p12", NULL); import_key (ctx, key); g_free (key); @@ -473,20 +484,20 @@ testsuite_check_failed ("multipart/signed failed: %s", ex->message); } finally; - testsuite_check ("multipart/encrypted"); + testsuite_check ("application/pkcs7-mime; smime-type=signed-data"); try { - test_multipart_encrypted (ctx, FALSE); + test_pkcs7_mime_sign (); testsuite_check_passed (); } catch (ex) { - testsuite_check_failed ("multipart/encrypted failed: %s", ex->message); + testsuite_check_failed ("multipart/signed failed: %s", ex->message); } finally; - testsuite_check ("multipart/encrypted+sign"); + testsuite_check ("application/pkcs7-mime; smime-type=enveloped-data"); try { - test_multipart_encrypted (ctx, TRUE); + test_pkcs7_mime_encrypt (); testsuite_check_passed (); } catch (ex) { - testsuite_check_failed ("multipart/encrypted+sign failed: %s", ex->message); + testsuite_check_failed ("multipart/encrypted failed: %s", ex->message); } finally; g_object_unref (ctx); diff -Nru gmime-2.6.22+dfsg2/tests/test-streams.c gmime-3.0.1/tests/test-streams.c --- gmime-2.6.22+dfsg2/tests/test-streams.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/tests/test-streams.c 2017-04-23 16:04:05.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -44,6 +44,23 @@ #define v(x) if (verbose > 3) x; +static float +randf (int randfd) +{ + size_t nread = 0; + unsigned int v; + ssize_t n; + + do { + if ((n = read (randfd, ((char *) &v) + nread, sizeof (v) - nread)) > 0) { + if ((nread += n) == sizeof (v)) + break; + } + } while (n == -1 && errno == EINTR); + + return (v * 1.0) / UINT_MAX; +} + static gboolean streams_match (GMimeStream **streams, const char *filename) { @@ -129,7 +146,7 @@ char sbuf[100], rbuf[100]; ssize_t slen; FILE *fp; - + /* '0x1a' character is treated as EOF (Ctrl+Z) on Windows if file is opened in text mode, * thus it's opened in binary mode. */ @@ -168,27 +185,14 @@ stream = g_mime_stream_fs_new (fd); - testsuite_check ("GMimeStreamBuffer::block gets"); + testsuite_check ("GMimeStreamBuffer::gets()"); try { g_mime_stream_reset (stream); buffered = g_mime_stream_buffer_new (stream, GMIME_STREAM_BUFFER_BLOCK_READ); test_stream_gets (buffered, filename); testsuite_check_passed (); } catch (ex) { - testsuite_check_failed ("GMimeStreamBuffer::block gets() failed: %s", - ex->message); - } finally { - g_object_unref (buffered); - } - - testsuite_check ("GMimeStreamBuffer::cache gets"); - try { - g_mime_stream_reset (stream); - buffered = g_mime_stream_buffer_new (stream, GMIME_STREAM_BUFFER_CACHE_READ); - test_stream_gets (buffered, filename); - testsuite_check_passed (); - } catch (ex) { - testsuite_check_failed ("GMimeStreamBuffer::block gets() failed: %s", + testsuite_check_failed ("GMimeStreamBuffer::gets() failed: %s", ex->message); } finally { g_object_unref (buffered); @@ -240,8 +244,6 @@ #endif - - static gboolean check_stream_fs (const char *input, const char *output, const char *filename, gint64 start, gint64 end) { @@ -344,7 +346,7 @@ #endif /* HAVE_MMAP */ static gboolean -check_stream_buffer_block (const char *input, const char *output, const char *filename, gint64 start, gint64 end) +check_stream_buffer (const char *input, const char *output, const char *filename, gint64 start, gint64 end) { GMimeStream *streams[2], *stream; Exception *ex = NULL; @@ -379,41 +381,6 @@ } static gboolean -check_stream_buffer_cache (const char *input, const char *output, const char *filename, gint64 start, gint64 end) -{ - GMimeStream *streams[2], *stream; - Exception *ex = NULL; - int fd[2]; - - if ((fd[0] = open (input, O_RDONLY, 0)) == -1) - return FALSE; - - if ((fd[1] = open (output, O_RDONLY, 0)) == -1) { - close (fd[0]); - return FALSE; - } - - streams[0] = g_mime_stream_fs_new (fd[0]); - stream = g_mime_stream_buffer_new (streams[0], GMIME_STREAM_BUFFER_CACHE_READ); - g_object_unref (streams[0]); - streams[0] = g_mime_stream_substream (stream, start, end); - g_object_unref (stream); - - streams[1] = g_mime_stream_fs_new (fd[1]); - - if (!streams_match (streams, filename)) - ex = exception_new ("GMimeStreamBuffer (Cache Mode) streams did not match for `%s'", filename); - - g_object_unref (streams[0]); - g_object_unref (streams[1]); - - if (ex != NULL) - throw (ex); - - return TRUE; -} - -static gboolean check_stream_gio (const char *input, const char *output, const char *filename, gint64 start, gint64 end) { GMimeStream *streams[2]; @@ -433,7 +400,7 @@ streams[1] = g_mime_stream_fs_new (fd); if (!streams_match (streams, filename)) - ex = exception_new ("GMimeStreamBuffer (Cache Mode) streams did not match for `%s'", filename); + ex = exception_new ("GMimeStreamGIO streams did not match for `%s'", filename); g_object_unref (streams[0]); g_object_unref (streams[1]); @@ -451,14 +418,13 @@ const char *what; checkFunc check; } checks[] = { - { "GMimeStreamFs", check_stream_fs }, - { "GMimeStreamFile", check_stream_file }, + { "GMimeStreamFs", check_stream_fs }, + { "GMimeStreamFile", check_stream_file }, #ifdef HAVE_MMAP - { "GMimeStreamMmap", check_stream_mmap }, + { "GMimeStreamMmap", check_stream_mmap }, #endif /* HAVE_MMAP */ - { "GMimeStreamBuffer (block mode)", check_stream_buffer_block }, - { "GMimeStreamBuffer (cache mode)", check_stream_buffer_cache }, - { "GMimeStreamGIO", check_stream_gio }, + { "GMimeStreamBuffer", check_stream_buffer }, + { "GMimeStreamGIO", check_stream_gio }, }; static void @@ -520,21 +486,25 @@ static size_t -gen_random_stream (GMimeStream *stream) +gen_random_stream (int randfd, GMimeStream *stream) { size_t nwritten, buflen, total = 0, size, i; char buf[4096]; ssize_t n; /* read between 4k and 14k bytes */ - size = 4096 + (size_t) (10240.0 * (rand () / (RAND_MAX + 1.0))); + size = 4096 + (size_t) (10240 * randf (randfd)); v(fprintf (stdout, "Generating %" G_GSIZE_FORMAT " bytes of random data... ", size)); v(fflush (stdout)); while (total < size) { buflen = size - total > sizeof (buf) ? sizeof (buf) : size - total; - for (i = 0; i < buflen; i++) - buf[i] = (char) (255 * (rand () / (RAND_MAX + 1.0))); + + nwritten = 0; + do { + if ((n = read (randfd, buf + nwritten, buflen - nwritten)) > 0) + nwritten += n; + } while (nwritten < buflen); nwritten = 0; do { @@ -552,7 +522,7 @@ g_mime_stream_reset (stream); v(fputs ("done\n", stdout)); - + return size; } @@ -562,9 +532,10 @@ GMimeStream *istream, *ostream, *stream; char input[256], output[256], *name, *p; gint64 start, end, len, size; - int fd, i; + int randfd, fd, i; - srand (time (NULL)); + if ((randfd = open ("/dev/urandom", O_RDONLY)) == -1) + return -1; name = g_stpcpy (input, datadir); *name++ = G_DIR_SEPARATOR; @@ -580,8 +551,10 @@ *name++ = G_DIR_SEPARATOR; strcpy (name, "streamXXXXXX"); - if ((fd = g_mkstemp (input)) == -1) + if ((fd = g_mkstemp (input)) == -1) { + close (randfd); return -1; + } *stream_name = g_strdup (name); @@ -590,14 +563,13 @@ *p++ = '_'; istream = g_mime_stream_fs_new (fd); - size = gen_random_stream (istream); + size = gen_random_stream (randfd, istream); for (i = 0; i < 64; i++) { retry: - start = (gint64) (size * (rand () / (RAND_MAX + 1.0))); - len = (gint64) (size * (rand () / (RAND_MAX + 1.0))); + start = (gint64) (size * randf (randfd)); + len = (gint64) (size * randf (randfd)); if (start + len > size) { - len = size - start; end = -1; } else { end = start + len; @@ -616,6 +588,8 @@ g_object_unref (stream); } + close (randfd); + return 0; } @@ -629,7 +603,7 @@ const char *dent; int i; - g_mime_init (0); + g_mime_init (); testsuite_init (argc, argv); diff -Nru gmime-2.6.22+dfsg2/tests/testsuite.c gmime-3.0.1/tests/testsuite.c --- gmime-2.6.22+dfsg2/tests/testsuite.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/tests/testsuite.c 2017-03-10 14:03:57.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,6 +23,8 @@ #endif #include +#include + #include #ifdef ENABLE_THREADS #include @@ -360,24 +362,78 @@ #define v2_1_16 ((2 << 24) | (1 << 16) | (16 << 8)) -int _g_mime_get_gpg_version (const char *gpg); +static int +get_gpg_version (const char *path) +{ + const char vheader[] = " (GnuPG) "; + int v, n = 0, version = 0; + const char *inptr; + char buffer[128]; + char *command; + FILE *gpg; + + g_return_val_if_fail (path != NULL, -1); + + command = g_strdup_printf ("%s --version", path); + gpg = popen (command, "r"); + g_free (command); + + if (gpg == NULL) + return -1; + + inptr = fgets (buffer, 128, gpg); + pclose (gpg); -int + if (!(inptr = strstr (inptr, vheader))) + return -1; + + inptr += sizeof (vheader) - 1; + while (*inptr >= '0' && *inptr <= '9' && n < 4) { + v = 0; + + while (*inptr >= '0' && *inptr <= '9' && (v < 25 || (v == 25 && *inptr < '6'))) { + v = (v * 10) + (*inptr - '0'); + inptr++; + } + + version = (version << 8) + v; + n++; + + if (*inptr != '.') + break; + + inptr++; + } + + if (n == 0) + return -1; + + if (n < 4) + version = version << ((4 - n) * 8); + + return version; +} + +gboolean testsuite_can_safely_override_session_key (const char *gpg) { - return _g_mime_get_gpg_version (gpg) >= v2_1_16; + return get_gpg_version (gpg) >= v2_1_16; } int testsuite_setup_gpghome (const char *gpg) { - const char directive[] = "pinentry-mode loopback\n"; - char *command; + const char *files[] = { "./tmp/.gnupg/gpg.conf", "./tmp/.gnupg/gpgsm.conf", "./tmp/.gnupg/gpg-agent.conf", "./tmp/.gnupg/dirmngr.conf", NULL }; + const char debug[] = "log-file socket://%s/tmp/.gnupg/S.log\ndebug 1024\nverbose\n"; + char *command, *cwd; + FILE *fp; + int i; /* reset .gnupg config directory */ if (system ("/bin/rm -rf ./tmp") != 0) return EXIT_FAILURE; - if (system ("/bin/mkdir ./tmp") != 0) + + if (g_mkdir ("./tmp", 0755) != 0) return EXIT_FAILURE; g_setenv ("GNUPGHOME", "./tmp/.gnupg", 1); @@ -395,13 +451,11 @@ g_free (command); - if (_g_mime_get_gpg_version (gpg) >= ((2 << 24) | (1 << 16))) { - FILE *fp; - - if ((fp = fopen ("./tmp/.gnupg/gpg.conf", "w")) == NULL) + if (get_gpg_version (gpg) >= ((2 << 24) | (1 << 16))) { + if (!(fp = fopen ("./tmp/.gnupg/gpg.conf", "a"))) return EXIT_FAILURE; - if (fwrite (directive, sizeof (directive) - 1, 1, fp) != 1) { + if (fprintf (fp, "pinentry-mode loopback\n") == -1) { fclose (fp); return EXIT_FAILURE; } @@ -410,6 +464,39 @@ return EXIT_FAILURE; } + if (!(fp = fopen ("./tmp/.gnupg/gpgsm.conf", "a"))) + return EXIT_FAILURE; + + if (fprintf (fp, "disable-crl-checks\n") == -1) { + fclose (fp); + return EXIT_FAILURE; + } + + if (fclose (fp)) + return EXIT_FAILURE; + +#if DEBUG_GNUPG + cwd = g_get_current_dir (); + + for (i = 0; files[i]; i++) { + if (!(fp = fopen (files[i], "a"))) + return EXIT_FAILURE; + + if (fprintf (fp, debug, cwd) == -1) { + g_free (cwd); + fclose (fp); + return EXIT_FAILURE; + } + + if (fclose (fp)) { + g_free (cwd); + return EXIT_FAILURE; + } + } + + g_free (cwd); +#endif + return EXIT_SUCCESS; } diff -Nru gmime-2.6.22+dfsg2/tests/testsuite.h gmime-3.0.1/tests/testsuite.h --- gmime-2.6.22+dfsg2/tests/testsuite.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/tests/testsuite.h 2017-03-07 11:59:56.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -48,7 +48,7 @@ /* GnuPG test suite utility functions */ int testsuite_setup_gpghome (const char *gpg); int testsuite_destroy_gpghome (void); -int testsuite_can_safely_override_session_key (const char *gpg); +gboolean testsuite_can_safely_override_session_key (const char *gpg); /*#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) #define G_GNUC_NORETURN __attribute__((noreturn)) diff -Nru gmime-2.6.22+dfsg2/TODO gmime-3.0.1/TODO --- gmime-2.6.22+dfsg2/TODO 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/TODO 2017-04-08 17:01:10.000000000 +0000 @@ -3,46 +3,22 @@ that is to say that there is no rhyme or reason to the order that the tasks are presented in. -GMime 2.8 / 3.0 Planning: -========================= +GMime 3.0 Planning: +=================== -- Fix g_mime_message_[g,s]set_sender() to take/return an - InternetAddressList to be more consistent with the recipient - functions as well as being less error-prone. - -- Fix g_mime_message_[g,s]et_reply_to() to take/return an - InternetAddressList to be more consistent with the recipient - functions as well as being less error-prone. +- Rename g_mime_message_[get,set]_mime_part() to g_mime_message_[get,set]_body()? + This would require me to rename g_mime_message_get_body() to + g_mime_message_get_text_body()? + + +Future Planning: +================ - Modify GMimeStream APIs to take GCancellable and GError arguments. -- Modify g_mime_parser_construct_message() and - g_mime_parser_construct_part() methods take GCancellable and GError - arguments. - -- Should GMimeStreamGIO be modified to take only a GInputStream or a - GOutputStream and do away with the GFile API? - -- Bump the Glib dependency and just use the newer GMutex APIs - directly. - -- How about a g_mime_part_get_best_charset()? This one could be - awkward since it depends on the content being text and also encoded - in UTF-8... [ CONSIDERING ] - -- Possibly make the GMime parser incremental. This will be difficult - and probably not worth the trouble. - -- Would be nice if gmime-sharp could take System.IO.Streams in - addition to GMime.Stream. - -- Combine GMimeGpgContext and GMimePkcs7Context by using GpgMe for - both. This could allow g_mime_multipart_encrypted_decrypt() and - g_mime_multipart_signed_verify() to set the appropriate protocol on - the CryptoContext so that the caller wouldn't have to figure that - out themselves. We'd actually be able to get rid of the need for - a GMimeCryptoContext parameter altogether if we could rely on - the backend using a gpg-agent for password requests. +- Modify GMimeParser APIs to take GCancellable and GError arguments. + +- Modify write_to_stream() methods to take GCancellable and GError arguments. All questions and comments should be directed toward the author, diff -Nru gmime-2.6.22+dfsg2/tools/gmime-port-2-6-to-3-0.sh gmime-3.0.1/tools/gmime-port-2-6-to-3-0.sh --- gmime-2.6.22+dfsg2/tools/gmime-port-2-6-to-3-0.sh 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/tools/gmime-port-2-6-to-3-0.sh 2017-03-28 23:46:26.000000000 +0000 @@ -0,0 +1,32 @@ +#!/bin/bash + +for src in `find . -name "*.[c,h]"` +do + echo "Auto-porting '$src' from GMime-2.6 to GMime-3.0..." + sed -e "s/g_mime_message_get_sender/g_mime_messaget_get_from/g" \ + -e "s/GMIME_RECIPIENT_TYPE_/GMIME_ADDRESS_TYPE_/g" \ + -e "s/g_mime_message_get_recipients/g_mime_message_get_addresses/g" \ + -e "s/g_mime_message_add_recipient/g_mime_message_add_mailbox/g" \ + -e "s/g_mime_param_new_from_string/g_mime_param_list_parse/g" \ + -e "s/g_mime_content_type_new_from_string/g_mime_content_type_parse/g" \ + -e "s/g_mime_content_type_to_string/g_mime_content_type_get_mime_type/g" \ + -e "s/g_mime_content_type_get_params/g_mime_content_type_get_parameters/g" \ + -e "s/g_mime_content_disposition_new_from_string/g_mime_content_disposition_parse/g" \ + -e "s/g_mime_content_disposition_to_string/g_mime_content_disposition_encode/g/" \ + -e "s/g_mime_content_disposition_get_params/g_mime_content_disposition_get_parameters/g/" \ + -e "s/internet_address_list_parse_string/internet_address_list_parse/g" \ + -e "s/GMimeCertificateTrust/GMimeTrust/g" \ + -e "s/GMIME_CERTIIFCATE_TRUST_NONE/GMIME_TRUST_UNKNOWN/g" \ + -e "s/GMIME_CERTIFICATE_TRUST_FULLY/GMIME_TRUST_FULL/g" \ + -e "s/GMIME_CERTIFICATE_TRUST_/GMIME_TRUST_/g" \ + -e "s/g_mime_stream_file_new_for_path/g_mime_stream_file_open/g" \ + -e "s/g_mime_stream_fs_new_for_path/g_mime_stream_fs_open/g" \ + -e "s/g_mime_part_set_content_object/g_mime_part_set_content/g" \ + -e "s/g_mime_part_get_content_object/g_mime_part_get_content/g" \ + -e "s/g_mime_parser_set_scan_from/g_mime_parser_set_format/g" \ + -e "s/g_mime_parser_get_scan_from/g_mime_parser_get_format/g" \ + -e "s/g_mime_parser_get_from/g_mime_parser_get_mbox_marker/g" \ + -e "s/g_mime_parser_get_from_offset/g_mime_parser_get_mbox_marker_offset/g" \ + < "$src" > "$src.tmp" + mv "$src.tmp" "$src" +done diff -Nru gmime-2.6.22+dfsg2/tools/Makefile.am gmime-3.0.1/tools/Makefile.am --- gmime-2.6.22+dfsg2/tools/Makefile.am 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/tools/Makefile.am 2017-03-28 23:46:26.000000000 +0000 @@ -2,4 +2,4 @@ SUBDIRS = . -EXTRA_DIST = gmime-port-2-2-to-2-4.sh gmime-port-2-4-to-2-6.sh +EXTRA_DIST = gmime-port-2-2-to-2-4.sh gmime-port-2-4-to-2-6.sh gmime-port-2-6-to-3-0.sh diff -Nru gmime-2.6.22+dfsg2/tools/Makefile.in gmime-3.0.1/tools/Makefile.in --- gmime-2.6.22+dfsg2/tools/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/tools/Makefile.in 2017-05-21 16:38:03.000000000 +0000 @@ -0,0 +1,690 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = tools +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gpgme.m4 \ + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/introspection.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/vapigen.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DB2HTML = @DB2HTML@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DOLT_BASH = @DOLT_BASH@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMIME_API_VERSION = @GMIME_API_VERSION@ +GMIME_BINARY_AGE = @GMIME_BINARY_AGE@ +GMIME_CFLAGS = @GMIME_CFLAGS@ +GMIME_INCLUDEDIR = @GMIME_INCLUDEDIR@ +GMIME_INTERFACE_AGE = @GMIME_INTERFACE_AGE@ +GMIME_LIBDIR = @GMIME_LIBDIR@ +GMIME_LIBS = @GMIME_LIBS@ +GMIME_LIBS_PRIVATE = @GMIME_LIBS_PRIVATE@ +GMIME_MAJOR_VERSION = @GMIME_MAJOR_VERSION@ +GMIME_MICRO_VERSION = @GMIME_MICRO_VERSION@ +GMIME_MINOR_VERSION = @GMIME_MINOR_VERSION@ +GMIME_VERSION = @GMIME_VERSION@ +GOBJECT_QUERY = @GOBJECT_QUERY@ +GPGME_CONFIG = @GPGME_CONFIG@ +GPGME_PTHREAD_CFLAGS = @GPGME_PTHREAD_CFLAGS@ +GPGME_PTHREAD_LIBS = @GPGME_PTHREAD_LIBS@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBIDN_CFLAGS = @LIBIDN_CFLAGS@ +LIBIDN_LIBS = @LIBIDN_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTCOMPILE = @LTCOMPILE@ +LTCXXCOMPILE = @LTCXXCOMPILE@ +LTLIBOBJS = @LTLIBOBJS@ +LTP = @LTP@ +LTP_GENHTML = @LTP_GENHTML@ +LT_AGE = @LT_AGE@ +LT_CURRENT = @LT_CURRENT@ +LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@ +LT_RELEASE = @LT_RELEASE@ +LT_REVISION = @LT_REVISION@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MV = @MV@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM = @RM@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHTOOL = @SHTOOL@ +STRIP = @STRIP@ +TAR = @TAR@ +VAPIGEN = @VAPIGEN@ +VAPIGEN_MAKEFILE = @VAPIGEN_MAKEFILE@ +VAPIGEN_VAPIDIR = @VAPIGEN_VAPIDIR@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = . +EXTRA_DIST = gmime-port-2-2-to-2-4.sh gmime-port-2-4-to-2-6.sh gmime-port-2-6-to-3-0.sh +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tools/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu tools/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(am__recursive_targets) install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-am clean clean-generic clean-libtool cscopelist-am ctags \ + ctags-am distclean distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff -Nru gmime-2.6.22+dfsg2/util/cache.c gmime-3.0.1/util/cache.c --- gmime-2.6.22+dfsg2/util/cache.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/util/cache.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,128 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free - * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "cache.h" - - -static void -cache_node_free (gpointer node_data) -{ - CacheNode *node = (CacheNode *) node_data; - Cache *cache = node->cache; - - cache->free_node (node); - g_free (node->key); - - g_slice_free1 (cache->node_size, node); -} - - -Cache * -cache_new (CacheNodeExpireFunc expire, CacheNodeFreeFunc free_node, size_t node_size, size_t max_size) -{ - Cache *cache; - - cache = g_new (Cache, 1); - list_init (&cache->list); - cache->expire = expire; - cache->free_node = free_node; - cache->node_hash = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, cache_node_free); - cache->node_size = node_size; - cache->max_size = max_size; - cache->size = 0; - - return cache; -} - - -void -cache_free (Cache *cache) -{ - g_hash_table_destroy (cache->node_hash); - g_free (cache); -} - - -void -cache_expire_unused (Cache *cache) -{ - ListNode *node, *prev; - - node = cache->list.tailpred; - while (node->prev && cache->size > cache->max_size) { - prev = node->prev; - if (cache->expire (cache, (CacheNode *) node)) { - list_unlink (node); - g_hash_table_remove (cache->node_hash, ((CacheNode *) node)->key); - cache->size--; - } - node = prev; - } -} - -CacheNode * -cache_node_insert (Cache *cache, const char *key) -{ - CacheNode *node; - - cache->size++; - - if (cache->size > cache->max_size) - cache_expire_unused (cache); - - node = g_slice_alloc (cache->node_size); - node->key = g_strdup (key); - node->cache = cache; - - g_hash_table_insert (cache->node_hash, node->key, node); - list_prepend (&cache->list, (ListNode *) node); - - return node; -} - -CacheNode * -cache_node_lookup (Cache *cache, const char *key, gboolean use) -{ - CacheNode *node; - - node = g_hash_table_lookup (cache->node_hash, key); - if (node && use) { - list_unlink ((ListNode *) node); - list_prepend (&cache->list, (ListNode *) node); - } - - return node; -} - -void -cache_node_expire (CacheNode *node) -{ - Cache *cache; - - cache = node->cache; - list_unlink ((ListNode *) node); - g_hash_table_remove (cache->node_hash, node->key); - cache->size--; -} diff -Nru gmime-2.6.22+dfsg2/util/cache.h gmime-3.0.1/util/cache.h --- gmime-2.6.22+dfsg2/util/cache.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/util/cache.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,68 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free - * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - - -#ifndef __CACHE_H__ -#define __CACHE_H__ - -#include - -#include - -#include - -G_BEGIN_DECLS - -typedef struct _Cache Cache; - -typedef struct { - ListNode node; - Cache *cache; - char *key; -} CacheNode; - -typedef gboolean (*CacheNodeExpireFunc) (Cache *cache, CacheNode *node); -typedef void (*CacheNodeFreeFunc) (CacheNode *node); - -struct _Cache { - List list; - size_t size; - size_t max_size; - size_t node_size; - GHashTable *node_hash; - CacheNodeExpireFunc expire; - CacheNodeFreeFunc free_node; -}; - - -G_GNUC_INTERNAL Cache *cache_new (CacheNodeExpireFunc expire, CacheNodeFreeFunc free_node, - size_t bucket_size, size_t max_cache_size); - -G_GNUC_INTERNAL void cache_free (Cache *cache); - -G_GNUC_INTERNAL CacheNode *cache_node_insert (Cache *cache, const char *key); -G_GNUC_INTERNAL CacheNode *cache_node_lookup (Cache *cache, const char *key, gboolean use); - -G_GNUC_INTERNAL void cache_expire_unused (Cache *cache); -G_GNUC_INTERNAL void cache_node_expire (CacheNode *node); - -G_END_DECLS - -#endif /* __CACHE_H__ */ diff -Nru gmime-2.6.22+dfsg2/util/gtrie.c gmime-3.0.1/util/gtrie.c --- gmime-2.6.22+dfsg2/util/gtrie.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/util/gtrie.c 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License diff -Nru gmime-2.6.22+dfsg2/util/gtrie.h gmime-3.0.1/util/gtrie.h --- gmime-2.6.22+dfsg2/util/gtrie.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/util/gtrie.h 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License diff -Nru gmime-2.6.22+dfsg2/util/list.c gmime-3.0.1/util/list.c --- gmime-2.6.22+dfsg2/util/list.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/util/list.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,118 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free - * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "list.h" - -void -list_init (List *list) -{ - list->head = (ListNode *) &list->tail; - list->tail = NULL; - list->tailpred = (ListNode *) &list->head; -} - -int -list_is_empty (List *list) -{ - return list->head == (ListNode *) &list->tail; -} - -int -list_length (List *list) -{ - ListNode *node; - int n = 0; - - node = list->head; - while (node->next) { - node = node->next; - n++; - } - - return n; -} - -ListNode * -list_unlink_head (List *list) -{ - ListNode *n, *nn; - - n = list->head; - nn = n->next; - if (nn) { - nn->prev = n->prev; - list->head = nn; - return n; - } - - return NULL; -} - -ListNode * -list_unlink_tail (List *list) -{ - ListNode *n, *np; - - n = list->tailpred; - np = n->prev; - if (np) { - np->next = n->next; - list->tailpred = np; - return n; - } - - return NULL; -} - -ListNode * -list_prepend (List *list, ListNode *node) -{ - node->next = list->head; - node->prev = (ListNode *) &list->head; - list->head->prev = node; - list->head = node; - - return node; -} - -ListNode * -list_append (List *list, ListNode *node) -{ - node->next = (ListNode *) &list->tail; - node->prev = list->tailpred; - list->tailpred->next = node; - list->tailpred = node; - - return node; -} - -ListNode * -list_unlink (ListNode *node) -{ - node->next->prev = node->prev; - node->prev->next = node->next; - - return node; -} diff -Nru gmime-2.6.22+dfsg2/util/list.h gmime-3.0.1/util/list.h --- gmime-2.6.22+dfsg2/util/list.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/util/list.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,59 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free - * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - - -#ifndef __LIST_H__ -#define __LIST_H__ - -#include -#include - -G_BEGIN_DECLS - -typedef struct _ListNode { - struct _ListNode *next; - struct _ListNode *prev; -} ListNode; - -typedef struct { - ListNode *head; - ListNode *tail; - ListNode *tailpred; -} List; - -#define LIST_INITIALIZER(l) { (ListNode *) &l.tail, NULL, (ListNode *) &l.head } - -G_GNUC_INTERNAL void list_init (List *list); - -G_GNUC_INTERNAL int list_is_empty (List *list); - -G_GNUC_INTERNAL int list_length (List *list); - -G_GNUC_INTERNAL ListNode *list_unlink_head (List *list); -G_GNUC_INTERNAL ListNode *list_unlink_tail (List *list); - -G_GNUC_INTERNAL ListNode *list_prepend (List *list, ListNode *node); -G_GNUC_INTERNAL ListNode *list_append (List *list, ListNode *node); - -G_GNUC_INTERNAL ListNode *list_unlink (ListNode *node); - -G_END_DECLS - -#endif /* __LIST_H__ */ diff -Nru gmime-2.6.22+dfsg2/util/Makefile.am gmime-3.0.1/util/Makefile.am --- gmime-2.6.22+dfsg2/util/Makefile.am 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/util/Makefile.am 2017-03-28 23:46:26.000000000 +0000 @@ -11,14 +11,10 @@ $(GLIB_CFLAGS) libutil_la_SOURCES = \ - cache.c \ - cache.h \ gtrie.c \ gtrie.h \ - list.c \ - list.h \ - md5-utils.c \ - md5-utils.h \ + packed.c \ + packed.h \ url-scanner.c \ url-scanner.h diff -Nru gmime-2.6.22+dfsg2/util/Makefile.in gmime-3.0.1/util/Makefile.in --- gmime-2.6.22+dfsg2/util/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/util/Makefile.in 2017-05-21 16:38:03.000000000 +0000 @@ -0,0 +1,784 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = util +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gpgme.m4 \ + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/introspection.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/vapigen.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libutil_la_LIBADD = +am_libutil_la_OBJECTS = gtrie.lo packed.lo url-scanner.lo +libutil_la_OBJECTS = $(am_libutil_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libutil_la_SOURCES) +DIST_SOURCES = $(libutil_la_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DB2HTML = @DB2HTML@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DOLT_BASH = @DOLT_BASH@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMIME_API_VERSION = @GMIME_API_VERSION@ +GMIME_BINARY_AGE = @GMIME_BINARY_AGE@ +GMIME_CFLAGS = @GMIME_CFLAGS@ +GMIME_INCLUDEDIR = @GMIME_INCLUDEDIR@ +GMIME_INTERFACE_AGE = @GMIME_INTERFACE_AGE@ +GMIME_LIBDIR = @GMIME_LIBDIR@ +GMIME_LIBS = @GMIME_LIBS@ +GMIME_LIBS_PRIVATE = @GMIME_LIBS_PRIVATE@ +GMIME_MAJOR_VERSION = @GMIME_MAJOR_VERSION@ +GMIME_MICRO_VERSION = @GMIME_MICRO_VERSION@ +GMIME_MINOR_VERSION = @GMIME_MINOR_VERSION@ +GMIME_VERSION = @GMIME_VERSION@ +GOBJECT_QUERY = @GOBJECT_QUERY@ +GPGME_CONFIG = @GPGME_CONFIG@ +GPGME_PTHREAD_CFLAGS = @GPGME_PTHREAD_CFLAGS@ +GPGME_PTHREAD_LIBS = @GPGME_PTHREAD_LIBS@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBIDN_CFLAGS = @LIBIDN_CFLAGS@ +LIBIDN_LIBS = @LIBIDN_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTCOMPILE = @LTCOMPILE@ +LTCXXCOMPILE = @LTCXXCOMPILE@ +LTLIBOBJS = @LTLIBOBJS@ +LTP = @LTP@ +LTP_GENHTML = @LTP_GENHTML@ +LT_AGE = @LT_AGE@ +LT_CURRENT = @LT_CURRENT@ +LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@ +LT_RELEASE = @LT_RELEASE@ +LT_REVISION = @LT_REVISION@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MV = @MV@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM = @RM@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHTOOL = @SHTOOL@ +STRIP = @STRIP@ +TAR = @TAR@ +VAPIGEN = @VAPIGEN@ +VAPIGEN_MAKEFILE = @VAPIGEN_MAKEFILE@ +VAPIGEN_VAPIDIR = @VAPIGEN_VAPIDIR@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = . +noinst_LTLIBRARIES = libutil.la +AM_CPPFLAGS = -I$(top_srcdir) \ + $(VERSION_FLAGS) \ + -DG_LOG_DOMAIN=\"util\" \ + $(GMIME_CFLAGS) \ + $(GLIB_CFLAGS) + +libutil_la_SOURCES = \ + gtrie.c \ + gtrie.h \ + packed.c \ + packed.h \ + url-scanner.c \ + url-scanner.h + +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu util/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu util/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libutil.la: $(libutil_la_OBJECTS) $(libutil_la_DEPENDENCIES) $(EXTRA_libutil_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(libutil_la_OBJECTS) $(libutil_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtrie.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/packed.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/url-scanner.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile $(LTLIBRARIES) +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(am__recursive_targets) install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-am clean clean-generic clean-libtool \ + clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff -Nru gmime-2.6.22+dfsg2/util/md5-utils.c gmime-3.0.1/util/md5-utils.c --- gmime-2.6.22+dfsg2/util/md5-utils.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/util/md5-utils.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,355 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * This code implements the MD5 message-digest algorithm. - * The algorithm is due to Ron Rivest. This code was - * written by Colin Plumb in 1993, no copyright is claimed. - * This code is in the public domain; do with it what you wish. - * - * Equivalent code is available from RSA Data Security, Inc. - * This code has been tested against that, and is equivalent, - * except that you don't need to include two pages of legalese - * with every copy. - * - * To compute the message digest of a chunk of bytes, declare an - * MD5Context structure, pass it to md5_init, call md5_update as - * needed on buffers full of bytes, and then call md5_Final, which - * will fill a supplied 16-byte array with the digest. - */ - -/* parts of this file are: - * Written March 1993 by Branko Lankester - * Modified June 1993 by Colin Plumb for altered md5.c. - * Modified October 1995 by Erik Troan for RPM - */ - - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include -#include "md5-utils.h" - -#define d(x) - -static void md5_transform (guint32 buf[4], const guint32 in[16]); - -static int _ie = 0x44332211; -static union _endian { int i; char b[4]; } *_endian = (union _endian *) &_ie; -#define IS_BIG_ENDIAN() (_endian->b[0] == '\x44') -#define IS_LITTLE_ENDIAN() (_endian->b[0] == '\x11') - - -/* - * Note: this code is harmless on little-endian machines. - */ -static void -_byte_reverse (unsigned char *buf, guint32 longs) -{ - guint32 t; - - do { - t = (guint32) ((guint32) buf[3] << 8 | buf[2]) << 16 | - ((guint32) buf[1] << 8 | buf[0]); - *(guint32 *) buf = t; - buf += 4; - } while (--longs); -} - - -/** - * md5_init: Initialise an md5 context object - * @ctx: md5 context - * - * Initialise an md5 buffer. - * - **/ -void -md5_init (MD5Context *ctx) -{ - ctx->buf[0] = 0x67452301; - ctx->buf[1] = 0xefcdab89; - ctx->buf[2] = 0x98badcfe; - ctx->buf[3] = 0x10325476; - - ctx->bits[0] = 0; - ctx->bits[1] = 0; - - if (IS_BIG_ENDIAN ()) - ctx->doByteReverse = 1; - else - ctx->doByteReverse = 0; -} - - -/** - * md5_update: add a buffer to md5 hash computation - * @ctx: conetxt object used for md5 computaion - * @buf: buffer to add - * @len: buffer length - * - * Update context to reflect the concatenation of another buffer full - * of bytes. Use this to progressively construct an md5 hash. - **/ -void -md5_update (MD5Context *ctx, const unsigned char *buf, guint32 len) -{ - guint32 t; - - /* Update bitcount */ - t = ctx->bits[0]; - if ((ctx->bits[0] = t + ((guint32) len << 3)) < t) - ctx->bits[1]++; /* Carry from low to high */ - ctx->bits[1] += len >> 29; - - t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */ - - /* Handle any leading odd-sized chunks */ - if (t) { - unsigned char *p = (unsigned char *) ctx->in + t; - - t = 64 - t; - if (len < t) { - memcpy (p, buf, len); - return; - } - memcpy (p, buf, t); - if (ctx->doByteReverse) - _byte_reverse (ctx->in, 16); - md5_transform (ctx->buf, (guint32 *) ctx->in); - buf += t; - len -= t; - } - - /* Process data in 64-byte chunks */ - while (len >= 64) { - memcpy (ctx->in, buf, 64); - if (ctx->doByteReverse) - _byte_reverse (ctx->in, 16); - md5_transform (ctx->buf, (guint32 *) ctx->in); - buf += 64; - len -= 64; - } - - /* Handle any remaining bytes of data. */ - memcpy (ctx->in, buf, len); -} - - -/* - * Final wrapup - pad to 64-byte boundary with the bit pattern - * 1 0* (64-bit count of bits processed, MSB-first) - */ -/** - * md5_final: copy the final md5 hash to a bufer - * @digest: 16 bytes buffer - * @ctx: context containing the calculated md5 - * - * copy the final md5 hash to a bufer - **/ -void -md5_final (MD5Context *ctx, unsigned char digest[16]) -{ - guint32 count; - unsigned char *p; - - /* Compute number of bytes mod 64 */ - count = (ctx->bits[0] >> 3) & 0x3F; - - /* Set the first char of padding to 0x80. This is safe since there is - always at least one byte free */ - p = ctx->in + count; - *p++ = 0x80; - - /* Bytes of padding needed to make 64 bytes */ - count = 64 - 1 - count; - - /* Pad out to 56 mod 64 */ - if (count < 8) { - /* Two lots of padding: Pad the first block to 64 bytes */ - memset (p, 0, count); - if (ctx->doByteReverse) - _byte_reverse (ctx->in, 16); - md5_transform (ctx->buf, (guint32 *) ctx->in); - - /* Now fill the next block with 56 bytes */ - memset (ctx->in, 0, 56); - } else { - /* Pad block to 56 bytes */ - memset (p, 0, count - 8); - } - - if (ctx->doByteReverse) - _byte_reverse (ctx->in, 14); - - /* Append length in bits and transform */ - ((guint32 *) ctx->in)[14] = ctx->bits[0]; - ((guint32 *) ctx->in)[15] = ctx->bits[1]; - - md5_transform (ctx->buf, (guint32 *) ctx->in); - if (ctx->doByteReverse) - _byte_reverse ((unsigned char *) ctx->buf, 4); - memcpy (digest, ctx->buf, 16); -} - - -/* The four core functions - F1 is optimized somewhat */ - -/* #define F1(x, y, z) (x & y | ~x & z) */ -#define F1(x, y, z) (z ^ (x & (y ^ z))) -#define F2(x, y, z) F1(z, x, y) -#define F3(x, y, z) (x ^ y ^ z) -#define F4(x, y, z) (y ^ (x | ~z)) - -/* This is the central step in the MD5 algorithm. */ -#define MD5STEP(f, w, x, y, z, data, s) \ - ( w += f(x, y, z) + data, w = w<>(32-s), w += x ) - -/* - * The core of the MD5 algorithm, this alters an existing MD5 hash to - * reflect the addition of 16 longwords of new data. md5_Update blocks - * the data and converts bytes into longwords for this routine. - */ -static void -md5_transform (guint32 buf[4], const guint32 in[16]) -{ - register guint32 a, b, c, d; - - a = buf[0]; - b = buf[1]; - c = buf[2]; - d = buf[3]; - - MD5STEP (F1, a, b, c, d, in[0] + 0xd76aa478, 7); - MD5STEP (F1, d, a, b, c, in[1] + 0xe8c7b756, 12); - MD5STEP (F1, c, d, a, b, in[2] + 0x242070db, 17); - MD5STEP (F1, b, c, d, a, in[3] + 0xc1bdceee, 22); - MD5STEP (F1, a, b, c, d, in[4] + 0xf57c0faf, 7); - MD5STEP (F1, d, a, b, c, in[5] + 0x4787c62a, 12); - MD5STEP (F1, c, d, a, b, in[6] + 0xa8304613, 17); - MD5STEP (F1, b, c, d, a, in[7] + 0xfd469501, 22); - MD5STEP (F1, a, b, c, d, in[8] + 0x698098d8, 7); - MD5STEP (F1, d, a, b, c, in[9] + 0x8b44f7af, 12); - MD5STEP (F1, c, d, a, b, in[10] + 0xffff5bb1, 17); - MD5STEP (F1, b, c, d, a, in[11] + 0x895cd7be, 22); - MD5STEP (F1, a, b, c, d, in[12] + 0x6b901122, 7); - MD5STEP (F1, d, a, b, c, in[13] + 0xfd987193, 12); - MD5STEP (F1, c, d, a, b, in[14] + 0xa679438e, 17); - MD5STEP (F1, b, c, d, a, in[15] + 0x49b40821, 22); - - MD5STEP (F2, a, b, c, d, in[1] + 0xf61e2562, 5); - MD5STEP (F2, d, a, b, c, in[6] + 0xc040b340, 9); - MD5STEP (F2, c, d, a, b, in[11] + 0x265e5a51, 14); - MD5STEP (F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); - MD5STEP (F2, a, b, c, d, in[5] + 0xd62f105d, 5); - MD5STEP (F2, d, a, b, c, in[10] + 0x02441453, 9); - MD5STEP (F2, c, d, a, b, in[15] + 0xd8a1e681, 14); - MD5STEP (F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); - MD5STEP (F2, a, b, c, d, in[9] + 0x21e1cde6, 5); - MD5STEP (F2, d, a, b, c, in[14] + 0xc33707d6, 9); - MD5STEP (F2, c, d, a, b, in[3] + 0xf4d50d87, 14); - MD5STEP (F2, b, c, d, a, in[8] + 0x455a14ed, 20); - MD5STEP (F2, a, b, c, d, in[13] + 0xa9e3e905, 5); - MD5STEP (F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); - MD5STEP (F2, c, d, a, b, in[7] + 0x676f02d9, 14); - MD5STEP (F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); - - MD5STEP (F3, a, b, c, d, in[5] + 0xfffa3942, 4); - MD5STEP (F3, d, a, b, c, in[8] + 0x8771f681, 11); - MD5STEP (F3, c, d, a, b, in[11] + 0x6d9d6122, 16); - MD5STEP (F3, b, c, d, a, in[14] + 0xfde5380c, 23); - MD5STEP (F3, a, b, c, d, in[1] + 0xa4beea44, 4); - MD5STEP (F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); - MD5STEP (F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); - MD5STEP (F3, b, c, d, a, in[10] + 0xbebfbc70, 23); - MD5STEP (F3, a, b, c, d, in[13] + 0x289b7ec6, 4); - MD5STEP (F3, d, a, b, c, in[0] + 0xeaa127fa, 11); - MD5STEP (F3, c, d, a, b, in[3] + 0xd4ef3085, 16); - MD5STEP (F3, b, c, d, a, in[6] + 0x04881d05, 23); - MD5STEP (F3, a, b, c, d, in[9] + 0xd9d4d039, 4); - MD5STEP (F3, d, a, b, c, in[12] + 0xe6db99e5, 11); - MD5STEP (F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); - MD5STEP (F3, b, c, d, a, in[2] + 0xc4ac5665, 23); - - MD5STEP (F4, a, b, c, d, in[0] + 0xf4292244, 6); - MD5STEP (F4, d, a, b, c, in[7] + 0x432aff97, 10); - MD5STEP (F4, c, d, a, b, in[14] + 0xab9423a7, 15); - MD5STEP (F4, b, c, d, a, in[5] + 0xfc93a039, 21); - MD5STEP (F4, a, b, c, d, in[12] + 0x655b59c3, 6); - MD5STEP (F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); - MD5STEP (F4, c, d, a, b, in[10] + 0xffeff47d, 15); - MD5STEP (F4, b, c, d, a, in[1] + 0x85845dd1, 21); - MD5STEP (F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); - MD5STEP (F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); - MD5STEP (F4, c, d, a, b, in[6] + 0xa3014314, 15); - MD5STEP (F4, b, c, d, a, in[13] + 0x4e0811a1, 21); - MD5STEP (F4, a, b, c, d, in[4] + 0xf7537e82, 6); - MD5STEP (F4, d, a, b, c, in[11] + 0xbd3af235, 10); - MD5STEP (F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); - MD5STEP (F4, b, c, d, a, in[9] + 0xeb86d391, 21); - - buf[0] += a; - buf[1] += b; - buf[2] += c; - buf[3] += d; -} - - -/** - * md5_get_digest: get the md5 hash of a buffer - * @buffer: byte buffer - * @buffer_size: buffer size (in bytes) - * @digest: 16 bytes buffer receiving the hash code. - * - * Get the md5 hash of a buffer. The result is put in - * the 16 bytes buffer @digest . - **/ -void -md5_get_digest (const char *buffer, unsigned int buffer_size, unsigned char digest[16]) -{ - MD5Context ctx; - - md5_init (&ctx); - md5_update (&ctx, (unsigned char *) buffer, buffer_size); - md5_final (&ctx, digest); -} - - -/** - * md5_get_digest_from_file: get the md5 hash of a file - * @filename: file name - * @digest: 16 bytes buffer receiving the hash code. - * - * Get the md5 hash of a file. The result is put in - * the 16 bytes buffer @digest . - **/ -void -md5_get_digest_from_file (const char *filename, unsigned char digest[16]) -{ - MD5Context ctx; - unsigned char buf[1024]; - size_t nread; - FILE *fp; - - d(fprintf (stderr, "generating checksum\n")); - - if (!(fp = fopen (filename, "rb"))) - return; - - md5_init (&ctx); - - while ((nread = fread (buf, 1, 1024, fp)) > 0) - md5_update (&ctx, buf, nread); - - if (ferror (fp)) { - fclose (fp); - return; - } - - md5_final (&ctx, digest); - - fclose (fp); - d(fprintf (stderr, "checksum done\n")); -} diff -Nru gmime-2.6.22+dfsg2/util/md5-utils.h gmime-3.0.1/util/md5-utils.h --- gmime-2.6.22+dfsg2/util/md5-utils.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/util/md5-utils.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,54 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * This code implements the MD5 message-digest algorithm. - * The algorithm is due to Ron Rivest. This code was - * written by Colin Plumb in 1993, no copyright is claimed. - * This code is in the public domain; do with it what you wish. - * - * Equivalent code is available from RSA Data Security, Inc. - * This code has been tested against that, and is equivalent, - * except that you don't need to include two pages of legalese - * with every copy. - * - * To compute the message digest of a chunk of bytes, declare an - * MD5Context structure, pass it to rpmMD5Init, call rpmMD5Update as - * needed on buffers full of bytes, and then call rpmMD5Final, which - * will fill a supplied 16-byte array with the digest. - */ - -/* parts of this file are : - * Written March 1993 by Branko Lankester - * Modified June 1993 by Colin Plumb for altered md5.c. - * Modified October 1995 by Erik Troan for RPM - */ - - -#ifndef MD5_UTILS_H -#define MD5_UTILS_H - -#include - -G_BEGIN_DECLS - -typedef struct { - guint32 buf[4]; - guint32 bits[2]; - unsigned char in[64]; - int doByteReverse; -} MD5Context; - - -G_GNUC_INTERNAL void md5_get_digest (const char *buffer, unsigned int buffer_size, unsigned char digest[16]); - -/* use this one when speed is needed */ -/* for use in provider code only */ -G_GNUC_INTERNAL void md5_get_digest_from_file (const char *filename, unsigned char digest[16]); - -/* raw routines */ -G_GNUC_INTERNAL void md5_init (MD5Context *ctx); -G_GNUC_INTERNAL void md5_update (MD5Context *ctx, const unsigned char *buf, guint32 len); -G_GNUC_INTERNAL void md5_final (MD5Context *ctx, unsigned char digest[16]); - -G_END_DECLS - -#endif /* MD5_UTILS_H */ diff -Nru gmime-2.6.22+dfsg2/util/packed.c gmime-3.0.1/util/packed.c --- gmime-2.6.22+dfsg2/util/packed.c 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/util/packed.c 2017-03-28 23:46:26.000000000 +0000 @@ -0,0 +1,107 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2017 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "packed.h" + + +PackedByteArray * +packed_byte_array_new (void) +{ + PackedByteArray *packed; + + packed = g_slice_new (PackedByteArray); + packed->buffer = g_malloc (sizeof (guint16) * 64); + packed->allocated = 64; + packed->cur = -1; + packed->len = 0; + + return packed; +} + + +void +packed_byte_array_free (PackedByteArray *packed) +{ + g_free (packed->buffer); + g_slice_free (PackedByteArray, packed); +} + + +void +packed_byte_array_clear (PackedByteArray *packed) +{ + packed->cur = -1; + packed->len = 0; +} + + +static guint16 * +ensure_buffer_size (PackedByteArray *packed, int size) +{ + if (packed->allocated > size) + return packed->buffer; + + size_t ideal = (size + 63) & ~63; + + packed->buffer = g_realloc (packed->buffer, sizeof (guint16) * ideal); + packed->allocated = ideal; + + return packed->buffer; +} + + +void +packed_byte_array_add (PackedByteArray *packed, char c) +{ + guint16 *buffer = packed->buffer; + int cur = packed->cur; + + if (cur < 0 || c != (char) (buffer[cur] & 0xff) || (buffer[cur] & 0xff00) == 0xff00) { + buffer = ensure_buffer_size (packed, cur + 2); + buffer[++cur] = (guint16) ((1 << 8) | (unsigned char) c); + } else { + buffer[cur] += (1 << 8); + } + + packed->cur = cur; + packed->len++; +} + + +void +packed_byte_array_copy_to (PackedByteArray *packed, char *outbuf) +{ + register char *outptr = outbuf; + int count, i, n; + char c; + + for (i = 0; i <= packed->cur; i++) { + count = (packed->buffer[i] >> 8) & 0xff; + c = (char) (packed->buffer[i] & 0xff); + + for (n = 0; n < count; n++) + *outptr++ = c; + } +} diff -Nru gmime-2.6.22+dfsg2/util/packed.h gmime-3.0.1/util/packed.h --- gmime-2.6.22+dfsg2/util/packed.h 1970-01-01 00:00:00.000000000 +0000 +++ gmime-3.0.1/util/packed.h 2017-03-28 23:46:26.000000000 +0000 @@ -0,0 +1,47 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2017 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __PACKED_BYTE_ARRAY_H__ +#define __PACKED_BYTE_ARRAY_H__ + +#include +#include + +G_BEGIN_DECLS + +typedef struct { + guint16 *buffer; + int allocated; + int cur, len; +} PackedByteArray; + +G_GNUC_INTERNAL PackedByteArray *packed_byte_array_new (void); +G_GNUC_INTERNAL void packed_byte_array_free (PackedByteArray *packed); + +G_GNUC_INTERNAL void packed_byte_array_clear (PackedByteArray *packed); + +G_GNUC_INTERNAL void packed_byte_array_add (PackedByteArray *packed, char c); + +G_GNUC_INTERNAL void packed_byte_array_copy_to (PackedByteArray *packed, char *outbuf); + +G_END_DECLS + +#endif /* __PACKED_BYTE_ARRAY_H__ */ diff -Nru gmime-2.6.22+dfsg2/util/url-scanner.c gmime-3.0.1/util/url-scanner.c --- gmime-2.6.22+dfsg2/util/url-scanner.c 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/util/url-scanner.c 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License diff -Nru gmime-2.6.22+dfsg2/util/url-scanner.h gmime-3.0.1/util/url-scanner.h --- gmime-2.6.22+dfsg2/util/url-scanner.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/util/url-scanner.h 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License diff -Nru gmime-2.6.22+dfsg2/zentimer.h gmime-3.0.1/zentimer.h --- gmime-2.6.22+dfsg2/zentimer.h 2017-04-28 17:43:42.000000000 +0000 +++ gmime-3.0.1/zentimer.h 2017-03-05 14:00:08.000000000 +0000 @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* ZenTimer - * Copyright (C) 2000-2014 Jeffrey Stedfast + * Copyright (C) 2000-2017 Jeffrey Stedfast * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation