home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
IRIS Development Option 6.2
/
IRIS_Development_Option_6.2_814-0478-001.iso
/
dist
/
dev.idb
/
usr
/
bin
/
check_for_syscalls.z
/
check_for_syscalls
Wrap
Text File
|
1996-03-14
|
2KB
|
128 lines
#!/sbin/sh
#ident "$Revision: 1.2 $"
PROG=`basename $0`
USAGE="Usage: $PROG [-syscalls SYSCALL_FILE] file"
SYSCALL_FILE=""
TMPDIR=${TMPDIR:-/var/tmp}
CHECKFILE=$TMPDIR/check.$$
DISFILE=$TMPDIR/dis.$$
case `uname -m` in
SNI) MIN_DISFILE_LEN=4;
DISARG=-F
DISFILE_PIC_ARG="8p";
DISFILE_HALF_ARG="11p";;
*) MIN_DISFILE_LEN=0;
DISARG=-p
DISFILE_PIC_ARG="2p";
DISFILE_HALF_ARG="5p";;
esac
trap "rm -f $CHECKFILE $DISFILE; exit 1" 1 2 13 15
while [ $# -gt 1 ]
do
case "$1" in
-syscalls) shift;
if [ $# -gt 1 ]
then
SYSCALL_FILE=$1; shift
else
echo $USAGE >&2;
exit 1;
fi;;
*) echo $USAGE >&2;
exit 1;;
esac
done
if [ $# -ne 1 ]
then
echo $USAGE >&2
exit 1
fi
if [ ! -f $1 ]
then
echo "$PROG: cannot access file $1" >&2
exit 1
fi
if [ "$SYSCALL_FILE" = """" ]
then
SYSCALL_FILE=/usr/lib/abi/data/syscall.names
CHECKER_ABIDIR=${CHECKER_ABIDIR:-/usr/lib/abi/data}
fi
rm -f $CHECKFILE
dis $DISARG _syscall $1 > $DISFILE 2> /dev/null
if [ `wc -l $DISFILE | awk '{ print $1 }'` -ne $MIN_DISFILE_LEN ]
then
SYSCALL_START_PIC=`sed -n $DISFILE_PIC_ARG $DISFILE | awk '{ print $3 }' | sed -e "s/://p"`
SYSCALL_START_HALF=`sed -n $DISFILE_HALF_ARG $DISFILE | awk '{ print $3 }' | sed -e "s/://p"`
else
SYSCALL_START_PIC="xyzzy"
SYSCALL_START_HALF="xyzzy"
fi
dis -d $1 | awk " \
BEGIN {foundjal = 0 } \
{ \
if (foundjal == 1) { \
if (( \$1 == \"li\") && (substr (\$2, 1, 2) == \"a0\")) { \
printf \"%s\n\", substr (\$2, 4) \
} else { \
printf \"%s\n\", substr (lasta0, 4) \
} \
} \
} \
{ \
if (\$1 == \"syscall\") { \
printf \"%s\n\", substr (prev, 4) \
} else { \
prev = \$2 \
} \
} \
{ \
if ((\$1 == \"jal\") && ((\$2 == \"$SYSCALL_START_PIC\") || (\$2 == \"$SYSCALL_START_HALF\"))) { \
foundjal = 1 \
} else { \
foundjal = 0 \
} \
} \
{ \
if ((\$1 == \"li\") && (substr (\$2, 1, 2) == \"a0\")) { \
lasta0 = \$2 \
} \
}" |
while read SYSCALL
do
ENTRY=`awk " \
NF > 2 { \
if ((substr (\\\$0, 1, 7) == \"#define\") && \
(\\\$3 == $SYSCALL)) { \
print \\\$2 \
} \
}" $SYSCALL_FILE | sed -e "s/.*SYS_//p"`
if [ "$ENTRY" != """" ]
then
echo $ENTRY >> $CHECKFILE
else
if [ $SYSCALL -ne 0 ]
then
echo $SYSCALL >> $CHECKFILE
fi
fi
done
if [ -f $CHECKFILE ]
then
sort -u $CHECKFILE
fi
rm -f $CHECKFILE $DISFILE