: ########################################################################## # Shellscript: errno - show messages to system errors # Version : 0.3 (beta) # Author : Heiner Steven (heiner.steven@odn.de) # Date : 19.07.95 # Category : Programming # SCCS-Id. : $Id: errno,v 1.1.1.1 1999/06/15 19:29:05 heiner Exp $ ########################################################################## # Changes # 21.09.95 hs New parameter -l: list all error codes (0.2) # 04.05.96 hs Do not remove errno database for faster response time (0.3) ########################################################################## PN=`basename $0` # program name VER='0.3 (beta)' : ${GREP:=grep} : ${ErrnoInc=/usr/include/sys/errno.h} # Errno include file Errnos=/tmp/$PN.db # "database" with errnos Usage () { echo "$PN - print name and description of error codes, $VER (stv '95) usage: $PN {number|name|regex} [...] or $PN -l -l list all error codes number system error number, i.e. 10 name system error name, i.e. EPERM regex string to 'grep' for" >&2 exit 1 } Msg () { for i do echo "$PN: $i" >&2 done } Fatal () { Msg "$@"; exit 1; } # Check arguments before setting them getopt hl "$@" > /dev/null 2>&1 || Usage set -- `getopt hl "$@"` while [ $# -gt 0 ] do case "$1" in -l) set -- '.'; break;; # List all errnos --) shift; break;; -h) Usage;; -*) Usage;; *) break;; # First argument esac shift done [ $# -lt 1 ] && Usage [ -r "$ErrnoInc" ] || Fatal "cannot read $ErrnoInc" [ -f "$Errnos" ] || { umask 000 # Everybody may read and write # Create "database" of errno values in the following format: # 2 ENOENT No such file or directory nawk ' # Example: # #define ENOENT 2 /* No such file or directory */ ($1 == "#define") && ($2 ~ /^E[A-Z][A-Z]*$/) && (NF >= 4) { # $2=name, $3=errno Desc = "" for ( i=4; i<=NF; i++ ) { if ( $i == "/*" || $i == "*/" ) continue; # Remove commentmarkers from description: # "/*Not owner*/" -> "Not owner" if ( $i ~ /^\/\*/ ) { sub (/\/\*[ ]*/, "", $i) } else if ( $i ~ /\*\/$/ ) { sub (/[ ]*\*\/$/, "", $i) } if ( Desc == "" ) Desc = $i else Desc = Desc " " $i } print $3 " " $2 " " Desc } ' $ErrnoInc > "$Errnos" || exit # nawk will print error message } # Search "database" for given strings for i do case "$i" in E[A-Z]*) Col=2;; # Symbolic name given *[!0-9]*) # No number: just grep for pattern $GREP -i "$i" "$Errnos" continue;; *) Col=1;; # This seems to be a number esac ${AWK:=nawk} '$'$Col' == "'$i'"' "$Errnos" done