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