xref: /aosp_15_r20/development/scripts/bash_util.bash (revision 90c8c64db3049935a07c6143d7fd006e26f8ecca)
1*90c8c64dSAndroid Build Coastguard Worker# Copyright (C) 2018 The Android Open Source Project
2*90c8c64dSAndroid Build Coastguard Worker#
3*90c8c64dSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
4*90c8c64dSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
5*90c8c64dSAndroid Build Coastguard Worker# You may obtain a copy of the License at
6*90c8c64dSAndroid Build Coastguard Worker#
7*90c8c64dSAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
8*90c8c64dSAndroid Build Coastguard Worker#
9*90c8c64dSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*90c8c64dSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
11*90c8c64dSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*90c8c64dSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
13*90c8c64dSAndroid Build Coastguard Worker# limitations under the License.
14*90c8c64dSAndroid Build Coastguard Worker
15*90c8c64dSAndroid Build Coastguard Workerscript_name="${0##*/}"
16*90c8c64dSAndroid Build Coastguard Workerscript_dir="${0%/*}"
17*90c8c64dSAndroid Build Coastguard Worker
18*90c8c64dSAndroid Build Coastguard Worker# Exit with 1 with printing a given message on stderr.
19*90c8c64dSAndroid Build Coastguard Workerfunction die() {
20*90c8c64dSAndroid Build Coastguard Worker    echo "$script_name: ERROR: $@" 1>&2
21*90c8c64dSAndroid Build Coastguard Worker    exit 1
22*90c8c64dSAndroid Build Coastguard Worker}
23*90c8c64dSAndroid Build Coastguard Worker
24*90c8c64dSAndroid Build Coastguard Worker# Print a given message on stderr.
25*90c8c64dSAndroid Build Coastguard Workerfunction warn() {
26*90c8c64dSAndroid Build Coastguard Worker    echo "$script_name: WARN: $@" 1>&2
27*90c8c64dSAndroid Build Coastguard Worker}
28*90c8c64dSAndroid Build Coastguard Worker
29*90c8c64dSAndroid Build Coastguard Worker# Print a given message on stderr.
30*90c8c64dSAndroid Build Coastguard Workerfunction info() {
31*90c8c64dSAndroid Build Coastguard Worker    echo "$script_name: $@" 1>&2
32*90c8c64dSAndroid Build Coastguard Worker}
33*90c8c64dSAndroid Build Coastguard Worker
34*90c8c64dSAndroid Build Coastguard Worker# Wrapper around "adb".
35*90c8c64dSAndroid Build Coastguard Workerfunction do_adb() {
36*90c8c64dSAndroid Build Coastguard Worker    adb $ADB_OPTIONS "$@"
37*90c8c64dSAndroid Build Coastguard Worker}
38*90c8c64dSAndroid Build Coastguard Worker
39*90c8c64dSAndroid Build Coastguard Worker# Return the timestamp of the most recent log line, which can be later used with logcat -t or -T.
40*90c8c64dSAndroid Build Coastguard Workerfunction get_last_logcat_timestamp() {
41*90c8c64dSAndroid Build Coastguard Worker    # Output will be like this. Extract the timestamp.
42*90c8c64dSAndroid Build Coastguard Worker    #--------- beginning of main
43*90c8c64dSAndroid Build Coastguard Worker    #06-14 00:04:43.909  3993  3993 E QtiImsExtUtils: isCarrierConfigEnabled bundle is null
44*90c8c64dSAndroid Build Coastguard Worker
45*90c8c64dSAndroid Build Coastguard Worker    do_adb logcat -t 1 | awk '(match($0, "^[0-9]")){print $1 " " $2}'
46*90c8c64dSAndroid Build Coastguard Worker}
47*90c8c64dSAndroid Build Coastguard Worker
48*90c8c64dSAndroid Build Coastguard Worker# If $1 is a number, just print it. Otherwise use adb shell pidof to try to resolve it into a pid.
49*90c8c64dSAndroid Build Coastguard Workerfunction resolve_pid() {
50*90c8c64dSAndroid Build Coastguard Worker    local name="$1"
51*90c8c64dSAndroid Build Coastguard Worker
52*90c8c64dSAndroid Build Coastguard Worker    if [[ -z "$name" ]] ;then
53*90c8c64dSAndroid Build Coastguard Worker        return 1
54*90c8c64dSAndroid Build Coastguard Worker    fi
55*90c8c64dSAndroid Build Coastguard Worker
56*90c8c64dSAndroid Build Coastguard Worker    if [[ "$name" =~ ^[0-9]+$ ]] ; then
57*90c8c64dSAndroid Build Coastguard Worker        echo "$name"
58*90c8c64dSAndroid Build Coastguard Worker        return 0
59*90c8c64dSAndroid Build Coastguard Worker    fi
60*90c8c64dSAndroid Build Coastguard Worker    local pid="$(do_adb shell pidof "$name")"
61*90c8c64dSAndroid Build Coastguard Worker    if [[ -z "$pid" ]] ; then
62*90c8c64dSAndroid Build Coastguard Worker        die "unknown process: $name"
63*90c8c64dSAndroid Build Coastguard Worker    fi
64*90c8c64dSAndroid Build Coastguard Worker    echo "$pid"
65*90c8c64dSAndroid Build Coastguard Worker}
66*90c8c64dSAndroid Build Coastguard Worker
67*90c8c64dSAndroid Build Coastguard Worker# Find available local port. Optionally take the starting port from $1.
68*90c8c64dSAndroid Build Coastguard Workerfunction find_open_port() {
69*90c8c64dSAndroid Build Coastguard Worker    local port="${1:-10000}" # Take the start port from $1 with 10000 as the default.
70*90c8c64dSAndroid Build Coastguard Worker
71*90c8c64dSAndroid Build Coastguard Worker    while true; do
72*90c8c64dSAndroid Build Coastguard Worker        if netstat -an | grep -qw "$port"; then
73*90c8c64dSAndroid Build Coastguard Worker            port=$(( $port + 1 ))
74*90c8c64dSAndroid Build Coastguard Worker            continue
75*90c8c64dSAndroid Build Coastguard Worker        fi
76*90c8c64dSAndroid Build Coastguard Worker        break # Found
77*90c8c64dSAndroid Build Coastguard Worker    done
78*90c8c64dSAndroid Build Coastguard Worker
79*90c8c64dSAndroid Build Coastguard Worker    echo "$port"
80*90c8c64dSAndroid Build Coastguard Worker}
81*90c8c64dSAndroid Build Coastguard Worker
82*90c8c64dSAndroid Build Coastguard Worker# Create a temp file name with a timestamp.
83*90c8c64dSAndroid Build Coastguard Workerfunction make_temp_file() {
84*90c8c64dSAndroid Build Coastguard Worker    local suffix="$1"
85*90c8c64dSAndroid Build Coastguard Worker    local dir="${TMPDIR:-${TEMP:-/tmp}}"
86*90c8c64dSAndroid Build Coastguard Worker
87*90c8c64dSAndroid Build Coastguard Worker    while true; do
88*90c8c64dSAndroid Build Coastguard Worker        local file="$dir/temp-$(date '+%Y%m%d-%H%M%S')-$$$suffix"
89*90c8c64dSAndroid Build Coastguard Worker        if ! [[ -e "$file" ]] ; then
90*90c8c64dSAndroid Build Coastguard Worker            touch "$file"   # Note it's a bit racy..
91*90c8c64dSAndroid Build Coastguard Worker            echo "$file"
92*90c8c64dSAndroid Build Coastguard Worker            return 0
93*90c8c64dSAndroid Build Coastguard Worker        fi
94*90c8c64dSAndroid Build Coastguard Worker        sleep 0.5 # Ugh.
95*90c8c64dSAndroid Build Coastguard Worker    done
96*90c8c64dSAndroid Build Coastguard Worker}