Initial push

This commit is contained in:
Fredrik Fornwall 2017-04-09 18:19:29 +02:00
parent 01558e502c
commit 1ec1334b54
28 changed files with 973 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
termux-api

11
Makefile Normal file
View File

@ -0,0 +1,11 @@
CFLAGS += -std=c11 -Wall -Wextra -pedantic -Werror
PREFIX ?= /data/data/com.termux/files/usr
termux-api: termux-api.c
install: termux-api
mkdir -p $(PREFIX)/bin/ $(PREFIX)/libexec/
install termux-api $(PREFIX)/libexec/
install scripts/* $(PREFIX)/bin/
.PHONY: install

22
scripts/termux-battery-status Executable file
View File

@ -0,0 +1,22 @@
#!/bin/sh
set -e -u
SCRIPTNAME=termux-battery-status
show_usage () {
echo "Usage: $SCRIPTNAME"
echo "Get the status of the device battery."
exit 0
}
while getopts :h option
do
case "$option" in
h) show_usage;;
?) echo "$SCRIPTNAME: illegal option -$OPTARG"; exit 1;
esac
done
shift $(($OPTIND-1))
if [ $# != 0 ]; then echo "$SCRIPTNAME: too many arguments"; exit 1; fi
@TERMUX_API@ BatteryStatus

22
scripts/termux-camera-info Executable file
View File

@ -0,0 +1,22 @@
#!/bin/sh
set -e -u
SCRIPTNAME=termux-camera-info
show_usage () {
echo "Usage: $SCRIPTNAME"
echo "Get information about device camera(s)."
exit 0
}
while getopts :h option
do
case "$option" in
h) show_usage;;
?) echo "$SCRIPTNAME: illegal option -$OPTARG"; exit 1;
esac
done
shift $(($OPTIND-1))
if [ $# != 0 ]; then echo "$SCRIPTNAME: too many arguments"; exit 1; fi
@TERMUX_API@ CameraInfo

30
scripts/termux-camera-photo Executable file
View File

@ -0,0 +1,30 @@
#!/bin/sh
set -e -u
SCRIPTNAME=termux-camera-photo
show_usage () {
echo "Usage: termux-camera-photo [-c camera-id] output-file"
echo "Take a photo and save it to a file in JPEG format."
echo " -c camera-id ID of the camera to use (see termux-camera-info), default: 0"
exit 0
}
PARAMS=""
while getopts :hc: option
do
case "$option" in
h) show_usage;;
c) PARAMS="--es camera $OPTARG";;
?) echo "$SCRIPTNAME: illegal option -$OPTARG"; exit 1;
esac
done
shift $(($OPTIND-1))
if [ $# = 0 ]; then echo "$SCRIPTNAME: missing file argument"; exit 1; fi
if [ $# != 1 ]; then echo "$SCRIPTNAME: too many arguments"; exit 1; fi
touch $1
PARAMS="$PARAMS --es file `realpath $1`"
@TERMUX_API@ CameraPhoto $PARAMS

22
scripts/termux-clipboard-get Executable file
View File

@ -0,0 +1,22 @@
#!/bin/sh
set -e -u
SCRIPTNAME=termux-clipboard-get
show_usage () {
echo "Usage: $SCRIPTNAME"
echo "Get the system clipboard text."
exit 0
}
while getopts :h option
do
case "$option" in
h) show_usage;;
?) echo "$SCRIPTNAME: illegal option -$OPTARG"; exit 1;
esac
done
shift $(($OPTIND-1))
if [ $# != 0 ]; then echo "$SCRIPTNAME: too many arguments"; exit 1; fi
@TERMUX_API@ Clipboard

26
scripts/termux-clipboard-set Executable file
View File

@ -0,0 +1,26 @@
#!/bin/sh
set -e -u
SCRIPTNAME=termux-clipboard-set
show_usage () {
echo "Usage: $SCRIPTNAME [text]"
echo "Set the system clipboard text. The text to set is either supplied as arguments or read from stdin if no arguments are given."
exit 0
}
while getopts :h option
do
case "$option" in
h) show_usage;;
?) echo "$SCRIPTNAME: illegal option -$OPTARG"; exit 1;
esac
done
shift $(($OPTIND-1))
CMD="@TERMUX_API@ Clipboard -e api_version 2 --ez set true"
if [ $# = 0 ]; then
$CMD
else
echo $@ | $CMD
fi

22
scripts/termux-contact-list Executable file
View File

@ -0,0 +1,22 @@
#!/bin/sh
set -e -u
SCRIPTNAME=termux-contact-list
show_usage () {
echo "Usage: $SCRIPTNAME"
echo "List all contacts."
exit 0
}
while getopts :h option
do
case "$option" in
h) show_usage;;
?) echo "$SCRIPTNAME: illegal option -$OPTARG"; exit 1;
esac
done
shift $(($OPTIND-1))
if [ $# != 0 ]; then echo "$SCRIPTNAME: too many arguments"; exit 1; fi
@TERMUX_API@ ContactList

43
scripts/termux-dialog Executable file
View File

@ -0,0 +1,43 @@
#!/bin/sh
set -e -u
SCRIPTNAME=termux-dialog
show_usage () {
echo "Usage: $SCRIPTNAME [-i hint] [-m] [-p] [-t title]"
echo "Show a text entry dialog."
echo " -i hint the input hint to show when the input is empty"
echo " -m use a textarea with multiple lines instead of a single"
echo " -p enter the input as a password"
echo " -t title the title to show for the input prompt"
exit 0
}
PARAMS=""
ARG_I=""
OPT_I=""
ARG_M=""
ARG_P=""
ARG_T=""
OPT_T=""
while getopts :hi:mpt: option
do
case "$option" in
h) show_usage;;
i) ARG_I="--es input_hint"; OPT_I="$OPTARG";;
m) ARG_M="--ez multiple_lines true";;
p) ARG_P="--es input_type password";;
t) ARG_T="--es input_title"; OPT_T="$OPTARG";;
?) echo "$SCRIPTNAME: illegal option -$OPTARG"; exit 1;
esac
done
shift $(($OPTIND-1))
if [ $# != 0 ]; then echo "$SCRIPTNAME: too many arguments"; exit 1; fi
set -- $ARG_M $ARG_P
if [ -n "$ARG_I" ]; then set -- "$@" $ARG_I "$OPT_I"; fi
if [ -n "$ARG_T" ]; then set -- "$@" $ARG_T "$OPT_T"; fi
@TERMUX_API@ Dialog "$@"

39
scripts/termux-download Executable file
View File

@ -0,0 +1,39 @@
#!/bin/sh
set -e -u
SCRIPTNAME=termux-download
show_usage () {
echo "Usage: $SCRIPTNAME [-d description] [-t title] url-to-download"
echo "Download a resource using the system download manager."
echo " -d description description for the download request notification"
echo " -t title title for the download request notification"
exit 0
}
ARG_D=""
OPT_D=""
ARG_T=""
OPT_T=""
while getopts :hd:t: option
do
case "$option" in
h) show_usage;;
d) ARG_D="--es description"; OPT_D="$OPTARG";;
t) ARG_T="--es title"; OPT_T="$OPTARG";;
?) echo "$SCRIPTNAME: illegal option -$OPTARG"; exit 1;
esac
done
shift $(($OPTIND-1))
if [ $# -lt 1 ]; then echo "$SCRIPTNAME: no url specified"; exit 1; fi
if [ $# -gt 1 ]; then echo "$SCRIPTNAME: too many arguments"; exit 1; fi
URL_TO_DOWNLOAD="$1"
set --
if [ -n "$ARG_D" ]; then set -- "$@" $ARG_D "$OPT_D"; fi
if [ -n "$ARG_T" ]; then set -- "$@" $ARG_T "$OPT_T"; fi
set -- "$@" $URL_TO_DOWNLOAD
@TERMUX_API@ Download "$@"

View File

@ -0,0 +1,22 @@
#!/bin/sh
set -e -u
SCRIPTNAME=termux-infrared-frequencies
show_usage () {
echo "Usage: $SCRIPTNAME"
echo "Query the infrared transmitter's supported carrier frequencies."
exit 0
}
while getopts :h option
do
case "$option" in
h) show_usage;;
?) echo "$SCRIPTNAME: illegal option -$OPTARG"; exit 1;
esac
done
shift $(($OPTIND-1))
if [ $# != 0 ]; then echo "$SCRIPTNAME: too many arguments"; exit 1; fi
@TERMUX_API@ InfraredFrequencies

View File

@ -0,0 +1,28 @@
#!/bin/sh
set -e -u
SCRIPTNAME=termux-infrared-transmit
show_usage () {
echo "Usage: $SCRIPTNAME -f frequency pattern"
echo "Transmit an infrared pattern. The pattern is specified in comma-separated on/off intervals, such as '20,50,20,30'. Only patterns shorter than 2 seconds will be transmitted."
echo " -f frequency IR carrier frequency in Hertz"
exit 0
}
FREQUENCY=""
while getopts :hf: option
do
case "$option" in
h) show_usage;;
f) FREQUENCY="--ei frequency $OPTARG";;
?) echo "$SCRIPTNAME: illegal option -$OPTARG"; exit 1;
esac
done
shift $(($OPTIND-1))
if [ -z "$FREQUENCY" ]; then echo "$SCRIPTNAME: No frequency specified"; exit 1; fi
if [ $# -lt 1 ]; then echo "$SCRIPTNAME: too few arguments"; exit 1; fi
if [ $# -gt 1 ]; then echo "$SCRIPTNAME: too many arguments"; exit 1; fi
@TERMUX_API@ InfraredTransmit $FREQUENCY --eia pattern $1

48
scripts/termux-location Executable file
View File

@ -0,0 +1,48 @@
#!/bin/sh
set -e -u
SCRIPTNAME=termux-location
show_usage () {
echo "usage: $SCRIPTNAME [-p provider] [-r request]"
echo "Get the device location."
echo " -p provider location provider [gps/network/passive] (default: gps)"
echo " -r request kind of request to make [once/last/updates] (default: once)"
exit 0
}
validate_provider () {
PROVIDER=$1
case "$PROVIDER" in
gps) ;;
network) ;;
passive) ;;
*) echo "$SCRIPTNAME: Unsupported provider: '$PROVIDER'"; exit 1;;
esac
}
validate_request () {
REQUEST=$1
case "$REQUEST" in
once) ;;
last) ;;
updates) ;;
*) echo "$SCRIPTNAME: Unsupported request: '$REQUEST'"; exit 1;;
esac
}
PARAMS=""
while getopts :hr:p: option
do
case "$option" in
h) show_usage;;
r) validate_request $OPTARG; PARAMS="$PARAMS --es request $OPTARG";;
p) validate_provider $OPTARG; PARAMS="$PARAMS --es provider $OPTARG";;
?) echo "$SCRIPTNAME: illegal option -$OPTARG"; exit 1;
esac
done
shift $(($OPTIND-1))
if [ $# != 0 ]; then echo "$SCRIPTNAME: too many arguments"; exit 1; fi
@TERMUX_API@ Location $PARAMS

104
scripts/termux-notification Executable file
View File

@ -0,0 +1,104 @@
#!/data/data/com.termux/files/usr/bin/bash
set -e -u
SCRIPTNAME=termux-notification
show_usage () {
echo "Usage: termux-notification [options]"
echo "Display a system notification. Context text is read from stdin or specified using --content."
echo " --action action action to execute when pressing the notification"
echo " --button1 text text to show on the first notification button"
echo " --button1-action action action to execute on the first notification button"
echo " --button2 text text to show on the second notification button"
echo " --button2-action action action to execute on the second notification button"
echo " --button3 text text to show on the third notification button"
echo " --button3-action action action to execute on the third notification button"
echo " --content content contnet to show in the notification. Read from stdin not specified here."
echo " --id id notification id (will overwrite any previous notification with the same id)"
echo " --led-color rrggbb color of the blinking led as RRGGBB (default: none)"
echo " --led-on milliseconds number of milliseconds for the LED to be on while it's flashing (default: 800)"
echo " --led-off milliseconds number of milliseconds for the LED to be off while it's flashing (default: 800)"
echo " --priority prio notification priority (high/low/max/min/default)"
echo " --sound play a sound with the notification"
echo " --title title notification title to show"
echo " --vibrate pattern vibrate pattern, comma separated as in 500,1000,200"
exit 0
}
OPT_ACTION=""
OPT_ID=""
OPT_LED_COLOR=""
OPT_LED_OFF=""
OPT_LED_ON=""
OPT_PRIORITY=""
OPT_SOUND=""
OPT_TITLE=""
OPT_VIBRATE=""
OPT_BUTTON1_TEXT=""
OPT_BUTTON1_ACTION=""
OPT_BUTTON2_TEXT=""
OPT_BUTTON2_ACTION=""
OPT_BUTTON3_TEXT=""
OPT_BUTTON3_ACTION=""
TEMP=`busybox getopt \
-n $SCRIPTNAME \
-o hc:i:t: \
--long action:,\
button1:,button1-action:,\
button2:,button2-action:,\
button3:,button3-action:,\
content:,help,id:,\
led-color:,led-on:,led-off:,\
priority:,sound,title:,vibrate: \
-s bash \
-- "$@"`
eval set -- "$TEMP"
while true; do
case "$1" in
--action) OPT_ACTION="$2"; shift 2;;
--button1) OPT_BUTTON1_TEXT="$2"; shift 2;;
--button1-action) OPT_BUTTON1_ACTION="$2"; shift 2;;
--button2) OPT_BUTTON2_TEXT="$2"; shift 2;;
--button2-action) OPT_BUTTON2_ACTION="$2"; shift 2;;
--button3) OPT_BUTTON3_TEXT="$2"; shift 2;;
--button3-action) OPT_BUTTON3_ACTION="$2"; shift 2;;
-c | --content) OPT_CONTENT="$2"; shift 2;;
-h | --help) show_usage;;
-i | --id) OPT_ID="$2"; shift 2;;
--led-color) OPT_LED_COLOR="$2"; shift 2;;
--led-on) OPT_LED_ON="$2"; shift 2;;
--led-off) OPT_LED_OFF="$2"; shift 2;;
--priority) OPT_PRIORITY="$2"; shift 2;;
--sound) OPT_SOUND="true"; shift 1;;
-t | --title) OPT_TITLE="$2"; shift 2;;
--vibrate) OPT_VIBRATE="$2"; shift 2;;
--) shift; break ;;
esac
done
if [ $# != 0 ]; then echo "$SCRIPTNAME: too many arguments"; exit 1; fi
set --
if [ -n "$OPT_ACTION" ]; then set -- "$@" --es action "$OPT_ACTION"; fi
if [ -n "$OPT_BUTTON1_ACTION" ]; then set -- "$@" --es button_action_1 "$OPT_BUTTON1_ACTION"; fi
if [ -n "$OPT_BUTTON1_TEXT" ]; then set -- "$@" --es button_text_1 "$OPT_BUTTON1_TEXT"; fi
if [ -n "$OPT_BUTTON2_ACTION" ]; then set -- "$@" --es button_action_2 "$OPT_BUTTON2_ACTION"; fi
if [ -n "$OPT_BUTTON2_TEXT" ]; then set -- "$@" --es button_text_2 "$OPT_BUTTON2_TEXT"; fi
if [ -n "$OPT_BUTTON3_ACTION" ]; then set -- "$@" --es button_action_3 "$OPT_BUTTON3_ACTION"; fi
if [ -n "$OPT_BUTTON3_TEXT" ]; then set -- "$@" --es button_text_3 "$OPT_BUTTON3_TEXT"; fi
if [ -n "$OPT_ID" ]; then set -- "$@" --es id "$OPT_ID"; fi
if [ -n "$OPT_LED_COLOR" ]; then set -- "$@" --es led-color "$OPT_LED_COLOR"; fi
if [ -n "$OPT_LED_OFF" ]; then set -- "$@" --ei led-off "$OPT_LED_OFF"; fi
if [ -n "$OPT_LED_ON" ]; then set -- "$@" --ei led-on "$OPT_LED_ON"; fi
if [ -n "$OPT_PRIORITY" ]; then set -- "$@" --es priority "$OPT_PRIORITY"; fi
if [ -n "$OPT_SOUND" ]; then set -- "$@" --ez sound "$OPT_SOUND"; fi
if [ -n "$OPT_TITLE" ]; then set -- "$@" --es title "$OPT_TITLE"; fi
if [ -n "$OPT_VIBRATE" ]; then set -- "$@" --ela vibrate "$OPT_VIBRATE"; fi
if [ -v OPT_CONTENT ]; then
# Note that we want to accept an empty content (--content "").
echo ${OPT_CONTENT:=""} | /data/data/com.termux/files/usr/libexec/termux-api Notification "$@"
else
/data/data/com.termux/files/usr/libexec/termux-api Notification "$@"
fi

View File

@ -0,0 +1,22 @@
#!/data/data/com.termux/files/usr/bin/sh
set -e -u
SCRIPTNAME=termux-notification-remove
show_usage () {
echo "Usage: $SCRIPTNAME notification-id"
echo "Remove a notification previously shown with termux-notification --id."
exit 0
}
while getopts :h option
do
case "$option" in
h) show_usage;;
?) echo "$SCRIPTNAME: illegal option -$OPTARG"; exit 1;
esac
done
shift $(($OPTIND-1))
if [ $# != 1 ]; then echo "$SCRIPTNAME: no notification id specified"; exit 1; fi
/data/data/com.termux/files/usr/libexec/termux-api NotificationRemove --es id $1

49
scripts/termux-share Executable file
View File

@ -0,0 +1,49 @@
#!/bin/sh
set -e -u
SCRIPTNAME=termux-share
show_usage () {
echo "Usage: $SCRIPTNAME [-a action] [-c content-type] [-d] [-t title] [file]"
echo "Share a file specified as argument or the text received on stdin if no file argument is given."
echo " -a action which action to performed on the shared content:"
echo " edit/send/view (default:view)"
echo " -c content-type content-type to use (default: guessed from file extension,"
echo " text/plain for stdin)"
echo " -d share to the default receiver if one is selected"
echo " instead of showing a chooser"
echo " -t title title to use for shared content (default: shared file name)"
exit 0
}
validate_share () {
SHARETYPE=$1
case "$SHARETYPE" in
edit) ;;
send) ;;
view) ;;
*) echo "$SCRIPTNAME: Unsupported action: '$SHARETYPE'"; exit 1;;
esac
}
PARAMS=""
while getopts :ha:c:dt: option
do
case "$option" in
h) show_usage;;
a) validate_share $OPTARG; PARAMS="$PARAMS --es action $OPTARG";;
c) PARAMS="$PARAMS --es content-type $OPTARG";;
d) PARAMS="$PARAMS --ez default-receiver true";;
t) PARAMS="$PARAMS --es title $OPTARG";;
?) echo "$SCRIPTNAME: illegal option -$OPTARG"; exit 1;
esac
done
shift $(($OPTIND-1))
if [ $# -gt 1 ]; then echo "$SCRIPTNAME: too many arguments"; exit 1; fi
if [ $# != 0 ]; then
# Note that the file path can contain whitespace.
@TERMUX_API@ Share $PARAMS --es file "`realpath "$1"`"
else
@TERMUX_API@ Share $PARAMS
fi

35
scripts/termux-sms-inbox Executable file
View File

@ -0,0 +1,35 @@
#!/bin/sh
set -u
PARAM_LIMIT=10
PARAM_OFFSET=0
PARAMS=""
SCRIPTNAME=termux-sms-inbox
show_usage () {
echo "Usage: termux-sms-inbox [-d] [-l limit] [-n] [-o offset]"
echo "List received SMS messages."
echo " -d show dates when messages were created"
echo " -l limit offset in sms list (default: $PARAM_LIMIT)"
echo " -n show phone numbers"
echo " -o offset offset in sms list (default: $PARAM_OFFSET)"
exit 0
}
while getopts :hdl:no: option
do
case "$option" in
h) show_usage;;
d) PARAMS="$PARAMS --ez show-dates true";;
l) PARAM_LIMIT=$OPTARG;;
n) PARAMS="$PARAMS --ez show-phone-numbers true";;
o) PARAM_OFFSET=$OPTARG;;
?) echo "$SCRIPTNAME: illegal option -$OPTARG"; exit 1;
esac
done
shift $(($OPTIND-1))
if [ $# != 0 ]; then echo "$SCRIPTNAME: too many arguments"; exit 1; fi
PARAMS="$PARAMS --ei offset $PARAM_OFFSET --ei limit $PARAM_LIMIT"
@TERMUX_API@ SmsInbox $PARAMS

32
scripts/termux-sms-send Executable file
View File

@ -0,0 +1,32 @@
#!/bin/sh
set -e -u
SCRIPTNAME=termux-sms-send
show_usage () {
echo "Usage: $SCRIPTNAME -n number[,number2,number3,...] [text]"
echo "Send a SMS message to the specified recipient number(s). The text to send is either supplied as arguments or read from stdin if no arguments are given."
echo " -n number(s) recipient number(s) - separate multiple numbers by commas"
exit 0
}
RECIPIENTS=""
while getopts :hn: option
do
case "$option" in
h) show_usage;;
n) RECIPIENTS="--esa recipients $OPTARG";;
?) echo "$SCRIPTNAME: illegal option -$OPTARG"; exit 1;
esac
done
shift $(($OPTIND-1))
if [ -z "$RECIPIENTS" ]; then
echo "$SCRIPTNAME: no recipient number given"; exit 1;
fi
CMD="@TERMUX_API@ SmsSend $RECIPIENTS"
if [ $# = 0 ]; then
$CMD
else
echo $@ | $CMD
fi

24
scripts/termux-storage-get Executable file
View File

@ -0,0 +1,24 @@
#!/bin/sh
set -e -u
SCRIPTNAME=termux-storage-get
show_usage () {
echo "Usage: $SCRIPTNAME output-file"
echo "Request a file from the system and output it to the specified file."
exit 0
}
while getopts :h option
do
case "$option" in
h) show_usage;;
?) echo "$SCRIPTNAME: illegal option -$OPTARG"; exit 1;
esac
done
shift $(($OPTIND-1))
if [ $# -gt 1 ]; then echo "$SCRIPTNAME: too many arguments"; exit 1; fi
if [ $# -lt 1 ]; then echo "$SCRIPTNAME: no output file specified"; exit 1; fi
@TERMUX_API@ StorageGet --es file "`realpath "$1"`"

View File

@ -0,0 +1,22 @@
#!/bin/sh
set -e -u
SCRIPTNAME=termux-telephony-cellinfo
show_usage () {
echo "Usage: $SCRIPTNAME"
echo "Get information about all observed cell information from all radios on the device including the primary and neighboring cells."
exit 0
}
while getopts :h option
do
case "$option" in
h) show_usage;;
?) echo "$SCRIPTNAME: illegal option -$OPTARG"; exit 1;
esac
done
shift $(($OPTIND-1))
if [ $# != 0 ]; then echo "$SCRIPTNAME: too many arguments"; exit 1; fi
@TERMUX_API@ TelephonyCellInfo

View File

@ -0,0 +1,22 @@
#!/bin/sh
set -e -u
SCRIPTNAME=termux-telephony-deviceinfo
show_usage () {
echo "Usage: $SCRIPTNAME"
echo "Get information about the telephony device."
exit 0
}
while getopts :h option
do
case "$option" in
h) show_usage;;
?) echo "$SCRIPTNAME: illegal option -$OPTARG"; exit 1;
esac
done
shift $(($OPTIND-1))
if [ $# != 0 ]; then echo "$SCRIPTNAME: too many arguments"; exit 1; fi
@TERMUX_API@ TelephonyDeviceInfo

28
scripts/termux-toast Executable file
View File

@ -0,0 +1,28 @@
#!/bin/sh
set -e -u
SCRIPTNAME=termux-toast
show_usage () {
echo "Usage: termux-toast [-s] [text]"
echo "Show text in a Toast (a transient popup). The text to show is either supplied as arguments or read from stdin if no arguments are given."
echo " -s only show the toast for a short while"
exit 0
}
PARAMS=""
while getopts :hs option
do
case "$option" in
h) show_usage;;
s) PARAMS="--ez short true";;
?) echo "$SCRIPTNAME: illegal option -$OPTARG"; exit 1;
esac
done
shift $(($OPTIND-1))
CMD="@TERMUX_API@ Toast $PARAMS"
if [ $# = 0 ]; then
$CMD
else
echo $@ | $CMD
fi

22
scripts/termux-tts-engines Executable file
View File

@ -0,0 +1,22 @@
#!/bin/sh
set -e -u
SCRIPTNAME=termux-tts-engines
show_usage () {
echo "Usage: $SCRIPTNAME"
echo "Get information about the available text-to-speech (TTS) engines. The name of an engine may be given to the termux-tts-speak command using the -e option."
exit 0
}
while getopts :h option
do
case "$option" in
h) show_usage;;
?) echo "$SCRIPTNAME: illegal option -$OPTARG"; exit 1;
esac
done
shift $(($OPTIND-1))
if [ $# != 0 ]; then echo "$SCRIPTNAME: too many arguments"; exit 1; fi
@TERMUX_API@ TextToSpeech --es engine LIST_AVAILABLE

49
scripts/termux-tts-speak Executable file
View File

@ -0,0 +1,49 @@
#!/bin/sh
set -e -u
SCRIPTNAME=termux-tts-speak
show_usage () {
echo "Usage: $SCRIPTNAME [-e engine] [-l language] [-n region] [-v variant] [-p pitch] [-r rate] [-s stream] [text-to-speak]"
echo "Speak text with a system text-to-speech (TTS) engine. The text to speak is either supplied as arguments or read from stdin if no arguments are given."
echo " -e engine TTS engine to use (see termux-tts-engines)"
echo " -l language language to speak in (may be unsupported by the engine)"
echo " -n region region of language to speak in"
echo " -v variant variant of the language to speak in"
echo " -p pitch pitch to use in speech. 1.0 is the normal pitch,"
echo " lower values lower the tone of the synthesized voice,"
echo " greater values increase it."
echo " -r rate speech rate to use. 1.0 is the normal speech rate,"
echo " lower values slow down the speech"
echo " (0.5 is half the normal speech rate)"
echo " while greater values accelerates it"
echo " (2.0 is twice the normal speech rate)."
echo " -s stream audio stream to use (default:NOTIFICATION), one of:"
echo " ALARM, MUSIC, NOTIFICATION, RING, SYSTEM, VOICE_CALL"
exit 0
}
PARAMS=""
while getopts :he:l:n:v:p:r:s: option
do
case "$option" in
h) show_usage;;
e) PARAMS="$PARAMS --es engine $OPTARG";;
l) PARAMS="$PARAMS --es language $OPTARG";;
n) PARAMS="$PARAMS --es region $OPTARG";;
v) PARAMS="$PARAMS --es variant $OPTARG";;
p) PARAMS="$PARAMS --ef pitch $OPTARG";;
r) PARAMS="$PARAMS --ef rate $OPTARG";;
s) PARAMS="$PARAMS --es stream $OPTARG";;
?) echo "$SCRIPTNAME: illegal option -$OPTARG"; exit 1;
esac
done
shift $(($OPTIND-1))
CMD="@TERMUX_API@ TextToSpeech $PARAMS"
if [ $# = 0 ]; then
$CMD
else
echo $@ | $CMD
fi

28
scripts/termux-vibrate Executable file
View File

@ -0,0 +1,28 @@
#!/bin/sh
set -e -u
SCRIPTNAME=termux-vibrate
show_usage () {
echo "Usage: $SCRIPTNAME [-d duration] [-f]"
echo "Vibrate the device."
echo " -d duration the duration to vibrate in ms (default:1000)"
echo " -f force vibration even in silent mode"
exit 0
}
PARAMS=""
while getopts :hfd: option
do
case "$option" in
h) show_usage;;
d) PARAMS="$PARAMS --ei duration_ms $OPTARG";;
f) PARAMS="$PARAMS --ez force true";;
?) echo "$SCRIPTNAME: illegal option -$OPTARG"; exit 1;
esac
done
shift $(($OPTIND-1))
if [ $# != 0 ]; then echo "$SCRIPTNAME: too many arguments"; exit 1; fi
@TERMUX_API@ Vibrate $PARAMS

View File

@ -0,0 +1,22 @@
#!/data/data/com.termux/files/usr/bin/sh
set -e -u
SCRIPTNAME=termux-wifi-connectioninfo
show_usage () {
echo "Usage: $SCRIPTNAME"
echo "Get information about the current wifi connection."
exit 0
}
while getopts :h option
do
case "$option" in
h) show_usage;;
?) echo "$SCRIPTNAME: illegal option -$OPTARG"; exit 1;
esac
done
shift $(($OPTIND-1))
if [ $# != 0 ]; then echo "$SCRIPTNAME: too many arguments"; exit 1; fi
/data/data/com.termux/files/usr/libexec/termux-api WifiConnectionInfo

22
scripts/termux-wifi-scaninfo Executable file
View File

@ -0,0 +1,22 @@
#!/data/data/com.termux/files/usr/bin/sh
set -e -u
SCRIPTNAME=termux-wifi-scaninfo
show_usage () {
echo "Usage: $SCRIPTNAME"
echo "Get information about the last wifi scan."
exit 0
}
while getopts :h option
do
case "$option" in
h) show_usage;;
?) echo "$SCRIPTNAME: illegal option -$OPTARG"; exit 1;
esac
done
shift $(($OPTIND-1))
if [ $# != 0 ]; then echo "$SCRIPTNAME: too many arguments"; exit 1; fi
/data/data/com.termux/files/usr/libexec/termux-api WifiScanInfo

156
termux-api.c Normal file
View File

@ -0,0 +1,156 @@
// termux-api.c - helper binary for calling termux api classes
// Usage: termux-api ${API_METHOD} ${ADDITIONAL_FLAGS}
// This executes
// am broadcast com.termux.api/.TermuxApiReceiver --es socket_input ${INPUT_SOCKET}
// --es socket_output ${OUTPUT_SOCKET}
// --es ${API_METHOD}
// ${ADDITIONAL_FLAGS}
// where ${INPUT_SOCKET} and ${OUTPUT_SOCKET} are addresses to linux abstract namespace sockets,
// used to pass on stdin to the java implementation and pass back output from java to stdout.
#define _POSIX_SOURCE
#define _GNU_SOURCE
#include <fcntl.h>
#include <pthread.h>
#include <signal.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/un.h>
#include <time.h>
#include <unistd.h>
// Function which execs "am broadcast ..".
_Noreturn void exec_am_broadcast(int argc, char** argv, char* input_address_string, char* output_address_string)
{
// Redirect stdout to /dev/null (but leave stderr open):
close(STDOUT_FILENO);
open("/dev/null", O_RDONLY);
// Close stdin:
close(STDIN_FILENO);
int const extra_args = 15; // Including ending NULL.
char** child_argv = malloc((sizeof(char*)) * (argc + extra_args));
child_argv[0] = "am";
child_argv[1] = "broadcast";
child_argv[2] = "--user";
child_argv[3] = "0";
child_argv[4] = "-n";
child_argv[5] = "com.termux.api/.TermuxApiReceiver";
child_argv[6] = "--es";
// Input/output are reversed for the java process (our output is its input):
child_argv[7] = "socket_input";
child_argv[8] = output_address_string;
child_argv[9] = "--es";
child_argv[10] = "socket_output";
child_argv[11] = input_address_string;
child_argv[12] = "--es";
child_argv[13] = "api_method";
child_argv[14] = argv[1];
// Copy the remaining arguments -2 for first binary and second api name:
memcpy(child_argv + extra_args, argv + 2, (argc-1) * sizeof(char*));
// End with NULL:
child_argv[argc + extra_args] = NULL;
// Use an a executable taking care of PATH and LD_LIBRARY_PATH:
execv("/data/data/com.termux/files/usr/bin/am", child_argv);
perror("execv(\"/data/data/com.termux/files/usr/bin/am\")");
exit(1);
}
void generate_uuid(char* str) {
sprintf(str, "%x%x-%x-%x-%x-%x%x%x",
arc4random(), arc4random(), // Generates a 64-bit Hex number
(uint32_t) getpid(), // Generates a 32-bit Hex number
((arc4random() & 0x0fff) | 0x4000), // Generates a 32-bit Hex number of the form 4xxx (4 indicates the UUID version)
arc4random() % 0x3fff + 0x8000, // Generates a 32-bit Hex number in the range [0x8000, 0xbfff]
arc4random(), arc4random(), arc4random()); // Generates a 96-bit Hex number
}
// Thread function which reads from stdin and writes to socket.
void* transmit_stdin_to_socket(void* arg) {
int output_server_socket = *((int*) arg);
struct sockaddr_un remote_addr;
socklen_t addrlen = sizeof(remote_addr);
int output_client_socket = accept(output_server_socket, (struct sockaddr*) &remote_addr, &addrlen);
ssize_t len;
char buffer[1024];
while (len = read(STDIN_FILENO, &buffer, sizeof(buffer)), len > 0) {
if (write(output_client_socket, buffer, len) < 0) break;
}
// Close output socket on end of input:
close(output_client_socket);
return NULL;
}
// Main thread function which reads from input socket and writes to stdout.
void transmit_socket_to_stdout(int input_socket_fd) {
ssize_t len;
char buffer[1024];
while ((len = read(input_socket_fd, &buffer, sizeof(buffer))) > 0) {
write(STDOUT_FILENO, buffer, len);
}
if (len < 0) perror("read()");
}
int main(int argc, char** argv) {
// Do not transform children into zombies when they terminate:
struct sigaction sigchld_action = { .sa_handler = SIG_DFL, .sa_flags = SA_RESTART | SA_NOCLDSTOP | SA_NOCLDWAIT };
sigaction(SIGCHLD, &sigchld_action, NULL);
char input_address_string[100]; // This program reads from it.
char output_address_string[100]; // This program writes to it.
generate_uuid(input_address_string);
generate_uuid(output_address_string);
struct sockaddr_un input_address = { .sun_family = AF_UNIX };
struct sockaddr_un output_address = { .sun_family = AF_UNIX };
// Leave struct sockaddr_un.sun_path[0] as 0 and use the UUID string as abstract linux namespace:
strncpy(&input_address.sun_path[1], input_address_string, strlen(input_address_string));
strncpy(&output_address.sun_path[1], output_address_string, strlen(output_address_string));
int input_server_socket = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC, 0);
if (input_server_socket == -1) { perror("socket()"); return 1; }
int output_server_socket = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC, 0);
if (output_server_socket == -1) { perror("socket()"); return 1; }
if (bind(input_server_socket, (struct sockaddr*) &input_address, sizeof(sa_family_t) + strlen(input_address_string) + 1) == -1) {
perror("bind(input)");
return 1;
}
if (bind(output_server_socket, (struct sockaddr*) &output_address, sizeof(sa_family_t) + strlen(output_address_string) + 1) == -1) {
perror("bind(output)");
return 1;
}
if (listen(input_server_socket, 1) == -1) { perror("listen()"); return 1; }
if (listen(output_server_socket, 1) == -1) { perror("listen()"); return 1; }
pid_t fork_result = fork();
switch (fork_result) {
case -1: perror("fork()"); return 1;
case 0: exec_am_broadcast(argc, argv, input_address_string, output_address_string);
}
struct sockaddr_un remote_addr;
socklen_t addrlen = sizeof(remote_addr);
int input_client_socket = accept(input_server_socket, (struct sockaddr*) &remote_addr, &addrlen);
pthread_t transmit_thread;
pthread_create(&transmit_thread, NULL, transmit_stdin_to_socket, &output_server_socket);
transmit_socket_to_stdout(input_client_socket);
return 0;
}