123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- # 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 <dl-procinfo.h>\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"
- }
|