Add support for SOCKSv5 proxy, bug #537616. Needed for network-sandbox support in...
authorMichał Górny <mgorny@gentoo.org>
Fri, 27 Feb 2015 21:14:23 +0000 (21:14 +0000)
committerMichał Górny <mgorny@gentoo.org>
Fri, 27 Feb 2015 21:14:23 +0000 (21:14 +0000)
Package-Manager: portage-2.2.17/cvs/Linux x86_64
Manifest-Sign-Key: 0xEFB4464E!

sys-devel/distcc/ChangeLog
sys-devel/distcc/Manifest
sys-devel/distcc/distcc-3.2_rc1-r3.ebuild [new file with mode: 0644]
sys-devel/distcc/files/distcc-3.2_rc1-socks5.patch [new file with mode: 0644]

index 133262d046d9ab96460a28234cd3f63453bc5231..635e372097a309a958cc1af6af65f5541e0fcf95 100644 (file)
@@ -1,6 +1,13 @@
 # ChangeLog for sys-devel/distcc
 # Copyright 1999-2015 Gentoo Foundation; Distributed under the GPL v2
-# $Header: /var/cvsroot/gentoo-x86/sys-devel/distcc/ChangeLog,v 1.240 2015/01/24 23:18:13 mgorny Exp $
+# $Header: /var/cvsroot/gentoo-x86/sys-devel/distcc/ChangeLog,v 1.241 2015/02/27 21:14:21 mgorny Exp $
+
+*distcc-3.2_rc1-r3 (27 Feb 2015)
+
+  27 Feb 2015; Michał Górny <mgorny@gentoo.org> +distcc-3.2_rc1-r3.ebuild,
+  +files/distcc-3.2_rc1-socks5.patch:
+  Add support for SOCKSv5 proxy, bug #537616. Needed for network-sandbox support
+  in Portage.
 
   24 Jan 2015; Michał Górny <mgorny@gentoo.org> distcc-3.1-r10.ebuild,
   distcc-3.2_rc1-r2.ebuild:
index 90a14861f9973a7f3182149945ae587cd270fa0b..1f1e786e857ea7963e8d2dea2edd484bf4b88c9a 100644 (file)
@@ -21,6 +21,7 @@ AUX distcc-3.1-python.patch 10754 SHA256 8ba3c0745a30b5901cfb37f4231d754e5779cbc
 AUX distcc-3.2_rc1-freedesktop.patch 3140 SHA256 7ead1174fc170cee5c32ac183edf0c15ae35df56bedbbf6bc24c0099fe23b7f6 SHA512 fe953e1884b498da9cbb83ca90af9e49b554ad56fef8a8f55b9e6b46e5904f7376e5e58a9123f4acb474e16577fb6c9371a12eddc29c07c5d488be847f4ed2ef WHIRLPOOL b073d4c775493a2976dc430f949269d6328178254c2080ca1f8c71be3b935cdfcc5e3135e2504e87267059df243f744d2f7f90a517aefebeaed5f55e40607eb1
 AUX distcc-3.2_rc1-gssapi.patch 1638 SHA256 2693fbf5b76ab64874e0a4bc1540067f402799dfabde5202a89ec045f1d88ea0 SHA512 c804189f87068f82e7cb18de4e8d30cc67db7cc7fbcb13872d44e3f6fb006b3c779adf9c6068ae50831ef649da718ddb33c0efc4354636aacc9a7217b3c9a348 WHIRLPOOL fd0afc3bcdc176aec7f2f2e9d990578573628c66a23da60ba8e34663c86835ca138f48a2feb4f02dd8cfa2c28442f65338ea531994a09db38bbdf62bfdfcbe4d
 AUX distcc-3.2_rc1-python.patch 10592 SHA256 935328943efe26f20bfb94952bc8bcb7f8536465db72411d81e6f3d1ade37989 SHA512 513c2fb9aa8f222a0f6062795fac1f855d67467d796b406c6b685e345554ce09a96ab9e594d6a05aad6c5a0f8c7906700529cfb562f2dd7c498d9078219b3d6b WHIRLPOOL 0ec9deafa00b161a29ead3ff7791262a189501d2ca69d03d46eb5838ca3effa8e1de7878b72917634cb261ee2cf68401f2b8ca70048345d4bfddc6db82fa56aa
+AUX distcc-3.2_rc1-socks5.patch 5462 SHA256 85b48489c360d384a67de91f1a750413a2239dd81fe45d7270c62451114a6f22 SHA512 707b6ad02bb7ff1507cfbfbb4cee673d5f0dc776006e9b7e801deabccf05c6057b33ea43c6a3ddd1756b8d07ff1d5e3087b635f15285195ba795b8679ebdc860 WHIRLPOOL 92f2721675d8dc06d73f8c5b0f0236fc1dc57f1dd1f05bc3765cc5daaa1b41db563af579c8dac4741666aeb10c12edfabf8109eef2e36cbd267506ee1c3ea3d6
 AUX distcc-as-needed.patch 558 SHA256 9e87d3b0487ffc52ccf6362866e967dff9c2a85681175096ece11413f8c91e54 SHA512 504a53ed00c11226e0ca69e9670dcadac25495c80eceff13ac3a14a6813fcae8cf1a526673560786f9d3f3985d9164445f47bca0eb37c04e77cb1dd7b76b0e16 WHIRLPOOL 7d4289a0b298ae85f12fd56c4c4cccfe075d88e9a7dbf6d2a1f1a999a67735cd4223a395062b6fc712869ba26fcb336af29b2312949046583b2891ab5a06bfee
 AUX distcc-avahi-configure.patch 1263 SHA256 9d967456da6631845b4262ae7508948d629764149fd568c367e76e89168bb132 SHA512 531c04ba9d246cd0b5baa9503ed4c895bd65d6a53b74cb84a647def587cf527e15329a146cd29a7331856cf696069cefc2b8d6600e45521983f4c0bb2f45331b WHIRLPOOL a0581da775b9218f8eb083dfbbd6133f85732de7e384e16ced0121aaec255a58d3dadd0ba61870a94e1b3c309c886bbed9a4723117fcb6d08f3dc9523426e1e5
 AUX distcc-config 4874 SHA256 c6a7bb74eb235fd7896ca101c033a2e9faf80afeb7232bff3afe22f8a6268a5c SHA512 d2d8413cc58cecb781b3518c688073125653abe2cf11c1f721a77797e4e8d4ef3cd039b06448e48020d27c6ea40e56c22245a7e82970800cad5184eaab3ab8d3 WHIRLPOOL 76d2f0a327c4319957dacffb1fd61d986103fbc55c9180c064b58b2826cdae5c39ae1fbe63629c26991c371bc5870441e6f5925efb2baa34c4f92a2b0fd2e1e5
@@ -41,24 +42,25 @@ EBUILD distcc-2.18.3-r10.ebuild 4890 SHA256 9eef0dc109e35aa396cf0300e53e38355594
 EBUILD distcc-3.0-r4.ebuild 4500 SHA256 890af2113a538fb7a4d12644e9adc8aea49c7e1f25723404bf6185a401357b2f SHA512 b0f652003f49e63c04c5a2a9463b70c6aee94b74f3e5a55f51656eb6fc0f305bfdb1e0dca4142929129f8acde233cfa5e996420cedae1b3dcffb218dbcfcda3e WHIRLPOOL 13f8abc008068cc4aa2a296a2cbf75048ec433302f2d4806685e619f9cbcadaa7934762f964619ca8ab11e6e6f9059f87bf6373cae486130a415d347932a2e6b
 EBUILD distcc-3.1-r10.ebuild 4763 SHA256 e434bde1e1f5ecdf187855ee788975db5174527f80fd3b2d4065ba8764a7107b SHA512 d729c3107b0e07316c68352b0dae5cd2c505d2b7a3c186217c381091a3795ec71644d56fae76713c0b1966d99d460452d4a992380e4495666ca311bb25af6ed5 WHIRLPOOL 9e0454ad3b8c80ad6dfeb5ba2e9249e13f4215fd1d6a62f2ff2c5aca83e5dccbc18c9ffc5e0a73960bc1b55c12b6f13aa7995aef17e9b19344db74b553156709
 EBUILD distcc-3.2_rc1-r2.ebuild 5900 SHA256 26d3e34af34da7d94b8adc99b6e6eff399ad0e378a79dab91e7df21558e0d573 SHA512 ecf8c003b5eafb851b3d7c7f39ca21f8aab0efd18360088a3f3a7aaeeff7742794094867036ed23fb2420b1d54b95e59c838763da88bd1582564783dafcc0782 WHIRLPOOL 2894eddfcbf6482b6ff3cfa8734379c2e7e2420b0a7b3f814118ecd9c60352d2be90207b944ca1a013366ea751aadc459ccbc63b4e2a5842379ab2d844962897
-MISC ChangeLog 42783 SHA256 490161e37f57fe15da556e10efd111f858cbc16e74037a9878cce0049fa0fc65 SHA512 f3ac42854a6a3e298046ab432be27be781ac0d6d289c5f5ced9b9dd83f07bbe0a06af91621f102c700ce221a454e069331473695ea0e0feaa68e4d04f6df0514 WHIRLPOOL 884e5366aaf9399a5327a1fe405935bdba90ed8791dfcac2a1bbece72d4c55a474cf9888ddae1cd241ee3443b69506c6e9b4354135c2fce5938ac746577803e8
+EBUILD distcc-3.2_rc1-r3.ebuild 6000 SHA256 b67c9414bb57dd843e16e2169bf58b44334f1b30e7ce64a825da0ed6ca5014a7 SHA512 bef7c082f9be19525751cd1ad7d5ceb6cbbceff43d343ca9ec80269a8d2abeeb0e429160930d5e8d77d0d5cb1df37505a91295020233d5622adf66792250a07b WHIRLPOOL 3f70ebe04214cd5d7efbabb24a2254ef8aa71481b656fdb32dbc45fea5e862fc4861c1ed309bc5a78be85f894ebbe758f09aed63bd1c3ae5056fcb6152cfa319
+MISC ChangeLog 43028 SHA256 946f306a2187dcaa7346af687e4e00f7780e26888ea7cc235872aa3a31a9ad84 SHA512 24401349d91fc9ab8d898b797d2458c8186c01ee3f6ca449a5c6a861dfa9197c1c3498f4412e7213c5c85a694a832ccc475368c5c1bbb8f7d0c2d30599c258f9 WHIRLPOOL e0141689ee596623a0360ff386d5bfd66b4286ea2c9762e48b988d5cdba88169f451a9479e98d2e2a566fb8f61c36c9d53097ca4de4aecd993a45f1856bef6e6
 MISC metadata.xml 490 SHA256 c507fd5ee99486759c3acb83a13d874253ce959acd93ac3084febc424a46df86 SHA512 b076932259b157a51d6006324835ab91a9cb86538fb95b8e321647e90675c210051fa3ea342ed1b26b884c166e2825aa16056f2178029cf5d7bf1042cc9425ef WHIRLPOOL 53eb51b9e8fa1acbbef117955d1ad51b36ead058b6cd0b09d902467a58de9854f0b896d7a8961ec2ef019b7d7e39ef24802a5fbb23a11618a9535c17e98bc038
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v2
 
-iQJ8BAEBCABmBQJUxCg4XxSAAAAAAC4AKGlzc3Vlci1mcHJAbm90YXRpb25zLm9w
+iQJ8BAEBCABmBQJU8N4uXxSAAAAAAC4AKGlzc3Vlci1mcHJAbm90YXRpb25zLm9w
 ZW5wZ3AuZmlmdGhob3JzZW1hbi5uZXQ2REJCMDdDQzRGMERBRDA2RUEwQUZFNDFC
-MDdBMUFFQUVGQjQ0NjRFAAoJELB6GurvtEZOqFoP/jlumgusrppg22CNqBoMXIQJ
-s5pCGx2xUn89E6BEazbY/c6JNwpbonvPIJVhhlSS+EsibyR2SJc/MXCw+s9criSe
-L9nbarCqkr6D3ovJXdUKmHO2vlcBaB/zxhvRaT8roIB1aQOgDAmLlCmwpdDxqICa
-zZqXYLSiYyAZHKm92jCG8zYelAIxWucvCBnuTod6Q9D34X39/R082n0DBVSfkteX
-D7BEbvpBfSLbztK1QMit6ZMuAvpn/zuHw/K/5je0+MpSk1y2x059Ck6EcnmOlnIU
-ZVat0JL6iXH+pLyyNkFWKiM0ELQMj5pzVs82YU1RPxpfLXs+XMs7WpIkshAvxb0a
-0qSxCQC67uAMdjBN2exKnOQJB4G+R607HpVxsCxuRMXW3lODGmr1ddPWrU2kjY8c
-VEm5ZHNt6COPoBcvipB1A4ceALSLI89HAnW6Gf84t22GRSigQQGD2kvMSdblB4Kt
-hFdw6SaHQZUE8/BnyHWZ59S6ix6oPYZ4HY/hWLnOzH3LvB4fhhSGmDeIf5OtcPgM
-bqKTReDLHTR9ZoR2WSA5CQK2VmbcOZZJx+GPSBITHQiKLZHB00NPrqXf4s4PAt2n
-f0yKe3dyN2ybK6FZaNsn7vxKXpm1+AxfQxI0MHp133gygCzR7NkvS411U0vUOkpf
-kHHPE2s1qWRcYA73Tefn
-=4J9m
+MDdBMUFFQUVGQjQ0NjRFAAoJELB6GurvtEZOAp8QAKl/EeeYruXIalBeuusBsRVl
+zsPjM1V6nE1heEBc5bodwyq2I4QzIkvWHy0uySLtRigm0NdcylX7aUXBbB/AeTOR
+oF5Rf4mX5cELAQ8jqvFu6QsMOuBZkT4SXNqMbDORZeWqawOkOxsNmBXN+cBjQZww
+XU0nEj3PeHkuQBWEIJhvBQ2u1Bw+MxKEjH6GR2w6cmxdadBxMwfQnpuJ7mynvzAp
+dvfhIBjICGlplPXFuaUPWy7qxsf49oB4j1a4LUjP3DeWWZYdV6deDLLMqDUQI9oJ
+1vhAoS1e2MPHk3utE1qDQnRvg8DZq4xz1ZgR12TI/dFJNlv8NYwPch4czubB8e3r
+acBhcyqj5ezwlzZhcZmx/2WYM8jDe0gi1GMo8CdpE6mEkbLy3doRAFBQFi4j7CXH
+4adaQmfpsnjXzJdYpW+byZtbHXmS0ruFzucLpMPAijBGU38M9zwZ9SP/KYCw3gnh
+vgJLUoBvku4qIpRbjgxGsxenqf230yc7P3Kq0gfcicP2ec5fyomv+7ErFpB72Cs9
+LLa3dfCEF0M5Ia1ws9Y2bjxmvpM+MzFpwfLuO1s9eQ/nSGPxFXfuMi3mxHn0NvcL
+mXnacnWXaTwPpdDx7Lga4x4toWQ8KFZqmzTBN7QU5ed57bkleFZGoicwkbnNaK6m
+ylF7VRRDyZpalRzzSZzN
+=XxrU
 -----END PGP SIGNATURE-----
diff --git a/sys-devel/distcc/distcc-3.2_rc1-r3.ebuild b/sys-devel/distcc/distcc-3.2_rc1-r3.ebuild
new file mode 100644 (file)
index 0000000..7eb32bd
--- /dev/null
@@ -0,0 +1,207 @@
+# Copyright 1999-2015 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/sys-devel/distcc/distcc-3.2_rc1-r3.ebuild,v 1.1 2015/02/27 21:14:21 mgorny Exp $
+
+EAPI=5
+
+PYTHON_COMPAT=( python2_7 )
+
+inherit autotools eutils fdo-mime flag-o-matic multilib python-single-r1 systemd toolchain-funcs user
+
+MY_P="${P/_}"
+DESCRIPTION="Distribute compilation of C code across several machines on a network"
+HOMEPAGE="http://distcc.org/"
+SRC_URI="http://distcc.googlecode.com/files/${MY_P}.tar.bz2"
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~m68k ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86 ~sparc-fbsd ~x86-fbsd"
+IUSE="avahi crossdev gnome gssapi gtk hardened ipv6 selinux xinetd"
+
+RESTRICT="test"
+
+CDEPEND="${PYTHON_DEPS}
+       dev-libs/popt
+       avahi? ( >=net-dns/avahi-0.6[dbus] )
+       gnome? (
+               >=gnome-base/libgnome-2
+               >=gnome-base/libgnomeui-2
+               x11-libs/gtk+:2
+               x11-libs/pango
+       )
+       gssapi? ( net-libs/libgssglue )
+       gtk? ( x11-libs/gtk+:2 )"
+DEPEND="${CDEPEND}
+       virtual/pkgconfig"
+RDEPEND="${CDEPEND}
+       !net-misc/pump
+       >=sys-devel/gcc-config-1.4.1
+       selinux? ( sec-policy/selinux-distcc )
+       xinetd? ( sys-apps/xinetd )"
+
+REQUIRED_USE="${PYTHON_REQUIRED_USE}"
+
+S="${WORKDIR}/${MY_P}"
+
+DCCC_PATH="/usr/$(get_libdir)/distcc/bin"
+DISTCC_VERBOSE="0"
+
+pkg_setup() {
+       enewuser distcc 240 -1 -1 daemon
+       python-single-r1_pkg_setup
+}
+
+src_prepare() {
+       epatch "${FILESDIR}/${PN}-3.0-xinetd.patch"
+       # bug #253786
+       epatch "${FILESDIR}/${PN}-3.0-fix-fortify.patch"
+       # bug #255188
+       epatch "${FILESDIR}/${PN}-3.2_rc1-freedesktop.patch"
+       # bug #258364
+       epatch "${FILESDIR}/${PN}-3.2_rc1-python.patch"
+       # for net-libs/libgssglue
+       epatch "${FILESDIR}/${PN}-3.2_rc1-gssapi.patch"
+       # SOCKSv5 support needed for Portage, bug #537616
+       epatch "${FILESDIR}/${PN}-3.2_rc1-socks5.patch"
+       epatch_user
+
+       # Bugs #120001, #167844 and probably more. See patch for description.
+       use hardened && epatch "${FILESDIR}/distcc-hardened.patch"
+
+       sed -i \
+               -e "/PATH/s:\$distcc_location:${EPREFIX}${DCCC_PATH}:" \
+               -e "s:@PYTHON@:${EPYTHON}:" \
+               pump.in || die "sed failed"
+
+       sed \
+               -e "s:@EPREFIX@:${EPREFIX:-/}:" \
+               -e "s:@libdir@:/usr/$(get_libdir):" \
+               "${FILESDIR}/distcc-config-3.2_rc1" > "${T}/distcc-config" || die
+
+       eaclocal -Im4 --output=aclocal.m4
+       eautoconf
+}
+
+src_configure() {
+       local myconf="--disable-Werror --with-docdir=/usr/share/doc/${PF}"
+       # More legacy stuff?
+       [ "$(gcc-major-version)" = "2" ] && filter-lfs-flags
+
+       # --disable-rfc2553 b0rked, bug #254176
+       use ipv6 && myconf="${myconf} --enable-rfc2553"
+
+       econf \
+               $(use_with avahi) \
+               $(use_with gtk) \
+               $(use_with gnome) \
+               $(use_with gssapi auth) \
+               ${myconf}
+}
+
+src_install() {
+       default
+       python_optimize
+
+       dobin "${FILESDIR}/3.0/distcc-config"
+
+       newinitd "${FILESDIR}/3.1/init" distccd
+       systemd_dounit "${FILESDIR}/distccd.service"
+       systemd_install_serviced "${FILESDIR}/distccd.service.conf"
+
+       cp "${FILESDIR}/3.0/conf" "${T}/distccd" || die
+       if use avahi; then
+               cat >> "${T}/distccd" <<-EOF
+
+               # Enable zeroconf support in distccd
+               DISTCCD_OPTS="\${DISTCCD_OPTS} --zeroconf"
+               EOF
+
+               sed -i '/ExecStart/ s|$| --zeroconf|' "${ED}"/usr/lib/systemd/system/distccd.service || die
+       fi
+       doconfd "${T}/distccd" || die
+
+       cat > "${T}/02distcc" <<-EOF
+       # This file is managed by distcc-config; use it to change these settings.
+       # DISTCC_LOG and DISTCC_DIR should not be set.
+       DISTCC_VERBOSE="${DISTCC_VERBOSE:-0}"
+       DISTCC_FALLBACK="${DISTCC_FALLBACK:-1}"
+       DISTCC_SAVE_TEMPS="${DISTCC_SAVE_TEMPS:-0}"
+       DISTCC_TCP_CORK="${DISTCC_TCP_CORK}"
+       DISTCC_SSH="${DISTCC_SSH}"
+       UNCACHED_ERR_FD="${UNCACHED_ERR_FD}"
+       DISTCC_ENABLE_DISCREPANCY_EMAIL="${DISTCC_ENABLE_DISCREPANCY_EMAIL}"
+       DCC_EMAILLOG_WHOM_TO_BLAME="${DCC_EMAILLOG_WHOM_TO_BLAME}"
+       EOF
+       doenvd "${T}/02distcc" || die
+
+       keepdir "${DCCC_PATH}" || die
+
+       dobin "${T}/distcc-config" || die
+
+       # create the distccd pid directory
+       keepdir /var/run/distccd || die
+       fowners distcc:daemon /var/run/distccd || die
+
+       if use gnome || use gtk; then
+               einfo "Renaming /usr/bin/distccmon-gnome to /usr/bin/distccmon-gui"
+               einfo "This is to have a little sensability in naming schemes between distccmon programs"
+               mv "${ED}/usr/bin/distccmon-gnome" "${ED}/usr/bin/distccmon-gui" || die
+               dosym distccmon-gui /usr/bin/distccmon-gnome || die
+       fi
+
+       if use xinetd; then
+               insinto /etc/xinetd.d || die
+               newins "doc/example/xinetd" distcc || die
+       fi
+
+       rm -r "${ED}/etc/default" || die
+       rm "${ED}/etc/distcc/clients.allow" || die
+       rm "${ED}/etc/distcc/commands.allow.sh" || die
+}
+
+pkg_postinst() {
+       if [ -x "${EPREFIX}/usr/bin/distcc-config" ] ; then
+               if use crossdev; then
+                       "${EPREFIX}/usr/bin/distcc-config" --update-masquerade-with-crossdev
+               else
+                       "${EPREFIX}/usr/bin/distcc-config" --update-masquerade
+               fi
+       fi
+
+       use gnome && fdo-mime_desktop_database_update
+
+       elog
+       elog "Tips on using distcc with Gentoo can be found at"
+       elog "http://www.gentoo.org/doc/en/distcc.xml"
+       elog
+       elog "How to use pump mode with Gentoo:"
+       elog "# distcc-config --set-hosts \"foo,cpp,lzo bar,cpp,lzo baz,cpp,lzo\""
+       elog "# echo 'FEATURES=\"\${FEATURES} distcc distcc-pump\"' >> /etc/make.conf"
+       elog "# emerge -u world"
+       elog
+       elog "To use the distccmon programs with Gentoo you should use this command:"
+       elog "# DISTCC_DIR=\"${DISTCC_DIR:-${BUILD_PREFIX}/.distcc}\" distccmon-text 5"
+
+       if use gnome || use gtk; then
+               elog "Or:"
+               elog "# DISTCC_DIR=\"${DISTCC_DIR:-${BUILD_PREFIX}/.distcc}\" distccmon-gnome"
+       fi
+
+       elog
+       elog "***SECURITY NOTICE***"
+       elog "If you are upgrading distcc please make sure to run etc-update to"
+       elog "update your /etc/conf.d/distccd and /etc/init.d/distccd files with"
+       elog "added security precautions (the --listen and --allow directives)"
+       elog
+}
+
+pkg_postrm() {
+       # delete the masquerade directory
+       if [ ! -f "${EPREFIX}/usr/bin/distcc" ] ; then
+               einfo "Remove masquerade symbolic links."
+               rm "${EPREFIX}${DCCC_PATH}/"*{cc,c++,gcc,g++}
+               rmdir "${EPREFIX}${DCCC_PATH}"
+       fi
+
+       use gnome && fdo-mime_desktop_database_update
+}
diff --git a/sys-devel/distcc/files/distcc-3.2_rc1-socks5.patch b/sys-devel/distcc/files/distcc-3.2_rc1-socks5.patch
new file mode 100644 (file)
index 0000000..256a16f
--- /dev/null
@@ -0,0 +1,191 @@
+From fdd93b1e9545b66d1b3a2a1ec24d4c8613ee43fb Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= <mgorny@gentoo.org>
+Date: Sat, 24 Jan 2015 23:59:21 +0100
+Subject: [PATCH] Support SOCKSv5 proxy
+
+Support using a SOCKSv5 proxy specified as DISTCC_SOCKS_PROXY.
+The variable can either a hostname, a host:port pair or an absolute path
+to a UNIX socket. When SOCKS is used, the hostname is passed to
+the proxy and therefore the name resolution is done remotely.
+---
+ src/clinet.c | 137 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 135 insertions(+), 2 deletions(-)
+
+diff --git a/src/clinet.c b/src/clinet.c
+index 010a884..4773d8b 100644
+--- a/src/clinet.c
++++ b/src/clinet.c
+@@ -31,6 +31,7 @@
+ 
+ #include <stdio.h>
+ #include <stdlib.h>
++#include <stddef.h>
+ #include <unistd.h>
+ #include <string.h>
+ #include <fcntl.h>
+@@ -42,8 +43,10 @@
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ 
++#include <arpa/inet.h>
+ #include <netinet/in.h>
+ #include <netinet/tcp.h>
++#include <sys/un.h>
+ 
+ #include <netdb.h>
+ 
+@@ -161,7 +164,7 @@ out_failed:
+ /**
+  * Open a socket to a tcp remote host with the specified port.
+  **/
+-int dcc_connect_by_name(const char *host, int port, int *p_fd)
++static int dcc_connect_by_name_real(const char *host, int port, int *p_fd)
+ {
+     struct addrinfo hints;
+     struct addrinfo *res;
+@@ -201,7 +204,7 @@ int dcc_connect_by_name(const char *host, int port, int *p_fd)
+  *
+  * @todo Don't try for too long to connect.
+  **/
+-int dcc_connect_by_name(const char *host, int port, int *p_fd)
++static int dcc_connect_by_name_real(const char *host, int port, int *p_fd)
+ {
+     struct sockaddr_in sock_out;
+     struct hostent *hp;
+@@ -224,3 +227,133 @@ int dcc_connect_by_name(const char *host, int port, int *p_fd)
+ }
+ 
+ #endif /* not ENABLE_RFC2553 */
++
++static int dcc_connect_via_socks5(const char *host, int port, int *p_fd, const char *proxy)
++{
++      int ret;
++      char *proxy_host, *proxy_it;
++      int proxy_port;
++      char buf[262];
++      int host_length;
++      struct sockaddr_in addr_buf;
++      int skip_bytes;
++
++      host_length = strlen(host);
++      if (host_length > 255) {
++              rs_log_error("hostname \"%s\" too long for SOCKSv5 (over 255 chars)", host);
++              return EXIT_CONNECT_FAILED;
++      }
++
++      if (proxy[0] == '/') { /* UNIX socket */
++              struct sockaddr_un unix_addr;
++
++              if (strlen(proxy) >= sizeof(unix_addr.sun_path))
++              {
++                      rs_log_error("UNIX socket path \"%s\" too long", proxy);
++                      return EXIT_CONNECT_FAILED;
++              }
++
++              unix_addr.sun_family = AF_UNIX;
++              strcpy(unix_addr.sun_path, proxy);
++
++              ret = dcc_connect_by_addr((struct sockaddr *) &unix_addr,
++                              offsetof(struct sockaddr_un, sun_path) + strlen(proxy) + 1,
++                              p_fd);
++
++      } else { /* hostname? IP address? */
++              proxy_host = strdup(proxy);
++              if (proxy_host == NULL) return EXIT_OUT_OF_MEMORY;
++
++              proxy_it = strrchr(proxy_host, ':');
++              if (proxy_it) {
++                      *(proxy_it++) = 0;
++                      proxy_port = atoi(proxy_it);
++
++                      if (proxy_port <= 0) {
++                              rs_log_error("invalid proxy port \"%s\"", proxy_it);
++                              free(proxy_host);
++                              return EXIT_CONNECT_FAILED;
++                      }
++              }
++              else
++                      proxy_port = 1080;
++
++              ret = dcc_connect_by_name_real(proxy_host, proxy_port, p_fd);
++              free(proxy_host);
++      }
++
++      if (ret != 0)
++              return ret;
++
++      /* connected to proxy, now identifier/method selection */
++      buf[0] = 0x05; /* SOCKSv5 */
++      buf[1] = 0x01; /* one method */
++      buf[2] = 0x00; /* NO AUTHENTICATION REQUIRED */
++      ret = dcc_writex(*p_fd, buf, 3);
++      if (ret != 0)
++              return ret;
++
++      /* wait for method selection */
++      ret = dcc_readx(*p_fd, buf, 2);
++      if (ret != 0)
++              return ret;
++      if (buf[0] != 0x05 || buf[1] != 0x00) { /* version, method */
++              rs_log_error("invalid proxy reply (version 0x%02x, method 0x%02x)",
++                              buf[0], buf[1]);
++              return EXIT_CONNECT_FAILED;
++      }
++
++      /* send connect request */
++      buf[0] = 0x05; /* SOCKSv5 */
++      buf[1] = 0x01; /* CONNECT command */
++      buf[2] = 0x00; /* reserved */
++      buf[3] = 0x03; /* DOMAINNAME address type */
++      buf[4] = host_length;
++      memcpy(&buf[5], host, host_length);
++      addr_buf.sin_port = htons(port);
++      memcpy(&buf[5 + host_length], &addr_buf.sin_port, 2);
++      ret = dcc_writex(*p_fd, buf, 7 + host_length);
++      if (ret != 0)
++              return ret;
++
++      /* wait for the connection */
++      /* read first 4 bytes of reply + 2 extra bytes we know will be there */
++      ret = dcc_readx(*p_fd, buf, 6);
++      if (ret != 0)
++              return ret;
++      if (buf[0] != 0x05 || buf[2] != 0x00) { /* version, reserved */
++              rs_log_error("invalid proxy reply (version 0x%02x, reserved 0x%02x)",
++                              buf[0], buf[2]);
++              return EXIT_CONNECT_FAILED;
++      }
++      if (buf[1] != 0x00) { /* reply */
++              rs_log_error("proxy connection failed, reason=0x%02x", buf[1]);
++              return EXIT_CONNECT_FAILED;
++      }
++
++      /* now read the remaining (packet size - 6) bytes */
++      switch (buf[3]) { /* address type */
++              case 0x01: skip_bytes = 4; break; /* IPv4 */
++              case 0x03: skip_bytes = buf[4] + 1; break; /* hostname with length field */
++              case 0x04: skip_bytes = 16; break; /* IPv6 */
++              default:
++                 rs_log_error("invalid proxy reply (address type 0x%02x)", buf[3]);
++                 return EXIT_CONNECT_FAILED;
++      }
++      ret = dcc_readx(*p_fd, buf, skip_bytes);
++      if (ret != 0)
++              return ret;
++
++      return 0;
++}
++
++int dcc_connect_by_name(const char *host, int port, int *p_fd)
++{
++      const char *proxy;
++
++      proxy = getenv("DISTCC_SOCKS_PROXY");
++      if (proxy)
++              return dcc_connect_via_socks5(host, port, p_fd, proxy);
++      else
++              return dcc_connect_by_name_real(host, port, p_fd);
++}
+-- 
+2.3.0
+