#!/bin/sh # # Copyright (c) 2013, The Linux Foundation. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of The Linux Foundation nor the names of its # contributors may be used to endorse or promote products derived from # this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE DISCLAIMED. IN NO # EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # Enable or disable debug messages in USB related files. # this script allows the user to chose the files in which should enable or disable debug messages # and also allows the user to save the debug configuration for the next reboot # This in order to allow early boot debug information. DBG_FILE="/sbin/usb/debuger/debugFiles" DEFAULT_FILE="/sbin/usb/debuger/default_debug" HELP="/sbin/usb/debuger/help" statusFile="/sbin/usb/debuger/statusFile" legal_fileName(){ file_list=`cat $DBG_FILE| cut -f 2| grep -v ___` for c in $file_list do if [ "$1" = "$c" ]; then echo "1" exit fi done echo "0" } legal_fid() { local id_list=`cat $DBG_FILE| cut -f 1| grep -v ___` for num in $id_list do if [ "$1" = "$num" ]; then echo "1" exit fi done echo "0" } legal_fileNames(){ local i=1 for j in "$@" do if [ $i -gt $1 ]; then if [ `legal_fileName $j` = "0" ]; then echo "0" exit fi fi let i+=1 done echo "1" } get_fileList(){ local i=1 local list="" for j in "$@" do if [ $i -gt $1 ]; then list="$list$j " fi let i+=1 done echo $list } read_fid() { # this func gets the file id and returns the file names of the chosen files local flag="1" local tmp_fid="0" local files="" read -p "fid number : " tmp_fid while [ true ]; do for num in $tmp_fid do if [ `legal_fid $num` = "0" ]; then flag="0" break else files="$files `cat $DBG_FILE|grep -w $num|grep -v ___|cut -f 2` " fi done if [ $flag = "0" ]; then flag="1" files="" read -p "Illegal Fid number, try again : " tmp_fid else echo "$files" exit fi done } read_persistent() { local tmp_persistent='0' read -p "Would you like it to be the default file\s for debug ? (y/n) " tmp_persistent while [ true ]; do if [ $tmp_persistent = "y" ] || [ $tmp_persistent = "n" ]; then echo "$tmp_persistent" exit fi read -p "Only 'y' or 'n' are allowed, try again : " tmp_persistent done } read_operation() { local tmp_op='0' read -p "Would you like to enable or disable the debug messages ? (on/off) " tmp_op while [ true ]; do if [ $tmp_op = "on" ] || [ $tmp_op = "off" ]; then echo "$tmp_op" exit fi read -p "Only 'on' or 'off' are allowed, try again : " tmp_op done } add_toStatus() { if [ -f $statusFile ]; then if [ `cat $statusFile |grep -c $1` = 0 ]; then echo $1 >> $statusFile fi else echo $1 >> $statusFile fi } rm_fromStatus() { if [ -f $statusFile ]; then sed -i '/^'$1'$/d' $statusFile fi } #===============================================================================================# #===============================================================================================# if [ ! -f $DBG_FILE ]; then echo "ERROR: debugFiles is missing" exit fi if [ "$#" -eq 0 ]; then cat $DBG_FILE echo " " echo "Choose files by id: " file=`read_fid` flag="-l" operation=`read_operation` persistent=`read_persistent` elif [ "$#" -eq 1 ]; then if [ $1 == "status" ]; then if [ -f $statusFile ]; then cat $statusFile exit 1 fi echo "" exit 1 elif [ $1 == "-h" ] || [ $1 == "help" ]; then cat $HELP exit 1 else echo "Usage: usb_debug -h" >&2 echo "Usage: usb_debug status" >&2 echo "Usage: usb_debug [-l] [OPERATION] [PERSISTENT] [LIST]" >&2 echo "Usage: usb_debug [-f] [OPERATION] [PERSISTENT] [PATH]" >&2 echo "Usage: usb_debug [all][OPERATION] [PERSISTENT]" >&2 exit 1 fi elif [ "$#" -eq 2 ]; then if [ $1 != "all" ]; then echo "Usage: usb_debug [-l] [OPERATION] [PERSISTENT] [LIST]" >&2 echo "Usage: usb_debug [-f] [OPERATION] [PERSISTENT] [PATH]" >&2 echo "Usage: usb_debug [all][OPERATION] [PERSISTENT]" >&2 exit 1 fi if [ $2 != "on" ] && [ $2 != "off" ]; then echo "Illegal operation choice (must be 'on' or 'off')." exit 2 fi if [ $2 = "on" ]; then flag=$1 operation=$2 file=`cat $DBG_FILE| cut -f 2| grep -v ___` persistent=`read_persistent` else flag=$1 operation=$2 file=`cat $DBG_FILE| cut -f 2| grep -v ___` persistent="y" fi elif [ "$#" -ge 3 ]; then if [ $1 != "-l" ] && [ $1 != "-f" ] && [ $1 != "all" ]; then echo "Usage: usb_debug [-l] [OPERATION] [PERSISTENT] [LIST]" >&2 echo "Usage: usb_debug [-f] [OPERATION] [PERSISTENT] [PATH]" >&2 echo "Usage: usb_debug [all][OPERATION] [PERSISTENT]" >&2 exit 1 fi if [ $2 != "on" ] && [ $2 != "off" ]; then echo "Illegal operation choice (must be 'on' or 'off')." exit 2 fi if [ $1 = "-l" ]; then if [ `legal_fileName $3` = "1" ]; then if [ "$#" -ge 4 ]; then #handle more then one file - default presistance=n if [ `legal_fileNames 3 "$@"` = "0" ]; then echo "Illegal file name." exit 4 fi flag=$1 operation=$2 persistent="n" file=`get_fileList 3 "$@"` else #case just one file name flag=$1 operation=$2 persistent="n" file=$3 fi elif [ $3 = "y" ] || [ $3 = "n" ]; then if [ `legal_fileName $4` = "0" ]; then echo "Illegal file name." exit 4 fi if [ "$#" -ge 5 ]; then #handle more then one file - presistance=$3 if [ `legal_fileNames 4 "$@"` = "0" ]; then echo "Illegal file name." exit 5 fi flag=$1 operation=$2 persistent=$3 file=`get_fileList 4 "$@"` else #just one file flag=$1 operation=$2 persistent=$3 file=$4 fi else echo "Illegal file name or persistent choice (persistent must be 'y' or 'n')." exit 4 fi elif [ $1 = "-f" ]; then if [ -f $3 ]; then flag=$1 operation=$2 persistent="n" file=`cat $3` if [ `legal_fileNames 1 $file` = 0 ]; then echo "Illegal file name (in the input file)" exit 3 fi elif [ $3 = "y" ] || [ $3 = "n" ]; then if [ "$#" -eq 3 ]; then echo "Usage: usb_debug [-f] [OPERATION] [PERSISTENT] [PATH]" >&2 exit 3 fi if [ -f $4 ]; then flag=$1 operation=$2 persistent=$3 file=`cat $4` if [ `legal_fileNames 1 "$file"` = 0 ]; then echo "Illegal file name (in the input file)" exit 4 fi else echo "Illegal input file." exit 4 fi else echo "Illegal file or persistent choice (persistent must be 'y' or 'n')." exit 3 fi else # $1=all if [ $3 != "y" ] && [ $3 != "n" ]; then echo "Illegal persistent choice (persistent must be 'y' or 'n')." exit 3 fi flag=$1 operation=$2 file=`cat $DBG_FILE| cut -f 2| grep -v ___` persistent=$3 fi else echo "Usage: usb_debug [-l] [OPERATION] [PERSISTENT] [LIST]" >&2 echo "Usage: usb_debug [-f] [OPERATION][PERSISTENT] [PATH]" >&2 echo "Usage: usb_debug [all][OPERATION] [PERSISTENT]" >&2 exit 1 fi #=============================================================================================== #=============================================================================================== # mount debugfs just one time if [ `mount | grep -c debugfs` = 0 ]; then mkdir /data/dbg mount -t debugfs none /data/dbg fi if [ $persistent = "y" ]; then if [ $operation = "off" ]; then if [ $flag = "all" ]; then rm -f $DEFAULT_FILE else echo "Change will have no effect on default file- Illegal combination of persistent and disable debug messages" fi else rm -f $DEFAULT_FILE echo $file > $DEFAULT_FILE fi fi if [ $operation = "on" ]; then for f in $file do `add_toStatus $f` f="$f.c" echo -n 'file $f +p' > /data/dbg/dynamic_debug/control done else for f in $file do `rm_fromStatus $f` f="$f.c" echo -n 'file $f -p' > /data/dbg/dynamic_debug/control done fi