1*8a272653SPeter Holm#!/bin/sh 2*8a272653SPeter Holm 3*8a272653SPeter Holm# 4*8a272653SPeter Holm# Copyright (c) 2013 Peter Holm 5*8a272653SPeter Holm# All rights reserved. 6*8a272653SPeter Holm# 7*8a272653SPeter Holm# Redistribution and use in source and binary forms, with or without 8*8a272653SPeter Holm# modification, are permitted provided that the following conditions 9*8a272653SPeter Holm# are met: 10*8a272653SPeter Holm# 1. Redistributions of source code must retain the above copyright 11*8a272653SPeter Holm# notice, this list of conditions and the following disclaimer. 12*8a272653SPeter Holm# 2. Redistributions in binary form must reproduce the above copyright 13*8a272653SPeter Holm# notice, this list of conditions and the following disclaimer in the 14*8a272653SPeter Holm# documentation and/or other materials provided with the distribution. 15*8a272653SPeter Holm# 16*8a272653SPeter Holm# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17*8a272653SPeter Holm# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18*8a272653SPeter Holm# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19*8a272653SPeter Holm# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20*8a272653SPeter Holm# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21*8a272653SPeter Holm# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22*8a272653SPeter Holm# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23*8a272653SPeter Holm# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24*8a272653SPeter Holm# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25*8a272653SPeter Holm# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26*8a272653SPeter Holm# SUCH DAMAGE. 27*8a272653SPeter Holm# 28*8a272653SPeter Holm 29*8a272653SPeter Holm# Call syscall4.sh with syscall number as argument. 30*8a272653SPeter Holm# Only run the last ~16 syscalls, if no argument is specified. 31*8a272653SPeter Holm 32*8a272653SPeter Holm[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 33*8a272653SPeter Holm 34*8a272653SPeter Holm. ../default.cfg 35*8a272653SPeter Holm 36*8a272653SPeter Holmsyscall=`grep SYS_MAXSYSCALL /usr/include/sys/syscall.h | awk '{print $NF}'` 37*8a272653SPeter Holmsyscall=$((syscall - 1)) 38*8a272653SPeter Holmesyscall=0 39*8a272653SPeter Holm 40*8a272653SPeter Holmlast=/tmp/syscall5.last 41*8a272653SPeter Holmlog=/tmp/syscall5.log 42*8a272653SPeter Holm 43*8a272653SPeter Holmwhile getopts ae:nrs:t:u flag; do 44*8a272653SPeter Holm case "$flag" in 45*8a272653SPeter Holm a) all=1 ;; 46*8a272653SPeter Holm e) esyscall="$OPTARG" ;; 47*8a272653SPeter Holm n) export noswap=1 ;; 48*8a272653SPeter Holm r) [ -h $last ] && 49*8a272653SPeter Holm syscall=`ls -l $last | awk '{print $NF}'` 50*8a272653SPeter Holm syscall=$((syscall - 1)) 51*8a272653SPeter Holm ;; 52*8a272653SPeter Holm s) syscall="$OPTARG" ;; 53*8a272653SPeter Holm t) sleeptime="$OPTARG" 54*8a272653SPeter Holm export sleeptime=$((sleeptime / 10)) ;; # used in syscall4.sh 55*8a272653SPeter Holm u) unnamed=1 ;; 56*8a272653SPeter Holm *) echo "Usage $0 [-a] [-n] [-r] [-s number] [-e number] "\ 57*8a272653SPeter Holm "[-t seconds] [-u]" 58*8a272653SPeter Holm return 1 ;; 59*8a272653SPeter Holm esac 60*8a272653SPeter Holmdone 61*8a272653SPeter Holm[ $syscall -gt $esyscall ] || 62*8a272653SPeter Holm { echo "$syscall must be greater than $esyscall"; exit 1; } 63*8a272653SPeter Holm 64*8a272653SPeter Holm# syscalls with known issues: 65*8a272653SPeter Holmbroken=" 66*8a272653SPeter Holmswapcontext 67*8a272653SPeter Holmpdfork 68*8a272653SPeter Holmrfork 69*8a272653SPeter Holmpselect 70*8a272653SPeter Holm" 71*8a272653SPeter Holm 72*8a272653SPeter Holmrm -f $log 73*8a272653SPeter Holmn=$syscall 74*8a272653SPeter Holmstart=`date '+%s'` 75*8a272653SPeter Holmwhile [ $n -gt 0 ]; do 76*8a272653SPeter Holm ps -lUnobody | grep syscall4 | awk '{print $2}' | xargs kill 77*8a272653SPeter Holm ln -fs $n $last 78*8a272653SPeter Holm name=`grep -w "$n$" /usr/include/sys/syscall.h | awk '{print $2}' | 79*8a272653SPeter Holm sed 's/SYS_//'` 80*8a272653SPeter Holm [ -z "$name" ] && name="unknown" 81*8a272653SPeter Holm rm -f /tmp/syscall5.name 82*8a272653SPeter Holm [ -x ../tools/exclude_syscall.sh ] && 83*8a272653SPeter Holm ../tools/exclude_syscall.sh $n && 84*8a272653SPeter Holm { n=$((n - 1)); continue; } 85*8a272653SPeter Holm [ "$name" = "unknown" ] && [ -f /tmp/syscall5.name ] && 86*8a272653SPeter Holm name=`cat /tmp/syscall5.name` 87*8a272653SPeter Holm [ -z "$name" -a -n "$unnamed" ] && 88*8a272653SPeter Holm { n=$((n - 1)); continue; } 89*8a272653SPeter Holm echo "`date '+%T'` syscall $n ($name)" 90*8a272653SPeter Holm echo "`date '+%T'` syscall $n ($name)" >> $log 91*8a272653SPeter Holm printf "`date '+%T'` syscall $n ($name)\r\n" > /dev/console 92*8a272653SPeter Holm sync; sleep 1 93*8a272653SPeter Holm echo "$broken" | grep -qw "$name" || 94*8a272653SPeter Holm ./syscall4.sh $n || break 95*8a272653SPeter Holm [ $n -le $esyscall ] && break 96*8a272653SPeter Holm n=$((n - 1)) 97*8a272653SPeter Holm [ -z "$all" -a `date '+%s'` -gt $((start + 1800)) ] && break 98*8a272653SPeter Holmdone 99*8a272653SPeter Holmrm -f $log $last 100