# Generate dl-tunable-list.h from dl-tunables.list BEGIN { min_of["STRING"]="0" max_of["STRING"]="0" min_of["INT_32"]="INT32_MIN" max_of["INT_32"]="INT32_MAX" min_of["UINT_64"]="0" max_of["UINT_64"]="UINT64_MAX" min_of["SIZE_T"]="0" max_of["SIZE_T"]="SIZE_MAX" tunable="" ns="" top_ns="" } # Skip over blank lines and comments. /^#/ { next } /^[ \t]*$/ { next } # Beginning of either a top namespace, tunable namespace or a tunable, decided # on the current value of TUNABLE, NS or TOP_NS. $2 == "{" { if (top_ns == "") { top_ns = $1 } else if (ns == "") { ns = $1 } else if (tunable == "") { tunable = $1 } else { printf ("Unexpected occurrence of '{': %s:%d\n", FILENAME, FNR) exit 1 } next } # End of either a top namespace, tunable namespace or a tunable. $1 == "}" { if (tunable != "") { # Tunables definition ended, now fill in default attributes. if (!types[top_ns,ns,tunable]) { types[top_ns,ns,tunable] = "STRING" } if (!minvals[top_ns,ns,tunable]) { minvals[top_ns,ns,tunable] = min_of[types[top_ns,ns,tunable]] } if (!maxvals[top_ns,ns,tunable]) { maxvals[top_ns,ns,tunable] = max_of[types[top_ns,ns,tunable]] } if (!env_alias[top_ns,ns,tunable]) { env_alias[top_ns,ns,tunable] = "NULL" } if (!security_level[top_ns,ns,tunable]) { security_level[top_ns,ns,tunable] = "SXID_ERASE" } tunable = "" } else if (ns != "") { ns = "" } else if (top_ns != "") { top_ns = "" } else { printf ("syntax error: extra }: %s:%d\n", FILENAME, FNR) exit 1 } next } # Everything else, which could either be a tunable without any attributes or a # tunable attribute. { if (ns == "") { printf("Line %d: Invalid tunable outside a namespace: %s\n", NR, $0) exit 1 } if (tunable == "") { # We encountered a tunable without any attributes, so note it with a # default. types[top_ns,ns,$1] = "STRING" next } # Otherwise, we have encountered a tunable attribute. split($0, arr, ":") attr = gensub(/^[ \t]+|[ \t]+$/, "", "g", arr[1]) val = gensub(/^[ \t]+|[ \t]+$/, "", "g", arr[2]) if (attr == "type") { types[top_ns,ns,tunable] = val } else if (attr == "minval") { minvals[top_ns,ns,tunable] = val } else if (attr == "maxval") { maxvals[top_ns,ns,tunable] = val } else if (attr == "env_alias") { env_alias[top_ns,ns,tunable] = sprintf("\"%s\"", val) } else if (attr == "security_level") { if (val == "SXID_ERASE" || val == "SXID_IGNORE" || val == "NONE") { security_level[top_ns,ns,tunable] = val } else { printf("Line %d: Invalid value (%s) for security_level: %s, ", NR, val, $0) print("Allowed values are 'SXID_ERASE', 'SXID_IGNORE', or 'NONE'") exit 1 } } else if (attr == "default") { if (types[top_ns,ns,tunable] == "STRING") { default_val[top_ns,ns,tunable] = sprintf(".strval = \"%s\"", val); } else { default_val[top_ns,ns,tunable] = sprintf(".numval = %s", val) } } } END { if (ns != "") { print "Unterminated namespace. Is a closing brace missing?" exit 1 } print "/* AUTOGENERATED by gen-tunables.awk. */" print "#ifndef _TUNABLES_H_" print "# error \"Do not include this file directly.\"" print "# error \"Include tunables.h instead.\"" print "#endif" print "#include \n" # Now, the enum names print "\ntypedef enum" print "{" for (tnm in types) { split (tnm, indices, SUBSEP); t = indices[1]; n = indices[2]; m = indices[3]; printf (" TUNABLE_ENUM_NAME(%s, %s, %s),\n", t, n, m); } print "} tunable_id_t;\n" # Finally, the tunable list. print "\n#ifdef TUNABLES_INTERNAL" print "static tunable_t tunable_list[] attribute_relro = {" for (tnm in types) { split (tnm, indices, SUBSEP); t = indices[1]; n = indices[2]; m = indices[3]; printf (" {TUNABLE_NAME_S(%s, %s, %s)", t, n, m) printf (", {TUNABLE_TYPE_%s, %s, %s}, {%s}, NULL, TUNABLE_SECLEVEL_%s, %s},\n", types[t,n,m], minvals[t,n,m], maxvals[t,n,m], default_val[t,n,m], security_level[t,n,m], env_alias[t,n,m]); } print "};" print "#endif" }