ports/110850: new port: net/hamachi

Lapo Luchini lapo at lapo.it
Mon Mar 26 12:40:07 UTC 2007


>Number:         110850
>Category:       ports
>Synopsis:       new port: net/hamachi
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          maintainer-update
>Submitter-Id:   current-users
>Arrival-Date:   Mon Mar 26 12:40:06 GMT 2007
>Closed-Date:
>Last-Modified:
>Originator:     Lapo Luchini
>Release:        FreeBSD 6.2-PRERELEASE amd64
>Organization:
>Environment:
System: FreeBSD motoko.lapo.it 6.2-PRERELEASE FreeBSD 6.2-PRERELEASE #5: Wed Nov 22 20:09:06 CET 2006 root at motoko.lapo.it:/usr/obj/usr/src/sys/MOTOKO amd64

New port of Hamachi VPN (using Linux official binary).

--- pr-hamachi begins here ---
# This is a shell archive.  Save it in a file, remove anything before
# this line, and then unpack it by entering "sh file".  Note, it may
# create directories; files and directories will be owned by you and
# have default permissions.
#
# This archive contains:
#
#	hamachi
#	hamachi/files
#	hamachi/files/patch-Makefile
#	hamachi/files/patch-tuncfg_tuncfg.c
#	hamachi/files/hamachi.sh.in
#	hamachi/pkg-descr
#	hamachi/Makefile
#	hamachi/distinfo
#
echo c - hamachi
mkdir -p hamachi > /dev/null 2>&1
echo c - hamachi/files
mkdir -p hamachi/files > /dev/null 2>&1
echo x - hamachi/files/patch-Makefile
sed 's/^X//' >hamachi/files/patch-Makefile << 'END-of-hamachi/files/patch-Makefile'
X--- Makefile.orig	Tue Jun 20 21:47:28 2006
X+++ Makefile	Thu Mar 22 14:02:01 2007
X@@ -2,12 +2,12 @@
X #
X #	Where hamachi and its symbolic link hamachi-init goes
X #
X-HAMACHI_DST ?= /usr/bin
X+HAMACHI_DST ?= /usr/local/bin
X 
X #
X #	Where root-level tunnel device configuration daemon tuncfg goes
X #
X-TUNCFG_DST  ?= /sbin
X+TUNCFG_DST  ?= /usr/local/sbin
X 
X .phony: install
X 
X@@ -26,7 +26,7 @@
X 	fi;
X 	
X 	@echo Copying tuncfg into $(TUNCFG_DST) ..
X-	@install -s -m 700 tuncfg/tuncfg $(TUNCFG_DST)
X+	@install -s -m 700 tuncfg/tuncfg $(TUNCFG_DST)/hamachi-tuncfg
X 
X 	@echo
X 	@echo "Hamachi is installed. See README for what to do next." 
END-of-hamachi/files/patch-Makefile
echo x - hamachi/files/patch-tuncfg_tuncfg.c
sed 's/^X//' >hamachi/files/patch-tuncfg_tuncfg.c << 'END-of-hamachi/files/patch-tuncfg_tuncfg.c'
X--- tuncfg/tuncfg.c.orig	Tue Jun 20 21:47:28 2006
X+++ tuncfg/tuncfg.c	Fri Nov 17 11:14:51 2006
X@@ -20,7 +20,7 @@
X  *	normally required by a private networking software. Namely -
X  *
X  *	* creation of tunneling devices; this requires an access to 
X- *	  /dev/net/tun file, which _usually_ has 700 access mask
X+ *	  /dev/tapXX files, which _usually_ has 700 access mask
X  *
X  *	* configuration of the tunneling device using ifconfig, which is
X  *	  always a root-level operation
X@@ -29,7 +29,7 @@
X  *	open a listening domain socket /var/run/tuncfg.sock.
X  *
X  *	Upon accepting the connection on this socket, it will issue an open()
X- *	call for /dev/net/tun file (thus instantiating the tunneling device) 
X+ *	call for /dev/tapXX file (iterating over first 16 XX values)
X  *	and pass obtained FD to the peer process. It will also query and pass
X  *	the MAC address of the device to the peer process.
X  *
X@@ -48,10 +48,12 @@
X #include <sys/un.h>
X #include <sys/ioctl.h>
X #include <sys/stat.h>
X+#include <sys/sysctl.h>
X #include <arpa/inet.h>
X 
X-#include <linux/if.h>
X-#include <linux/if_tun.h>
X+#include <net/if.h>
X+#include <net/if_dl.h>
X+#include <netinet/in.h>
X 
X #include <unistd.h>
X #include <errno.h>
X@@ -59,6 +61,7 @@
X #include <fcntl.h>
X #include <stdarg.h>
X #include <stdlib.h>
X+#include <string.h>
X 
X /*
X  *
X@@ -68,7 +71,7 @@
X 
X #define TUNTAP_URL  "http://www.hamachi.cc/tuntap"
X 
X-#define MAX_CLIENTS 64
X+#define MAX_CLIENTS 16
X 
X struct context
X {
X@@ -90,6 +93,7 @@
X 	struct stat st;
X 	pid_t pid;
X 	int   fd, r, i;
X+	int   debug = 0;
X 
X 	struct context ctx[MAX_CLIENTS];
X 	int ctx_n = 0;
X@@ -98,18 +102,28 @@
X 	if (getuid() != 0)
X 		errorf("tuncfg: must be run with superuser permissions\n");
X 
X-	// lcok
X-	fd = open(LOCK_PATH, O_CREAT);
X+	//
X+	if (argc > 1)
X+	{
X+		debug = (strcmp(argv[1], "-d") == 0);
X+	}
X+
X+	// lock
X+	fd = open(LOCK_PATH, O_CREAT | O_RDWR);
X 	if (fd < 0)
X 		errorf("tuncfg: cannot open lock file %s -- %s\n",
X 			LOCK_PATH, strerror(errno));
X 
X+	//
X 	if (flock(fd, LOCK_EX | LOCK_NB) < 0)
X-		errorf("tuncfg: already running\n");
X+	{
X+		errorf("tuncfg: already running, "
X+		       "use 'killall tuncfg; tuncfg' to restart it\n");
X+	}
X 
X 	// check there's /dev/net/tun
X-	if (stat("/dev/net/tun", &st) < 0)
X-		errorf("tuncfg: cannot stat() /dev/net/tun -- %s\n"
X+	if (stat("/dev/tap0", &st) < 0)
X+		errorf("tuncfg: cannot stat() /dev/tap0 -- %s\n"
X 		       "tuncfg: visit %s for more information\n",
X 		       strerror(errno), TUNTAP_URL);
X 	
X@@ -143,7 +157,7 @@
X 			SOCK_PATH, strerror(errno));
X 
X 	// daemonize
X-	if (argc < 2 || strcmp(argv[1], "-d"))
X+	if (! debug)
X 	{
X 		chdir("/");
X 
X@@ -196,8 +210,13 @@
X 		if (FD_ISSET(fd, &fdr))
X 		{
X 			struct context * p;
X-			struct ifreq   ifr;
X 			char buf[4+6];
X+			int mib[6];
X+			size_t len;
X+			struct if_msghdr * msg = NULL;
X+			struct sockaddr_dl * sa;
X+			char dev_name[32];
X+			int i;
X 			int cli, dev = -1, tmp = -1;
X 
X 			cli = accept(fd, (void*)&addr, &alen);
X@@ -213,48 +232,64 @@
X 				goto done;
X 			}
X 
X-			// open tap device
X-			dev = open("/dev/net/tun", O_RDWR);
X-			printf("tuncfg: open() %d %d\n", dev, errno);
X+			// open first available tap device
X+			for (i=0; i<MAX_CLIENTS; i++)
X+			{
X+				snprintf(dev_name, sizeof(dev_name),
X+						"/dev/tap%d", i);
X+
X+				dev = open(dev_name, O_RDWR);
X+				printf("tuncfg: open(%s) %d %d\n", 
X+						dev_name, dev, errno);
X+				if (dev >= 0)
X+					break;
X+			}
X 			if (dev < 0)
X 			{
X-				r = (0x02 << 24) | errno;
X+				r = (0x02 << 24);
X 				goto done;
X 			}
X 
X-			// bring it up
X-			strcpy(ifr.ifr_name, "ham%d");
X-			ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
X-			if (ioctl(dev, TUNSETIFF, (ulong)&ifr) < 0)
X+			// query mac
X+			mib[0] = CTL_NET;
X+			mib[1] = AF_ROUTE;
X+			mib[2] = 0;
X+			mib[3] = AF_LINK;
X+			mib[4] = NET_RT_IFLIST;
X+			mib[5] = if_nametoindex("tap0");
X+
X+			if (! mib[5])
X 			{
X-				printf("tuncfg: ioctl() -1 %d\n", errno);
X 				r = (0x03 << 24) | errno;
X 				goto done;
X 			}
X-			printf("tuncfg: ioctl() 0 %s\n", ifr.ifr_name);
X 
X-			// query mac
X-			tmp = socket(AF_INET, SOCK_DGRAM, 0);
X-			if (tmp < 0)
X+			if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0)
X 			{
X-				printf("tuncfg: socket(mac) %d\n", errno);
X 				r = (0x04 << 24) | errno;
X 				goto done;
X 			}
X-			
X-			if (ioctl(tmp, SIOCGIFHWADDR, (ulong)&ifr) < 0)
X+
X+			msg = malloc(len);
X+			if (! msg)
X+			{
X+				r = (0x05 << 24) | errno;
X+				goto done;
X+			}
X+
X+			if (sysctl(mib, 6, msg, &len, NULL, 0) < 0)
X 			{
X-				printf("tuncfg: ioctl(mac) %d\n", errno);
X 				r = (0x05 << 24) | errno;
X 				goto done;
X 			}
X 
X-			memcpy(buf+4, &ifr.ifr_hwaddr.sa_data, 6);
X+			sa = (void*)(msg + 1);
X+			memcpy(buf+4, LLADDR(sa), 6);
X 
X 			// remember
X 			p = &ctx[ctx_n++];
X 			p->fd = cli;
X-			strncpy(p->dev, ifr.ifr_name, sizeof(p->dev));
X+			strncpy(p->dev, dev_name+5, 5);
X 
X 			r = 0;
X done:
X@@ -264,6 +299,7 @@
X 				send_with_fd(cli, buf, sizeof(buf), dev); 
X 			}
X 
X+			free(msg);
X 			if (tmp != -1)  close(tmp);
X 			if (dev != -1)  close(dev);
X 			if (r != 0)     close(cli);
X@@ -295,7 +331,7 @@
X 				goto ack;
X 			}
X 
X-			/* v[0] = ham<n>, v[1] = ip, v[2] = mask */
X+			/* v[0] = ip, v[1] = mask */
X 			if ( (v[0] & 0xff000000) != 0x05000000 ||
X 			     (v[1] & 0xff000000) != 0xff000000 )
X 			{
X@@ -324,9 +360,13 @@
X 
X 			r = system(cmd);
X 			printf("tuncfg: system(%s) %d %d\n", cmd, r, errno);
X-
X+			if (r != 0)
X+			{
X+				r = (0x08 << 24) | (r & 0x00ffffff);
X+				goto ack;
X+			}
X ack:
X-			printf("tuncfg: config() %08x", r);
X+			printf("tuncfg: config() %08x\n", r);
X 			send_with_fd(ctx[i].fd, &r, sizeof(r), -1);
X 		}
X 	}
X@@ -360,4 +400,3 @@
X 
X 	return sendmsg(fd, &msg, 0);
X }
X-
END-of-hamachi/files/patch-tuncfg_tuncfg.c
echo x - hamachi/files/hamachi.sh.in
sed 's/^X//' >hamachi/files/hamachi.sh.in << 'END-of-hamachi/files/hamachi.sh.in'
X#!/bin/sh
X#
X# hamachi.sh - load tap driver and start Hamachi's tuncfg daemon
X#
X# (C) Copyright 2007 by Lapo Luchini
X# (loosely based on ports/security/openvpn/files/openvpn.sh.in 1.9 by Matthias Andree)
X#
X# $FreeBSD$
X# 
X# This program is free software; you can redistribute it and/or modify it under
X# the terms of the GNU General Public License as published by the Free Software
X# Foundation; either version 2 of the License, or (at your option) any later
X# version.
X#
X# This program is distributed in the hope that it will be useful, but WITHOUT
X# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
X# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
X# details.
X#
X# You should have received a copy of the GNU General Public License along with
X# this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
X# Street, Fifth Floor, Boston, MA 02110-1301, USA.
X
X# PROVIDE: hamachi
X# REQUIRE: DAEMON
X# KEYWORD: shutdown
X
X#TODO: serve la KEYWORD:shutdown? che fa?
X
X# Note that we deliberately refrain from unloading drivers.
X
X. %%RC_SUBR%%
X
Xname="hamachi"
Xrcvar=`set_rcvar`
X
Xload_rc_config $name
X
X: ${hamachi_enable="NO"}
X
Xcommand="%%PREFIX%%/sbin/hamachi-tuncfg"
Xstart_precmd="hamachi_precmd"
X
Xhamachi_precmd() {
X	# FreeBSD <= 5.4 does not know kldstat's -m option
X	# FreeBSD >= 6.0 does not add debug.* sysctl information
X	# in the default build - we check both to keep things simple
X	if ! sysctl debug.if_tap_debug >/dev/null 2>&1 \
X			&& ! kldstat -m if_tap >/dev/null 2>&1 ; then
X		if ! kldload if_tap ; then
X			warn "Could not load tap module."
X			return 1
X		fi
X	fi
X	if ! sysctl compat.linux >/dev/null 2>&1 \
X			&& ! kldstat -m linuxelf >/dev/null 2>&1 ; then
X		if ! kldload linux ; then
X			warn "Could not load linux module."
X			return 1
X		fi
X	fi
X	return 0
X}
X
Xrun_rc_command "$1"
END-of-hamachi/files/hamachi.sh.in
echo x - hamachi/pkg-descr
sed 's/^X//' >hamachi/pkg-descr << 'END-of-hamachi/pkg-descr'
XHamachi is a zero-configuration virtual private networking tool
Xwith NAT-to-NAT traversal capabilities.
X
XWWW: http://hamachi.cc/
END-of-hamachi/pkg-descr
echo x - hamachi/Makefile
sed 's/^X//' >hamachi/Makefile << 'END-of-hamachi/Makefile'
X# New ports collection makefile for:	hamachi
X# Date created:				2006-11-17
X# Whom:					Lapo Luchini <lapo at lapo.it>
X#
X# $FreeBSD$
X#
X
XPORTNAME=	hamachi
XDISTVERSION=	0.9.9.9-20
XDISTVERSIONSUFFIX=	-lnx
XCATEGORIES=	net linux
XMASTER_SITES=	http://files.hamachi.cc/linux/
XPKGNAMEPREFIX=	linux-
X
XMAINTAINER=	lapo at lapo.it
XCOMMENT=	Fast, secure, simple VPN software with NAT-traversal
X
XNO_BUILD=	yes
XONLY_FOR_ARCHS=	i386 amd64
XUSE_LINUX=	yes
X
XUSE_RC_SUBR=	hamachi.sh
XPLIST_FILES=	bin/hamachi bin/hamachi-init sbin/hamachi-tuncfg
XPORTDOCS=	README CHANGES
X
Xpost-patch:
X	${RM} -f ${WRKSRC}/tuncfg/tuncfg
X	${CC} -o ${WRKSRC}/tuncfg/tuncfg ${WRKSRC}/tuncfg/tuncfg.c
X
Xpost-install:
X.if !defined(NOPORTDOCS)
X	${MKDIR} ${DOCSDIR}
X	cd ${WRKSRC} && ${INSTALL_DATA} ${PORTDOCS} ${DOCSDIR}
X.endif
X
X.include <bsd.port.mk>
END-of-hamachi/Makefile
echo x - hamachi/distinfo
sed 's/^X//' >hamachi/distinfo << 'END-of-hamachi/distinfo'
XMD5 (hamachi-0.9.9.9-20-lnx.tar.gz) = 27e4c926d0aa03de3573c0b7acf032a6
XSHA256 (hamachi-0.9.9.9-20-lnx.tar.gz) = 9e4b733558377d0c971ee2a19e04c0f5956e069033e8d13865f7c4dcb6d7f31b
XSIZE (hamachi-0.9.9.9-20-lnx.tar.gz) = 344866
END-of-hamachi/distinfo
exit
--- pr-hamachi ends here ---
>Description:
>How-To-Repeat:
>Fix:
>Release-Note:
>Audit-Trail:
>Unformatted:



More information about the freebsd-ports-bugs mailing list