#!/bin/sh
#
# $NetBSD: pf2netbsd,v 1.2 2009/12/02 15:21:37 martti Exp $
#
# Copyright (c) 2009 The NetBSD Foundation, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
usage()
{
cat << EOF
Usage: `basename $0` [options] srcdir dstdir
where
-h This help
-v Be verbose
Example:
`basename $0` /tmp/openbsd-4.2 /tmp/netbsd-4.2
EOF
exit 1
}
verbose()
{
${VERBOSE} && echo $*
eval $*
}
mklist()
{
# $1 = filename
if [ -z "$1" ]; then
echo "ERROR: Not enough arguments for mklist!"
exit 1
fi
cat > $1 << EOF
etc/pf.conf
etc/pf.os
libexec/tftp-proxy/filter.c
libexec/tftp-proxy/filter.h
libexec/tftp-proxy/Makefile
libexec/tftp-proxy/tftp-proxy.8
libexec/tftp-proxy/tftp-proxy.c
sbin/pfctl/Makefile
sbin/pfctl/parse.y
sbin/pfctl/pfctl.8
sbin/pfctl/pfctl_altq.c
sbin/pfctl/pfctl.c
sbin/pfctl/pfctl.h
sbin/pfctl/pfctl_optimize.c
sbin/pfctl/pfctl_osfp.c
sbin/pfctl/pfctl_parser.c
sbin/pfctl/pfctl_parser.h
sbin/pfctl/pfctl_qstats.c
sbin/pfctl/pfctl_radix.c
sbin/pfctl/pfctl_table.c
sbin/pfctl/pf_print_state.c
sbin/pflogd/Makefile
sbin/pflogd/pflogd.8
sbin/pflogd/pflogd.c
sbin/pflogd/pflogd.h
sbin/pflogd/privsep.c
sbin/pflogd/privsep_fdpass.c
share/man/man4/pf.4
share/man/man4/pflog.4
share/man/man4/pfsync.4
share/man/man5/pf.conf.5
share/man/man5/pf.os.5
usr.sbin/authpf/authpf.8
usr.sbin/authpf/authpf.c
usr.sbin/authpf/Makefile
usr.sbin/authpf/pathnames.h
usr.sbin/ftp-proxy/filter.c
usr.sbin/ftp-proxy/filter.h
usr.sbin/ftp-proxy/ftp-proxy.8
usr.sbin/ftp-proxy/ftp-proxy.c
usr.sbin/ftp-proxy/Makefile
sys/net/if.c
sys/net/if.h
sys/net/if_pflog.c
sys/net/if_pflog.h
sys/net/if_pfsync.c
sys/net/if_pfsync.h
sys/net/pf.c
sys/net/pf_if.c
sys/net/pf_ioctl.c
sys/net/pf_norm.c
sys/net/pf_osfp.c
sys/net/pf_ruleset.c
sys/net/pf_table.c
sys/net/pfvar.h
sys/netinet/tcp_subr.c
sys/netinet/tcp_var.h
EOF
}
openbsd2netbsd()
{
# $1 = srcdir
# $2 = dstdir
if [ -z "$2" ]; then
echo "ERROR: Not enough arguments for openbsd2netbsd!"
exit 1
fi
if [ -d $2/dist/pf ]; then
echo "ERROR: $2 already exists!"
exit 1
fi
if [ -d "$1/src" ]; then
echo "ERROR: Use $1/src as the srcdir!"
exit 1
fi
cd $1 || exit 1
# Copy from OpenBSD
verbose "mklist /tmp/pf.$$"
verbose "mkdir -p $2"
verbose "tar -c -T /tmp/pf.$$ -f- | tar -x -f- -C $2"
# Some files have different name/location in NetBSD
verbose cd $2
verbose mkdir -p dist/pf sys/dist/pf
verbose cd $2/sys/net
verbose mv if.c if_compat.c
verbose mv if.h if_compat.h
verbose cp pf.c pf_mtag.c
verbose cp pfvar.h pf_mtag.h
verbose cd $2/sys/netinet
verbose mv tcp_subr.c tcp_rndiss.c
verbose mv tcp_var.h tcp_rndiss.h
verbose cd $2
verbose mv etc libexec sbin share usr.sbin dist/pf/
verbose cd $2/sys
verbose mv net netinet dist/pf/
# Remove references to the OpenBSD CVS
find $2 -name CVS | xargs rm -rf
# # Remove the $'s around various CVS keywords
# find $2 -type f | \
# while read f
# do
# sed -e 's/\$\(Id.*\) \$/\1/' \
# -e 's/\$\(Date.*\) \$/\1/' \
# -e 's/\$\(Header.*\) \$/\1/' \
# ${f} > ${f}.fixed
# mv ${f}.fixed ${f}
# echo "Deactivated CVS keywords from ${f}"
# done
# Add the NetBSD keyword
find $2 -type f -name '*.[chly]' | \
grep -v -e if_compat -e tcp_rndiss | \
while read f
do
sed 1q < ${f} | grep -q '\$NetBSD' || (
cat > /tmp/pf2n.$$ << EOF
/* \$NetBSD\$ */
EOF
cat ${f} >> /tmp/pf2n.$$
mv /tmp/pf2n.$$ ${f}
)
done
find $2 -type f -name '*.[0-9]' | \
while read f
do
sed 1q < ${f} | grep -q '\$NetBSD' || (
cat > /tmp/pf2n.$$ << EOF
.\" \$NetBSD\$
EOF
cat ${f} >> /tmp/pf2n.$$
mv /tmp/pf2n.$$ ${f}
)
done
find $2 -type f -name 'faq*' -o -name 'queue*' \
-o -name 'ackpri' -o -name 'spamd' | \
while read f
do
sed 1q < ${f} | grep -q '\$NetBSD' || (
cat > /tmp/pf2n.$$ << EOF
# \$NetBSD\$
EOF
cat ${f} >> /tmp/pf2n.$$
mv /tmp/pf2n.$$ ${f}
)
done
find $2 -type f -name 'Makefile' | \
while read f
do
sed 1q < ${f} | grep -q '\$NetBSD' || (
cat > /tmp/pf2n.$$ << EOF
# \$NetBSD\$
EOF
cat ${f} >> /tmp/pf2n.$$
mv /tmp/pf2n.$$ ${f}
)
done
}
##
## MAIN
##
VERBOSE=false
ARGV=`getopt hv ${*}`
[ ${?} != 0 ] && exit 1
set -- ${ARGV}
for i
do
case "${i}" in
-h)
usage
shift
;;
-v)
VERBOSE=true
shift
;;
--)
shift
;;
esac
done
[ $# -ne 2 ] && usage
openbsd2netbsd $1 $2
rm -f /tmp/pf.$$
echo ""
echo "The sources-to-be-imported are now in $2"
echo ""