1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
#!/bin/bash
# Script arguments in order:
#
# [-setcap] Optional 1st argument to use setcap, see below
# [-root] Optional 1st argument to use sudo, see below
# [-log <filename>] Optional argument to define logfile
# ... All subsequent arguments are passed to the Direct-BT example
#
# See scripts/scripts/run-native-example.sh for details
#
# JAVA_PROPS="-Dorg.direct_bt.debug=true -Dorg.direct_bt.verbose=true"
#
# export direct_bt_debug=true
# export direct_bt_debug=adapter.event=false,gatt.data=false,hci.event=true,hci.scan_ad_eir=true,mgmt.event=false
# export direct_bt_debug=adapter.event,gatt.data,hci.event,hci.scan_ad_eir,mgmt.event
# export direct_bt_debug=adapter.event,gatt.data
# export direct_bt_debug=adapter.event,hci.event
# export direct_bt_debug=adapter.event
#
# See scripts/scripts/run-native-example.sh for commandline invocation and non-root usage
#
script_args="$@"
username=${USER}
sdir=`dirname $(readlink -f $0)`
rootdir=`dirname $sdir`
bname=`basename $0 .sh`
exename=`echo $bname | sed 's/^run-//g'`
if [ ! -e lib/java/direct_bt.jar -o ! -e bin/java/${exename}.jar -o ! -e lib/libdirect_bt.so ] ; then
echo run from dist directory
exit 1
fi
run_setcap=0
run_root=0
if [ "$1" = "-setcap" ] ; then
run_setcap=1
shift 1
elif [ "$1" = "-root" ] ; then
run_root=1
shift 1
fi
if [ "$1" = "-log" ] ; then
logbasename=$2
shift 2
else
logbasename=~/${bname}-${archabi}
fi
logfile=$logbasename.log
rm -f $logfile
valgrindlogfile=$logbasename-valgrind.log
rm -f $valgrindlogfile
callgrindoutfile=$logbasename-callgrind.out
rm -f $callgrindoutfile
echo 'core_%e.%p' | sudo tee /proc/sys/kernel/core_pattern
ulimit -c unlimited
# run as root 'dpkg-reconfigure locales' enable 'en_US.UTF-8'
# perhaps run as root 'update-locale LC_MEASUREMENT=en_US.UTF-8 LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8'
export LC_MEASUREMENT=en_US.UTF-8
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
JAVA_EXE=`readlink -f $(which java)`
# JAVA_CMD="${JAVA_EXE} -Xcheck:jni -verbose:jni"
JAVA_CMD="${JAVA_EXE}"
# EXE_WRAPPER="valgrind --tool=memcheck --leak-check=full --show-reachable=no --error-limit=no --default-suppressions=yes --suppressions=$sdir/valgrind.supp --suppressions=$sdir/valgrind-jvm.supp --gen-suppressions=all -s --log-file=$valgrindlogfile"
# EXE_WRAPPER="valgrind --tool=helgrind --track-lockorders=yes --ignore-thread-creation=yes --default-suppressions=yes --suppressions=$sdir/valgrind.supp --suppressions=$sdir/valgrind-jvm.supp --gen-suppressions=all -s --log-file=$valgrindlogfile"
# EXE_WRAPPER="valgrind --tool=drd --segment-merging=no --ignore-thread-creation=yes --trace-barrier=no --trace-cond=no --trace-fork-join=no --trace-mutex=no --trace-rwlock=no --trace-semaphore=no --default-suppressions=yes --suppressions=$sdir/valgrind.supp --suppressions=$sdir/valgrind-jvm.supp --gen-suppressions=all -s --log-file=$valgrindlogfile"
# EXE_WRAPPER="valgrind --tool=callgrind --instr-atstart=yes --collect-atstart=yes --collect-systime=yes --combine-dumps=yes --separate-threads=no --callgrind-out-file=$callgrindoutfile --log-file=$valgrindlogfile"
runit_root() {
echo "sudo ... ${*@Q}"
sudo -- bash -c "ulimit -c unlimited; $EXE_WRAPPER $JAVA_CMD $JAVA_PROPS -cp lib/java/direct_bt.jar:bin/java/${exename}.jar -Djava.library.path=`pwd`/lib ${exename} ${*@Q}"
exit $?
}
runit_setcap() {
echo "sudo setcap ... " "$@"
echo "sudo setcap 'cap_net_raw,cap_net_admin+eip' ${JAVA_EXE}"
trap 'sudo setcap -q -r '"${JAVA_EXE}"'' EXIT INT HUP QUIT TERM ALRM USR1
sudo setcap 'cap_net_raw,cap_net_admin+eip' ${JAVA_EXE}
sudo getcap ${JAVA_EXE}
ulimit -c unlimited
$EXE_WRAPPER $JAVA_CMD $JAVA_PROPS -cp lib/java/direct_bt.jar:bin/java/${exename}.jar -Djava.library.path=`pwd`/lib ${exename} "$@"
exit $?
}
runit_capsh() {
echo "sudo capsh ... ${*@Q}"
sudo /sbin/capsh --caps="cap_net_raw,cap_net_admin+eip cap_setpcap,cap_setuid,cap_setgid+ep" \
--keep=1 --user=$username --addamb=cap_net_raw,cap_net_admin+eip \
-- -c "ulimit -c unlimited; $EXE_WRAPPER $JAVA_CMD $JAVA_PROPS -cp lib/java/direct_bt.jar:bin/java/${exename}.jar -Djava.library.path=`pwd`/lib ${exename} ${*@Q}"
exit $?
}
runit() {
echo "script invocation: $0 ${script_args}"
echo username $username
echo run_setcap ${run_setcap}
echo run_root ${run_root}
echo ${exename} commandline "$@"
echo EXE_WRAPPER $EXE_WRAPPER
echo logbasename $logbasename
echo logfile $logfile
echo valgrindlogfile $valgrindlogfile
echo callgrindoutfile $callgrindoutfile
echo direct_bt_debug $direct_bt_debug
echo direct_bt_verbose $direct_bt_verbose
echo $EXE_WRAPPER $JAVA_CMD -cp lib/java/direct_bt.jar:bin/java/${exename}.jar -Djava.library.path=`pwd`/lib ${exename} $*
# $EXE_WRAPPER $JAVA_CMD -cp lib/java/direct_bt.jar:bin/java/${exename}.jar -Djava.library.path=`pwd`/lib ${exename} $*
mkdir -p client_keys
mkdir -p server_keys
if [ "${run_setcap}" -eq "1" ]; then
runit_setcap "$@"
elif [ "${run_root}" -eq "1" ]; then
runit_root "$@"
else
runit_capsh "$@"
fi
}
runit "$@" 2>&1 | tee $logfile
|