]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Add script for generating autoloader definitions in case someone else wants to help
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Sun, 29 Apr 2018 11:44:11 +0000 (23:44 +1200)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Sun, 29 Apr 2018 11:44:11 +0000 (23:44 +1200)
scripts/autoload_defs.sh [new file with mode: 0755]

diff --git a/scripts/autoload_defs.sh b/scripts/autoload_defs.sh
new file mode 100755 (executable)
index 0000000..e6f0a10
--- /dev/null
@@ -0,0 +1,169 @@
+#!/bin/bash
+
+PATH="$PATH:./build/bin/local"
+NEED_INTERNAL=false
+NEED_RADIUS=false
+
+IFS=$'\n'
+for i in $@; do
+       ATTR_DEFS+=($(grep -o -E 'FR_[[:alnum:]_]*' "$i" | sort | uniq | sed -e 's/^FR_//' | sed -e 's/_/-/g'))
+done
+
+for i in $@; do
+       if echo $i | grep '[.]c$' > /dev/null; then
+               FILE=$(basename $i .c)
+               break
+       fi
+done
+
+RESOLVED=($(radict -- ${ATTR_DEFS[*]} | sort -k5,3))
+
+for i in ${RESOLVED[*]}; do
+       if echo $i | cut -f 5 | grep 'internal' > /dev/null; then
+               NEED_INTERNAL=true
+       else
+               NEED_RADIUS=true
+       fi
+
+       ATTRS+=($(echo $i | cut -f 3 | sed -e 's/-/_/g' | tr '[:upper:]' '[:lower:]'))
+done
+
+if $NEED_INTERNAL; then
+       echo "static fr_dict_t const *dict_freeradius;"
+fi
+
+if $NEED_RADIUS; then
+       echo "static fr_dict_t const *dict_radius;"
+fi
+
+echo
+
+printf "extern fr_dict_autoload_t %s_dict[];\n" $FILE
+printf "fr_dict_autoload_t %s_dict[] = {\n" $FILE
+
+if $NEED_INTERNAL; then
+       printf "\t{ .out = &dict_freeradius, .proto = \"freeradius\" },\n"
+fi
+
+if $NEED_RADIUS; then
+       printf "\t{ .out = &dict_radius, .proto = \"radius\" },\n"
+fi
+
+printf "\t{ NULL }\n"
+printf "};\n"
+
+echo
+
+for i in ${ATTRS[*]}; do
+       printf "static fr_dict_attr_t const *attr_%s;\n" $i
+done
+
+echo
+
+printf "extern fr_dict_attr_autoload_t %s_attr[];\n" $FILE
+printf "fr_dict_attr_autoload_t %s_attr[] = {\n" $FILE
+
+for i in ${RESOLVED[*]}; do
+       if echo $i | cut -f 5 | grep 'internal' > /dev/null; then
+               DICT="dict_freeradius"
+       else
+               DICT="dict_radius"
+       fi
+
+       NAME=$(echo $i | cut -f 3)
+       VAR=$(echo $NAME | sed -e 's/-/_/g' | tr '[:upper:]' '[:lower:]')
+
+       case $(echo $i | cut -f 4) in
+       'string')
+               TYPE="FR_TYPE_STRING"
+               ;;
+
+       'octets')
+               TYPE="FR_TYPE_OCTETS"
+               ;;
+
+       'ipaddr')
+               TYPE="FR_TYPE_IPV4_ADDR"
+               ;;
+
+       'ipv4prefix')
+               TYPE="FR_TYPE_IPV4_PREFIX"
+               ;;
+
+       'ipv6addr')
+               TYPE="FR_TYPE_IPV6_ADDR"
+               ;;
+
+       'ipv6prefix')
+               TYPE="FR_TYPE_IPV6_PREFIX"
+               ;;
+
+       'ifid')
+               TYPE="FR_TYPE_IFID"
+               ;;
+
+       'ether')
+               TYPE="FR_TYPE_ETHERNET"
+               ;;
+
+       'bool')
+               TYPE="FR_TYPE_BOOL"
+               ;;
+
+       'uint8')
+               TYPE="FR_TYPE_UINT8"
+               ;;
+
+       'uint16')
+               TYPE="FR_TYPE_UINT16"
+               ;;
+
+       'uint32')
+               TYPE="FR_TYPE_UINT32"
+               ;;
+
+       'uint64')
+               TYPE="FR_TYPE_UINT64"
+               ;;
+
+       'int8')
+               TYPE="FR_TYPE_INT8"
+               ;;
+
+       'int16')
+               TYPE="FR_TYPE_INT16"
+               ;;
+
+       'int32')
+               TYPE="FR_TYPE_INT32"
+               ;;
+
+       'int64')
+               TYPE="FR_TYPE_INT64"
+               ;;
+
+       'int64')
+               TYPE="FR_TYPE_INT64"
+               ;;
+
+       'float32')
+               TYPE="FR_TYPE_FLOAT32"
+               ;;
+
+       'float64')
+               TYPE="FR_TYPE_FLOAT64"
+               ;;
+
+       'date')
+               TYPE="FR_TYPE_DATE"
+               ;;
+       *)
+               TYPE="FR_UNKNOWN"
+               ;;
+       esac
+
+       printf "\t{ .out = &attr_%s, .name = \"%s\", .type = %s, .dict = &%s},\n" $VAR $NAME $TYPE $DICT
+done
+
+printf "\t{ NULL }\n"
+printf "};\n"