Blame scripts/gen-tunables.awk

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