# 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:
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
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-----
--- /dev/null
+# 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
+}
--- /dev/null
+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
+