xref: /freebsd/cddl/lib/libdtrace/mkpriv (revision 434283fda99e89af20c3fe95fde427624ae96d04)
1*434283fdSDevin Teske#!/bin/sh
2*434283fdSDevin Teske# -*- tab-width: 4 -*- ;; Emacs
3*434283fdSDevin Teske# vi: set filetype=sh tabstop=8 shiftwidth=8 noexpandtab :: Vi/ViM
4*434283fdSDevin Teske############################################################ LICENSE
5*434283fdSDevin Teske#
6*434283fdSDevin Teske# Copyright (c) 2026 Devin Teske <dteske@FreeBSD.org>
7*434283fdSDevin Teske#
8*434283fdSDevin Teske# SPDX-License-Identifier: BSD-2-Clause
9*434283fdSDevin Teske#
10*434283fdSDevin Teske############################################################ IDENT(1)
11*434283fdSDevin Teske#
12*434283fdSDevin Teske# $Title: Generate priv.d from <sys/priv.h> for libdtrace(3) $
13*434283fdSDevin Teske# $Copyright: 2026 Devin Teske. All rights reserved. $
14*434283fdSDevin Teske#
15*434283fdSDevin Teske############################################################ GLOBALS
16*434283fdSDevin Teske
17*434283fdSDevin TeskeVERSION='$Version: 1.0 $'
18*434283fdSDevin Teske
19*434283fdSDevin Teskepgm="${0##*/}" # Program basename
20*434283fdSDevin Teske
21*434283fdSDevin Teske#
22*434283fdSDevin Teske# Global exit status
23*434283fdSDevin Teske#
24*434283fdSDevin TeskeSUCCESS=0
25*434283fdSDevin TeskeFAILURE=1
26*434283fdSDevin Teske
27*434283fdSDevin Teske#
28*434283fdSDevin Teske# Command-line options
29*434283fdSDevin Teske#
30*434283fdSDevin TeskeOUTPUT_FILE=	# -o file
31*434283fdSDevin Teske
32*434283fdSDevin Teske#
33*434283fdSDevin Teske# Miscellaneous
34*434283fdSDevin Teske#
35*434283fdSDevin TeskePRIV_H=
36*434283fdSDevin Teske
37*434283fdSDevin Teske############################################################ FUNCTIONS
38*434283fdSDevin Teske
39*434283fdSDevin Teskeusage()
40*434283fdSDevin Teske{
41*434283fdSDevin Teske	local fmt="$1"
42*434283fdSDevin Teske	local optfmt="\t%-5s %s\n"
43*434283fdSDevin Teske
44*434283fdSDevin Teske	exec >&2
45*434283fdSDevin Teske	if [ "$fmt" ]; then
46*434283fdSDevin Teske		shift 1 # fmt
47*434283fdSDevin Teske		printf "%s: $fmt\n" "$pgm" "$@"
48*434283fdSDevin Teske	fi
49*434283fdSDevin Teske	printf "Usage: %s [-hv] [-o file] priv.h\n" "$pgm"
50*434283fdSDevin Teske	printf "Options:\n"
51*434283fdSDevin Teske	printf "$optfmt" "-h" "Print this usage statment and exit."
52*434283fdSDevin Teske	printf "$optfmt" "-o file" "Write to output file instead of stdout."
53*434283fdSDevin Teske	printf "$optfmt" "-v" "Print version information and exit."
54*434283fdSDevin Teske	exit $FAILURE
55*434283fdSDevin Teske}
56*434283fdSDevin Teske
57*434283fdSDevin Teske############################################################ MAIN
58*434283fdSDevin Teske
59*434283fdSDevin Teske#
60*434283fdSDevin Teske# Process command-line options
61*434283fdSDevin Teske#
62*434283fdSDevin Teskewhile getopts ho:v flag; do
63*434283fdSDevin Teske	case "$flag" in
64*434283fdSDevin Teske	o) OUTPUT_FILE="$OPTARG" ;;
65*434283fdSDevin Teske	v) VERSION="${VERSION#*: }"
66*434283fdSDevin Teske		echo "${VERSION% $}"
67*434283fdSDevin Teske		exit $SUCCESS ;;
68*434283fdSDevin Teske	*) usage # NOTREACHED
69*434283fdSDevin Teske	esac
70*434283fdSDevin Teskedone
71*434283fdSDevin Teskeshift $(( $OPTIND - 1 ))
72*434283fdSDevin Teske
73*434283fdSDevin Teske#
74*434283fdSDevin Teske# Check command-line arguments
75*434283fdSDevin Teske#
76*434283fdSDevin Teske[ $# -gt 0 ] || usage "Too few arguments" # NOTREACHED
77*434283fdSDevin Teske[ $# -eq 1 ] || usage "Too many arguments" # NOTREACHED
78*434283fdSDevin Teske[ "$1" ] || usage "Missing priv.h argument" # NOTREACHED
79*434283fdSDevin Teske[ -e "$1" ] || usage "%s: No such file or directory" "$1" # NOTREACHED
80*434283fdSDevin Teske
81*434283fdSDevin Teske#
82*434283fdSDevin Teske# Generate priv.d contents from priv.h input
83*434283fdSDevin Teske#
84*434283fdSDevin TeskePRIV_H="$1"
85*434283fdSDevin Teskeexec 9<<PRIV_D_EOF
86*434283fdSDevin Teske/*-
87*434283fdSDevin Teske * Copyright (c) 2026 Devin Teske <dteske@FreeBSD.org>
88*434283fdSDevin Teske *
89*434283fdSDevin Teske * SPDX-License-Identifier: BSD-2-Clause
90*434283fdSDevin Teske */
91*434283fdSDevin Teske
92*434283fdSDevin Teske/*
93*434283fdSDevin Teske * Map priv(9) privilege values to their symbolic names.
94*434283fdSDevin Teske * NB: Mechanically generated from <sys/priv.h> -- keep in-sync.
95*434283fdSDevin Teske * NB: Generated by /usr/src/cddl/lib/libdtrace/$pgm
96*434283fdSDevin Teske */
97*434283fdSDevin Teske
98*434283fdSDevin Teske#pragma D binding "1.13" priv_string
99*434283fdSDevin Teskeinline string priv_string[int priv] =
100*434283fdSDevin Teske$( awk '
101*434283fdSDevin Teske	/^#define[[:space:]]+PRIV_[A-Z0-9_]+[[:space:]]+[0-9]+/ {
102*434283fdSDevin Teske		for (i = 0; ++i <= NF; ) if ($i ~ /define/) break
103*434283fdSDevin Teske		name = $++i
104*434283fdSDevin Teske		value = $++i
105*434283fdSDevin Teske		printf "\tpriv == %s ?\t\t\"%s\" :\n", value, name
106*434283fdSDevin Teske	}' "$PRIV_H"
107*434283fdSDevin Teske)
108*434283fdSDevin Teske	strjoin("PRIV_UNKNOWN#", lltostr(priv));
109*434283fdSDevin TeskePRIV_D_EOF
110*434283fdSDevin Teske
111*434283fdSDevin Teske#
112*434283fdSDevin Teske# Output contents
113*434283fdSDevin Teske#
114*434283fdSDevin Teske[ ! "$OUTPUT_FILE" ] || exec > "$OUTPUT_FILE"
115*434283fdSDevin Teskecat <&9
116*434283fdSDevin Teske
117*434283fdSDevin Teske################################################################################
118*434283fdSDevin Teske# END
119*434283fdSDevin Teske################################################################################
120