#!/bin/sh # Convert a FreeBSD Driver into DriverAPI version. Doesn't take care of all the # cases yet, but still does about 95% of work. # Author: Sreekanth Rupavatharam # Juniper networks - 2014 if [ $# -lt 1 ] then echo " $0 "; exit 1; fi # XXX - This needs to change if the data structure uses different name __ifp__="ifp"; file=$1 rotateCursor() { case $toggle in 1) printf " \\ " printf "\b\b" toggle="2" ;; 2) printf " | " printf "\b\b\b" toggle="3" ;; 3) printf " / " printf "\b\b\b" toggle="4" ;; *) printf " - " printf "\b\b\b" toggle="1" ;; esac } handle_set() { # Handle the case where $__ifp__->if_blah = XX; line=$1 set=`echo $line| grep "$__ifp__->.* = "` if [ ! -z "$set" ] then word=`echo $line | awk -F "if_" ' { print $2 }' | awk -F" =" '{ print $1 }'` value=`echo $line | awk -F "=" '{ print $2 }' | sed -e 's/;//g'` new=`echo if_set$word"\($__ifp__,"$value");"` new=`echo $new | sed -e 's/&/\\\&/'` old=`echo $line|sed -e 's/^[ ]*//'` line=`echo $line| sed -e's/'$old'/'$new'/g'` return 0 fi return 1 } handle_inc() { line=$1 inc=`echo $line | grep "$__ifp__->.*++"` if [ ! -z "$inc" ] then word=`echo $line | awk -F"if_" '{ print $2 }'|awk -F"\+" '{ print $1}'` value=' 1'; old=`echo $line|sed -e 's/^[ ]*//'` new=`echo if_inc$word"\($__ifp__,"$value");"` new=`echo $new | sed -e 's/&/\\\&/'` line=`echo $line| sed -e's/'$old'/'$new'/g'` return 0; fi return 1; } handle_add() { line=$1 add=`echo $line|grep "$__ifp__->.*+= "` if [ ! -z "$add" ] then word=`echo $line | awk -F"if_" '{ print $2 }'|awk '{ print $1}'` value=`echo $line | awk -F"=" '{ print $2}' | sed -e 's/;//g'` new=`echo if_inc$word"\($__ifp__,$value);"` new=`echo $new | sed -e 's/&/\\\&/'` old=`echo $line|sed -e 's/^[ ]*//'` line=`echo $line| sed -e's/'$old'/'$new'/g'` return 0 fi return 1; } handle_or() { line=$1 or=`echo $line|grep "$__ifp__->.*|= "` if [ ! -z "$or" ] then word=`echo $line | awk -F"if_" '{ print $2 }'|awk '{ print $1}'` value=`echo $line | awk -F"=" '{ print $2}' | sed -e 's/;//g'` new=`echo if_set${word}bit"($__ifp__,$value, 0);"` new=`echo $new | sed -e 's/&/\\\&/'` #line=`echo $line|sed -e 's/&/\\&/'` old=`echo $line|sed -e 's/^[ ]*//'` line=`echo $line| sed -e's/'$old'/'$new'/g'` return 0; fi return 1; } handle_and() { line=$1 or=`echo $line|grep "$__ifp__->.*&= "` if [ ! -z "$or" ] then word=`echo $line | awk -F"if_" '{ print $2 }'|awk '{ print $1}'` value=`echo $line | awk -F"=" '{ print $2}' | sed -e 's/;//g'` value=`echo $value | sed -e's/~//g'` new=`echo if_set${word}bit"\($__ifp__, 0,$value);"` new=`echo $new | sed -e 's/&/\\\&/'` old=`echo $line|sed -e 's/^[ ]*//'` line=`echo $line| sed -e's/'$old'/'$new'/g'` return 0; fi return 1; } # XXX - this needs updating handle_misc() { line=$1 get=`echo $line | grep "if_capabilities\|if_flags\|if_softc\|if_capenable\|if_mtu\|if_drv_flags"` if [ ! -z "$get" ] then word=`echo $line |awk -F"$__ifp__->if_" '{ print $2 }' | \ sed -e's/[^a-zA-Z0-9_]/\@/'|awk -F"\@" '{ print $1}'` old=`echo "$__ifp__->if_"${word}` new=`echo "if_get"${word}"($__ifp__)"` new=`echo $new | sed -e 's/&/\\\&/'` line=`echo $line| sed -e's/'$old'/'$new'/g'` return 0; fi return 1; } if [ -e $file.tmp ] then rm $file.tmp fi IFS= echo -n "Conversion for $file started, please wait: " FAIL_PAT="XXX - DRVAPI" count=0 cat $1 | while read -r line do count=`expr $count + 1` rotateCursor pat=`echo $line | grep "$__ifp__->"` while [ "$pat" != "" ] do pat=`echo $line | grep "$__ifp__->"` if [ ! -z `echo $pat | grep "$FAIL_PAT"` ] then break; fi handle_set $line if [ $? != 0 ] then handle_inc $line fi if [ $? != 0 ] then handle_add $line fi if [ $? != 0 ] then handle_or $line fi if [ $? != 0 ] then handle_and $line fi if [ $? != 0 ] then handle_misc $line fi if [ $? != 0 ] then if [ ! -z `echo $line | grep "$__ifp__->"` ] then line=`echo $line | sed -e 's:$: \/* '${FAIL_PAT}' *\/:g'` fi fi done # Replace the ifnet * with if_t if [ ! -z `echo $line | grep "struct ifnet"` ] then line=`echo $line | sed -e 's/struct ifnet[ \t]*\*/if_t /g'` fi echo "$line" >> $file.tmp done echo "" count=`grep $FAIL_PAT $file.tmp | wc -l` if [ $count -gt 0 ] then echo "$count lines could not be converted to DRVAPI" echo "Look for /* $FAIL_PAT */ in the converted file" fi echo "original $file has been moved to $file.orig" mv $file $file.orig mv $file.tmp $file