httpd-cvs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From j..@apache.org
Subject svn commit: r1590597 [11/14] - in /httpd/httpd/trunk/modules/spdy: ./ apache/ apache/filters/ apache/testing/ common/ common/testing/ support/ support/base/ support/base/metrics/ support/build/ support/install/ support/install/common/ support/install/d...
Date Mon, 28 Apr 2014 10:55:22 GMT
Added: httpd/httpd/trunk/modules/spdy/support/install/debian/control.template
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/spdy/support/install/debian/control.template?rev=1590597&view=auto
==============================================================================
--- httpd/httpd/trunk/modules/spdy/support/install/debian/control.template (added)
+++ httpd/httpd/trunk/modules/spdy/support/install/debian/control.template Mon Apr 28 10:55:17 2014
@@ -0,0 +1,16 @@
+Source: @@PACKAGE@@-@@CHANNEL@@
+Section: httpd
+Priority: optional
+Maintainer: @@MAINTNAME@@ <@@MAINTMAIL@@>
+Build-Depends: dpkg-dev, devscripts, fakeroot
+Standards-Version: 3.8.0
+
+Package: @@PACKAGE@@-@@CHANNEL@@
+Provides: @@PROVIDES@@
+Replaces: @@REPLACES@@
+Conflicts: @@CONFLICTS@@
+Pre-Depends: @@PREDEPENDS@@
+Depends: ${shlibs:Depends}, @@DEPENDS@@
+Architecture: @@ARCHITECTURE@@
+Description: @@SHORTDESC@@
+ @@FULLDESC@@

Added: httpd/httpd/trunk/modules/spdy/support/install/debian/postinst
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/spdy/support/install/debian/postinst?rev=1590597&view=auto
==============================================================================
--- httpd/httpd/trunk/modules/spdy/support/install/debian/postinst (added)
+++ httpd/httpd/trunk/modules/spdy/support/install/debian/postinst Mon Apr 28 10:55:17 2014
@@ -0,0 +1,67 @@
+#!/bin/sh
+
+# Based on postinst from Chromium and Google Talk.
+
+@@include@@../common/apt.include
+
+MODSPDY_ENABLE_UPDATES=@@MODSPDY_ENABLE_UPDATES@@
+
+case "$1" in
+    configure)
+        if [ -n "${MODSPDY_ENABLE_UPDATES}" -a ! -e "$DEFAULTS_FILE" ]; then
+            echo 'repo_add_once="true"' > "$DEFAULTS_FILE"
+            echo 'repo_reenable_on_distupgrade="true"' >> "$DEFAULTS_FILE"
+        fi
+
+        # Run the cron job immediately to perform repository
+        # configuration.
+        nohup sh /etc/cron.daily/@@PACKAGE@@ > /dev/null 2>&1 &
+
+        test ! -e /etc/apache2/mods-enabled/spdy.load && \
+            a2enmod spdy
+    ;;
+    abort-upgrade|abort-remove|abort-deconfigure)
+    ;;
+    *)
+        echo "postinst called with unknown argument \`$1'" >&2
+        exit 1
+    ;;
+esac
+
+set -e  # If any command fails from here on, the whole scripts fails.
+
+# Regardless of what argument postinst is called with, we should make sure at
+# this point that we're set up to load our version of mod_ssl.  Note that if we
+# upgrade mod-spdy, the old package's prerm will first get called, which will
+# undo changes to ssl.load, and then we'll redo them here.  This is good, in
+# case we ever need to change the way we modify ssl.load.
+if [ -f "@@APACHE_CONFDIR@@/ssl.load" ]; then
+  # Don't do anything if the magic "MOD_SPDY" marker is already present in the
+  # file; this helps ensure that this prerm script is idempotent.  See
+  # http://www.debian.org/doc/debian-policy/ch-maintainerscripts.html#s-idempotency
+  # for why this is important.
+  if ! grep -q 'MOD_SPDY' @@APACHE_CONFDIR@@/ssl.load; then
+    # First, comment out all lines in the file, using a special prefix.  We
+    # will look for that prefix later when we uninstall.
+    sed --in-place 's/^.*$/#ORIG# &/' @@APACHE_CONFDIR@@/ssl.load
+    # Next, append a new LoadModule line to the file, with some explanitory
+    # comments.  The first line we append contains the magic marker "MOD_SPDY",
+    # which we look for in the prerm script so that we can remove the below
+    # text when we uninstall.
+    cat >> @@APACHE_CONFDIR@@/ssl.load <<EOF
+########## MOD_SPDY CHANGES BELOW ##########
+# If mod_spdy is uninstalled, this file will be restored to its original form
+# by deleting everything below here and uncommenting everything above.
+
+# Using mod_spdy requires using a patched version of mod_ssl that provides
+# hooks into the Next Protocol Negotiation (NPN) data from the SSL handshake.
+# Thus, the mod_spdy package installs mod_ssl_with_npn.so, which is exactly
+# mod_ssl but with the following (small) patch applied:
+#   https://issues.apache.org/bugzilla/attachment.cgi?id=27969
+
+LoadModule ssl_module @@APACHE_MODULEDIR@@/mod_ssl_with_npn.so
+EOF
+  fi
+fi
+
+exit 0

Propchange: httpd/httpd/trunk/modules/spdy/support/install/debian/postinst
------------------------------------------------------------------------------
    svn:executable = *

Added: httpd/httpd/trunk/modules/spdy/support/install/debian/postrm
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/spdy/support/install/debian/postrm?rev=1590597&view=auto
==============================================================================
--- httpd/httpd/trunk/modules/spdy/support/install/debian/postrm (added)
+++ httpd/httpd/trunk/modules/spdy/support/install/debian/postrm Mon Apr 28 10:55:17 2014
@@ -0,0 +1,27 @@
+#!/bin/sh
+#
+# Copyright (c) 2009 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+action="$1"
+
+# Only do complete clean-up on purge.
+if [ "$action" != "purge" ] ; then
+  exit 0
+fi
+
+@@include@@../common/apt.include
+
+# Only remove the defaults file if it is not empty. An empty file was probably
+# put there by the sysadmin to disable automatic repository configuration, as
+# per the instructions on the package download page.
+if [ -s "$DEFAULTS_FILE" ]; then
+  # Make sure the package defaults are removed before the repository config,
+  # otherwise it could result in the repository config being removed, but the
+  # package defaults remain and are set to not recreate the repository config.
+  # In that case, future installs won't recreate it and won't get auto-updated.
+  rm "$DEFAULTS_FILE" || exit 1
+fi
+# Remove any Google repository added by the package.
+clean_sources_lists

Propchange: httpd/httpd/trunk/modules/spdy/support/install/debian/postrm
------------------------------------------------------------------------------
    svn:executable = *

Added: httpd/httpd/trunk/modules/spdy/support/install/debian/preinst
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/spdy/support/install/debian/preinst?rev=1590597&view=auto
==============================================================================
--- httpd/httpd/trunk/modules/spdy/support/install/debian/preinst (added)
+++ httpd/httpd/trunk/modules/spdy/support/install/debian/preinst Mon Apr 28 10:55:17 2014
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+exit 0

Added: httpd/httpd/trunk/modules/spdy/support/install/debian/prerm
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/spdy/support/install/debian/prerm?rev=1590597&view=auto
==============================================================================
--- httpd/httpd/trunk/modules/spdy/support/install/debian/prerm (added)
+++ httpd/httpd/trunk/modules/spdy/support/install/debian/prerm Mon Apr 28 10:55:17 2014
@@ -0,0 +1,41 @@
+#!/bin/sh
+
+case "$1" in
+    remove)
+        test -e /etc/apache2/mods-enabled/spdy.load && a2dismod spdy
+    ;;
+    upgrade|deconfigure|failed-upgrade)
+    ;;
+    *)
+        echo "prerm called with unknown argument \`$1'" >&2
+        exit 1
+    ;;
+esac
+
+set -e  # If any command fails from here on, the whole scripts fails.
+
+# Regardless of the argument prerm is called with, we should undo our changes
+# to ssl.load.  If we're upgrading to a newer version of mod_spdy, the new
+# package will redo its changes to ssl.load in its postinst script.  See
+# http://www.debian.org/doc/debian-policy/ch-maintainerscripts.html#s-unpackphase
+# for details.
+if [ -f "@@APACHE_CONFDIR@@/ssl.load" ]; then
+  # Don't do anything if we don't see the magic "MOD_SPDY" marker; this helps
+  # ensure that this prerm script is idempotent.  See
+  # http://www.debian.org/doc/debian-policy/ch-maintainerscripts.html#s-idempotency
+  # for why this is important.
+  if grep -q 'MOD_SPDY' @@APACHE_CONFDIR@@/ssl.load; then
+    # First, we uncomment any line that starts with "#ORIG# " (we use that
+    # particular prefix, to reduce the chances that we break the file if the
+    # user has added their own comments to the file for some reason), up until
+    # we see the "MOD_SPDY" marker.  Second, we delete the line containing the
+    # "MOD_SPDY" marker and all lines thereafter, thus removing the stuff we
+    # appended to the file in the postinst script.
+    sed --in-place \
+      -e '1,/MOD_SPDY/ s/^#ORIG# \(.*\)$/\1/' \
+      -e '/MOD_SPDY/,$ d' \
+      @@APACHE_CONFDIR@@/ssl.load
+  fi
+fi
+
+exit 0

Propchange: httpd/httpd/trunk/modules/spdy/support/install/debian/prerm
------------------------------------------------------------------------------
    svn:executable = *

Added: httpd/httpd/trunk/modules/spdy/support/install/rpm/build.sh
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/spdy/support/install/rpm/build.sh?rev=1590597&view=auto
==============================================================================
--- httpd/httpd/trunk/modules/spdy/support/install/rpm/build.sh (added)
+++ httpd/httpd/trunk/modules/spdy/support/install/rpm/build.sh Mon Apr 28 10:55:17 2014
@@ -0,0 +1,238 @@
+#!/bin/bash
+#
+# Copyright (c) 2009 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+set -e
+if [ "$VERBOSE" ]; then
+  set -x
+fi
+set -u
+
+gen_spec() {
+  rm -f "${SPEC}"
+  process_template "${SCRIPTDIR}/mod-spdy.spec.template" "${SPEC}"
+}
+
+# Setup the installation directory hierachy in the package staging area.
+prep_staging_rpm() {
+  prep_staging_common
+  install -m 755 -d "${STAGEDIR}/etc/cron.daily"
+}
+
+# Put the package contents in the staging area.
+stage_install_rpm() {
+  prep_staging_rpm
+  stage_install_common
+  echo "Staging RPM install files in '${STAGEDIR}'..."
+  process_template "${BUILDDIR}/install/common/rpmrepo.cron" \
+    "${STAGEDIR}/etc/cron.daily/${PACKAGE}"
+  chmod 755 "${STAGEDIR}/etc/cron.daily/${PACKAGE}"
+
+  # For CentOS, the load and conf files are combined into a single
+  # 'conf' file. So we install the load template as the conf file, and
+  # then concatenate the actual conf file.
+  process_template "${BUILDDIR}/install/common/spdy.load.template" \
+    "${STAGEDIR}${APACHE_CONFDIR}/spdy.conf"
+  process_template "${BUILDDIR}/install/common/spdy.conf.template" \
+    "${BUILDDIR}/install/common/spdy.conf"
+  cat "${BUILDDIR}/install/common/spdy.conf" >> \
+    "${STAGEDIR}${APACHE_CONFDIR}/spdy.conf"
+  chmod 644 "${STAGEDIR}${APACHE_CONFDIR}/spdy.conf"
+
+  # Our conf file for loading mod_ssl_with_npn.so must come alphabetically
+  # before the built-in ssl.conf file, so we can't call it "ssl_with_npn.conf".
+  # Since all it will do is load the module (not configure it),
+  # "load_ssl_with_npn.conf" seems like an appropriate name.
+  process_template "${BUILDDIR}/install/common/ssl.load.template" \
+    "${STAGEDIR}${APACHE_CONFDIR}/load_ssl_with_npn.conf"
+  chmod 644 "${STAGEDIR}${APACHE_CONFDIR}/load_ssl_with_npn.conf"
+}
+
+# Actually generate the package file.
+do_package() {
+  echo "Packaging ${HOST_ARCH}..."
+  PROVIDES="${PACKAGE}"
+  local REPS="$REPLACES"
+  REPLACES=""
+  for rep in $REPS; do
+    if [ -z "$REPLACES" ]; then
+      REPLACES="$PACKAGE-$rep"
+    else
+      REPLACES="$REPLACES $PACKAGE-$rep"
+    fi
+  done
+
+  # If we specify a dependecy of foo.so below, we would depend on both the
+  # 32 and 64-bit versions on a 64-bit machine. The current version of RPM
+  # we use is too old and doesn't provide %{_isa}, so we do this manually.
+  if [ "$HOST_ARCH" = "x86_64" ] ; then
+    local EMPTY_VERSION="()"
+    local PKG_ARCH="(64bit)"
+  elif [ "$HOST_ARCH" = "i386" ] ; then
+    local EMPTY_VERSION=""
+    local PKG_ARCH=""
+  fi
+
+  DEPENDS="httpd >= 2.2.4, \
+  mod_ssl >= 2.2, \
+  libstdc++ >= 4.1.2, \
+  at"
+  gen_spec
+
+  # Create temporary rpmbuild dirs.
+  RPMBUILD_DIR=$(mktemp -d -t rpmbuild.XXXXXX) || exit 1
+  mkdir -p "$RPMBUILD_DIR/BUILD"
+  mkdir -p "$RPMBUILD_DIR/RPMS"
+
+  rpmbuild --buildroot="$RPMBUILD_DIR/BUILD" -bb \
+    --target="$HOST_ARCH" --rmspec \
+    --define "_topdir $RPMBUILD_DIR" \
+    --define "_binary_payload w9.bzdio" \
+    "${SPEC}"
+  PKGNAME="${PACKAGE}-${CHANNEL}-${VERSION}-${REVISION}"
+  mv "$RPMBUILD_DIR/RPMS/$HOST_ARCH/${PKGNAME}.${HOST_ARCH}.rpm" "${OUTPUTDIR}"
+  # Make sure the package is world-readable, otherwise it causes problems when
+  # copied to share drive.
+  chmod a+r "${OUTPUTDIR}/${PKGNAME}.$HOST_ARCH.rpm"
+  rm -rf "$RPMBUILD_DIR"
+}
+
+# Remove temporary files and unwanted packaging output.
+cleanup() {
+  rm -rf "${STAGEDIR}"
+  rm -rf "${TMPFILEDIR}"
+}
+
+usage() {
+  echo "usage: $(basename $0) [-c channel] [-a target_arch] [-o 'dir'] [-b 'dir']"
+  echo "-c channel the package channel (unstable, beta, stable)"
+  echo "-a arch    package architecture (ia32 or x64)"
+  echo "-o dir     package output directory [${OUTPUTDIR}]"
+  echo "-b dir     build input directory    [${BUILDDIR}]"
+  echo "-h         this help message"
+}
+
+# Check that the channel name is one of the allowable ones.
+verify_channel() {
+  case $CHANNEL in
+    stable )
+      CHANNEL=stable
+      REPLACES="unstable beta"
+      ;;
+    unstable|dev|alpha )
+      CHANNEL=unstable
+      REPLACES="stable beta"
+      ;;
+    testing|beta )
+      CHANNEL=beta
+      REPLACES="unstable stable"
+      ;;
+    * )
+      echo
+      echo "ERROR: '$CHANNEL' is not a valid channel type."
+      echo
+      exit 1
+      ;;
+  esac
+}
+
+process_opts() {
+  while getopts ":o:b:c:a:h" OPTNAME
+  do
+    case $OPTNAME in
+      o )
+        OUTPUTDIR="$OPTARG"
+        mkdir -p "${OUTPUTDIR}"
+        ;;
+      b )
+        BUILDDIR=$(readlink -f "${OPTARG}")
+        ;;
+      c )
+        CHANNEL="$OPTARG"
+        verify_channel
+        ;;
+      a )
+        TARGETARCH="$OPTARG"
+        ;;
+      h )
+        usage
+        exit 0
+        ;;
+      \: )
+        echo "'-$OPTARG' needs an argument."
+        usage
+        exit 1
+        ;;
+      * )
+        echo "invalid command-line option: $OPTARG"
+        usage
+        exit 1
+        ;;
+    esac
+  done
+}
+
+#=========
+# MAIN
+#=========
+
+SCRIPTDIR=$(readlink -f "$(dirname "$0")")
+OUTPUTDIR="${PWD}"
+STAGEDIR=$(mktemp -d -t rpm.build.XXXXXX) || exit 1
+TMPFILEDIR=$(mktemp -d -t rpm.tmp.XXXXXX) || exit 1
+CHANNEL="beta"
+# Default target architecture to same as build host.
+if [ "$(uname -m)" = "x86_64" ]; then
+  TARGETARCH="x64"
+else
+  TARGETARCH="ia32"
+fi
+SPEC="${TMPFILEDIR}/mod-spdy.spec"
+
+# call cleanup() on exit
+trap cleanup 0
+process_opts "$@"
+if [ ! "$BUILDDIR" ]; then
+  BUILDDIR=$(readlink -f "${SCRIPTDIR}/../../out/Release")
+fi
+
+source ${BUILDDIR}/install/common/installer.include
+
+get_version_info
+
+source "${BUILDDIR}/install/common/mod-spdy.info"
+eval $(sed -e "s/^\([^=]\+\)=\(.*\)$/export \1='\2'/" \
+  "${BUILDDIR}/install/common/BRANDING")
+
+REPOCONFIG="http://dl.google.com/linux/${PACKAGE#google-}/rpm/stable"
+verify_channel
+
+APACHE_CONFDIR="/etc/httpd/conf.d"
+APACHE_USER="apache"
+COMMENT_OUT_DEFLATE=
+
+# Make everything happen in the OUTPUTDIR.
+cd "${OUTPUTDIR}"
+
+case "$TARGETARCH" in
+  ia32 )
+    export APACHE_MODULEDIR="/usr/lib/httpd/modules"
+    export HOST_ARCH="i386"
+    stage_install_rpm
+    ;;
+  x64 )
+    export APACHE_MODULEDIR="/usr/lib64/httpd/modules"
+    export HOST_ARCH="x86_64"
+    stage_install_rpm
+    ;;
+  * )
+    echo
+    echo "ERROR: Don't know how to build RPMs for '$TARGETARCH'."
+    echo
+    exit 1
+    ;;
+esac
+
+do_package "$HOST_ARCH"

Propchange: httpd/httpd/trunk/modules/spdy/support/install/rpm/build.sh
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpd/httpd/trunk/modules/spdy/support/install/rpm/build.sh
------------------------------------------------------------------------------
    svn:executable = *

Added: httpd/httpd/trunk/modules/spdy/support/install/rpm/mod-spdy.spec.template
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/spdy/support/install/rpm/mod-spdy.spec.template?rev=1590597&view=auto
==============================================================================
--- httpd/httpd/trunk/modules/spdy/support/install/rpm/mod-spdy.spec.template (added)
+++ httpd/httpd/trunk/modules/spdy/support/install/rpm/mod-spdy.spec.template Mon Apr 28 10:55:17 2014
@@ -0,0 +1,179 @@
+#------------------------------------------------------------------------------
+#   mod-spdy.spec
+#------------------------------------------------------------------------------
+
+#------------------------------------------------------------------------------
+#   Prologue information
+#------------------------------------------------------------------------------
+Summary         : @@SHORTDESC@@
+License         : Apache Software License
+Name            : @@PACKAGE@@-@@CHANNEL@@
+Version         : @@VERSION@@
+Release         : @@REVISION@@
+Group           : System Environment/Daemons
+Vendor          : @@COMPANY_FULLNAME@@
+Url             : @@PRODUCTURL@@
+Packager        : @@MAINTNAME@@ <@@MAINTMAIL@@>
+
+#------------------------------------------------------------------------------
+# Tested on:
+# TODO
+#------------------------------------------------------------------------------
+
+Provides        : @@PROVIDES@@ = %{version}
+Requires        : @@DEPENDS@@
+Conflicts       : @@REPLACES@@
+
+#------------------------------------------------------------------------------
+#   Description
+#------------------------------------------------------------------------------
+%Description
+@@FULLDESC@@
+
+#------------------------------------------------------------------------------
+#   Build rule - How to make the package
+#------------------------------------------------------------------------------
+%build
+
+#------------------------------------------------------------------------------
+#       Installation rule - how to install it (note that it
+#   gets installed into a temp directory given by $RPM_BUILD_ROOT)
+#------------------------------------------------------------------------------
+%install
+rm -rf "$RPM_BUILD_ROOT"
+
+if [ -z "@@STAGEDIR@@" -o ! -d "@@STAGEDIR@@" ] ; then
+    echo "@@STAGEDIR@@ appears to be incorrectly set - aborting"
+    exit 1
+fi
+
+install -m 755 -d \
+  "$RPM_BUILD_ROOT/etc" \
+  "$RPM_BUILD_ROOT/usr"
+# This is hard coded for now
+cp -a "@@STAGEDIR@@/etc/" "$RPM_BUILD_ROOT/"
+cp -a "@@STAGEDIR@@/usr/" "$RPM_BUILD_ROOT/"
+
+#------------------------------------------------------------------------------
+#   Rule to clean up a build
+#------------------------------------------------------------------------------
+%clean
+rm -rf "$RPM_BUILD_ROOT"
+
+#------------------------------------------------------------------------------
+#   Files listing.
+#------------------------------------------------------------------------------
+%files
+%defattr(-,root,root)
+@@APACHE_MODULEDIR@@/mod_spdy.so
+@@APACHE_MODULEDIR@@/mod_ssl_with_npn.so
+%config(noreplace) @@APACHE_CONFDIR@@/spdy.conf
+%config @@APACHE_CONFDIR@@/load_ssl_with_npn.conf
+/etc/cron.daily/mod-spdy
+
+#------------------------------------------------------------------------------
+#   Pre install script
+#------------------------------------------------------------------------------
+%pre
+
+exit 0
+
+#------------------------------------------------------------------------------
+#   Post install script
+#------------------------------------------------------------------------------
+%post
+
+@@include@@../common/rpm.include
+
+MODSPDY_ENABLE_UPDATES=@@MODSPDY_ENABLE_UPDATES@@
+
+DEFAULTS_FILE="/etc/default/@@PACKAGE@@"
+if [ -n "${MODSPDY_ENABLE_UPDATES}" -a ! -e "$DEFAULTS_FILE" ]; then
+  echo 'repo_add_once="true"' > "$DEFAULTS_FILE"
+fi
+
+if [ -e "$DEFAULTS_FILE" ]; then
+. "$DEFAULTS_FILE"
+
+if [ "$repo_add_once" = "true" ]; then
+  determine_rpm_package_manager
+
+  case $PACKAGEMANAGER in
+  "yum")
+    install_yum
+    ;;
+  "urpmi")
+    install_urpmi
+    ;;
+  "yast")
+    install_yast
+    ;;
+  esac
+fi
+
+# Some package managers have locks that prevent everything from being
+# configured at install time, so wait a bit then kick the cron job to do
+# whatever is left. Probably the db will be unlocked by then, but if not, the
+# cron job will keep retrying.
+# Do this with 'at' instead of a backgrounded shell because zypper waits on all
+# sub-shells to finish before it finishes, which is exactly the opposite of
+# what we want here. Also preemptively start atd because for some reason it's
+# not always running, which kind of defeats the purpose of having 'at' as a
+# required LSB command.
+service atd start
+echo "sh /etc/cron.daily/@@PACKAGE@@" | at now + 2 minute
+fi
+
+# Turn off loading of the normal mod_ssl.so:
+sed --in-place \
+  's/^ *LoadModule \+ssl_module .*$/#& # See load_ssl_with_npn.conf/' \
+  @@APACHE_CONFDIR@@/ssl.conf
+
+exit 0
+
+
+#------------------------------------------------------------------------------
+#   Pre uninstallation script
+#------------------------------------------------------------------------------
+%preun
+
+if [ "$1" -eq "0" ]; then
+  mode="uninstall"
+elif [ "$1" -eq "1" ]; then
+  mode="upgrade"
+fi
+
+@@include@@../common/rpm.include
+
+# On Debian we only remove when we purge. However, RPM has no equivalent to
+# dpkg --purge, so this is all disabled.
+#
+#determine_rpm_package_manager
+#
+#case $PACKAGEMANAGER in
+#"yum")
+#  remove_yum
+#  ;;
+#"urpmi")
+#  remove_urpmi
+#  ;;
+#"yast")
+#  remove_yast
+#  ;;
+#esac
+
+if [ "$mode" == "uninstall" ]; then
+  # Re-enable loading of the normal mod_ssl.so:
+  sed --in-place \
+    's/^#\( *LoadModule.*[^ ]\) *# See load_ssl_with_npn.conf$/\1/' \
+    @@APACHE_CONFDIR@@/ssl.conf
+fi
+
+exit 0
+
+#------------------------------------------------------------------------------
+#   Post uninstallation script
+#------------------------------------------------------------------------------
+%postun
+
+exit 0

Added: httpd/httpd/trunk/modules/spdy/support/net/net.gyp
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/spdy/support/net/net.gyp?rev=1590597&view=auto
==============================================================================
--- httpd/httpd/trunk/modules/spdy/support/net/net.gyp (added)
+++ httpd/httpd/trunk/modules/spdy/support/net/net.gyp Mon Apr 28 10:55:17 2014
@@ -0,0 +1,51 @@
+# Copyright (c) 2009 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+{
+  'variables': {
+    'chromium_code': 1,
+    'chromium_root': '<(DEPTH)/third_party/chromium/src',
+  },
+  'targets': [
+    {
+      'target_name': 'instaweb_util',
+      'type': '<(library)',
+      'dependencies': [
+        '<(DEPTH)/base/base.gyp:base',
+      ],
+      'include_dirs': [
+        '<(DEPTH)',
+      ],
+      'export_dependent_settings': [
+        '<(DEPTH)/base/base.gyp:base',
+      ],
+      'sources': [
+        # TODO(mdsteele): Add sources here as we need them.
+        'instaweb/util/function.cc',
+      ],
+    },
+    {
+      'target_name': 'spdy',
+      'type': '<(library)',
+      'dependencies': [
+        '<(DEPTH)/base/base.gyp:base',
+        '<(DEPTH)/third_party/zlib/zlib.gyp:zlib',
+      ],
+      'export_dependent_settings': [
+        '<(DEPTH)/base/base.gyp:base',
+      ],
+      'include_dirs': [
+        '<(DEPTH)',
+        '<(chromium_root)',
+      ],
+      'sources': [
+        '<(chromium_root)/net/spdy/buffered_spdy_framer.cc',
+        '<(chromium_root)/net/spdy/spdy_frame_builder.cc',
+        '<(chromium_root)/net/spdy/spdy_frame_reader.cc',
+        '<(chromium_root)/net/spdy/spdy_framer.cc',
+        '<(chromium_root)/net/spdy/spdy_protocol.cc',
+      ],
+    },
+  ],
+}

Added: httpd/httpd/trunk/modules/spdy/support/scripts/loadtest.py
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/spdy/support/scripts/loadtest.py?rev=1590597&view=auto
==============================================================================
--- httpd/httpd/trunk/modules/spdy/support/scripts/loadtest.py (added)
+++ httpd/httpd/trunk/modules/spdy/support/scripts/loadtest.py Mon Apr 28 10:55:17 2014
@@ -0,0 +1,187 @@
+#!/usr/bin/env python
+
+# Copyright 2012 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# A simple script for load-testing mod_spdy (or any other SPDY server).  For
+# example, to hit the server with 150 simultaneous SPDY clients, each fetching
+# the URLs https://example.com/ and https://example.com/image.jpg, you would
+# run:
+#
+#  $ ./loadtest.py spdy 150 https://example.com/ https://example.com/image.jpg
+#
+# To run the same test with plain HTTPS clients instead of SPDY clients (for
+# comparison), you would run:
+#
+#  $ ./loadtest.py https 150 https://example.com/ https://example.com/image.jpg
+#
+# Press Ctrl-C to stop the test.
+#
+# You must have spdycat (https://github.com/tatsuhiro-t/spdylay) installed and
+# on your $PATH in order to run SPDY tests, and you must have curl installed in
+# order to run HTTPS or HTTP tests.
+
+from __future__ import division  # Always convert ints to floats for / operator
+from __future__ import print_function  # Treat print as function, not keyword
+
+import re
+import subprocess
+import sys
+import time
+
+#=============================================================================#
+
+def print_usage_and_quit():
+  sys.stderr.write('Usage: {0} TYPE MAX_CLIENTS URL...\n'.format(sys.argv[0]))
+  sys.stderr.write('TYPE must be one of "spdy", "https", or "http"\n')
+  sys.stderr.write('MAX_CLIENTS must be a positive integer\n')
+  sys.exit(1)
+
+def with_scheme(url, scheme):
+  """Given a URL string, return a new URL string with the given scheme."""
+  if re.match(r'^[a-zA-Z0-9]+:', url):
+    return re.sub(r'^[a-zA-Z0-9]+:', scheme + ':', url)
+  elif url.startswith('//'):
+    return scheme + ':' + url
+  else:
+    return scheme + '://' + url
+
+
+class ClientProcess (object):
+  """A client subprocess that will try to load the URLs from the server."""
+
+  def __init__(self, key, command, factory):
+    self.__key = key
+    self.__child = subprocess.Popen(command, stdout=open('/dev/null', 'wb'))
+    self.__start_time = time.time()
+    self.__factory = factory
+
+  def get_key(self):
+    return self.__key
+
+  def get_start_time(self):
+    return self.__start_time
+
+  def check_done(self):
+    """If the client is done, print time and return True, else return False."""
+    code = self.__child.poll()
+    if code is None:
+      return False
+    else:
+      duration = time.time() - self.__start_time
+      self.__factory._client_finished(self.__key, code, duration)
+      return True
+
+  def kill(self):
+    """Shut down this client."""
+    self.__child.kill()
+
+
+class ClientFactory (object):
+  """A factory for ClientProcess objects, that also tracks stats."""
+
+  def __init__(self, command):
+    """Create a factory that will use the given command for subprocesses."""
+    self.__command = command
+    self.num_started = 0
+    self.num_finished = 0
+    self.max_duration = 0.0
+    self.total_duration = 0.0
+
+  def new_client(self):
+    """Create and return a new ClientProcess."""
+    self.num_started += 1
+    return ClientProcess(key=self.num_started, command=self.__command,
+                         factory=self)
+
+  def _client_finished(self, key, code, duration):
+    """Called by each ClientProcess when it finishes."""
+    self.num_finished += 1
+    self.max_duration = max(self.max_duration, duration)
+    self.total_duration += duration
+    print('Client {0} exit {1} after {2:.3f}s'.format(key, code, duration))
+
+#=============================================================================#
+
+if len(sys.argv) < 4:
+  print_usage_and_quit()
+
+# Determine what type of test we're doing and what URL scheme to use.
+TYPE = sys.argv[1].lower()
+if TYPE not in ['spdy', 'https', 'http']:
+  print_usage_and_quit()
+SCHEME = 'https' if TYPE == 'spdy' else TYPE
+
+# Determine how many clients to have at once.
+try:
+  MAX_CLIENTS = int(sys.argv[2])
+except ValueError:
+  print_usage_and_quit()
+if MAX_CLIENTS < 1:
+  print_usage_and_quit()
+
+# Collect the URLs to fetch from.
+URLS = []
+for url in sys.argv[3:]:
+  URLS.append(with_scheme(url, SCHEME))
+
+# Put together the subprocess command to issue for each client.
+if TYPE == 'spdy':
+  # The -n flag tells spdycat throw away the downloaded data without saving it.
+  COMMAND = ['spdycat', '-n'] + URLS
+else:
+  # The -s flag tells curl to be silent (don't display progress meter); the -k
+  # flag tells curl to ignore certificate errors (e.g. self-signed certs).
+  COMMAND = ['curl', '-sk'] + URLS
+
+# Print out a summary of the test we'll be doing before we start.
+print('TYPE={0}'.format(TYPE))
+print('URLS ({0}):'.format(len(URLS)))
+for url in URLS:
+    print('  ' + url)
+print('MAX_CLIENTS={0}'.format(MAX_CLIENTS))
+
+# Run the test.
+factory = ClientFactory(COMMAND)
+clients = []
+try:
+  # Start us off with an initial batch of clients.
+  for index in xrange(MAX_CLIENTS):
+    clients.append(factory.new_client())
+  # Each time a client finishes, replace it with a new client.
+  # TODO(mdsteele): This is a busy loop, which isn't great.  What we want is to
+  #   sleep until one or more children are done.  Maybe we could do something
+  #   clever that would allow us to do a select() call here or something.
+  while True:
+    for index in xrange(MAX_CLIENTS):
+      if clients[index].check_done():
+        clients[index] = factory.new_client()
+# Stop when the user hits Ctrl-C, and print a summary of the results.
+except KeyboardInterrupt:
+  print()
+  if clients:
+    slowpoke = min(clients, key=(lambda c: c.get_key()))
+    print('Earliest unfinished client, {0}, not done after {1:.3f}s'.format(
+        slowpoke.get_key(), time.time() - slowpoke.get_start_time()))
+  if factory.num_finished > 0:
+    print('Avg time per client: {0:.3f}s ({1} started, {2} completed)'.format(
+        factory.total_duration / factory.num_finished,
+        factory.num_started, factory.num_finished))
+    print('Max time per client: {0:.3f}s'.format(factory.max_duration))
+    print("URLs served per second: {0:.3f}".format(
+        factory.num_finished * len(URLS) / factory.total_duration))
+for client in clients:
+  client.kill()
+
+#=============================================================================#

Propchange: httpd/httpd/trunk/modules/spdy/support/scripts/loadtest.py
------------------------------------------------------------------------------
    svn:eol-style = native

Added: httpd/httpd/trunk/modules/spdy/support/scripts/mod_ssl_with_npn.patch
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/spdy/support/scripts/mod_ssl_with_npn.patch?rev=1590597&view=auto
==============================================================================
--- httpd/httpd/trunk/modules/spdy/support/scripts/mod_ssl_with_npn.patch (added)
+++ httpd/httpd/trunk/modules/spdy/support/scripts/mod_ssl_with_npn.patch Mon Apr 28 10:55:17 2014
@@ -0,0 +1,235 @@
+Index: modules/ssl/ssl_private.h
+===================================================================
+--- modules/ssl/ssl_private.h	(revision 1585744)
++++ modules/ssl/ssl_private.h	(working copy)
+@@ -653,6 +653,7 @@
+ #ifndef OPENSSL_NO_TLSEXT
+ int          ssl_callback_ServerNameIndication(SSL *, int *, modssl_ctx_t *);
+ #endif
++int ssl_callback_AdvertiseNextProtos(SSL *ssl, const unsigned char **data, unsigned int *len, void *arg);
+ 
+ /**  Session Cache Support  */
+ void         ssl_scache_init(server_rec *, apr_pool_t *);
+Index: modules/ssl/ssl_engine_init.c
+===================================================================
+--- modules/ssl/ssl_engine_init.c	(revision 1585744)
++++ modules/ssl/ssl_engine_init.c	(working copy)
+@@ -654,6 +654,11 @@
+ #endif
+ 
+     SSL_CTX_set_info_callback(ctx, ssl_callback_Info);
++
++#ifdef HAVE_TLS_NPN
++    SSL_CTX_set_next_protos_advertised_cb(
++        ctx, ssl_callback_AdvertiseNextProtos, NULL);
++#endif
+ }
+ 
+ static void ssl_init_ctx_verify(server_rec *s,
+Index: modules/ssl/ssl_engine_io.c
+===================================================================
+--- modules/ssl/ssl_engine_io.c	(revision 1585744)
++++ modules/ssl/ssl_engine_io.c	(working copy)
+@@ -338,6 +338,7 @@
+     apr_pool_t *pool;
+     char buffer[AP_IOBUFSIZE];
+     ssl_filter_ctx_t *filter_ctx;
++    int npn_finished;  /* 1 if NPN has finished, 0 otherwise */
+ } bio_filter_in_ctx_t;
+ 
+ /*
+@@ -1451,6 +1452,27 @@
+         APR_BRIGADE_INSERT_TAIL(bb, bucket);
+     }
+ 
++#ifdef HAVE_TLS_NPN
++    /* By this point, Next Protocol Negotiation (NPN) should be completed (if
++     * our version of OpenSSL supports it).  If we haven't already, find out
++     * which protocol was decided upon and inform other modules by calling
++     * npn_proto_negotiated_hook. */
++    if (!inctx->npn_finished) {
++        const unsigned char *next_proto = NULL;
++        unsigned next_proto_len = 0;
++
++        SSL_get0_next_proto_negotiated(
++            inctx->ssl, &next_proto, &next_proto_len);
++        ap_log_cerror(APLOG_MARK, APLOG_DEBUG, APR_SUCCESS, f->c,
++                      "SSL NPN negotiated protocol: '%s'",
++                      apr_pstrmemdup(f->c->pool, (const char*)next_proto,
++                                     next_proto_len));
++        modssl_run_npn_proto_negotiated_hook(
++            f->c, (const char*)next_proto, next_proto_len);
++        inctx->npn_finished = 1;
++    }
++#endif
++
+     return APR_SUCCESS;
+ }
+ 
+@@ -1795,6 +1817,7 @@
+     inctx->block = APR_BLOCK_READ;
+     inctx->pool = c->pool;
+     inctx->filter_ctx = filter_ctx;
++    inctx->npn_finished = 0;
+ }
+ 
+ void ssl_io_filter_init(conn_rec *c, SSL *ssl)
+Index: modules/ssl/ssl_engine_kernel.c
+===================================================================
+--- modules/ssl/ssl_engine_kernel.c	(revision 1585744)
++++ modules/ssl/ssl_engine_kernel.c	(working copy)
+@@ -2141,3 +2141,84 @@
+     return 0;
+ }
+ #endif
++
++#ifdef HAVE_TLS_NPN
++/*
++ * This callback function is executed when SSL needs to decide what protocols
++ * to advertise during Next Protocol Negotiation (NPN).  It must produce a
++ * string in wire format -- a sequence of length-prefixed strings -- indicating
++ * the advertised protocols.  Refer to SSL_CTX_set_next_protos_advertised_cb
++ * in OpenSSL for reference.
++ */
++int ssl_callback_AdvertiseNextProtos(SSL *ssl, const unsigned char **data_out,
++                                     unsigned int *size_out, void *arg)
++{
++    conn_rec *c = (conn_rec*)SSL_get_app_data(ssl);
++    apr_array_header_t *protos;
++    int num_protos;
++    unsigned int size;
++    int i;
++    unsigned char *data;
++    unsigned char *start;
++
++    *data_out = NULL;
++    *size_out = 0;
++
++    /* If the connection object is not available, then there's nothing for us
++     * to do. */
++    if (c == NULL) {
++        return SSL_TLSEXT_ERR_OK;
++    }
++
++    /* Invoke our npn_advertise_protos hook, giving other modules a chance to
++     * add alternate protocol names to advertise. */
++    protos = apr_array_make(c->pool, 0, sizeof(char*));
++    modssl_run_npn_advertise_protos_hook(c, protos);
++    num_protos = protos->nelts;
++
++    /* We now have a list of null-terminated strings; we need to concatenate
++     * them together into a single string, where each protocol name is prefixed
++     * by its length.  First, calculate how long that string will be. */
++    size = 0;
++    for (i = 0; i < num_protos; ++i) {
++        const char *string = APR_ARRAY_IDX(protos, i, const char*);
++        unsigned int length = strlen(string);
++        /* If the protocol name is too long (the length must fit in one byte),
++         * then log an error and skip it. */
++        if (length > 255) {
++            ap_log_cerror(APLOG_MARK, APLOG_ERR, 0, c,
++                          "SSL NPN protocol name too long (length=%u): %s",
++                          length, string);
++            continue;
++        }
++        /* Leave room for the length prefix (one byte) plus the protocol name
++         * itself. */
++        size += 1 + length;
++    }
++
++    /* If there is nothing to advertise (either because no modules added
++     * anything to the protos array, or because all strings added to the array
++     * were skipped), then we're done. */
++    if (size == 0) {
++        return SSL_TLSEXT_ERR_OK;
++    }
++
++    /* Now we can build the string.  Copy each protocol name string into the
++     * larger string, prefixed by its length. */
++    data = apr_palloc(c->pool, size * sizeof(unsigned char));
++    start = data;
++    for (i = 0; i < num_protos; ++i) {
++        const char *string = APR_ARRAY_IDX(protos, i, const char*);
++        apr_size_t length = strlen(string);
++        *start = (unsigned char)length;
++        ++start;
++        memcpy(start, string, length * sizeof(unsigned char));
++        start += length;
++    }
++
++    /* Success. */
++    *data_out = data;
++    *size_out = size;
++    return SSL_TLSEXT_ERR_OK;
++}
++#endif
+Index: modules/ssl/mod_ssl.c
+===================================================================
+--- modules/ssl/mod_ssl.c	(revision 1585744)
++++ modules/ssl/mod_ssl.c	(working copy)
+@@ -237,6 +237,18 @@
+     AP_END_CMD
+ };
+ 
++/* Implement 'modssl_run_npn_advertise_protos_hook'. */
++APR_IMPLEMENT_OPTIONAL_HOOK_RUN_ALL(
++    modssl, AP, int, npn_advertise_protos_hook,
++    (conn_rec *connection, apr_array_header_t *protos),
++    (connection, protos), OK, DECLINED);
++
++/* Implement 'modssl_run_npn_proto_negotiated_hook'. */
++APR_IMPLEMENT_OPTIONAL_HOOK_RUN_ALL(
++    modssl, AP, int, npn_proto_negotiated_hook,
++    (conn_rec *connection, const char *proto_name, apr_size_t proto_name_len),
++    (connection, proto_name, proto_name_len), OK, DECLINED);
++
+ /*
+  *  the various processing hooks
+  */
+Index: modules/ssl/mod_ssl.h
+===================================================================
+--- modules/ssl/mod_ssl.h	(revision 1585744)
++++ modules/ssl/mod_ssl.h	(working copy)
+@@ -60,5 +60,26 @@
+ 
+ APR_DECLARE_OPTIONAL_FN(apr_array_header_t *, ssl_extlist_by_oid, (request_rec *r, const char *oidstr));
+ 
++/** The npn_advertise_protos optional hook allows other modules to add entries
++ * to the list of protocol names advertised by the server during the Next
++ * Protocol Negotiation (NPN) portion of the SSL handshake.  The hook callee is
++ * given the connection and an APR array; it should push one or more char*'s
++ * pointing to null-terminated strings (such as "http/1.1" or "spdy/2") onto
++ * the array and return OK, or do nothing and return DECLINED. */
++APR_DECLARE_EXTERNAL_HOOK(modssl, AP, int, npn_advertise_protos_hook,
++                          (conn_rec *connection, apr_array_header_t *protos));
++
++/** The npn_proto_negotiated optional hook allows other modules to discover the
++ * name of the protocol that was chosen during the Next Protocol Negotiation
++ * (NPN) portion of the SSL handshake.  Note that this may be the empty string
++ * (in which case modules should probably assume HTTP), or it may be a protocol
++ * that was never even advertised by the server.  The hook callee is given the
++ * connection, a non-null-terminated string containing the protocol name, and
++ * the length of the string; it should do something appropriate (i.e. insert or
++ * remove filters) and return OK, or do nothing and return DECLINED. */
++APR_DECLARE_EXTERNAL_HOOK(modssl, AP, int, npn_proto_negotiated_hook,
++                          (conn_rec *connection, const char *proto_name,
++                           apr_size_t proto_name_len));
++
+ #endif /* __MOD_SSL_H__ */
+ /** @} */
+Index: modules/ssl/ssl_toolkit_compat.h
+===================================================================
+--- modules/ssl/ssl_toolkit_compat.h	(revision 1585744)
++++ modules/ssl/ssl_toolkit_compat.h	(working copy)
+@@ -151,6 +151,11 @@
+ #define HAVE_FIPS
+ #endif
+ 
++#if OPENSSL_VERSION_NUMBER >= 0x10001000L && !defined(OPENSSL_NO_NEXTPROTONEG) \
++    && !defined(OPENSSL_NO_TLSEXT)
++#define HAVE_TLS_NPN
++#endif
++
+ #ifndef PEM_F_DEF_CALLBACK
+ #ifdef PEM_F_PEM_DEF_CALLBACK
+ /** In OpenSSL 0.9.8 PEM_F_DEF_CALLBACK was renamed */

Added: httpd/httpd/trunk/modules/spdy/support/third_party/apache/apr/apr.gyp
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/spdy/support/third_party/apache/apr/apr.gyp?rev=1590597&view=auto
==============================================================================
--- httpd/httpd/trunk/modules/spdy/support/third_party/apache/apr/apr.gyp (added)
+++ httpd/httpd/trunk/modules/spdy/support/third_party/apache/apr/apr.gyp Mon Apr 28 10:55:17 2014
@@ -0,0 +1,212 @@
+# Copyright 2010 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+{
+  'variables': {
+    'apr_root': '<(DEPTH)/third_party/apache/apr',
+    'apr_src_root': '<(apr_root)/src',
+    'apr_gen_os_root': '<(apr_root)/gen/arch/<(OS)',
+    'apr_gen_arch_root': '<(apr_gen_os_root)/<(target_arch)',
+    'system_include_path_apr%': '/usr/include/apr-1.0',
+    'conditions': [
+      ['OS!="win"', {
+        'apr_os_include': '<(apr_src_root)/include/arch/unix',
+      }, {  # else, OS=="win"
+        'apr_os_include': '<(apr_src_root)/include/arch/win32',
+      }]
+    ],
+  },
+  'conditions': [
+    ['use_system_apache_dev==0', {
+      'targets': [
+        {
+          'target_name': 'include',
+          'type': 'none',
+          'direct_dependent_settings': {
+            'include_dirs': [
+              '<(apr_src_root)/include',
+              '<(apr_os_include)',
+              '<(apr_gen_arch_root)/include',
+            ],
+            'conditions': [
+              ['OS=="mac"', {
+                'defines': [
+                  'HAVE_CONFIG_H',
+                  'DARWIN',
+                  'SIGPROCMASK_SETS_THREAD_MASK',
+                ]}],
+              ['OS=="linux"', {
+                'defines': [
+                  # We need to define _LARGEFILE64_SOURCE so <sys/types.h>
+                  # provides off64_t.
+                  '_LARGEFILE64_SOURCE',
+                  'HAVE_CONFIG_H',
+                  'LINUX=2',
+                  '_REENTRANT',
+                  '_GNU_SOURCE',
+                ],
+              }],
+            ],
+          },
+        },
+        {
+          'target_name': 'apr',
+          'type': '<(library)',
+          'dependencies': [
+            'include',
+          ],
+          'export_dependent_settings': [
+            'include',
+          ],
+          'sources': [
+            '<(apr_src_root)/passwd/apr_getpass.c',
+            '<(apr_src_root)/strings/apr_strnatcmp.c',
+            '<(apr_src_root)/strings/apr_strtok.c',
+            '<(apr_src_root)/strings/apr_strings.c',
+            '<(apr_src_root)/strings/apr_snprintf.c',
+            '<(apr_src_root)/strings/apr_fnmatch.c',
+            '<(apr_src_root)/strings/apr_cpystrn.c',
+            '<(apr_src_root)/tables/apr_tables.c',
+            '<(apr_src_root)/tables/apr_hash.c',
+          ],
+          'conditions': [
+            ['OS!="win"', { # TODO(lsong): Add win sources.
+              'conditions': [
+                ['OS=="linux"', {
+                  'cflags': [
+                    '-pthread',
+                    '-Wall',
+                  ],
+                  'link_settings': {
+                    'libraries': [
+                      '-ldl',
+                  ]},
+                }],
+              ],
+              'sources': [
+                'src/atomic/unix/builtins.c',
+                'src/atomic/unix/ia32.c',
+                'src/atomic/unix/mutex.c',
+                'src/atomic/unix/ppc.c',
+                'src/atomic/unix/s390.c',
+                'src/atomic/unix/solaris.c',
+                'src/dso/unix/dso.c',
+                'src/file_io/unix/buffer.c',
+                'src/file_io/unix/copy.c',
+                'src/file_io/unix/dir.c',
+                'src/file_io/unix/fileacc.c',
+                'src/file_io/unix/filedup.c',
+                'src/file_io/unix/filepath.c',
+                'src/file_io/unix/filepath_util.c',
+                'src/file_io/unix/filestat.c',
+                'src/file_io/unix/flock.c',
+                'src/file_io/unix/fullrw.c',
+                'src/file_io/unix/mktemp.c',
+                'src/file_io/unix/open.c',
+                'src/file_io/unix/pipe.c',
+                'src/file_io/unix/readwrite.c',
+                'src/file_io/unix/seek.c',
+                'src/file_io/unix/tempdir.c',
+                'src/locks/unix/global_mutex.c',
+                'src/locks/unix/proc_mutex.c',
+                'src/locks/unix/thread_cond.c',
+                'src/locks/unix/thread_mutex.c',
+                'src/locks/unix/thread_rwlock.c',
+                'src/memory/unix/apr_pools.c',
+                'src/misc/unix/charset.c',
+                'src/misc/unix/env.c',
+                'src/misc/unix/errorcodes.c',
+                'src/misc/unix/getopt.c',
+                'src/misc/unix/otherchild.c',
+                'src/misc/unix/rand.c',
+                'src/misc/unix/start.c',
+                'src/misc/unix/version.c',
+                'src/mmap/unix/common.c',
+                'src/mmap/unix/mmap.c',
+                'src/network_io/unix/inet_ntop.c',
+                'src/network_io/unix/inet_pton.c',
+                'src/network_io/unix/multicast.c',
+                'src/network_io/unix/sendrecv.c',
+                'src/network_io/unix/sockaddr.c',
+                'src/network_io/unix/socket_util.c',
+                'src/network_io/unix/sockets.c',
+                'src/network_io/unix/sockopt.c',
+                'src/poll/unix/epoll.c',
+                'src/poll/unix/kqueue.c',
+                'src/poll/unix/poll.c',
+                'src/poll/unix/pollcb.c',
+                'src/poll/unix/pollset.c',
+                'src/poll/unix/port.c',
+                'src/poll/unix/select.c',
+                'src/random/unix/apr_random.c',
+                'src/random/unix/sha2.c',
+                'src/random/unix/sha2_glue.c',
+                'src/shmem/unix/shm.c',
+                'src/support/unix/waitio.c',
+                'src/threadproc/unix/proc.c',
+                'src/threadproc/unix/procsup.c',
+                'src/threadproc/unix/signals.c',
+                'src/threadproc/unix/thread.c',
+                'src/threadproc/unix/threadpriv.c',
+                'src/time/unix/time.c',
+                'src/time/unix/timestr.c',
+                'src/user/unix/groupinfo.c',
+                'src/user/unix/userinfo.c',
+              ],
+            }],
+          ],
+        }
+      ],
+    },
+    { # use_system_apache_dev
+      'targets': [
+        {
+          'target_name': 'include',
+          'type': 'none',
+          'direct_dependent_settings': {
+            'include_dirs': [
+              '<(system_include_path_apr)',
+            ],
+            'defines': [
+              # We need to define _LARGEFILE64_SOURCE so <sys/types.h>
+              # provides off64_t.
+              '_LARGEFILE64_SOURCE',
+              'HAVE_CONFIG_H',
+              'LINUX=2',
+              '_REENTRANT',
+              '_GNU_SOURCE',
+            ],
+          },
+        },
+        {
+          'target_name': 'apr',
+          'type': 'settings',
+          'dependencies': [
+            'include',
+          ],
+          'export_dependent_settings': [
+            'include',
+          ],
+          'link_settings': {
+            'libraries': [
+              '-lapr-1',
+            ],
+          },
+        },
+      ],
+    }],
+  ],
+}
+

Added: httpd/httpd/trunk/modules/spdy/support/third_party/apache/apr/gen/arch/linux/ia32/include/apr.h
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/spdy/support/third_party/apache/apr/gen/arch/linux/ia32/include/apr.h?rev=1590597&view=auto
==============================================================================
--- httpd/httpd/trunk/modules/spdy/support/third_party/apache/apr/gen/arch/linux/ia32/include/apr.h (added)
+++ httpd/httpd/trunk/modules/spdy/support/third_party/apache/apr/gen/arch/linux/ia32/include/apr.h Mon Apr 28 10:55:17 2014
@@ -0,0 +1,512 @@
+/* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#ifndef APR_H
+#define APR_H
+
+/* GENERATED FILE WARNING!  DO NOT EDIT apr.h
+ *
+ * You must modify apr.h.in instead.
+ *
+ * And please, make an effort to stub apr.hw and apr.hnw in the process.
+ */
+
+/**
+ * @file apr.h
+ * @brief APR Platform Definitions
+ * @remark This is a generated header generated from include/apr.h.in by
+ * ./configure, or copied from include/apr.hw or include/apr.hnw
+ * for Win32 or Netware by those build environments, respectively.
+ */
+
+/**
+ * @defgroup APR Apache Portability Runtime library
+ * @{
+ */
+/**
+ * @defgroup apr_platform Platform Definitions
+ * @{
+ * @warning
+ * <strong><em>The actual values of macros and typedefs on this page<br>
+ * are platform specific and should NOT be relied upon!</em></strong>
+ */
+
+/* So that we can use inline on some critical functions, and use
+ * GNUC attributes (such as to get -Wall warnings for printf-like
+ * functions).  Only do this in gcc 2.7 or later ... it may work
+ * on earlier stuff, but why chance it.
+ *
+ * We've since discovered that the gcc shipped with NeXT systems
+ * as "cc" is completely broken.  It claims to be __GNUC__ and so
+ * on, but it doesn't implement half of the things that __GNUC__
+ * means.  In particular it's missing inline and the __attribute__
+ * stuff.  So we hack around it.  PR#1613. -djg
+ */
+#if !defined(__GNUC__) || __GNUC__ < 2 || \
+    (__GNUC__ == 2 && __GNUC_MINOR__ < 7) ||\
+    defined(NEXT)
+#ifndef __attribute__
+#define __attribute__(__x)
+#endif
+#define APR_INLINE
+#define APR_HAS_INLINE		0
+#else
+#define APR_INLINE __inline__
+#define APR_HAS_INLINE		1
+#endif
+
+#define APR_HAVE_ARPA_INET_H     1
+#define APR_HAVE_CONIO_H         0
+#define APR_HAVE_CRYPT_H         1
+#define APR_HAVE_CTYPE_H         1
+#define APR_HAVE_DIRENT_H        1
+#define APR_HAVE_ERRNO_H         1
+#define APR_HAVE_FCNTL_H         1
+#define APR_HAVE_IO_H            0
+#define APR_HAVE_LIMITS_H        1
+#define APR_HAVE_NETDB_H         1
+#define APR_HAVE_NETINET_IN_H    1
+#define APR_HAVE_NETINET_SCTP_H  0
+#define APR_HAVE_NETINET_SCTP_UIO_H 0
+#define APR_HAVE_NETINET_TCP_H   1
+#define APR_HAVE_PTHREAD_H       1
+#define APR_HAVE_SEMAPHORE_H     1
+#define APR_HAVE_SIGNAL_H        1
+#define APR_HAVE_STDARG_H        1
+#define APR_HAVE_STDINT_H        1
+#define APR_HAVE_STDIO_H         1
+#define APR_HAVE_STDLIB_H        1
+#define APR_HAVE_STRING_H        1
+#define APR_HAVE_STRINGS_H       1
+#define APR_HAVE_SYS_IOCTL_H     1
+#define APR_HAVE_SYS_SENDFILE_H  1
+#define APR_HAVE_SYS_SIGNAL_H    1
+#define APR_HAVE_SYS_SOCKET_H    1
+#define APR_HAVE_SYS_SOCKIO_H    0
+#define APR_HAVE_SYS_SYSLIMITS_H 0
+#define APR_HAVE_SYS_TIME_H      1
+#define APR_HAVE_SYS_TYPES_H     1
+#define APR_HAVE_SYS_UIO_H       1
+#define APR_HAVE_SYS_UN_H        1
+#define APR_HAVE_SYS_WAIT_H      1
+#define APR_HAVE_TIME_H          1
+#define APR_HAVE_UNISTD_H        1
+#define APR_HAVE_WINDOWS_H       0
+#define APR_HAVE_WINSOCK2_H      0
+
+/** @} */
+/** @} */
+
+/* We don't include our conditional headers within the doxyblocks
+ * or the extern "C" namespace
+ */
+
+#if APR_HAVE_WINDOWS_H
+#include <windows.h>
+#endif
+
+#if APR_HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif
+
+#if APR_HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#if APR_HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+
+#if defined(__cplusplus) && !defined(__STDC_CONSTANT_MACROS)
+/* C99 7.18.4 requires that stdint.h only exposes INT64_C
+ * and UINT64_C for C++ implementations if this is defined: */
+#define __STDC_CONSTANT_MACROS
+#endif
+
+#if APR_HAVE_STDINT_H
+#include <stdint.h>
+#endif
+
+#if APR_HAVE_SYS_WAIT_H
+#include <sys/wait.h>
+#endif
+
+#ifdef OS2
+#define INCL_DOS
+#define INCL_DOSERRORS
+#include <os2.h>
+#endif
+
+/* header files for PATH_MAX, _POSIX_PATH_MAX */
+#if APR_HAVE_LIMITS_H
+#include <limits.h>
+#else
+#if APR_HAVE_SYS_SYSLIMITS_H
+#include <sys/syslimits.h>
+#endif
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @addtogroup apr_platform
+ * @ingroup APR
+ * @{
+ */
+
+#define APR_HAVE_SHMEM_MMAP_TMP     1
+#define APR_HAVE_SHMEM_MMAP_SHM     1
+#define APR_HAVE_SHMEM_MMAP_ZERO    1
+#define APR_HAVE_SHMEM_SHMGET_ANON  1
+#define APR_HAVE_SHMEM_SHMGET       1
+#define APR_HAVE_SHMEM_MMAP_ANON    1
+#define APR_HAVE_SHMEM_BEOS         0
+
+#define APR_USE_SHMEM_MMAP_TMP     0
+#define APR_USE_SHMEM_MMAP_SHM     0
+#define APR_USE_SHMEM_MMAP_ZERO    0
+#define APR_USE_SHMEM_SHMGET_ANON  0
+#define APR_USE_SHMEM_SHMGET       1
+#define APR_USE_SHMEM_MMAP_ANON    1
+#define APR_USE_SHMEM_BEOS         0
+
+#define APR_USE_FLOCK_SERIALIZE           0
+#define APR_USE_SYSVSEM_SERIALIZE         1
+#define APR_USE_POSIXSEM_SERIALIZE        0
+#define APR_USE_FCNTL_SERIALIZE           0
+#define APR_USE_PROC_PTHREAD_SERIALIZE    0
+#define APR_USE_PTHREAD_SERIALIZE         1
+
+#define APR_HAS_FLOCK_SERIALIZE           1
+#define APR_HAS_SYSVSEM_SERIALIZE         1
+#define APR_HAS_POSIXSEM_SERIALIZE        1
+#define APR_HAS_FCNTL_SERIALIZE           1
+#define APR_HAS_PROC_PTHREAD_SERIALIZE    1
+
+#define APR_PROCESS_LOCK_IS_GLOBAL        0
+
+#define APR_HAVE_CORKABLE_TCP   1
+#define APR_HAVE_GETRLIMIT      1
+#define APR_HAVE_IN_ADDR        1
+#define APR_HAVE_INET_ADDR      1
+#define APR_HAVE_INET_NETWORK   1
+#define APR_HAVE_IPV6           1
+#define APR_HAVE_MEMMOVE        1
+#define APR_HAVE_SETRLIMIT      1
+#define APR_HAVE_SIGACTION      1
+#define APR_HAVE_SIGSUSPEND     1
+#define APR_HAVE_SIGWAIT        1
+#define APR_HAVE_SA_STORAGE     1
+#define APR_HAVE_STRCASECMP     1
+#define APR_HAVE_STRDUP         1
+#define APR_HAVE_STRICMP        0
+#define APR_HAVE_STRNCASECMP    1
+#define APR_HAVE_STRNICMP       0
+#define APR_HAVE_STRSTR         1
+#define APR_HAVE_MEMCHR         1
+#define APR_HAVE_STRUCT_RLIMIT  1
+#define APR_HAVE_UNION_SEMUN    0
+#define APR_HAVE_SCTP           0
+#define APR_HAVE_IOVEC          1
+
+/*  APR Feature Macros */
+#define APR_HAS_SHARED_MEMORY     1
+#define APR_HAS_THREADS           1
+#define APR_HAS_SENDFILE          1
+#define APR_HAS_MMAP              1
+#define APR_HAS_FORK              1
+#define APR_HAS_RANDOM            1
+#define APR_HAS_OTHER_CHILD       1
+#define APR_HAS_DSO               1
+#define APR_HAS_SO_ACCEPTFILTER   0
+#define APR_HAS_UNICODE_FS        0
+#define APR_HAS_PROC_INVOKED      0
+#define APR_HAS_USER              1
+#define APR_HAS_LARGE_FILES       1
+#define APR_HAS_XTHREAD_FILES     0
+#define APR_HAS_OS_UUID           0
+
+#define APR_PROCATTR_USER_SET_REQUIRES_PASSWORD 0
+
+/* APR sets APR_FILES_AS_SOCKETS to 1 on systems where it is possible
+ * to poll on files/pipes.
+ */
+#define APR_FILES_AS_SOCKETS      1
+
+/* This macro indicates whether or not EBCDIC is the native character set.
+ */
+#define APR_CHARSET_EBCDIC        0
+
+/* If we have a TCP implementation that can be "corked", what flag
+ * do we use?
+ */
+#define APR_TCP_NOPUSH_FLAG       TCP_CORK
+
+/* Is the TCP_NODELAY socket option inherited from listening sockets?
+*/
+#define APR_TCP_NODELAY_INHERITED 1
+
+/* Is the O_NONBLOCK flag inherited from listening sockets?
+*/
+#define APR_O_NONBLOCK_INHERITED 0
+
+/* Typedefs that APR needs. */
+
+typedef  unsigned char           apr_byte_t;
+
+typedef  short           apr_int16_t;
+typedef  unsigned short  apr_uint16_t;
+
+typedef  int             apr_int32_t;
+typedef  unsigned int    apr_uint32_t;
+
+typedef  long long            apr_int64_t;
+typedef  unsigned long long   apr_uint64_t;
+
+typedef  size_t          apr_size_t;
+typedef  ssize_t         apr_ssize_t;
+typedef  off64_t           apr_off_t;
+typedef  socklen_t       apr_socklen_t;
+typedef  unsigned long           apr_ino_t;
+
+#define APR_SIZEOF_VOIDP 4
+
+#if APR_SIZEOF_VOIDP == 8
+typedef  apr_uint64_t            apr_uintptr_t;
+#else
+typedef  apr_uint32_t            apr_uintptr_t;
+#endif
+
+/* Are we big endian? */
+#define APR_IS_BIGENDIAN	0
+
+/* Mechanisms to properly type numeric literals */
+#define APR_INT64_C(val) INT64_C(val)
+#define APR_UINT64_C(val) UINT64_C(val)
+
+#ifdef INT16_MIN
+#define APR_INT16_MIN   INT16_MIN
+#else
+#define APR_INT16_MIN   (-0x7fff - 1)
+#endif
+
+#ifdef INT16_MAX
+#define APR_INT16_MAX  INT16_MAX
+#else
+#define APR_INT16_MAX   (0x7fff)
+#endif
+
+#ifdef UINT16_MAX
+#define APR_UINT16_MAX  UINT16_MAX
+#else
+#define APR_UINT16_MAX  (0xffff)
+#endif
+
+#ifdef INT32_MIN
+#define APR_INT32_MIN   INT32_MIN
+#else
+#define APR_INT32_MIN   (-0x7fffffff - 1)
+#endif
+
+#ifdef INT32_MAX
+#define APR_INT32_MAX  INT32_MAX
+#else
+#define APR_INT32_MAX  0x7fffffff
+#endif
+
+#ifdef UINT32_MAX
+#define APR_UINT32_MAX  UINT32_MAX
+#else
+#define APR_UINT32_MAX  (0xffffffffU)
+#endif
+
+#ifdef INT64_MIN
+#define APR_INT64_MIN   INT64_MIN
+#else
+#define APR_INT64_MIN   (APR_INT64_C(-0x7fffffffffffffff) - 1)
+#endif
+
+#ifdef INT64_MAX
+#define APR_INT64_MAX   INT64_MAX
+#else
+#define APR_INT64_MAX   APR_INT64_C(0x7fffffffffffffff)
+#endif
+
+#ifdef UINT64_MAX
+#define APR_UINT64_MAX  UINT64_MAX
+#else
+#define APR_UINT64_MAX  APR_UINT64_C(0xffffffffffffffff)
+#endif
+
+#define APR_SIZE_MAX    (~((apr_size_t)0))
+
+
+/* Definitions that APR programs need to work properly. */
+
+/**
+ * APR public API wrap for C++ compilers.
+ */
+#ifdef __cplusplus
+#define APR_BEGIN_DECLS     extern "C" {
+#define APR_END_DECLS       }
+#else
+#define APR_BEGIN_DECLS
+#define APR_END_DECLS
+#endif
+
+/**
+ * Thread callbacks from APR functions must be declared with APR_THREAD_FUNC,
+ * so that they follow the platform's calling convention.
+ * <PRE>
+ *
+ * void* APR_THREAD_FUNC my_thread_entry_fn(apr_thread_t *thd, void *data);
+ *
+ * </PRE>
+ */
+#define APR_THREAD_FUNC
+
+/**
+ * The public APR functions are declared with APR_DECLARE(), so they may
+ * use the most appropriate calling convention.  Public APR functions with
+ * variable arguments must use APR_DECLARE_NONSTD().
+ *
+ * @remark Both the declaration and implementations must use the same macro.
+ *
+ * <PRE>
+ * APR_DECLARE(rettype) apr_func(args)
+ * </PRE>
+ * @see APR_DECLARE_NONSTD @see APR_DECLARE_DATA
+ * @remark Note that when APR compiles the library itself, it passes the
+ * symbol -DAPR_DECLARE_EXPORT to the compiler on some platforms (e.g. Win32)
+ * to export public symbols from the dynamic library build.\n
+ * The user must define the APR_DECLARE_STATIC when compiling to target
+ * the static APR library on some platforms (e.g. Win32.)  The public symbols
+ * are neither exported nor imported when APR_DECLARE_STATIC is defined.\n
+ * By default, compiling an application and including the APR public
+ * headers, without defining APR_DECLARE_STATIC, will prepare the code to be
+ * linked to the dynamic library.
+ */
+#define APR_DECLARE(type)            type
+
+/**
+ * The public APR functions using variable arguments are declared with
+ * APR_DECLARE_NONSTD(), as they must follow the C language calling convention.
+ * @see APR_DECLARE @see APR_DECLARE_DATA
+ * @remark Both the declaration and implementations must use the same macro.
+ * <PRE>
+ *
+ * APR_DECLARE_NONSTD(rettype) apr_func(args, ...);
+ *
+ * </PRE>
+ */
+#define APR_DECLARE_NONSTD(type)     type
+
+/**
+ * The public APR variables are declared with AP_MODULE_DECLARE_DATA.
+ * This assures the appropriate indirection is invoked at compile time.
+ * @see APR_DECLARE @see APR_DECLARE_NONSTD
+ * @remark Note that the declaration and implementations use different forms,
+ * but both must include the macro.
+ *
+ * <PRE>
+ *
+ * extern APR_DECLARE_DATA type apr_variable;\n
+ * APR_DECLARE_DATA type apr_variable = value;
+ *
+ * </PRE>
+ */
+#define APR_DECLARE_DATA
+
+/* Define APR_SSIZE_T_FMT.
+ * If ssize_t is an integer we define it to be "d",
+ * if ssize_t is a long int we define it to be "ld",
+ * if ssize_t is neither we declare an error here.
+ * I looked for a better way to define this here, but couldn't find one, so
+ * to find the logic for this definition search for "ssize_t_fmt" in
+ * configure.in.
+ */
+#define APR_SSIZE_T_FMT "d"
+
+/* And APR_SIZE_T_FMT */
+#define APR_SIZE_T_FMT "u"
+
+/* And APR_OFF_T_FMT */
+#define APR_OFF_T_FMT APR_INT64_T_FMT
+
+/* And APR_PID_T_FMT */
+#define APR_PID_T_FMT "d"
+
+/* And APR_INT64_T_FMT */
+#define APR_INT64_T_FMT "lld"
+
+/* And APR_UINT64_T_FMT */
+#define APR_UINT64_T_FMT "llu"
+
+/* And APR_UINT64_T_HEX_FMT */
+#define APR_UINT64_T_HEX_FMT "llx"
+
+/* Does the proc mutex lock threads too */
+#define APR_PROC_MUTEX_IS_GLOBAL      0
+
+/* Local machine definition for console and log output. */
+#define APR_EOL_STR              "\n"
+
+#if APR_HAVE_SYS_WAIT_H
+#ifdef WEXITSTATUS
+#define apr_wait_t       int
+#else
+#define apr_wait_t       union wait
+#define WEXITSTATUS(status)    (int)((status).w_retcode)
+#define WTERMSIG(status)       (int)((status).w_termsig)
+#endif /* !WEXITSTATUS */
+#elif defined(__MINGW32__)
+typedef int apr_wait_t;
+#endif /* HAVE_SYS_WAIT_H */
+
+#if defined(PATH_MAX)
+#define APR_PATH_MAX       PATH_MAX
+#elif defined(_POSIX_PATH_MAX)
+#define APR_PATH_MAX       _POSIX_PATH_MAX
+#else
+#error no decision has been made on APR_PATH_MAX for your platform
+#endif
+
+#define APR_DSOPATH "LD_LIBRARY_PATH"
+
+/** @} */
+
+/* Definitions that only Win32 programs need to compile properly. */
+
+/* XXX These simply don't belong here, perhaps in apr_portable.h
+ * based on some APR_HAVE_PID/GID/UID?
+ */
+#ifdef __MINGW32__
+#ifndef __GNUC__
+typedef  int         pid_t;
+#endif
+typedef  int         uid_t;
+typedef  int         gid_t;
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* APR_H */

Propchange: httpd/httpd/trunk/modules/spdy/support/third_party/apache/apr/gen/arch/linux/ia32/include/apr.h
------------------------------------------------------------------------------
    svn:eol-style = native



Mime
View raw message