xref: /dflybsd-src/usr.bin/kdump/mksubr (revision 346b9dadb592a2194dd69cfeaa20cd1808df547d)
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