From: Michał Górny Date: Fri, 27 Feb 2015 21:14:23 +0000 (+0000) Subject: Add support for SOCKSv5 proxy, bug #537616. Needed for network-sandbox support in... X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=65fd3257095cb2e7f1df58491b342785b5969710;p=gentoo.git Add support for SOCKSv5 proxy, bug #537616. Needed for network-sandbox support in Portage. Package-Manager: portage-2.2.17/cvs/Linux x86_64 Manifest-Sign-Key: 0xEFB4464E! --- diff --git a/sys-devel/distcc/ChangeLog b/sys-devel/distcc/ChangeLog index 133262d046d9..635e372097a3 100644 --- a/sys-devel/distcc/ChangeLog +++ b/sys-devel/distcc/ChangeLog @@ -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 +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 distcc-3.1-r10.ebuild, distcc-3.2_rc1-r2.ebuild: diff --git a/sys-devel/distcc/Manifest b/sys-devel/distcc/Manifest index 90a14861f997..1f1e786e857e 100644 --- a/sys-devel/distcc/Manifest +++ b/sys-devel/distcc/Manifest @@ -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 index 000000000000..7eb32bd58d6c --- /dev/null +++ b/sys-devel/distcc/distcc-3.2_rc1-r3.ebuild @@ -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 index 000000000000..256a16ffd5ba --- /dev/null +++ b/sys-devel/distcc/files/distcc-3.2_rc1-socks5.patch @@ -0,0 +1,191 @@ +From fdd93b1e9545b66d1b3a2a1ec24d4c8613ee43fb Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= +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 + #include ++#include + #include + #include + #include +@@ -42,8 +43,10 @@ + #include + #include + ++#include + #include + #include ++#include + + #include + +@@ -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 +