net/dante: restore read/send-side pipe system check during configure

It was disabled (patched out) in July 2023 based on the pkg-fallout@
emails, nearly seven months after the last regression which could be
causing it had been fixed.  Evidently, the cluster was running buggy
kernel for its port-building jails long enough to confuse people the
problem was still somehow exhibiting itself.

While here, assume maintainership, fix some DRY bugs in the Makefile,
and install the manpages under $PREFIX/share/man per new world order.

PR:	272755
Fixes:	2b81a5f3f7
This commit is contained in:
Alexey Dokuchaev 2024-02-05 10:44:44 +00:00
parent 6fcbf445d8
commit 1b25faa3f9
3 changed files with 21 additions and 294 deletions

View file

@ -4,7 +4,7 @@ CATEGORIES= net security
MASTER_SITES= http://www.inet.no/dante/files/ \
ftp://ftp.inet.no/pub/socks/
MAINTAINER= ports@FreeBSD.org
MAINTAINER= danfe@FreeBSD.org
COMMENT= Circuit-level firewall/proxy
WWW= https://www.inet.no/dante/
@ -16,8 +16,9 @@ LIB_DEPENDS= libminiupnpc.so:net/miniupnpc \
CONFLICTS= socks5
USES= autoreconf libtool localbase
USES= libtool localbase
GNU_CONFIGURE= yes
GNU_CONFIGURE_MANPREFIX= ${PREFIX}/share
CONFIGURE_ARGS= --with-socks-conf=${PREFIX}/etc/socks.conf \
--with-sockd-conf=${PREFIX}/etc/sockd.conf
INSTALL_TARGET= install-strip
@ -28,23 +29,25 @@ USE_RC_SUBR= sockd
OPTIONS_DEFINE= DOCS EXAMPLES
post-install:
${INSTALL_DATA} ${WRKSRC}/example/socks.conf ${STAGEDIR}${PREFIX}/etc/socks.conf.sample
${INSTALL_DATA} ${WRKSRC}/example/sockd.conf ${STAGEDIR}${PREFIX}/etc/sockd.conf.sample
.for x in s d
${INSTALL_DATA} ${WRKSRC}/example/sock${x}.conf \
${STAGEDIR}${PREFIX}/etc/sock${x}.conf.sample
.endfor
post-install-EXAMPLES-on:
@${MKDIR} ${STAGEDIR}${EXAMPLESDIR}
${INSTALL_DATA} ${WRKSRC}/example/sockd-basic.conf ${STAGEDIR}${EXAMPLESDIR}
${INSTALL_DATA} ${WRKSRC}/example/sockd-chaining.conf ${STAGEDIR}${EXAMPLESDIR}
${INSTALL_DATA} ${WRKSRC}/example/socks-simple-withoutnameserver.conf ${STAGEDIR}${EXAMPLESDIR}
${INSTALL_DATA} ${WRKSRC}/example/socks-simple.conf ${STAGEDIR}${EXAMPLESDIR}
${INSTALL_DATA} ${WRKSRC}/example/sockd-basic.conf \
${WRKSRC}/example/sockd-chaining.conf \
${WRKSRC}/example/socks-simple-withoutnameserver.conf \
${WRKSRC}/example/socks-simple.conf ${STAGEDIR}${EXAMPLESDIR}
post-install-DOCS-on:
@${MKDIR} ${STAGEDIR}${DOCSDIR}
@${MKDIR} ${STAGEDIR}${DOCSDIR}/contrib
${INSTALL_DATA} ${WRKSRC}/doc/README* ${STAGEDIR}${DOCSDIR}
${INSTALL_DATA} ${WRKSRC}/doc/rfc* ${STAGEDIR}${DOCSDIR}
${INSTALL_DATA} ${WRKSRC}/doc/SOCKS4*.protocol ${STAGEDIR}${DOCSDIR}
${INSTALL_DATA} ${WRKSRC}/UPGRADE ${STAGEDIR}${DOCSDIR}
${INSTALL_DATA} ${WRKSRC}/contrib/sockd-stat.awk ${STAGEDIR}${DOCSDIR}/contrib/sockd-stat.awk
${INSTALL_DATA} ${WRKSRC}/doc/README* \
${WRKSRC}/doc/rfc* \
${WRKSRC}/doc/SOCKS4*.protocol \
${WRKSRC}/UPGRADE ${STAGEDIR}${DOCSDIR}
${INSTALL_DATA} ${WRKSRC}/contrib/sockd-stat.awk \
${STAGEDIR}${DOCSDIR}/contrib
.include <bsd.port.mk>

View file

@ -1,276 +0,0 @@
--- acinclude.m4.orig 2023-07-27 14:17:06 UTC
+++ acinclude.m4
@@ -437,270 +437,10 @@ unset pipeside
#This little hack tries to make an educated guess as to what is the
#case on this particular system.
AC_MSG_CHECKING(read/send-side pipe system)
-AC_TRY_RUN([
-#include <sys/types.h>
-#include <sys/socket.h>
+#This test is known to fail on the FreeBSD's official packaging
+#machine. Set it to recvbased as FreeBSD is known to be.
-#include <assert.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <errno.h>
-
-#ifndef MIN
-#define MIN(a,b) ((a) < (b) ? (a) : (b))
-#endif /* !MIN */
-
-#if NEED_AF_LOCAL
-#define AF_LOCAL AF_UNIX
-#endif /* NEED_AF_LOCAL */
-
-#define PACKETSIZE (1024)
-
-#define PADBYTES (sizeof(short) * (64))
-/*
- * Just a wild guess. Dante uses sizeof(long).
- */
-
-#define SEND_PIPE (0)
-#define RECV_PIPE (1)
-
-#define EXIT_OK (0) /* type successfully determined */
-#define EXIT_UNKNOWN (1) /* error: unable to determine type */
-
-static void
-setsockets(const int doreverse, const size_t packetsize,
- const int s, const int r,
- int *sndbuf, int *sndbuf_set,
- int *rcvbuf, int *rcvbuf_set);
-
-static size_t
-sendtest(const int s, const char *buf, const size_t buflen);
-
-void
-reswrite(const char *res);
-
-int
-main(void)
-{
- size_t sent, packetcount;
- int sndbuf, sndbuf_set, rcvbuf, rcvbuf_set;
- char buf[PACKETSIZE];
- int datapipev[2];
-
- if (socketpair(AF_LOCAL, SOCK_DGRAM, 0, datapipev) != 0) {
- perror("socketpair()");
- exit(EXIT_UNKNOWN);
- }
-
- setsockets(0,
- PACKETSIZE,
- datapipev[SEND_PIPE],
- datapipev[RECV_PIPE],
- &sndbuf, &sndbuf_set,
- &rcvbuf, &rcvbuf_set);
-
- packetcount = MIN(sndbuf, sndbuf_set) / (PACKETSIZE + PADBYTES);
-
- fprintf(stderr,
- "Requested sndbuf to be %d, is %d. "
- "Requested rcvbuf to be %d, is %d.\n"
- "Calculated packetcount is %lu\n",
- sndbuf, sndbuf_set,
- rcvbuf, rcvbuf_set,
- (unsigned long)packetcount);
-
- sent = sendtest(datapipev[SEND_PIPE], buf, PACKETSIZE) / PACKETSIZE;
-
- if (sent >= packetcount) {
- fprintf(stderr, "status determined by send-side\n");
- reswrite("sendbased");
- exit(EXIT_OK);
- }
-
- /*
- * Try the reverse. Perhaps this system wants a large rcvbuf rather than
- * a large sndbuf.
- */
- close(datapipev[SEND_PIPE]);
- close(datapipev[RECV_PIPE]);
-
- if (socketpair(AF_LOCAL, SOCK_DGRAM, 0, datapipev) != 0) {
- perror("socketpair()");
- exit(EXIT_UNKNOWN);
- }
-
- setsockets(1,
- PACKETSIZE,
- datapipev[SEND_PIPE],
- datapipev[RECV_PIPE],
- &sndbuf, &sndbuf_set,
- &rcvbuf, &rcvbuf_set);
-
- packetcount = MIN(rcvbuf, rcvbuf_set) / (PACKETSIZE + PADBYTES);
-
- fprintf(stderr,
- "Requested sndbuf to be %d, is %d. "
- "Requested rcvbuf to be %d, is %d.\n"
- "Calculated packetcount is %lu\n",
- sndbuf, sndbuf_set,
- rcvbuf, rcvbuf_set,
- (unsigned long)packetcount);
-
- sent = sendtest(datapipev[SEND_PIPE], buf, PACKETSIZE) / PACKETSIZE;
-
- if (sent >= packetcount) {
- fprintf(stderr, "status determined by read-side\n");
- reswrite("recvbased");
- exit(EXIT_OK);
- }
-
- fprintf(stderr, "status is unknown\n");
- return EXIT_UNKNOWN;
-}
-
-static void
-setsockets(doreverse, packetsize, s, r, sndbuf, sndbuf_set, rcvbuf, rcvbuf_set)
- const int doreverse;
- const size_t packetsize;
- const int s;
- const int r;
- int *sndbuf, *sndbuf_set;
- int *rcvbuf, *rcvbuf_set;
-{
- socklen_t len;
- int p;
-
- if ((p = fcntl(s, F_GETFL, 0)) == -1
- || fcntl(s, F_SETFL, p | O_NONBLOCK) == -1
- || fcntl(r, F_SETFL, p | O_NONBLOCK) == -1) {
- perror("fcntl(F_SETFL/F_GETFL, O_NONBLOCK) failed");
- exit(EXIT_UNKNOWN);
- }
-
- len = sizeof(*sndbuf_set);
-
- if (doreverse) {
- *sndbuf = packetsize + PADBYTES;
-
- if (setsockopt(s, SOL_SOCKET, SO_SNDBUF, sndbuf, sizeof(*sndbuf)) != 0) {
- perror("setsockopt(SO_SNDBUF)");
- exit(EXIT_UNKNOWN);
- }
-
- if (getsockopt(s, SOL_SOCKET, SO_SNDBUF, sndbuf_set, &len) != 0) {
- perror("getsockopt(SO_SNDBUF)");
- exit(EXIT_UNKNOWN);
- }
-
- *rcvbuf = *sndbuf_set * 10;
- if (setsockopt(r, SOL_SOCKET, SO_RCVBUF, rcvbuf, sizeof(*rcvbuf)) != 0) {
- perror("setsockopt(SO_RCVBUF)");
- exit(EXIT_UNKNOWN);
- }
- }
- else {
- *rcvbuf = packetsize + PADBYTES;
-
- if (setsockopt(r, SOL_SOCKET, SO_RCVBUF, rcvbuf, sizeof(*rcvbuf)) != 0) {
- perror("setsockopt(SO_RCVBUF)");
- exit(EXIT_UNKNOWN);
- }
-
- if (getsockopt(r, SOL_SOCKET, SO_RCVBUF, rcvbuf_set, &len) != 0) {
- perror("getsockopt(SO_RCVBUF)");
- exit(EXIT_UNKNOWN);
- }
-
- *sndbuf = *rcvbuf_set * 10;
- if (setsockopt(s, SOL_SOCKET, SO_SNDBUF, sndbuf, sizeof(*sndbuf)) != 0) {
- perror("setsockopt(SO_SNDBUF)");
- exit(EXIT_UNKNOWN);
- }
- }
-
- if (getsockopt(s, SOL_SOCKET, SO_SNDBUF, sndbuf_set, &len) != 0
- || getsockopt(r, SOL_SOCKET, SO_RCVBUF, rcvbuf_set, &len) != 0) {
- perror("getsockopt(SO_SNDBUF/SO_RCVBUF)");
- exit(EXIT_UNKNOWN);
- }
-
- fprintf(stderr, "sndbuf is %lu, rcvbuf is %lu\n",
- (unsigned long)*sndbuf_set, (unsigned long)*rcvbuf_set);
-
- if (doreverse) {
- if (*rcvbuf_set < *rcvbuf) {
- fprintf(stderr, "failed to set rcvbuf to %lu. Is %lu\n",
- (unsigned long)*rcvbuf, (unsigned long)*rcvbuf_set);
- exit(EXIT_UNKNOWN);
- }
- }
- else {
- if (*sndbuf_set < *sndbuf) {
- fprintf(stderr, "failed to set sndbuf to %lu (is %lu)\n",
- (unsigned long)*sndbuf, (unsigned long)*sndbuf_set);
- exit(EXIT_UNKNOWN);
- }
- }
-}
-
-static size_t
-sendtest(s, buf, buflen)
- const int s;
- const char *buf;
- const size_t buflen;
-{
- ssize_t rc;
- size_t sent;
- int i;
-
- i = 1;
- sent = 0;
- errno = 0;
-
- while (1) {
- if ((rc = write(s, buf, buflen)) == -1)
- break;
- else {
- assert(rc == (ssize_t)buflen);
-
- ++i;
- sent += rc;
- }
- }
-
- fprintf(stderr,
- "failed sending packet #%d, sent %ld/%ld. "
- "Total bytes sent: %lu. Error on last packet: %s\n",
- i,
- (long)rc,
- (unsigned long)buflen,
- (unsigned long)sent,
- strerror(errno));
-
- return sent;
-}
-
-void
-reswrite(res)
- const char *res;
-{
- FILE *fp;
- if ((fp = fopen("conftest.out", "w")) == NULL) {
- perror("fopen");
- exit(1);
- }
- fprintf(fp, "%s\n", res);
- fclose(fp);
-}], [pipeside=`cat conftest.out`
- AC_MSG_RESULT([$pipeside])
-], [AC_MSG_RESULT(unknown)],
- [dnl XXX assume no when cross-compiling
- AC_MSG_RESULT(cross-compiling, assuming unknown)])
-
-case $pipeside in
+case "recvbased" in
recvbased)
AC_DEFINE(HAVE_PIPEBUFFER_RECV_BASED, 1, [platform pipe behavior])
;;

View file

@ -8,10 +8,6 @@ lib/libsocks.so
lib/libsocks.so.0
lib/libsocks.so.0.1.1
sbin/sockd
man/man1/socksify.1.gz
man/man5/sockd.conf.5.gz
man/man5/socks.conf.5.gz
man/man8/sockd.8.gz
%%PORTEXAMPLES%%%%EXAMPLESDIR%%/sockd-basic.conf
%%PORTEXAMPLES%%%%EXAMPLESDIR%%/sockd-chaining.conf
%%PORTEXAMPLES%%%%EXAMPLESDIR%%/socks-simple-withoutnameserver.conf
@ -26,3 +22,7 @@ man/man8/sockd.8.gz
%%PORTDOCS%%%%DOCSDIR%%/rfc1928.txt
%%PORTDOCS%%%%DOCSDIR%%/rfc1929.txt
%%PORTDOCS%%%%DOCSDIR%%/rfc1961.txt
share/man/man1/socksify.1.gz
share/man/man5/sockd.conf.5.gz
share/man/man5/socks.conf.5.gz
share/man/man8/sockd.8.gz