#!/bin/sh # nfs2netbsd - arrange bits of (FreeBSD's) newnfs code for importing # usage: nfs2netbsd FREEBSDSYSDIR # # Caution: unlike most of the *2netbsd scripts in the tree, this copies # from another dir (which should be the sys/ dir from a FreeBSD checkout) # rather than operating on a tree already in the current directory. # # The current directory should be empty. # # $NetBSD: nfs2netbsd.sh,v 1.1 2013/09/30 07:23:37 dholland Exp $ FTOP="$1" if [ $# != 1 ]; then echo "$0: usage: $0 freebsdsysdir" 1>&2 exit 1 fi if [ ! -d "$FTOP" ]; then echo "$0: $FTOP: not found" 1>&2 exit 1 fi ############################################################ # 1. Get the list of files. # Note that we don't (for now anyway) take rpc/* and xdr/*. FILES=$(egrep -w 'nfscl|nfsd' "$FTOP"/conf/files | awk '{ print $1 }' |\ sed '/^rpc\//d;/^xdr\//d') DIRS=$(echo "$FILES" | sed 's,/[^/*]*$,,' | sort -u) MOREFILES=$(cd "$FTOP" && find $DIRS -name '*.h' -print) FILES="$FILES $MOREFILES" ############################################################ # 2. Create the directories to copy into. ALLDIRS=$(echo "$DIRS" | awk -F/ ' { path = sep = ""; for (i=1;i<=NF;i++) { path = path sep $i; sep = "/"; print path; } } ' | sort -u) for D in $ALLDIRS; do echo "MKDIR $D" mkdir "$D" || exit 1 done ############################################################ # 3. Copy the files. # In the course of copying, strip the dollar-signs from FreeBSD RCS # tags and add a NetBSD tag. for F in $FILES; do echo "COPY $F" awk < "$FTOP"/"$F" ' function detag() { gsub("\\$", "", $0); } function commentout() { $0 = "/* " $0 " */"; } BEGIN { first = 1; } # there are a handful of netbsd __RCSID()s in the input /__RCSID(.*NetBSD:.*)/ { detag(); commentout(); print; first = 0; next; } /__FBSDID(.*FreeBSD:.*)/ { detag(); commentout(); print; printf "__RCSID(\"%sNetBSD%s\");\n", "$", "$"; first = 0; next; } /\$NetBSD.*\$/ { detag(); print; first = 0; next; } /\$FreeBSD.*\$/ { orig = $0; detag(); print; sub("FreeBSD:.*\\$", "NetBSD$", orig); print orig; first = 0; next; } first { printf "/*\t%sNetBSD%s\t*/\n", "$", "$"; print; first = 0; next; } { print; } ' "name=$F" > "$F" done # If you need to diff the files against the freebsd tree for some # reason, e.g. because you needed to debug the awk script above, # uncomment this for testing. #exit 3 ############################################################ # 4. Move the files around the way we want them. # Be sure to reflect changes in this section into section 5. # If these fail, it means the script needs to be updated... mv nfs/nfsproto.h nfs/oldnfsproto.h || exit 1 mv nfs/xdr_subs.h nfs/old_xdr_subs.h || exit 1 # Make sure nothing in nfs/ and fs/nfs/ overlaps as we're going # to merge those dirs. BAD=$( ( (cd nfs && ls) (cd fs/nfs && ls) ) | sort | uniq -d) if [ x"$BAD" != x ]; then echo "$0: The following files exist in both nfs/ and fs/nfs/:" 1>&2 echo "$BAD" 1>&2 echo "$0: Please add logic to fix this before continuing." 1>&2 exit 1 fi # Now rearrange the dirs. mkdir fs/nfs/common || exit 1 mv nfs/*.[ch] fs/nfs/common/ || exit 1 mv fs/nfs/*.[ch] fs/nfs/common/ || exit 1 mv fs/nfsserver fs/nfs/server || exit 1 mv fs/nfsclient fs/nfs/client || exit 1 mv nlm fs/nfs/nlm || exit 1 rmdir nfs || exit 1 ############################################################ # 5. Prepare a skeleton files.newnfs. # This helps make sure that freebsd changes in the file list # propagate. echo 'GEN fs/nfs/files.newnfs' egrep -w 'nfscl|nfsd' "$FTOP"/conf/files |\ sed '/^rpc\//d;/^xdr\//d' | sed ' s,^fs/nfs/,fs/nfs/common/, s,^fs/nfsclient/,fs/nfs/client/, s,^fs/nfsserver/,fs/nfs/server/, s,^nfs/,fs/nfs/common/, s,^nlm/,fs/nfs/nlm/, ' | sort | awk ' BEGIN { # fbsd -> nbsd translation table for files.* tokens # old nfs implementation transtoken["nfsserver"] = "false"; transtoken["nfsclient"] = "false"; # new nfs implementation transtoken["nfscl"] = "new_nfsclient"; transtoken["nfsd"] = "new_nfsserver"; transtoken["nfslockd"] = "new_nfslockd"; transtoken["nfs_root"] = "new_nfs_boot"; transtoken["bootp"] = "new_nfs_boot_bootp"; # other stuff transtoken["inet"] = "true"; } { file = $1; expr = ""; havetoken = 0; for (i=2;i<=NF;i++) { if ($i == "optional") { continue; } if ($i == "|") { havetoken = 0; } else if (havetoken) { expr = expr " &"; havetoken = 0; } else { havetoken = 1; } t = $i; if (transtoken[t]) { t = transtoken[t]; } expr = expr " " t; seentokens[t] = 1; } gsub("false \\& [a-zA-Z0-9_]+ \\| ", "", expr); gsub("false \\| ", "", expr); gsub(" \\& true", "", expr); files[++nfiles] = file; exprs[file] = expr; } END { # This output is not meant to be perfect; it is meant as a # starting point. printf "#\t%sNetBSD%s\n", "$", "$"; printf "\n"; printf "deffs NEW_NFSCLIENT\n"; sep = "defflag opt_newnfs.h\t\t\t"; for (t in seentokens) { if (t == "true" || t == "false" || t == "|" || t == "&") { continue; } if (t == "new_nfsclient") { continue; } printf "%s%s\n", sep, toupper(t); sep = "\t\t\t\t\t"; } printf "\n"; for (i=1;i<=nfiles;i++) { printf "file\t%s", files[i]; ntabs = 4 - int(length(files[i])/8); if (ntabs < 1) { ntabs = 1; } for (j=0; j fs/nfs/files.newnfs ############################################################ # 6. done mv fs/nfs/* . || exit 1 rmdir fs/nfs fs || exit 1 echo "Now do:" echo " cvs -d cvs.netbsd.org:/cvsroot import src/sys/fs/nfs FREEBSD FREEBSD-NNNNNN" echo "where NNNNNN is the subversion version number."