Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/Linux/scripts/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 4 kB image not shown  

SSL check-sysctl-docs   Sprache: Text

 
#!/usr/bin/env -S gawk -f
# SPDX-License-Identifier: GPL-2.0

# Script to check sysctl documentation against source files
#
# Copyright (c) 2020 Stephen Kitt

# Example invocation:
# scripts/check-sysctl-docs -vtable="kernel" \
#  Documentation/admin-guide/sysctl/kernel.rst \
#  $(git grep -l register_sysctl)
#
# Specify -vdebug=1 to see debugging information

BEGIN {
 if (!table) {
 print "Please specify the table to look for using the table variable" > "/dev/stderr"
 exit 1
 }

 # Documentation title skiplist
 skiplist[0] = "^Documentation for"
 skiplist[1] = "Network core options$"
 skiplist[2] = "POSIX message queues filesystem$"
 skiplist[3] = "Configuration options"
 skiplist[4] = ". /proc/sys/fs"
 skiplist[5] = "^Introduction$"
 skiplist[6] = "^seccomp$"
 skiplist[7] = "^pty$"
 skiplist[8] = "^firmware_config$"
 skiplist[9] = "^random$"
}

# The following globals are used:
# documented: maps documented entries (each key is an entry)
# entries: maps ctl_table names and procnames to counts (so
#          enumerating the subkeys for a given ctl_table lists its
#          procnames)
# curtable: the name of the current ctl_table struct
# curentry: the name of the current proc entry (procname when parsing
#           a ctl_table, constructed path when parsing a ctl_path)


# Remove punctuation from the given value
function trimpunct(value) {
 while (value ~ /^["&]/) {
  value = substr(value, 2)
 }
 while (value ~ /[]["&,}]$/) {
  value = substr(value, 1, length(value) - 1)
 }
 return value
}

# Print the information for the given entry
function printentry(entry) {
 seen[entry]++
 printf "* %s from %s", entry, file[entry]
 if (documented[entry]) {
  printf " (documented)"
 }
 print ""
}


# Stage 1: build the list of documented entries
FNR == NR && /^=+$/ {
 for (i in skiplist) {
  if (prevline ~ skiplist[i]) {
   next
  }
 }

 # The previous line is a section title, parse it
 $0 = prevline
 if (debug) print "Parsing " $0
 inbrackets = 0
 for (i = 1; i <= NF; i++) {
  if (length($i) == 0) {
   continue
  }
  if (!inbrackets && substr($i, 1, 1) == "(") {
   inbrackets = 1
  }
  if (!inbrackets) {
   token = trimpunct($i)
   if (length(token) > 0 && token != "and") {
    if (debug) print trimpunct($i)
     documented[trimpunct($i)]++
   }
  }
  if (inbrackets && substr($i, length($i), 1) == ")") {
   inbrackets = 0
  }
 }
}

FNR == NR {
 prevline = $0
 next
}


# Stage 2: process each file and find all sysctl tables
BEGINFILE {
 delete entries
 curtable = ""
 curentry = ""
 delete vars
 if (debug) print "Processing file " FILENAME
}

/^static( const)? struct ctl_table/ {
 match($0, /static( const)? struct ctl_table ([^][]+)/, tables)
 curtable = tables[2]
 if (debug) print "Processing table " curtable
}

/^};$/ {
 curtable = ""
 curentry = ""
 delete vars
}

curtable && /\.procname[\t ]*=[\t ]*".+"/ {
 match($0, /.procname[\t ]*=[\t ]*"([^"]+)"/, names)
 curentry = names[1]
 if (debug) print "Adding entry " curentry " to table " curtable
 entries[curtable][curentry]++
 file[curentry] = FILENAME
}

curtable && /UCOUNT_ENTRY.*/ {
 match($0, /UCOUNT_ENTRY\("([^"]+)"\)/, names)
 curentry = names[1]
 if (debug) print "Adding entry " curentry " to table " curtable
 entries[curtable][curentry]++
 file[curentry] = FILENAME
}

/register_sysctl.*/ {
 match($0, /register_sysctl(|_init|_sz)\("([^"]+)" *, *([^,)]+)/, tables)
 if (debug) print "Registering table " tables[3] " at " tables[2]
 if (tables[2] == table) {
  for (entry in entries[tables[3]]) {
   printentry(entry)
  }
 }
}

/kmemdup.*/ {
 match($0, /([^ \t]+) *= *kmemdup\(([^,]+) *,/, names)
 if (debug) print "Found variable " names[1] " for table " names[2]
 if (names[2] in entries) {
  vars[names[1]] = names[2]
 }
}

/__register_sysctl_table.*/ {
 match($0, /__register_sysctl_table\([^,]+, *"([^"]+)" *, *([^,]+)/, tables)
 if (debug) print "Registering variable table " tables[2] " at " tables[1]
 if (tables[1] == table && tables[2] in vars) {
  for (entry in entries[vars[tables[2]]]) {
   printentry(entry)
  }
 }
}

END {
 for (entry in documented) {
  if (!seen[entry])
   print "No implementation for " entry
 }
}

¤ Dauer der Verarbeitung: 0.30 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung ist noch experimentell.