10f3d9012SSascha Wildner#!/bin/sh 20f3d9012SSascha Wildner# 3988bb7fdSMatthias Schmidt# Generates kdump_subr.c 4988bb7fdSMatthias Schmidt# mkioctls is a special-purpose script, and works fine as it is 5988bb7fdSMatthias Schmidt# now, so it remains independent. The idea behind how it generates 6988bb7fdSMatthias Schmidt# its list was heavily borrowed here. 7988bb7fdSMatthias Schmidt# 8988bb7fdSMatthias Schmidt# Some functions here are automatically generated. This can mean 9988bb7fdSMatthias Schmidt# the user will see unusual kdump output or errors while building 10988bb7fdSMatthias Schmidt# if the underlying .h files are changed significantly. 11988bb7fdSMatthias Schmidt# 12988bb7fdSMatthias Schmidt# Key: 13988bb7fdSMatthias Schmidt# AUTO: Completely auto-generated with either the "or" or the "switch" 14988bb7fdSMatthias Schmidt# method. 15988bb7fdSMatthias Schmidt# AUTO - Special: Generated automatically, but with some extra commands 16988bb7fdSMatthias Schmidt# that the auto_*_type() functions are inappropriate for. 17988bb7fdSMatthias Schmidt# MANUAL: Manually entered and must therefore be manually updated. 18988bb7fdSMatthias Schmidt 19988bb7fdSMatthias Schmidt# $FreeBSD: src/usr.bin/kdump/mksubr,v 1.9 2007/04/09 19:16:24 emaste Exp $ 200f3d9012SSascha Wildner 210f3d9012SSascha Wildnerset -e 22988bb7fdSMatthias Schmidt 23988bb7fdSMatthias SchmidtLC_ALL=C; export LC_ALL 24988bb7fdSMatthias Schmidt 25988bb7fdSMatthias Schmidtif [ -z "$1" ] 26988bb7fdSMatthias Schmidtthen 27988bb7fdSMatthias Schmidt echo "usage: sh $0 include-dir" 28988bb7fdSMatthias Schmidt exit 1 29988bb7fdSMatthias Schmidtfi 30988bb7fdSMatthias Schmidtinclude_dir=$1 31988bb7fdSMatthias Schmidt 32988bb7fdSMatthias Schmidt# 33988bb7fdSMatthias Schmidt# Automatically generates a C function that will print out the 34988bb7fdSMatthias Schmidt# numeric input as a pipe-delimited string of the appropriate 35988bb7fdSMatthias Schmidt# #define keys. ex: 36988bb7fdSMatthias Schmidt# S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH 37988bb7fdSMatthias Schmidt# The XOR is necessary to prevent including the "0"-value in every 38988bb7fdSMatthias Schmidt# line. 39988bb7fdSMatthias Schmidt# 400086407eSSascha Wildnerauto_or_int () { 41988bb7fdSMatthias Schmidt local name grep file 42988bb7fdSMatthias Schmidt name=$1 43988bb7fdSMatthias Schmidt grep=$2 44988bb7fdSMatthias Schmidt file=$3 45988bb7fdSMatthias Schmidt 46988bb7fdSMatthias Schmidt cat <<_EOF_ 47988bb7fdSMatthias Schmidt/* AUTO */ 48988bb7fdSMatthias Schmidtvoid 49988bb7fdSMatthias Schmidt$name (int arg) 50988bb7fdSMatthias Schmidt{ 510086407eSSascha Wildner bool or = false; 520f3d9012SSascha Wildner printf("%#x<", arg); 53988bb7fdSMatthias Schmidt_EOF_ 54988bb7fdSMatthias Schmidt egrep "^#[[:space:]]*define[[:space:]]+"${grep}"[[:space:]]*" \ 55988bb7fdSMatthias Schmidt $include_dir/$file | \ 56988bb7fdSMatthias Schmidt awk '{ for (i = 1; i <= NF; i++) \ 57988bb7fdSMatthias Schmidt if ($i ~ /define/) \ 58988bb7fdSMatthias Schmidt break; \ 59988bb7fdSMatthias Schmidt ++i; \ 60988bb7fdSMatthias Schmidt printf "\tif(!((arg>0)^((%s)>0)))\n\t\tif_print_or(arg, %s, or);\n", $i, $i }' 61988bb7fdSMatthias Schmidtcat <<_EOF_ 620f3d9012SSascha Wildner printf(">"); 630086407eSSascha Wildner if (or == false) 640086407eSSascha Wildner printf("<invalid>%d", arg); 65988bb7fdSMatthias Schmidt} 66988bb7fdSMatthias Schmidt 67988bb7fdSMatthias Schmidt_EOF_ 68988bb7fdSMatthias Schmidt} 69988bb7fdSMatthias Schmidt 70988bb7fdSMatthias Schmidt# 71513a5bc4Szrj# Automatically generates a C function that will print out the 72513a5bc4Szrj# numeric input as a pipe-delimited string of the appropriate 73513a5bc4Szrj# #define keys. ex: 74513a5bc4Szrj# S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH 75513a5bc4Szrj# The XOR is necessary to prevent including the "0"-value in every 76513a5bc4Szrj# line. 77513a5bc4Szrj# 780086407eSSascha Wildnerauto_or_long () { 79513a5bc4Szrj local name grep file 80513a5bc4Szrj name=$1 81513a5bc4Szrj grep=$2 82513a5bc4Szrj file=$3 83513a5bc4Szrj 84513a5bc4Szrj cat <<_EOF_ 85513a5bc4Szrj/* AUTO */ 86513a5bc4Szrjvoid 87513a5bc4Szrj$name (long arg) 88513a5bc4Szrj{ 890086407eSSascha Wildner bool or = false; 90513a5bc4Szrj printf("%#lx<", arg); 91513a5bc4Szrj_EOF_ 92513a5bc4Szrj egrep "^#[[:space:]]*define[[:space:]]+"${grep}"[[:space:]]*" \ 93513a5bc4Szrj $include_dir/$file | \ 94513a5bc4Szrj awk '{ for (i = 1; i <= NF; i++) \ 95513a5bc4Szrj if ($i ~ /define/) \ 96513a5bc4Szrj break; \ 97513a5bc4Szrj ++i; \ 98513a5bc4Szrj printf "\tif(!((arg>0)^((%s)>0)))\n\t\tif_print_or(arg, %s, or);\n", $i, $i }' 99513a5bc4Szrjcat <<_EOF_ 100513a5bc4Szrj printf(">"); 1010086407eSSascha Wildner if (or == false) 1020086407eSSascha Wildner printf("<invalid>%ld", arg); 103513a5bc4Szrj} 104513a5bc4Szrj 105513a5bc4Szrj_EOF_ 106513a5bc4Szrj} 107513a5bc4Szrj 108513a5bc4Szrj# 109988bb7fdSMatthias Schmidt# Automatically generates a C function used when the argument 110988bb7fdSMatthias Schmidt# maps to a single, specific #definition 111988bb7fdSMatthias Schmidt# 112988bb7fdSMatthias Schmidtauto_switch_type () { 113355d3385SSascha Wildner local name grep file noinvdef 114988bb7fdSMatthias Schmidt name=$1 115988bb7fdSMatthias Schmidt grep=$2 116988bb7fdSMatthias Schmidt file=$3 117355d3385SSascha Wildner noinvdef=$4 118988bb7fdSMatthias Schmidt 119988bb7fdSMatthias Schmidt cat <<_EOF_ 120988bb7fdSMatthias Schmidt/* AUTO */ 121988bb7fdSMatthias Schmidtvoid 122988bb7fdSMatthias Schmidt$name (int arg) 123988bb7fdSMatthias Schmidt{ 124988bb7fdSMatthias Schmidt switch (arg) { 125988bb7fdSMatthias Schmidt_EOF_ 126988bb7fdSMatthias Schmidt egrep "^#[[:space:]]*define[[:space:]]+"${grep}"[[:space:]]*" \ 127988bb7fdSMatthias Schmidt $include_dir/$file | \ 128988bb7fdSMatthias Schmidt awk '{ for (i = 1; i <= NF; i++) \ 129988bb7fdSMatthias Schmidt if ($i ~ /define/) \ 130988bb7fdSMatthias Schmidt break; \ 131988bb7fdSMatthias Schmidt ++i; \ 132d119d94dSSascha Wildner printf "\tcase %s:\n\t\tprintf(\"%s\");\n\t\tbreak;\n", $i, $i }' 133355d3385SSascha Wildner if [ -z "$noinvdef" ]; then 134988bb7fdSMatthias Schmidtcat <<_EOF_ 135988bb7fdSMatthias Schmidt default: /* Should not reach */ 136d119d94dSSascha Wildner printf("<invalid=%ld>", (long)arg); 137988bb7fdSMatthias Schmidt } 138988bb7fdSMatthias Schmidt} 139988bb7fdSMatthias Schmidt 140988bb7fdSMatthias Schmidt_EOF_ 141355d3385SSascha Wildner else 142355d3385SSascha Wildnercat <<_EOF_ 143355d3385SSascha Wildner default: 144355d3385SSascha Wildner printf("%ld", (long)arg); 145355d3385SSascha Wildner } 146355d3385SSascha Wildner} 147355d3385SSascha Wildner 148355d3385SSascha Wildner_EOF_ 149355d3385SSascha Wildner fi 150988bb7fdSMatthias Schmidt} 151988bb7fdSMatthias Schmidt 152988bb7fdSMatthias Schmidt# 153988bb7fdSMatthias Schmidt# Automatically generates a C function used when the argument 154988bb7fdSMatthias Schmidt# maps to a #definition 155988bb7fdSMatthias Schmidt# 156988bb7fdSMatthias Schmidtauto_if_type () { 157988bb7fdSMatthias Schmidt local name grep file 158988bb7fdSMatthias Schmidt name=$1 159988bb7fdSMatthias Schmidt grep=$2 160988bb7fdSMatthias Schmidt file=$3 161988bb7fdSMatthias Schmidt 162988bb7fdSMatthias Schmidt cat <<_EOF_ 163988bb7fdSMatthias Schmidt/* AUTO */ 164988bb7fdSMatthias Schmidtvoid 165988bb7fdSMatthias Schmidt$name (int arg) 166988bb7fdSMatthias Schmidt{ 167988bb7fdSMatthias Schmidt_EOF_ 168988bb7fdSMatthias Schmidt egrep "^#[[:space:]]*define[[:space:]]+"${grep}"[[:space:]]*" \ 169988bb7fdSMatthias Schmidt $include_dir/$file | \ 170988bb7fdSMatthias Schmidt awk '{ printf "\t"; \ 171988bb7fdSMatthias Schmidt if (NR > 1) \ 172988bb7fdSMatthias Schmidt printf "else " ; \ 173988bb7fdSMatthias Schmidt printf "if (arg == %s) \n\t\tprintf(\"%s\");\n", $2, $2 }' 174988bb7fdSMatthias Schmidtcat <<_EOF_ 175988bb7fdSMatthias Schmidt else /* Should not reach */ 176d119d94dSSascha Wildner printf("<invalid=%ld>", (long)arg); 177988bb7fdSMatthias Schmidt} 178988bb7fdSMatthias Schmidt 179988bb7fdSMatthias Schmidt_EOF_ 180988bb7fdSMatthias Schmidt} 181988bb7fdSMatthias Schmidt 182988bb7fdSMatthias Schmidt# C start 183988bb7fdSMatthias Schmidt 184988bb7fdSMatthias Schmidtcat <<_EOF_ 185988bb7fdSMatthias Schmidt#define _KERNEL_STRUCTURES 186988bb7fdSMatthias Schmidt 187988bb7fdSMatthias Schmidt#include <stdio.h> 188493ee394SSascha Wildner#include <time.h> 189988bb7fdSMatthias Schmidt#include <sys/fcntl.h> 190988bb7fdSMatthias Schmidt#include <sys/stat.h> 191988bb7fdSMatthias Schmidt#include <sys/unistd.h> 192988bb7fdSMatthias Schmidt#include <sys/mman.h> 193988bb7fdSMatthias Schmidt#include <sys/wait.h> 194988bb7fdSMatthias Schmidt#include <sys/socket.h> 195988bb7fdSMatthias Schmidt#include <netinet/in.h> 196988bb7fdSMatthias Schmidt#include <sys/param.h> 197988bb7fdSMatthias Schmidt#include <sys/mount.h> 198988bb7fdSMatthias Schmidt#include <sys/resource.h> 199988bb7fdSMatthias Schmidt#include <sys/reboot.h> 200988bb7fdSMatthias Schmidt#include <sched.h> 20137ffcab2SSascha Wildner#include <sys/usched.h> 202988bb7fdSMatthias Schmidt#include <sys/linker.h> 203988bb7fdSMatthias Schmidt#include <sys/extattr.h> 204988bb7fdSMatthias Schmidt#include <sys/acl.h> 205988bb7fdSMatthias Schmidt#include <aio.h> 206988bb7fdSMatthias Schmidt#include <sys/sem.h> 207988bb7fdSMatthias Schmidt#include <sys/ipc.h> 208988bb7fdSMatthias Schmidt#include <sys/rtprio.h> 209988bb7fdSMatthias Schmidt#include <sys/shm.h> 210988bb7fdSMatthias Schmidt#include <vfs/ufs/quota.h> 21137ffcab2SSascha Wildner#include <sys/kenv.h> 21237ffcab2SSascha Wildner#include <sys/checkpoint.h> 21337ffcab2SSascha Wildner#include <sys/procctl.h> 21437ffcab2SSascha Wildner#include <sys/mountctl.h> 21537ffcab2SSascha Wildner#include <sys/varsym.h> 216988bb7fdSMatthias Schmidt 217988bb7fdSMatthias Schmidt#include "kdump_subr.h" 218988bb7fdSMatthias Schmidt 219988bb7fdSMatthias Schmidt/* 220988bb7fdSMatthias Schmidt * These are simple support macros. print_or utilizes a variable 221988bb7fdSMatthias Schmidt * defined in the calling function to track whether or not it should 222988bb7fdSMatthias Schmidt * print a logical-OR character ('|') before a string. if_print_or 223988bb7fdSMatthias Schmidt * simply handles the necessary "if" statement used in many lines 224988bb7fdSMatthias Schmidt * of this file. 225988bb7fdSMatthias Schmidt */ 226988bb7fdSMatthias Schmidt#define print_or(str,orflag) do { \\ 2270086407eSSascha Wildner if (orflag) putchar('|'); else orflag = true; \\ 228988bb7fdSMatthias Schmidt printf (str); } \\ 229988bb7fdSMatthias Schmidt while (0) 230988bb7fdSMatthias Schmidt#define if_print_or(i,flag,orflag) do { \\ 231988bb7fdSMatthias Schmidt if ((i & flag) == flag) \\ 232988bb7fdSMatthias Schmidt print_or(#flag,orflag); } \\ 233988bb7fdSMatthias Schmidt while (0) 234988bb7fdSMatthias Schmidt 235988bb7fdSMatthias Schmidt/* MANUAL */ 236988bb7fdSMatthias Schmidtextern char *signames[]; /* from kdump.c */ 237988bb7fdSMatthias Schmidtvoid 238988bb7fdSMatthias Schmidtsigname (int sig) 239988bb7fdSMatthias Schmidt{ 24085619e7eSSimon Schubert if (sig > 0 && sig < NSIG && signames[sig] != NULL) 241d119d94dSSascha Wildner printf("SIG%s",signames[sig]); 242988bb7fdSMatthias Schmidt else 243d119d94dSSascha Wildner printf("SIG %d", sig); 244988bb7fdSMatthias Schmidt} 245988bb7fdSMatthias Schmidt 246988bb7fdSMatthias Schmidt/* MANUAL */ 247988bb7fdSMatthias Schmidtvoid 248988bb7fdSMatthias Schmidtsemctlname (int cmd) 249988bb7fdSMatthias Schmidt{ 250988bb7fdSMatthias Schmidt switch (cmd) { 251988bb7fdSMatthias Schmidt case GETNCNT: 252d119d94dSSascha Wildner printf("GETNCNT"); 253988bb7fdSMatthias Schmidt break; 254988bb7fdSMatthias Schmidt case GETPID: 255d119d94dSSascha Wildner printf("GETPID"); 256988bb7fdSMatthias Schmidt break; 257988bb7fdSMatthias Schmidt case GETVAL: 258d119d94dSSascha Wildner printf("GETVAL"); 259988bb7fdSMatthias Schmidt break; 260988bb7fdSMatthias Schmidt case GETALL: 261d119d94dSSascha Wildner printf("GETALL"); 262988bb7fdSMatthias Schmidt break; 263988bb7fdSMatthias Schmidt case GETZCNT: 264d119d94dSSascha Wildner printf("GETZCNT"); 265988bb7fdSMatthias Schmidt break; 266988bb7fdSMatthias Schmidt case SETVAL: 267d119d94dSSascha Wildner printf("SETVAL"); 268988bb7fdSMatthias Schmidt break; 269988bb7fdSMatthias Schmidt case SETALL: 270d119d94dSSascha Wildner printf("SETALL"); 271988bb7fdSMatthias Schmidt break; 272988bb7fdSMatthias Schmidt case IPC_RMID: 273d119d94dSSascha Wildner printf("IPC_RMID"); 274988bb7fdSMatthias Schmidt break; 275988bb7fdSMatthias Schmidt case IPC_SET: 276d119d94dSSascha Wildner printf("IPC_SET"); 277988bb7fdSMatthias Schmidt break; 278988bb7fdSMatthias Schmidt case IPC_STAT: 279d119d94dSSascha Wildner printf("IPC_STAT"); 280988bb7fdSMatthias Schmidt break; 281988bb7fdSMatthias Schmidt default: /* Should not reach */ 282d119d94dSSascha Wildner printf("<invalid=%ld>", (long)cmd); 283988bb7fdSMatthias Schmidt } 284988bb7fdSMatthias Schmidt} 285988bb7fdSMatthias Schmidt 286988bb7fdSMatthias Schmidt/* MANUAL */ 287988bb7fdSMatthias Schmidtvoid 288988bb7fdSMatthias Schmidtshmctlname (int cmd) { 289988bb7fdSMatthias Schmidt switch (cmd) { 290988bb7fdSMatthias Schmidt case IPC_RMID: 291d119d94dSSascha Wildner printf("IPC_RMID"); 292988bb7fdSMatthias Schmidt break; 293988bb7fdSMatthias Schmidt case IPC_SET: 294d119d94dSSascha Wildner printf("IPC_SET"); 295988bb7fdSMatthias Schmidt break; 296988bb7fdSMatthias Schmidt case IPC_STAT: 297d119d94dSSascha Wildner printf("IPC_STAT"); 298988bb7fdSMatthias Schmidt break; 299988bb7fdSMatthias Schmidt default: /* Should not reach */ 300d119d94dSSascha Wildner printf("<invalid=%ld>", (long)cmd); 301988bb7fdSMatthias Schmidt } 302988bb7fdSMatthias Schmidt} 303988bb7fdSMatthias Schmidt 304988bb7fdSMatthias Schmidt/* MANUAL */ 305988bb7fdSMatthias Schmidtvoid 306988bb7fdSMatthias Schmidtsemgetname (int flag) { 307988bb7fdSMatthias Schmidt int or = 0; 308988bb7fdSMatthias Schmidt if_print_or(flag, SEM_R, or); 309988bb7fdSMatthias Schmidt if_print_or(flag, SEM_A, or); 310988bb7fdSMatthias Schmidt if_print_or(flag, (SEM_R>>3), or); 311988bb7fdSMatthias Schmidt if_print_or(flag, (SEM_A>>3), or); 312988bb7fdSMatthias Schmidt if_print_or(flag, (SEM_R>>6), or); 313988bb7fdSMatthias Schmidt if_print_or(flag, (SEM_A>>6), or); 314988bb7fdSMatthias Schmidt} 315988bb7fdSMatthias Schmidt 316988bb7fdSMatthias Schmidt/* 317988bb7fdSMatthias Schmidt * MANUAL 318988bb7fdSMatthias Schmidt * 319988bb7fdSMatthias Schmidt * Only used by SYS_open. Unless O_CREAT is set in flags, the 320988bb7fdSMatthias Schmidt * mode argument is unused (and often bogus and misleading). 321988bb7fdSMatthias Schmidt */ 322988bb7fdSMatthias Schmidtvoid 323988bb7fdSMatthias Schmidtflagsandmodename (int flags, int mode, int decimal) { 324988bb7fdSMatthias Schmidt flagsname (flags); 325d119d94dSSascha Wildner putchar(','); 326988bb7fdSMatthias Schmidt if ((flags & O_CREAT) == O_CREAT) { 327988bb7fdSMatthias Schmidt modename (mode); 328988bb7fdSMatthias Schmidt } else { 329988bb7fdSMatthias Schmidt if (decimal) { 330d119d94dSSascha Wildner printf("<unused>%ld", (long)mode); 331988bb7fdSMatthias Schmidt } else { 332d119d94dSSascha Wildner printf("<unused>%#lx", (long)mode); 333988bb7fdSMatthias Schmidt } 334988bb7fdSMatthias Schmidt } 335988bb7fdSMatthias Schmidt} 336988bb7fdSMatthias Schmidt 337988bb7fdSMatthias Schmidt/* 338988bb7fdSMatthias Schmidt * MANUAL 339988bb7fdSMatthias Schmidt * 340988bb7fdSMatthias Schmidt * [g|s]etsockopt's level argument can either be SOL_SOCKET or a value 341988bb7fdSMatthias Schmidt * referring to a line in /etc/protocols . It might be appropriate 342988bb7fdSMatthias Schmidt * to use getprotoent(3) here. 343988bb7fdSMatthias Schmidt */ 344988bb7fdSMatthias Schmidtvoid 345988bb7fdSMatthias Schmidtsockoptlevelname (int level, int decimal) 346988bb7fdSMatthias Schmidt{ 347988bb7fdSMatthias Schmidt if (level == SOL_SOCKET) { 348d119d94dSSascha Wildner printf("SOL_SOCKET"); 349988bb7fdSMatthias Schmidt } else { 350988bb7fdSMatthias Schmidt if (decimal) { 351d119d94dSSascha Wildner printf("%ld", (long)level); 352988bb7fdSMatthias Schmidt } else { 353d119d94dSSascha Wildner printf("%#lx", (long)level); 354988bb7fdSMatthias Schmidt } 355988bb7fdSMatthias Schmidt } 356988bb7fdSMatthias Schmidt} 357988bb7fdSMatthias Schmidt 358988bb7fdSMatthias Schmidt_EOF_ 359988bb7fdSMatthias Schmidt 3600086407eSSascha Wildnerauto_or_int "modename" "S_[A-Z]+[[:space:]]+[0-6]{7}" "sys/stat.h" 3610086407eSSascha Wildnerauto_or_int "flagsname" "O_[A-Z]+[[:space:]]+0x[0-9A-Fa-f]+" "sys/fcntl.h" 3620086407eSSascha Wildnerauto_or_int "accessmodename" "[A-Z]_OK[[:space:]]+0?x?[0-9A-Fa-f]+" "sys/unistd.h" 3630086407eSSascha Wildnerauto_or_int "mmapprotname" "PROT_[A-Z]+[[:space:]]+0x[0-9A-Fa-f]+" "sys/mman.h" 3640086407eSSascha Wildnerauto_or_int "mmapflagsname" "MAP_[A-Z]+[[:space:]]+0x[0-9A-Fa-f]+" "sys/mman.h" 3650086407eSSascha Wildnerauto_or_int "wait4optname" "W[A-Z]+[[:space:]]+[0-9]+" "sys/wait.h" 3660086407eSSascha Wildnerauto_or_int "getfsstatflagsname" "MNT_[A-Z]+[[:space:]]+0x[0-9][0-9][0-9][0-9][^0-9]" "sys/mount.h" 3670086407eSSascha Wildnerauto_or_int "mountflagsname" "MNT_[A-Z]+[[:space:]]+0x[0-9][0-9][0-9][0-9][0-9]+" "sys/mount.h" 3680086407eSSascha Wildnerauto_or_int "rebootoptname" "RB_[A-Z]+[[:space:]]+0x[0-9]+" "sys/reboot.h" 3690086407eSSascha Wildnerauto_or_int "flockname" "LOCK_[A-Z]+[[:space:]]+0x[0-9]+" "sys/fcntl.h" 3700086407eSSascha Wildnerauto_or_int "mlockallname" "MCL_[A-Z]+[[:space:]]+0x[0-9]+" "sys/mman.h" 3710086407eSSascha Wildnerauto_or_int "shmatname" "SHM_[A-Z]+[[:space:]]+[0-9]{6}+" "sys/shm.h" 3720086407eSSascha Wildnerauto_or_int "rforkname" "RF[A-Z]+[[:space:]]+\([0-9]+<<[0-9]+\)" "sys/unistd.h" 3730086407eSSascha Wildnerauto_or_long "chflagsname" "[SU]F_[A-Z]+[[:space:]]+0x[0-9]+" "sys/stat.h" 3740086407eSSascha Wildnerauto_or_int "atflagsname" "AT_[A-Z_]+[[:space:]]+[1-9]+[0-9]*" "sys/fcntl.h" 375988bb7fdSMatthias Schmidt 376988bb7fdSMatthias Schmidtauto_switch_type "whencename" "SEEK_[A-Z]+[[:space:]]+[0-9]+" "sys/unistd.h" 377988bb7fdSMatthias Schmidtauto_switch_type "rlimitname" "RLIMIT_[A-Z]+[[:space:]]+[0-9]+" "sys/resource.h" 378a0e1b252SSascha Wildnerauto_switch_type "shutdownhowname" "SHUT_[A-Z]+[[:space:]]+[0-9]+" "sys/socket.h" 379988bb7fdSMatthias Schmidtauto_switch_type "prioname" "PRIO_[A-Z]+[[:space:]]+[0-9]" "sys/resource.h" 380988bb7fdSMatthias Schmidtauto_switch_type "madvisebehavname" "_?MADV_[A-Z]+[[:space:]]+[0-9]+" "sys/mman.h" 381988bb7fdSMatthias Schmidtauto_switch_type "msyncflagsname" "MS_[A-Z]+[[:space:]]+0x[0-9]+" "sys/mman.h" 382988bb7fdSMatthias Schmidtauto_switch_type "schedpolicyname" "SCHED_[A-Z]+[[:space:]]+[0-9]+" "sched.h" 383988bb7fdSMatthias Schmidtauto_switch_type "extattrctlname" "EXTATTR_NAMESPACE_[A-Z]+[[:space:]]+0x[0-9]+" "sys/extattr.h" 384988bb7fdSMatthias Schmidtauto_switch_type "kldsymcmdname" "KLDSYM_[A-Z]+[[:space:]]+[0-9]+" "sys/linker.h" 385988bb7fdSMatthias Schmidtauto_switch_type "sendfileflagsname" "SF_[A-Z]+[[:space:]]+[0-9]+" "sys/socket.h" 386988bb7fdSMatthias Schmidtauto_switch_type "acltypename" "ACL_TYPE_[A-Z]+[[:space:]]+0x[0-9]+" "sys/acl.h" 387988bb7fdSMatthias Schmidtauto_switch_type "sigprocmaskhowname" "SIG_[A-Z]+[[:space:]]+[0-9]+" "sys/signal.h" 388988bb7fdSMatthias Schmidtauto_switch_type "lio_listioname" "LIO_(NO)?WAIT[[:space:]]+[0-9]+" "aio.h" 389988bb7fdSMatthias Schmidtauto_switch_type "minheritname" "INHERIT_[A-Z]+[[:space:]]+[0-9]+" "sys/mman.h" 390*346b9dadSzrjauto_switch_type "quotactlname" "Q_[A-Z]+[[:space:]]+0x[0-9]+" "vfs/ufs/quota.h" 391988bb7fdSMatthias Schmidtauto_if_type "sockdomainname" "PF_[[:alnum:]]+[[:space:]]+" "sys/socket.h" 392988bb7fdSMatthias Schmidtauto_if_type "sockipprotoname" "IPPROTO_[[:alnum:]]+[[:space:]]+" "netinet/in.h" 393988bb7fdSMatthias Schmidtauto_switch_type "sockoptname" "SO_[A-Z]+[[:space:]]+0x[0-9]+" "sys/socket.h" 394988bb7fdSMatthias Schmidtauto_switch_type "socktypename" "SOCK_[A-Z]+[[:space:]]+[1-9]+[0-9]*" "sys/socket.h" 395493ee394SSascha Wildnerauto_switch_type "clockidname" "CLOCK_[[:alnum:]]+" "time.h" "noinvdef" 396e5ef1af1SSascha Wildnerauto_switch_type "pathconfname" "_PC_[[:alnum:]]+" "sys/unistd.h" 39737ffcab2SSascha Wildnerauto_switch_type "uschedcmdname" "USCHED_[[:alnum:]]+" "sys/usched.h" 39837ffcab2SSascha Wildnerauto_switch_type "ckpttypename" "CKPT_[[:alnum:]]+" "sys/checkpoint.h" 39937ffcab2SSascha Wildnerauto_switch_type "procctlcmdname" "PROC_[[:alnum:]]+" "sys/procctl.h" 40037ffcab2SSascha Wildnerauto_switch_type "mountctlopname" "MOUNTCTL_[[:alnum:]]+" "sys/mountctl.h" 40137ffcab2SSascha Wildnerauto_switch_type "varsymlvlname" "VARSYM_[A-Z]+[[:space:]]+[1-9]+[0-9]*" "sys/varsym.h" 402988bb7fdSMatthias Schmidt 403988bb7fdSMatthias Schmidtcat <<_EOF_ 404988bb7fdSMatthias Schmidt/* 405988bb7fdSMatthias Schmidt * AUTO - Special 406988bb7fdSMatthias Schmidt * F_ is used to specify fcntl commands as well as arguments. Both sets are 407988bb7fdSMatthias Schmidt * grouped in fcntl.h, and this awk script grabs the first group. 408988bb7fdSMatthias Schmidt */ 409988bb7fdSMatthias Schmidtvoid 410988bb7fdSMatthias Schmidtfcntlcmdname (int cmd, int arg, int decimal) 411988bb7fdSMatthias Schmidt{ 412988bb7fdSMatthias Schmidt switch (cmd) { 413988bb7fdSMatthias Schmidt_EOF_ 41437ffcab2SSascha Wildneregrep "^#[[:space:]]*define[[:space:]]+F_[A-Z0-9_]+[[:space:]]+[0-9]+[[:space:]]*" \ 415988bb7fdSMatthias Schmidt $include_dir/sys/fcntl.h | \ 416988bb7fdSMatthias Schmidt awk 'BEGIN { o=0 } { for (i = 1; i <= NF; i++) \ 417988bb7fdSMatthias Schmidt if ($i ~ /define/) \ 418988bb7fdSMatthias Schmidt break; \ 419988bb7fdSMatthias Schmidt ++i; \ 420988bb7fdSMatthias Schmidt if (o <= $(i+1)) \ 421d119d94dSSascha Wildner printf "\tcase %s:\n\t\tprintf(\"%s\");\n\t\tbreak;\n", $i, $i; \ 422988bb7fdSMatthias Schmidt else \ 423988bb7fdSMatthias Schmidt exit; \ 424988bb7fdSMatthias Schmidt o = $(i+1) }' 425988bb7fdSMatthias Schmidtcat <<_EOF_ 426988bb7fdSMatthias Schmidt default: /* Should not reach */ 427d119d94dSSascha Wildner printf("<invalid=%ld>", (long)cmd); 428988bb7fdSMatthias Schmidt } 429d119d94dSSascha Wildner putchar(','); 430988bb7fdSMatthias Schmidt if (cmd == F_GETFD || cmd == F_SETFD) { 431988bb7fdSMatthias Schmidt if (arg == FD_CLOEXEC) 432d119d94dSSascha Wildner printf("FD_CLOEXEC"); 433988bb7fdSMatthias Schmidt else if (arg == 0) 434d119d94dSSascha Wildner printf("0"); 435988bb7fdSMatthias Schmidt else { 436988bb7fdSMatthias Schmidt if (decimal) 437d119d94dSSascha Wildner printf("<invalid>%ld", (long)arg); 438988bb7fdSMatthias Schmidt else 439d119d94dSSascha Wildner printf("<invalid>%#lx", (long)arg); 440988bb7fdSMatthias Schmidt } 441988bb7fdSMatthias Schmidt } else if (cmd == F_SETFL) { 442988bb7fdSMatthias Schmidt flagsname(arg); 443988bb7fdSMatthias Schmidt } else { 444988bb7fdSMatthias Schmidt if (decimal) 445d119d94dSSascha Wildner printf("%ld", (long)arg); 446988bb7fdSMatthias Schmidt else 447d119d94dSSascha Wildner printf("%#lx", (long)arg); 448988bb7fdSMatthias Schmidt } 449988bb7fdSMatthias Schmidt} 450988bb7fdSMatthias Schmidt 451988bb7fdSMatthias Schmidt/* 452988bb7fdSMatthias Schmidt * AUTO - Special 453988bb7fdSMatthias Schmidt * 454988bb7fdSMatthias Schmidt * The only reason this is not fully automated is due to the 455988bb7fdSMatthias Schmidt * grep -v RTP_PRIO statement. A better egrep line should 456988bb7fdSMatthias Schmidt * make this capable of being a auto_switch_type() function. 457988bb7fdSMatthias Schmidt */ 458988bb7fdSMatthias Schmidtvoid 459988bb7fdSMatthias Schmidtrtprioname (int func) 460988bb7fdSMatthias Schmidt{ 461988bb7fdSMatthias Schmidt switch (func) { 462988bb7fdSMatthias Schmidt_EOF_ 463988bb7fdSMatthias Schmidtegrep "^#[[:space:]]*define[[:space:]]+RTP_[A-Z]+[[:space:]]+0x[0-9]+[[:space:]]*" \ 464988bb7fdSMatthias Schmidt $include_dir/sys/rtprio.h | grep -v RTP_PRIO | \ 465988bb7fdSMatthias Schmidt awk '{ for (i = 1; i <= NF; i++) \ 466988bb7fdSMatthias Schmidt if ($i ~ /define/) \ 467988bb7fdSMatthias Schmidt break; \ 468988bb7fdSMatthias Schmidt ++i; \ 469d119d94dSSascha Wildner printf "\tcase %s:\n\t\tprintf(\"%s\");\n\t\tbreak;\n", $i, $i }' 470988bb7fdSMatthias Schmidtcat <<_EOF_ 471988bb7fdSMatthias Schmidt default: /* Should not reach */ 472d119d94dSSascha Wildner printf("<invalid=%ld>", (long)func); 473988bb7fdSMatthias Schmidt } 474988bb7fdSMatthias Schmidt} 475988bb7fdSMatthias Schmidt 476988bb7fdSMatthias Schmidt/* 477988bb7fdSMatthias Schmidt * AUTO - Special 478988bb7fdSMatthias Schmidt * 479988bb7fdSMatthias Schmidt * The send and recv functions have a flags argument which can be 480988bb7fdSMatthias Schmidt * set to 0. There is no corresponding #define. The auto_ functions 481988bb7fdSMatthias Schmidt * detect this as "invalid", which is incorrect here. 482988bb7fdSMatthias Schmidt */ 483988bb7fdSMatthias Schmidtvoid 484988bb7fdSMatthias Schmidtsendrecvflagsname (int flags) 485988bb7fdSMatthias Schmidt{ 486988bb7fdSMatthias Schmidt int or = 0; 487988bb7fdSMatthias Schmidt 488988bb7fdSMatthias Schmidt if (flags == 0) { 489d119d94dSSascha Wildner printf("0"); 490988bb7fdSMatthias Schmidt return; 491988bb7fdSMatthias Schmidt } 4920f3d9012SSascha Wildner 4930f3d9012SSascha Wildner printf("%#x<", flags); 494988bb7fdSMatthias Schmidt_EOF_ 49537ffcab2SSascha Wildneregrep "^#[[:space:]]*define[[:space:]]+MSG_[A-Z_]+[[:space:]]+0x[0-9]+[[:space:]]*" $include_dir/sys/socket.h | \ 496988bb7fdSMatthias Schmidt awk '{ for (i = 1; i <= NF; i++) \ 497988bb7fdSMatthias Schmidt if ($i ~ /define/) \ 498988bb7fdSMatthias Schmidt break; \ 499988bb7fdSMatthias Schmidt ++i; \ 500988bb7fdSMatthias Schmidt printf "\tif(!((flags>0)^((%s)>0)))\n\t\tif_print_or(flags, %s, or);\n", $i, $i }' 501988bb7fdSMatthias Schmidtcat <<_EOF_ 5020f3d9012SSascha Wildner printf(">"); 503988bb7fdSMatthias Schmidt} 504988bb7fdSMatthias Schmidt 50537ffcab2SSascha Wildner/* 50637ffcab2SSascha Wildner * AUTO - Special 50737ffcab2SSascha Wildner * 50837ffcab2SSascha Wildner * The only reason this is not fully automated is due to the 50937ffcab2SSascha Wildner * grep -vw ... statement. A better egrep line should 51037ffcab2SSascha Wildner * make this capable of being a auto_switch_type() function. 51137ffcab2SSascha Wildner */ 51237ffcab2SSascha Wildnervoid 51337ffcab2SSascha Wildnerkenvactname (int act) 51437ffcab2SSascha Wildner{ 51537ffcab2SSascha Wildner switch (act) { 51637ffcab2SSascha Wildner_EOF_ 51737ffcab2SSascha Wildneregrep "^#[[:space:]]*define[[:space:]]+KENV_[A-Z]+[[:space:]]+[0-9]+[[:space:]]*" \ 51837ffcab2SSascha Wildner $include_dir/sys/kenv.h | grep -vw -e KENV_MNAMELEN -e KENV_MVALLEN | \ 51937ffcab2SSascha Wildner awk '{ for (i = 1; i <= NF; i++) \ 52037ffcab2SSascha Wildner if ($i ~ /define/) \ 52137ffcab2SSascha Wildner break; \ 52237ffcab2SSascha Wildner ++i; \ 52337ffcab2SSascha Wildner printf "\tcase %s:\n\t\tprintf(\"%s\");\n\t\tbreak;\n", $i, $i }' 52437ffcab2SSascha Wildnercat <<_EOF_ 52537ffcab2SSascha Wildner default: /* Should not reach */ 52637ffcab2SSascha Wildner printf("<invalid=%ld>", (long)act); 52737ffcab2SSascha Wildner } 52837ffcab2SSascha Wildner} 529988bb7fdSMatthias Schmidt_EOF_ 530