toybox: deprecate busybox and toolbox utils

Starting with android-10.0 we should only use tools from toybox.
Toyxbox in android-10.0 is specified as a recovery target, so
we just move the symlinks in our relink target.

Change-Id: Ic0116a7d583519b39422ac4d82d30e00918eb29d
This commit is contained in:
bigbiff
2020-03-28 13:46:48 -04:00
parent ac6cc08941
commit 416fe3a18a
12 changed files with 67 additions and 3072 deletions
+7 -59
View File
@@ -418,22 +418,12 @@ ifneq ($(TARGET_ARCH), arm64)
else
LOCAL_LDFLAGS += -Wl,-dynamic-linker,/sbin/linker64
endif
ifneq ($(TW_USE_TOOLBOX), true)
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 24; echo $$?),0)
LOCAL_POST_INSTALL_CMD := \
$(hide) mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/sbin && \
ln -sf /sbin/busybox $(TARGET_RECOVERY_ROOT_OUT)/sbin/sh
endif
else
ifneq ($(wildcard external/toybox/Android.mk),)
TWRP_REQUIRED_MODULES += toybox_symlinks
endif
ifneq ($(wildcard external/zip/Android.mk),)
TWRP_REQUIRED_MODULES += zip
endif
ifneq ($(wildcard external/unzip/Android.mk),)
TWRP_REQUIRED_MODULES += unzip
endif
ifneq ($(wildcard external/zip/Android.mk),)
TWRP_REQUIRED_MODULES += zip
endif
ifneq ($(wildcard external/unzip/Android.mk),)
TWRP_REQUIRED_MODULES += unzip
endif
ifneq ($(TW_NO_EXFAT), true)
@@ -561,48 +551,7 @@ endif
LOCAL_POST_INSTALL_CMD := \
$(hide) cp -f $(PRODUCT_OUT)/obj/ETC/file_contexts.bin_intermediates/file_contexts.concat.tmp $(TARGET_RECOVERY_ROOT_OUT)/file_contexts
#include $(BUILD_PHONY_PACKAGE)
ifneq ($(TW_USE_TOOLBOX), true)
include $(CLEAR_VARS)
# Create busybox symlinks... gzip and gunzip are excluded because those need to link to pigz instead
BUSYBOX_LINKS := $(shell cat external/busybox/busybox-full.links)
exclude := tune2fs mke2fs mkdosfs mkfs.vfat gzip gunzip
# Having /sbin/modprobe present on 32 bit devices with can cause a massive
# performance problem if the kernel has CONFIG_MODULES=y
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 22; echo $$?),0)
ifneq ($(TARGET_ARCH), arm64)
ifneq ($(TARGET_ARCH), x86_64)
exclude += modprobe
endif
endif
endif
# If busybox does not have restorecon, assume it does not have SELinux support.
# Then, let toolbox provide 'ls' so -Z is available to list SELinux contexts.
ifeq ($(filter restorecon, $(notdir $(BUSYBOX_LINKS))),)
exclude += ls
endif
RECOVERY_BUSYBOX_TOOLS := $(filter-out $(exclude), $(notdir $(BUSYBOX_LINKS)))
RECOVERY_BUSYBOX_SYMLINKS := $(addprefix $(TARGET_RECOVERY_ROOT_OUT)/sbin/, $(RECOVERY_BUSYBOX_TOOLS))
$(RECOVERY_BUSYBOX_SYMLINKS): BUSYBOX_BINARY := busybox
$(RECOVERY_BUSYBOX_SYMLINKS): $(LOCAL_INSTALLED_MODULE)
@echo "Symlink: $@ -> $(BUSYBOX_BINARY)"
@mkdir -p $(dir $@)
@rm -rf $@
$(hide) ln -sf $(BUSYBOX_BINARY) $@
include $(CLEAR_VARS)
LOCAL_MODULE := busybox_symlinks
LOCAL_MODULE_TAGS := optional
LOCAL_ADDITIONAL_DEPENDENCIES := $(RECOVERY_BUSYBOX_SYMLINKS)
ifneq (,$(filter $(PLATFORM_SDK_VERSION),16 17 18))
ALL_DEFAULT_INSTALLED_MODULES += $(RECOVERY_BUSYBOX_SYMLINKS)
endif
RECOVERY_BUSYBOX_SYMLINKS :=
endif # !TW_USE_TOOLBOX
include $(BUILD_PHONY_PACKAGE)
# recovery-persist (system partition dynamic executable run after /data mounts)
# ===============================
@@ -858,7 +807,6 @@ include $(commands_TWRP_local_path)/injecttwrp/Android.mk \
$(commands_TWRP_local_path)/minzip/Android.mk \
$(commands_TWRP_local_path)/dosfstools/Android.mk \
$(commands_TWRP_local_path)/etc/Android.mk \
$(commands_TWRP_local_path)/toybox/Android.mk \
$(commands_TWRP_local_path)/simg2img/Android.mk \
$(commands_TWRP_local_path)/adbbu/Android.mk \
$(commands_TWRP_local_path)/libpixelflinger/Android.mk \
+60 -54
View File
@@ -15,51 +15,48 @@ RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/dump_image
RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/flash_image
RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/erase_image
RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/bu
ifneq ($(TW_USE_TOOLBOX), true)
RELINK_SOURCE_FILES += $(TARGET_OUT_OPTIONAL_EXECUTABLES)/busybox
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 29; echo $$?),0)
RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/sh
else
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 29; echo $$?),0)
RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/sh
RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/bin/sh
endif
RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libcrypto.so
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 23; echo $$?),0)
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 29; echo $$?),0)
RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/bin/grep
else
RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/bin/sh
RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/grep
endif
RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libcrypto.so
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 23; echo $$?),0)
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 29; echo $$?),0)
RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/bin/grep
else
RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/grep
endif
LOCAL_POST_INSTALL_CMD += $(hide) if [ -e "$(TARGET_RECOVERY_ROOT_OUT)/sbin/egrep" ]; then \
rm $(TARGET_RECOVERY_ROOT_OUT)/sbin/egrep; fi; ln -s $(TARGET_RECOVERY_ROOT_OUT)/sbin/grep $(TARGET_RECOVERY_ROOT_OUT)/sbin/egrep; \
if [ -e "$(TARGET_RECOVERY_ROOT_OUT)/sbin/fgrep" ]; then \
rm $(TARGET_RECOVERY_ROOT_OUT)/sbin/fgrep; fi; ln -s $(TARGET_RECOVERY_ROOT_OUT)/sbin/grep $(TARGET_RECOVERY_ROOT_OUT)/sbin/fgrep;
# RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/toybox
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 23; echo $$?),0)
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 29; echo $$?),0)
RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/dd
endif
endif
ifneq ($(wildcard external/zip/Android.mk),)
RELINK_SOURCE_FILES += $(TARGET_OUT_OPTIONAL_EXECUTABLES)/zip
endif
ifneq ($(wildcard external/unzip/Android.mk),)
RELINK_SOURCE_FILES += $(TARGET_OUT_OPTIONAL_EXECUTABLES)/unzip
endif
ifneq ($(wildcard system/core/libziparchive/Android.bp),)
RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/unzip
endif
ifneq ($(wildcard external/one-true-awk/Android.bp),)
RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/awk
LOCAL_POST_INSTALL_CMD += $(hide) if [ -e "$(TARGET_RECOVERY_ROOT_OUT)/sbin/egrep" ]; then \
rm $(TARGET_RECOVERY_ROOT_OUT)/sbin/egrep; fi; ln -s $(TARGET_RECOVERY_ROOT_OUT)/sbin/grep $(TARGET_RECOVERY_ROOT_OUT)/sbin/egrep; \
if [ -e "$(TARGET_RECOVERY_ROOT_OUT)/sbin/fgrep" ]; then \
rm $(TARGET_RECOVERY_ROOT_OUT)/sbin/fgrep; fi; ln -s $(TARGET_RECOVERY_ROOT_OUT)/sbin/grep $(TARGET_RECOVERY_ROOT_OUT)/sbin/fgrep;
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 23; echo $$?),0)
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 29; echo $$?),0)
RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/dd
endif
endif
ifneq ($(wildcard external/zip/Android.mk),)
RELINK_SOURCE_FILES += $(TARGET_OUT_OPTIONAL_EXECUTABLES)/zip
endif
ifneq ($(wildcard external/unzip/Android.mk),)
RELINK_SOURCE_FILES += $(TARGET_OUT_OPTIONAL_EXECUTABLES)/unzip
endif
ifneq ($(wildcard system/core/libziparchive/Android.bp),)
RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/unzip
endif
ifneq ($(wildcard external/one-true-awk/Android.bp),)
RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/awk
endif
endif
RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/pigz
RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/fsck.fat
RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/fatlabel
RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/mkfs.fat
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 27; echo $$?),0)
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -le 29; echo $$?),0)
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -le 29; echo $$?),0)
RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/adbd
else
RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/bin/adbd
@@ -105,12 +102,14 @@ ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 29; echo $$?),0)
RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libadbd_services.so
RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libcap.so
RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libminijail.so
RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/bin/toybox
# RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libinit.so
RELINK_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/lib64/libdl_android.so
else
RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libc.so
RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libdl.so
RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libm.so
RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/toybox
endif
RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libcutils.so
RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libcrecovery.so
@@ -454,22 +453,29 @@ ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 27; echo $$?),0)
RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libext2_misc.so
endif
TW_BB_SYMLINKS :=
ifneq ($(TW_USE_TOOLBOX), true)
TW_BB_SYMLINKS := busybox_symlinks
endif
#toybox links
toybox_links := acpi base64 basename bc blockdev cal cat chcon chgrp chmod chown chroot chrt cksum clear \
cmp comm cp cpio cut date dd devmem df diff dirname dmesg dos2unix du echo env expand expr fallocate \
false file find flock fmt free fsync getconf getenforce groups gunzip gzip head hostname hwclock i2cdetect \
i2cdump i2cget i2cset iconv id ifconfig inotifyd insmod install ionice iorenice kill killall ln load_policy \
log logname losetup ls lsmod lsof lspci lsusb md5sum microcom mkdir mkfifo mknod mkswap mktemp modinfo modprobe \
more mount mountpoint mv nc netcat netstat nice nl nohup nproc nsenter od paste patch pgrep pidof pkill pmap \
printenv printf ps pwd readlink realpath renice restorecon rm rmdir rmmod runcon sed sendevent seq setenforce \
setprop setsid sha1sum sha224sum sha256sum sha384sum sha512sum sleep sort split start stat stop strings stty \
swapoff swapon sync sysctl tac tail tar taskset tee time timeout top touch toybox tr true truncate tty ulimit \
umount uname uniq unix2dos unlink unshare uptime usleep uudecode uuencode uuidgen vmstat watch wc which whoami \
xargs xxd yes zcat
TOYBOX_LINKS := $(addprefix $(TARGET_RECOVERY_ROOT_OUT)/system/bin/, $(toybox_links))
# GEN := $(intermediates)/teamwin
# $(GEN): $(RELINK) $(TW_BB_SYMLINKS) toolbox_symlinks
#relink recovery executables linker to /sbin
#relink recovery executables linker to /sbin and move symlinks
include $(CLEAR_VARS)
LOCAL_MODULE := relink
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
LOCAL_POST_INSTALL_CMD += $(RELINK) $(TARGET_RECOVERY_ROOT_OUT)/sbin $(RELINK_SOURCE_FILES)
LOCAL_REQUIRED_MODULES := linker toolbox_symlinks adbd libdl_android
LOCAL_POST_INSTALL_CMD += $(RELINK) $(TARGET_RECOVERY_ROOT_OUT)/sbin $(RELINK_SOURCE_FILES) && \
mv $(TOYBOX_LINKS) $(TARGET_RECOVERY_ROOT_OUT)/sbin/
LOCAL_REQUIRED_MODULES := linker adbd libdl_android toybox
include $(BUILD_PHONY_PACKAGE)
#relink init
@@ -602,16 +608,16 @@ ifeq ($(TW_INCLUDE_DUMLOCK), true)
include $(BUILD_PREBUILT)
endif
#ifeq ($(TW_USE_TOOLBOX), true)
# include $(CLEAR_VARS)
# LOCAL_MODULE := mkshrc_twrp
# LOCAL_MODULE_STEM := mkshrc
# LOCAL_MODULE_TAGS := optional
# LOCAL_MODULE_CLASS := ETC
# LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/etc
# LOCAL_SRC_FILES := $(LOCAL_MODULE)
# include $(BUILD_PREBUILT)
#endif
ifeq ($(TW_USE_TOOLBOX), true)
include $(CLEAR_VARS)
LOCAL_MODULE := mkshrc_twrp
LOCAL_MODULE_STEM := mkshrc
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/etc
LOCAL_SRC_FILES := $(LOCAL_MODULE)
include $(BUILD_PREBUILT)
endif
#TWRP App "placeholder"
include $(CLEAR_VARS)
-484
View File
@@ -1,484 +0,0 @@
#!/sbin/sh
#
# Warning: if you want to run this script in cm-recovery change the above to #!/sbin/sh
#
# fix_permissions - fixes permissions on Android data directories after upgrade
# shade@chemlab.org
#
# original concept: http://blog.elsdoerfer.name/2009/05/25/android-fix-package-uid-mismatches/
# implementation by: Cyanogen
# improved by: ankn, smeat, thenefield, farmatito, rikupw, Kastro
#
# v1.1-v1.31r3 - many improvements and concepts from XDA developers.
# v1.34 through v2.00 - A lot of frustration [by Kastro]
# v2.01 - Completely rewrote the script for SPEED, thanks for the input farmatito
# /data/data depth recursion is tweaked;
# fixed single mode;
# functions created for modularity;
# logging can be disabled via CLI for more speed;
# runtime computation added to end (Runtime: mins secs);
# progress (current # of total) added to screen;
# fixed CLI argument parsing, now you can have more than one option!;
# debug cli option;
# verbosity can be disabled via CLI option for less noise;;
# [by Kastro, (XDA: k4str0), twitter;mattcarver]
# v2.02 - ignore com.htc.resources.apk if it exists and minor code cleanups,
# fix help text, implement simulated run (-s) [farmatito]
# v2.03 - fixed chown group ownership output [Kastro]
# v2.04 - replaced /system/sd with $SD_EXT_DIRECTORY [Firerat]
VERSION="2.04"
# Defaults
DEBUG=0 # Debug off by default
LOGGING=1 # Logging on by default
VERBOSE=1 # Verbose on by default
# Messages
UID_MSG="Changing user ownership for:"
GID_MSG="Changing group ownership for:"
PERM_MSG="Changing permissions for:"
# Programs needed
ECHO="busybox echo"
GREP="busybox grep"
EGREP="busybox egrep"
CAT="busybox cat"
CHOWN="busybox chown"
CHMOD="busybox chmod"
MOUNT="busybox mount"
UMOUNT="busybox umount"
CUT="busybox cut"
FIND="busybox find"
LS="busybox ls"
TR="busybox tr"
TEE="busybox tee"
TEST="busybox test"
SED="busybox sed"
RM="busybox rm"
WC="busybox wc"
EXPR="busybox expr"
DATE="busybox date"
# Initialise vars
CODEPATH=""
UID=""
GID=""
PACKAGE=""
REMOVE=0
NOSYSTEM=0
ONLY_ONE=""
SIMULATE=0
SYSREMOUNT=0
SYSMOUNT=0
DATAMOUNT=0
SYSSDMOUNT=0
FP_STARTTIME=$( $DATE +"%m-%d-%Y %H:%M:%S" )
FP_STARTEPOCH=$( $DATE +%s )
if $TEST "$SD_EXT_DIRECTORY" = ""; then
#check for mount point, /system/sd included in tests for backward compatibility
for MP in /sd-ext /system/sd;do
if $TEST -d $MP; then
SD_EXT_DIRECTORY=$MP
break
fi
done
fi
fp_usage()
{
$ECHO "Usage $0 [OPTIONS] [APK_PATH]"
$ECHO " -d turn on debug"
$ECHO " -f fix only package APK_PATH"
$ECHO " -l disable logging for this run (faster)"
$ECHO " -r remove stale data directories"
$ECHO " of uninstalled packages while fixing permissions"
$ECHO " -s simulate only"
$ECHO " -u check only non-system directories"
$ECHO " -v disable verbosity for this run (less output)"
$ECHO " -V print version"
$ECHO " -h this help"
}
fp_parseargs()
{
# Parse options
while $TEST $# -ne 0; do
case "$1" in
-d)
DEBUG=1
;;
-f)
if $TEST $# -lt 2; then
$ECHO "$0: missing argument for option $1"
exit 1
else
if $TEST $( $ECHO $2 | $CUT -c1 ) != "-"; then
ONLY_ONE=$2
shift;
else
$ECHO "$0: missing argument for option $1"
exit 1
fi
fi
;;
-r)
REMOVE=1
;;
-s)
SIMULATE=1
;;
-l)
if $TEST $LOGGING -eq 0; then
LOGGING=1
else
LOGGING=0
fi
;;
-v)
if $TEST $VERBOSE -eq 0; then
VERBOSE=1
else
VERBOSE=0
fi
;;
-u)
NOSYSTEM=1
;;
-V)
$ECHO "$0 $VERSION"
exit 0
;;
-h)
fp_usage
exit 0
;;
-*)
$ECHO "$0: unknown option $1"
$ECHO
fp_usage
exit 1
;;
esac
shift;
done
}
fp_print()
{
MSG=$@
if $TEST $LOGGING -eq 1; then
$ECHO $MSG | $TEE -a $LOG_FILE
else
$ECHO $MSG
fi
}
fp_start()
{
if $TEST $SIMULATE -eq 0 ; then
if $TEST $( $GREP -c " /system " "/proc/mounts" ) -ne 0; then
DEVICE=$( $GREP " /system " "/proc/mounts" | $CUT -d ' ' -f1 )
if $TEST $DEBUG -eq 1; then
fp_print "/system mounted on $DEVICE"
fi
if $TEST $( $GREP " /system " "/proc/mounts" | $GREP -c " ro " ) -ne 0; then
$MOUNT -o remount,rw $DEVICE /system
SYSREMOUNT=1
fi
else
$MOUNT /system > /dev/null 2>&1
SYSMOUNT=1
fi
if $TEST $( $GREP -c " /data " "/proc/mounts" ) -eq 0; then
$MOUNT /data > /dev/null 2>&1
DATAMOUNT=1
fi
if $TEST -e /dev/block/mmcblk0p2 && $TEST $( $GREP -c " $SD_EXT_DIRECTORY " "/proc/mounts" ) -eq 0; then
$MOUNT $SD_EXT_DIRECTORY > /dev/null 2>&1
SYSSDMOUNT=1
fi
fi
if $TEST $( $MOUNT | $GREP -c /sdcard ) -eq 0; then
LOG_FILE="/data/fix_permissions.log"
else
LOG_FILE="/sdcard/fix_permissions.log"
fi
if $TEST ! -e "$LOG_FILE"; then
> $LOG_FILE
fi
fp_print "$0 $VERSION started at $FP_STARTTIME"
}
fp_chown_uid()
{
FP_OLDUID=$1
FP_UID=$2
FP_FILE=$3
#if user ownership doesn't equal then change them
if $TEST "$FP_OLDUID" != "$FP_UID"; then
if $TEST $VERBOSE -ne 0; then
fp_print "$UID_MSG $FP_FILE from '$FP_OLDUID' to '$FP_UID'"
fi
if $TEST $SIMULATE -eq 0; then
$CHOWN $FP_UID "$FP_FILE"
fi
fi
}
fp_chown_gid()
{
FP_OLDGID=$1
FP_GID=$2
FP_FILE=$3
#if group ownership doesn't equal then change them
if $TEST "$FP_OLDGID" != "$FP_GID"; then
if $TEST $VERBOSE -ne 0; then
fp_print "$GID_MSG $FP_FILE from '$FP_OLDGID' to '$FP_GID'"
fi
if $TEST $SIMULATE -eq 0; then
$CHOWN :$FP_GID "$FP_FILE"
fi
fi
}
fp_chmod()
{
FP_OLDPER=$1
FP_OLDPER=$( $ECHO $FP_OLDPER | cut -c2-10 )
FP_PERSTR=$2
FP_PERNUM=$3
FP_FILE=$4
#if the permissions are not equal
if $TEST "$FP_OLDPER" != "$FP_PERSTR"; then
if $TEST $VERBOSE -ne 0; then
fp_print "$PERM_MSG $FP_FILE from '$FP_OLDPER' to '$FP_PERSTR' ($FP_PERNUM)"
fi
#change the permissions
if $TEST $SIMULATE -eq 0; then
$CHMOD $FP_PERNUM "$FP_FILE"
fi
fi
}
fp_all()
{
FP_NUMS=$( $CAT /data/system/packages.xml | $EGREP "^<package.*serId" | $GREP -v framework-res.apk | $GREP -v com.htc.resources.apk | $WC -l )
I=0
$CAT /data/system/packages.xml | $EGREP "^<package.*serId" | $GREP -v framework-res.apk | $GREP -v com.htc.resources.apk | while read all_line; do
I=$( $EXPR $I + 1 )
fp_package "$all_line" $I $FP_NUMS
done
}
fp_single()
{
FP_SFOUND=$( $CAT /data/system/packages.xml | $EGREP "^<package.*serId" | $GREP -v framework-res.apk | $GREP -v com.htc.resources.apk | $GREP -i $ONLY_ONE | wc -l )
if $TEST $FP_SFOUND -gt 1; then
fp_print "Cannot perform single operation on $FP_SFOUND matched package(s)."
elif $TEST $FP_SFOUND = "" -o $FP_SFOUND -eq 0; then
fp_print "Could not find the package you specified in the packages.xml file."
else
FP_SPKG=$( $CAT /data/system/packages.xml | $EGREP "^<package.*serId" | $GREP -v framework-res.apk | $GREP -v com.htc.resources.apk | $GREP -i $ONLY_ONE )
fp_package "${FP_SPKG}" 1 1
fi
}
fp_package()
{
pkgline=$1
curnum=$2
endnum=$3
CODEPATH=$( $ECHO $pkgline | $SED 's%.* codePath="\(.*\)".*%\1%' | $CUT -d '"' -f1 )
PACKAGE=$( $ECHO $pkgline | $SED 's%.* name="\(.*\)".*%\1%' | $CUT -d '"' -f1 )
UID=$( $ECHO $pkgline | $SED 's%.*serId="\(.*\)".*%\1%' | $CUT -d '"' -f1 )
GID=$UID
APPDIR=$( $ECHO $CODEPATH | $SED 's%^\(.*\)/.*%\1%' )
APK=$( $ECHO $CODEPATH | $SED 's%^.*/\(.*\..*\)$%\1%' )
#debug
if $TEST $DEBUG -eq 1; then
fp_print "CODEPATH: $CODEPATH APPDIR: $APPDIR APK:$APK UID/GID:$UID:$GID"
fi
#check for existence of apk
if $TEST -e $CODEPATH; then
fp_print "Processing ($curnum of $endnum): $PACKAGE..."
#lets get existing permissions of CODEPATH
OLD_UGD=$( $LS -ln "$CODEPATH" )
OLD_PER=$( $ECHO $OLD_UGD | $CUT -d ' ' -f1 )
OLD_UID=$( $ECHO $OLD_UGD | $CUT -d ' ' -f3 )
OLD_GID=$( $ECHO $OLD_UGD | $CUT -d ' ' -f4 )
#apk source dirs
if $TEST "$APPDIR" = "/system/app"; then
#skip system apps if set
if $TEST "$NOSYSTEM" = "1"; then
fp_print "***SKIPPING SYSTEM APP ($PACKAGE)!"
return
fi
fp_chown_uid $OLD_UID 0 "$CODEPATH"
fp_chown_gid $OLD_GID 0 "$CODEPATH"
fp_chmod $OLD_PER "rw-r--r--" 644 "$CODEPATH"
elif $TEST "$APPDIR" = "/data/app" || $TEST "$APPDIR" = "/sd-ext/app"; then
fp_chown_uid $OLD_UID 1000 "$CODEPATH"
fp_chown_gid $OLD_GID 1000 "$CODEPATH"
fp_chmod $OLD_PER "rw-r--r--" 644 "$CODEPATH"
elif $TEST "$APPDIR" = "/data/app-private" || $TEST "$APPDIR" = "/sd-ext/app-private"; then
fp_chown_uid $OLD_UID 1000 "$CODEPATH"
fp_chown_gid $OLD_GID $GID "$CODEPATH"
fp_chmod $OLD_PER "rw-r-----" 640 "$CODEPATH"
fi
else
fp_print "$CODEPATH does not exist ($curnum of $endnum). Reinstall..."
if $TEST $REMOVE -eq 1; then
if $TEST -d /data/data/$PACKAGE ; then
fp_print "Removing stale dir /data/data/$PACKAGE"
if $TEST $SIMULATE -eq 0 ; then
$RM -R /data/data/$PACKAGE
fi
fi
fi
fi
#the data/data for the package
if $TEST -d "/data/data/$PACKAGE"; then
#find all directories in /data/data/$PACKAGE
$FIND /data/data/$PACKAGE -type d -exec $LS -ldn {} \; | while read dataline; do
#get existing permissions of that directory
OLD_PER=$( $ECHO $dataline | $CUT -d ' ' -f1 )
OLD_UID=$( $ECHO $dataline | $CUT -d ' ' -f3 )
OLD_GID=$( $ECHO $dataline | $CUT -d ' ' -f4 )
FILEDIR=$( $ECHO $dataline | $CUT -d ' ' -f9 )
FOURDIR=$( $ECHO $FILEDIR | $CUT -d '/' -f5 )
#set defaults for iteration
ISLIB=0
REVPERM=755
REVPSTR="rwxr-xr-x"
REVUID=$UID
REVGID=$GID
if $TEST "$FOURDIR" = ""; then
#package directory, perms:755 owner:$UID:$GID
fp_chmod $OLD_PER "rwxr-xr-x" 755 "$FILEDIR"
elif $TEST "$FOURDIR" = "lib"; then
#lib directory, perms:755 owner:1000:1000
#lib files, perms:755 owner:1000:1000
ISLIB=1
REVPERM=755
REVPSTR="rwxr-xr-x"
REVUID=1000
REVGID=1000
fp_chmod $OLD_PER "rwxr-xr-x" 755 "$FILEDIR"
elif $TEST "$FOURDIR" = "shared_prefs"; then
#shared_prefs directories, perms:771 owner:$UID:$GID
#shared_prefs files, perms:660 owner:$UID:$GID
REVPERM=660
REVPSTR="rw-rw----"
fp_chmod $OLD_PER "rwxrwx--x" 771 "$FILEDIR"
elif $TEST "$FOURDIR" = "databases"; then
#databases directories, perms:771 owner:$UID:$GID
#databases files, perms:660 owner:$UID:$GID
REVPERM=660
REVPSTR="rw-rw----"
fp_chmod $OLD_PER "rwxrwx--x" 771 "$FILEDIR"
elif $TEST "$FOURDIR" = "cache"; then
#cache directories, perms:771 owner:$UID:$GID
#cache files, perms:600 owner:$UID:GID
REVPERM=600
REVPSTR="rw-------"
fp_chmod $OLD_PER "rwxrwx--x" 771 "$FILEDIR"
else
#other directories, perms:771 owner:$UID:$GID
REVPERM=771
REVPSTR="rwxrwx--x"
fp_chmod $OLD_PER "rwxrwx--x" 771 "$FILEDIR"
fi
#change ownership of directories matched
if $TEST "$ISLIB" = "1"; then
fp_chown_uid $OLD_UID 1000 "$FILEDIR"
fp_chown_gid $OLD_GID 1000 "$FILEDIR"
else
fp_chown_uid $OLD_UID $UID "$FILEDIR"
fp_chown_gid $OLD_GID $GID "$FILEDIR"
fi
#if any files exist in directory with improper permissions reset them
$FIND $FILEDIR -type f -maxdepth 1 ! -perm $REVPERM -exec $LS -ln {} \; | while read subline; do
OLD_PER=$( $ECHO $subline | $CUT -d ' ' -f1 )
SUBFILE=$( $ECHO $subline | $CUT -d ' ' -f9 )
fp_chmod $OLD_PER $REVPSTR $REVPERM "$SUBFILE"
done
#if any files exist in directory with improper user reset them
$FIND $FILEDIR -type f -maxdepth 1 ! -user $REVUID -exec $LS -ln {} \; | while read subline; do
OLD_UID=$( $ECHO $subline | $CUT -d ' ' -f3 )
SUBFILE=$( $ECHO $subline | $CUT -d ' ' -f9 )
fp_chown_uid $OLD_UID $REVUID "$SUBFILE"
done
#if any files exist in directory with improper group reset them
$FIND $FILEDIR -type f -maxdepth 1 ! -group $REVGID -exec $LS -ln {} \; | while read subline; do
OLD_GID=$( $ECHO $subline | $CUT -d ' ' -f4 )
SUBFILE=$( $ECHO $subline | $CUT -d ' ' -f9 )
fp_chown_gid $OLD_GID $REVGID "$SUBFILE"
done
done
fi
}
date_diff()
{
if $TEST $# -ne 2; then
FP_DDM="E"
FP_DDS="E"
return
fi
FP_DDD=$( $EXPR $2 - $1 )
FP_DDM=$( $EXPR $FP_DDD / 60 )
FP_DDS=$( $EXPR $FP_DDD % 60 )
}
fp_end()
{
if $TEST $SYSREMOUNT -eq 1; then
$MOUNT -o remount,ro $DEVICE /system > /dev/null 2>&1
fi
if $TEST $SYSSDMOUNT -eq 1; then
$UMOUNT $SD_EXT_DIRECTORY > /dev/null 2>&1
fi
if $TEST $SYSMOUNT -eq 1; then
$UMOUNT /system > /dev/null 2>&1
fi
if $TEST $DATAMOUNT -eq 1; then
$UMOUNT /data > /dev/null 2>&1
fi
FP_ENDTIME=$( $DATE +"%m-%d-%Y %H:%M:%S" )
FP_ENDEPOCH=$( $DATE +%s )
date_diff $FP_STARTEPOCH $FP_ENDEPOCH
fp_print "$0 $VERSION ended at $FP_ENDTIME (Runtime:${FP_DDM}m${FP_DDS}s)"
}
#MAIN SCRIPT
fp_parseargs $@
fp_start
if $TEST "$ONLY_ONE" != "" -a "$ONLY_ONE" != "0" ; then
fp_single "$ONLY_ONE"
else
fp_all
fi
fp_end
-357
View File
@@ -1,357 +0,0 @@
TWRP_TOOLBOX_PATH := $(call my-dir)
LOCAL_PATH := system/core/toolbox
include $(CLEAR_VARS)
OUR_TOOLS :=
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 24; echo $$?),0)
OUR_TOOLS := \
start \
stop
endif
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23; echo $$?),0)
OUR_TOOLS += \
getprop \
setprop
endif
# If busybox does not have SELinux support, provide these tools with toolbox.
# Note that RECOVERY_BUSYBOX_TOOLS will be empty if TW_USE_TOOLBOX == true.
TOOLS_FOR_SELINUX := \
ls
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23; echo $$?),0)
TOOLS_FOR_SELINUX += \
load_policy \
getenforce \
chcon \
restorecon \
runcon \
getsebool \
setsebool
endif
OUR_TOOLS += $(filter-out $(RECOVERY_BUSYBOX_TOOLS), $(TOOLS_FOR_SELINUX))
# toolbox setenforce is used during init, so it needs to be included here
# symlink is omitted at the very end if busybox already provides this
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23; echo $$?),0)
OUR_TOOLS += setenforce
endif
ifeq ($(TW_USE_TOOLBOX), true)
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 22; echo $$?),0)
# These are the only toolbox tools in M. The rest are now in toybox.
BSD_TOOLS :=
OUR_TOOLS := \
newfs_msdos
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 26; echo $$?),0)
OUR_TOOLS += \
iftop \
ioctl \
nandread \
prlimit \
sendevent \
start \
stop
endif
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 24; echo $$?),0)
BSD_TOOLS += \
dd \
du \
OUR_TOOLS += \
df \
ionice \
log \
ls \
lsof \
mount \
ps \
renice \
top \
uptime \
watchprops
endif
else
ifneq (,$(filter $(PLATFORM_SDK_VERSION), 21 22))
OUR_TOOLS += \
mknod \
nohup
BSD_TOOLS := \
cat \
chown \
cp \
dd \
du \
grep \
kill \
ln \
mv \
printenv \
rm \
rmdir \
sleep \
sync
else
OUR_TOOLS += \
cat \
chown \
dd \
du \
kill \
ln \
mv \
printenv \
rm \
rmdir \
setconsole \
sleep \
sync
endif
OUR_TOOLS += \
chmod \
clear \
cmp \
date \
df \
dmesg \
getevent \
hd \
id \
ifconfig \
iftop \
insmod \
ioctl \
ionice \
log \
lsmod \
lsof \
md5 \
mkdir \
mkswap \
mount \
nandread \
netstat \
newfs_msdos \
notify \
ps \
readlink \
renice \
rmmod \
route \
schedtop \
sendevent \
smd \
swapoff \
swapon \
top \
touch \
umount \
uptime \
vmstat \
watchprops \
wipe
endif
endif
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 27; echo $$?),0)
# Special rules for 9.0
OUR_TOOLS += getevent
LOCAL_C_INCLUDES += $(TWRP_TOOLBOX_PATH)
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 29; echo $$?),0)
LOCAL_WHOLE_STATIC_LIBRARIES += libtoolbox_dd
endif
ifneq ($(TW_USE_TOOLBOX), true)
OUR_TOOLS += newfs_msdos
endif
endif
ifneq (,$(filter $(PLATFORM_SDK_VERSION), 21 22))
ifneq (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT)))
OUR_TOOLS += r
endif
endif
LOCAL_SRC_FILES := \
toolbox.c \
$(patsubst %,%.c,$(OUR_TOOLS))
ifneq ($(wildcard system/core/toolbox/dynarray.c),)
LOCAL_SRC_FILES += dynarray.c
endif
ifneq (,$(filter $(PLATFORM_SDK_VERSION), 21 22))
LOCAL_SRC_FILES += \
pwcache.c \
upstream-netbsd/lib/libc/gen/getbsize.c \
upstream-netbsd/lib/libc/gen/humanize_number.c \
upstream-netbsd/lib/libc/stdlib/strsuftoll.c \
upstream-netbsd/lib/libc/string/swab.c \
upstream-netbsd/lib/libutil/raise_default_signal.c
endif
ifneq (,$(filter $(PLATFORM_SDK_VERSION), 21 22 23))
LOCAL_CFLAGS += \
-std=gnu99 \
-Werror -Wno-unused-parameter \
-I$(LOCAL_PATH)/upstream-netbsd/include \
-include bsd-compatibility.h
endif
ifneq (,$(filter $(PLATFORM_SDK_VERSION), 21 22))
LOCAL_C_INCLUDES += external/openssl/include
else
LOCAL_C_INCLUDES += bionic/libc/bionic
endif
LOCAL_SHARED_LIBRARIES += libcutils
ifneq (,$(filter $(PLATFORM_SDK_VERSION), 21 22))
ifeq ($(TW_USE_TOOLBOX), true)
LOCAL_SHARED_LIBRARIES += libcrypto
endif
else
LOCAL_SHARED_LIBRARIES += \
libc \
liblog
endif
LOCAL_SHARED_LIBRARIES += libselinux
ifneq (,$(filter $(PLATFORM_SDK_VERSION), 21 22 23))
# libusbhost is only used by lsusb, and that isn't usually included in toolbox.
# The linker strips out all the unused library code in the normal case.
LOCAL_STATIC_LIBRARIES := libusbhost
LOCAL_WHOLE_STATIC_LIBRARIES := $(patsubst %,libtoolbox_%,$(BSD_TOOLS))
endif
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 22; echo $$?),0)
# Rule to make getprop and setprop in M trees where toybox normally
# provides these tools. Toybox does not allow for easy dynamic
# configuration, so we would have to include the entire toybox binary
# which takes up more space than is necessary so long as we are still
# including busybox.
ifneq ($(TW_USE_TOOLBOX), true)
LOCAL_SRC_FILES += \
../../../$(TWRP_TOOLBOX_PATH)/setprop.c \
../../../$(TWRP_TOOLBOX_PATH)/ls.c
OUR_TOOLS += setprop
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 28; echo $$?),0)
# Special rules for <= 8.1
LOCAL_SRC_FILES += \
../../../$(TWRP_TOOLBOX_PATH)/getprop.c
OUR_TOOLS += getprop
endif
endif
endif
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 23; echo $$?),0)
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 28; echo $$?),0)
# Rule for making start and stop in N trees
LOCAL_SRC_FILES += \
../../../$(TWRP_TOOLBOX_PATH)/start.c \
../../../$(TWRP_TOOLBOX_PATH)/stop.c
OUR_TOOLS += start stop
endif
endif
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 27; echo $$?),0)
LOCAL_SRC_FILES += getprop.cpp
LOCAL_SHARED_LIBRARIES += libbase
LOCAL_STATIC_LIBRARIES += libpropertyinfoparser
LOCAL_CPPFLAGS += -std=c++17
OUR_TOOLS += getprop
endif
LOCAL_MODULE := toolbox_recovery
LOCAL_MODULE_STEM := toolbox
LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
LOCAL_MODULE_TAGS := optional
LOCAL_CFLAGS += -Wno-unused-parameter -Wno-unused-const-variable
# Including this will define $(intermediates) below
include $(BUILD_EXECUTABLE)
$(LOCAL_PATH)/toolbox.c: $(intermediates)/tools.h
ifneq (,$(filter $(PLATFORM_SDK_VERSION), 21 22 23))
ALL_TOOLS := $(BSD_TOOLS) $(OUR_TOOLS)
else
ALL_TOOLS := $(OUR_TOOLS)
endif
TOOLS_H := $(intermediates)/tools.h
$(TOOLS_H): PRIVATE_TOOLS := $(ALL_TOOLS)
$(TOOLS_H): PRIVATE_CUSTOM_TOOL = echo "/* file generated automatically */" > $@ ; for t in $(PRIVATE_TOOLS) ; do echo "TOOL($$t)" >> $@ ; done
$(TOOLS_H):
$(transform-generated-source)
# toolbox setenforce is used during init in non-symlink form, so it was
# required to be included as part of the suite above. if busybox already
# provides setenforce, we can omit the toolbox symlink
TEMP_TOOLS := $(filter-out $(RECOVERY_BUSYBOX_TOOLS), $(ALL_TOOLS))
ALL_TOOLS := $(TEMP_TOOLS)
# Make /sbin/toolbox launchers for each tool
SYMLINKS := $(addprefix $(TARGET_RECOVERY_ROOT_OUT)/sbin/,$(ALL_TOOLS))
$(SYMLINKS): TOOLBOX_BINARY := $(LOCAL_MODULE_STEM)
$(SYMLINKS): $(LOCAL_INSTALLED_MODULE)
@echo "Symlink: $@ -> $(TOOLBOX_BINARY)"
@mkdir -p $(dir $@)
@rm -rf $@
$(hide) ln -sf $(TOOLBOX_BINARY) $@
include $(CLEAR_VARS)
LOCAL_MODULE := toolbox_symlinks
LOCAL_MODULE_TAGS := optional
LOCAL_ADDITIONAL_DEPENDENCIES := $(SYMLINKS)
include $(BUILD_PHONY_PACKAGE)
ifneq (,$(filter $(PLATFORM_SDK_VERSION),16 17 18))
# Only needed if the build system lacks support for LOCAL_ADDITIONAL_DEPENDENCIES
ALL_DEFAULT_INSTALLED_MODULES += $(SYMLINKS)
ALL_MODULES.$(LOCAL_MODULE).INSTALLED := \
$(ALL_MODULES.$(LOCAL_MODULE).INSTALLED) $(SYMLINKS)
endif
ifeq ($(TW_USE_TOOLBOX), true)
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 23; echo $$?),0)
include $(CLEAR_VARS)
LOCAL_MODULE := dd_twrp
LOCAL_MODULE_STEM := dd
LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
LOCAL_MODULE_TAGS := optional
LOCAL_CFLAGS := -include bsd-compatibility.h -DNO_CONV -Wno-unused-parameter
LOCAL_C_INCLUDES := system/core/toolbox/upstream-netbsd/include/ system/core/toolbox/upstream-netbsd/bin/dd system/core/toolbox
LOCAL_SHARED_LIBRARIES := \
libcutils \
LOCAL_SRC_FILES += \
upstream-netbsd/bin/dd/args.c \
upstream-netbsd/bin/dd/conv.c \
upstream-netbsd/bin/dd/dd.c \
upstream-netbsd/bin/dd/dd_hostops.c \
upstream-netbsd/bin/dd/misc.c \
upstream-netbsd/bin/dd/position.c \
upstream-netbsd/lib/libc/gen/getbsize.c \
upstream-netbsd/lib/libc/gen/humanize_number.c \
upstream-netbsd/lib/libc/stdlib/strsuftoll.c \
upstream-netbsd/lib/libc/string/swab.c \
upstream-netbsd/lib/libutil/raise_default_signal.c
include $(BUILD_EXECUTABLE)
endif
endif
SYMLINKS :=
ALL_TOOLS :=
BSD_TOOLS :=
OUR_TOOLS :=
TEMP_TOOLS :=
TOOLS_FOR_SELINUX :=
-82
View File
@@ -1,82 +0,0 @@
#ifndef DYNARRAY_H
#define DYNARRAY_H
// These functions are now found in system/core/toolbox/ls.c
#include <stddef.h>
/* simple dynamic array of pointers */
typedef struct {
int count;
int capacity;
void** items;
} dynarray_t;
#define DYNARRAY_INITIALIZER { 0, 0, NULL }
void dynarray_init( dynarray_t *a );
void dynarray_done( dynarray_t *a );
void dynarray_append( dynarray_t *a, void* item );
/* Used to iterate over a dynarray_t
* _array :: pointer to the array
* _item_type :: type of objects pointed to by the array
* _item :: name of a local variable defined within the loop
* with type '_item_type'
* _stmnt :: C statement that will be executed in each iteration.
*
* You case use 'break' and 'continue' within _stmnt
*
* This macro is only intended for simple uses. I.e. do not add or
* remove items from the array during iteration.
*/
#define DYNARRAY_FOREACH_TYPE(_array,_item_type,_item,_stmnt) \
do { \
int _nn_##__LINE__ = 0; \
for (;_nn_##__LINE__ < (_array)->count; ++ _nn_##__LINE__) { \
_item_type _item = (_item_type)(_array)->items[_nn_##__LINE__]; \
_stmnt; \
} \
} while (0)
#define DYNARRAY_FOREACH(_array,_item,_stmnt) \
DYNARRAY_FOREACH_TYPE(_array,void *,_item,_stmnt)
/* Simple dynamic string arrays
*
* NOTE: A strlist_t owns the strings it references.
*/
typedef dynarray_t strlist_t;
#define STRLIST_INITIALIZER DYNARRAY_INITIALIZER
/* Used to iterate over a strlist_t
* _list :: pointer to strlist_t object
* _string :: name of local variable name defined within the loop with
* type 'char*'
* _stmnt :: C statement executed in each iteration
*
* This macro is only intended for simple uses. Do not add or remove items
* to/from the list during iteration.
*/
#define STRLIST_FOREACH(_list,_string,_stmnt) \
DYNARRAY_FOREACH_TYPE(_list,char *,_string,_stmnt)
void strlist_init( strlist_t *list );
/* note: strlist_done will free all the strings owned by the list */
void strlist_done( strlist_t *list );
/* append a new string made of the first 'slen' characters from 'str'
* followed by a trailing zero.
*/
void strlist_append_b( strlist_t *list, const void* str, size_t slen );
/* append the copy of a given input string to a strlist_t */
void strlist_append_dup( strlist_t *list, const char *str);
/* sort the strings in a given list (using strcmp) */
void strlist_sort( strlist_t *list );
#endif /* DYNARRAY_H */
-50
View File
@@ -1,50 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include <cutils/properties.h>
#include "dynarray.h"
static void record_prop(const char* key, const char* name, void* opaque)
{
strlist_t* list = opaque;
char temp[PROP_VALUE_MAX + PROP_NAME_MAX + 16];
snprintf(temp, sizeof temp, "[%s]: [%s]", key, name);
strlist_append_dup(list, temp);
}
static void list_properties(void)
{
strlist_t list[1] = { STRLIST_INITIALIZER };
/* Record properties in the string list */
(void)property_list(record_prop, list);
/* Sort everything */
strlist_sort(list);
/* print everything */
STRLIST_FOREACH(list, str, printf("%s\n", str));
/* voila */
strlist_done(list);
}
int getprop_main(int argc, char *argv[])
{
if (argc == 1) {
list_properties();
} else {
char value[PROPERTY_VALUE_MAX];
char *default_value;
if(argc > 2) {
default_value = argv[2];
} else {
default_value = "";
}
property_get(argv[1], value, default_value);
printf("%s\n", value);
}
return 0;
}
-741
View File
@@ -1,741 +0,0 @@
static struct label input_prop_labels[] = {
LABEL(INPUT_PROP_POINTER),
LABEL(INPUT_PROP_DIRECT),
LABEL(INPUT_PROP_BUTTONPAD),
LABEL(INPUT_PROP_SEMI_MT),
LABEL(INPUT_PROP_TOPBUTTONPAD),
LABEL(INPUT_PROP_POINTING_STICK),
LABEL(INPUT_PROP_ACCELEROMETER),
LABEL(INPUT_PROP_MAX),
LABEL_END,
};
static struct label ev_labels[] = {
LABEL(EV_VERSION),
LABEL(EV_SYN),
LABEL(EV_KEY),
LABEL(EV_REL),
LABEL(EV_ABS),
LABEL(EV_MSC),
LABEL(EV_SW),
LABEL(EV_LED),
LABEL(EV_SND),
LABEL(EV_REP),
LABEL(EV_FF),
LABEL(EV_PWR),
LABEL(EV_FF_STATUS),
LABEL(EV_MAX),
LABEL_END,
};
static struct label syn_labels[] = {
LABEL(SYN_REPORT),
LABEL(SYN_CONFIG),
LABEL(SYN_MT_REPORT),
LABEL(SYN_DROPPED),
LABEL(SYN_MAX),
LABEL_END,
};
static struct label key_labels[] = {
LABEL(KEY_RESERVED),
LABEL(KEY_ESC),
LABEL(KEY_1),
LABEL(KEY_2),
LABEL(KEY_3),
LABEL(KEY_4),
LABEL(KEY_5),
LABEL(KEY_6),
LABEL(KEY_7),
LABEL(KEY_8),
LABEL(KEY_9),
LABEL(KEY_0),
LABEL(KEY_MINUS),
LABEL(KEY_EQUAL),
LABEL(KEY_BACKSPACE),
LABEL(KEY_TAB),
LABEL(KEY_Q),
LABEL(KEY_W),
LABEL(KEY_E),
LABEL(KEY_R),
LABEL(KEY_T),
LABEL(KEY_Y),
LABEL(KEY_U),
LABEL(KEY_I),
LABEL(KEY_O),
LABEL(KEY_P),
LABEL(KEY_LEFTBRACE),
LABEL(KEY_RIGHTBRACE),
LABEL(KEY_ENTER),
LABEL(KEY_LEFTCTRL),
LABEL(KEY_A),
LABEL(KEY_S),
LABEL(KEY_D),
LABEL(KEY_F),
LABEL(KEY_G),
LABEL(KEY_H),
LABEL(KEY_J),
LABEL(KEY_K),
LABEL(KEY_L),
LABEL(KEY_SEMICOLON),
LABEL(KEY_APOSTROPHE),
LABEL(KEY_GRAVE),
LABEL(KEY_LEFTSHIFT),
LABEL(KEY_BACKSLASH),
LABEL(KEY_Z),
LABEL(KEY_X),
LABEL(KEY_C),
LABEL(KEY_V),
LABEL(KEY_B),
LABEL(KEY_N),
LABEL(KEY_M),
LABEL(KEY_COMMA),
LABEL(KEY_DOT),
LABEL(KEY_SLASH),
LABEL(KEY_RIGHTSHIFT),
LABEL(KEY_KPASTERISK),
LABEL(KEY_LEFTALT),
LABEL(KEY_SPACE),
LABEL(KEY_CAPSLOCK),
LABEL(KEY_F1),
LABEL(KEY_F2),
LABEL(KEY_F3),
LABEL(KEY_F4),
LABEL(KEY_F5),
LABEL(KEY_F6),
LABEL(KEY_F7),
LABEL(KEY_F8),
LABEL(KEY_F9),
LABEL(KEY_F10),
LABEL(KEY_NUMLOCK),
LABEL(KEY_SCROLLLOCK),
LABEL(KEY_KP7),
LABEL(KEY_KP8),
LABEL(KEY_KP9),
LABEL(KEY_KPMINUS),
LABEL(KEY_KP4),
LABEL(KEY_KP5),
LABEL(KEY_KP6),
LABEL(KEY_KPPLUS),
LABEL(KEY_KP1),
LABEL(KEY_KP2),
LABEL(KEY_KP3),
LABEL(KEY_KP0),
LABEL(KEY_KPDOT),
LABEL(KEY_ZENKAKUHANKAKU),
LABEL(KEY_102ND),
LABEL(KEY_F11),
LABEL(KEY_F12),
LABEL(KEY_RO),
LABEL(KEY_KATAKANA),
LABEL(KEY_HIRAGANA),
LABEL(KEY_HENKAN),
LABEL(KEY_KATAKANAHIRAGANA),
LABEL(KEY_MUHENKAN),
LABEL(KEY_KPJPCOMMA),
LABEL(KEY_KPENTER),
LABEL(KEY_RIGHTCTRL),
LABEL(KEY_KPSLASH),
LABEL(KEY_SYSRQ),
LABEL(KEY_RIGHTALT),
LABEL(KEY_LINEFEED),
LABEL(KEY_HOME),
LABEL(KEY_UP),
LABEL(KEY_PAGEUP),
LABEL(KEY_LEFT),
LABEL(KEY_RIGHT),
LABEL(KEY_END),
LABEL(KEY_DOWN),
LABEL(KEY_PAGEDOWN),
LABEL(KEY_INSERT),
LABEL(KEY_DELETE),
LABEL(KEY_MACRO),
LABEL(KEY_MUTE),
LABEL(KEY_VOLUMEDOWN),
LABEL(KEY_VOLUMEUP),
LABEL(KEY_POWER),
LABEL(KEY_KPEQUAL),
LABEL(KEY_KPPLUSMINUS),
LABEL(KEY_PAUSE),
LABEL(KEY_SCALE),
LABEL(KEY_KPCOMMA),
LABEL(KEY_HANGEUL),
LABEL(KEY_HANJA),
LABEL(KEY_YEN),
LABEL(KEY_LEFTMETA),
LABEL(KEY_RIGHTMETA),
LABEL(KEY_COMPOSE),
LABEL(KEY_STOP),
LABEL(KEY_AGAIN),
LABEL(KEY_PROPS),
LABEL(KEY_UNDO),
LABEL(KEY_FRONT),
LABEL(KEY_COPY),
LABEL(KEY_OPEN),
LABEL(KEY_PASTE),
LABEL(KEY_FIND),
LABEL(KEY_CUT),
LABEL(KEY_HELP),
LABEL(KEY_MENU),
LABEL(KEY_CALC),
LABEL(KEY_SETUP),
LABEL(KEY_SLEEP),
LABEL(KEY_WAKEUP),
LABEL(KEY_FILE),
LABEL(KEY_SENDFILE),
LABEL(KEY_DELETEFILE),
LABEL(KEY_XFER),
LABEL(KEY_PROG1),
LABEL(KEY_PROG2),
LABEL(KEY_WWW),
LABEL(KEY_MSDOS),
LABEL(KEY_COFFEE),
LABEL(KEY_ROTATE_DISPLAY),
LABEL(KEY_CYCLEWINDOWS),
LABEL(KEY_MAIL),
LABEL(KEY_BOOKMARKS),
LABEL(KEY_COMPUTER),
LABEL(KEY_BACK),
LABEL(KEY_FORWARD),
LABEL(KEY_CLOSECD),
LABEL(KEY_EJECTCD),
LABEL(KEY_EJECTCLOSECD),
LABEL(KEY_NEXTSONG),
LABEL(KEY_PLAYPAUSE),
LABEL(KEY_PREVIOUSSONG),
LABEL(KEY_STOPCD),
LABEL(KEY_RECORD),
LABEL(KEY_REWIND),
LABEL(KEY_PHONE),
LABEL(KEY_ISO),
LABEL(KEY_CONFIG),
LABEL(KEY_HOMEPAGE),
LABEL(KEY_REFRESH),
LABEL(KEY_EXIT),
LABEL(KEY_MOVE),
LABEL(KEY_EDIT),
LABEL(KEY_SCROLLUP),
LABEL(KEY_SCROLLDOWN),
LABEL(KEY_KPLEFTPAREN),
LABEL(KEY_KPRIGHTPAREN),
LABEL(KEY_NEW),
LABEL(KEY_REDO),
LABEL(KEY_F13),
LABEL(KEY_F14),
LABEL(KEY_F15),
LABEL(KEY_F16),
LABEL(KEY_F17),
LABEL(KEY_F18),
LABEL(KEY_F19),
LABEL(KEY_F20),
LABEL(KEY_F21),
LABEL(KEY_F22),
LABEL(KEY_F23),
LABEL(KEY_F24),
LABEL(KEY_PLAYCD),
LABEL(KEY_PAUSECD),
LABEL(KEY_PROG3),
LABEL(KEY_PROG4),
LABEL(KEY_DASHBOARD),
LABEL(KEY_SUSPEND),
LABEL(KEY_CLOSE),
LABEL(KEY_PLAY),
LABEL(KEY_FASTFORWARD),
LABEL(KEY_BASSBOOST),
LABEL(KEY_PRINT),
LABEL(KEY_HP),
LABEL(KEY_CAMERA),
LABEL(KEY_SOUND),
LABEL(KEY_QUESTION),
LABEL(KEY_EMAIL),
LABEL(KEY_CHAT),
LABEL(KEY_SEARCH),
LABEL(KEY_CONNECT),
LABEL(KEY_FINANCE),
LABEL(KEY_SPORT),
LABEL(KEY_SHOP),
LABEL(KEY_ALTERASE),
LABEL(KEY_CANCEL),
LABEL(KEY_BRIGHTNESSDOWN),
LABEL(KEY_BRIGHTNESSUP),
LABEL(KEY_MEDIA),
LABEL(KEY_SWITCHVIDEOMODE),
LABEL(KEY_KBDILLUMTOGGLE),
LABEL(KEY_KBDILLUMDOWN),
LABEL(KEY_KBDILLUMUP),
LABEL(KEY_SEND),
LABEL(KEY_REPLY),
LABEL(KEY_FORWARDMAIL),
LABEL(KEY_SAVE),
LABEL(KEY_DOCUMENTS),
LABEL(KEY_BATTERY),
LABEL(KEY_BLUETOOTH),
LABEL(KEY_WLAN),
LABEL(KEY_UWB),
LABEL(KEY_UNKNOWN),
LABEL(KEY_VIDEO_NEXT),
LABEL(KEY_VIDEO_PREV),
LABEL(KEY_BRIGHTNESS_CYCLE),
LABEL(KEY_BRIGHTNESS_AUTO),
LABEL(KEY_DISPLAY_OFF),
LABEL(KEY_WWAN),
LABEL(KEY_RFKILL),
LABEL(KEY_MICMUTE),
LABEL(BTN_MISC),
LABEL(BTN_0),
LABEL(BTN_1),
LABEL(BTN_2),
LABEL(BTN_3),
LABEL(BTN_4),
LABEL(BTN_5),
LABEL(BTN_6),
LABEL(BTN_7),
LABEL(BTN_8),
LABEL(BTN_9),
LABEL(BTN_MOUSE),
LABEL(BTN_LEFT),
LABEL(BTN_RIGHT),
LABEL(BTN_MIDDLE),
LABEL(BTN_SIDE),
LABEL(BTN_EXTRA),
LABEL(BTN_FORWARD),
LABEL(BTN_BACK),
LABEL(BTN_TASK),
LABEL(BTN_JOYSTICK),
LABEL(BTN_TRIGGER),
LABEL(BTN_THUMB),
LABEL(BTN_THUMB2),
LABEL(BTN_TOP),
LABEL(BTN_TOP2),
LABEL(BTN_PINKIE),
LABEL(BTN_BASE),
LABEL(BTN_BASE2),
LABEL(BTN_BASE3),
LABEL(BTN_BASE4),
LABEL(BTN_BASE5),
LABEL(BTN_BASE6),
LABEL(BTN_DEAD),
LABEL(BTN_GAMEPAD),
LABEL(BTN_SOUTH),
LABEL(BTN_EAST),
LABEL(BTN_C),
LABEL(BTN_NORTH),
LABEL(BTN_WEST),
LABEL(BTN_Z),
LABEL(BTN_TL),
LABEL(BTN_TR),
LABEL(BTN_TL2),
LABEL(BTN_TR2),
LABEL(BTN_SELECT),
LABEL(BTN_START),
LABEL(BTN_MODE),
LABEL(BTN_THUMBL),
LABEL(BTN_THUMBR),
LABEL(BTN_DIGI),
LABEL(BTN_TOOL_PEN),
LABEL(BTN_TOOL_RUBBER),
LABEL(BTN_TOOL_BRUSH),
LABEL(BTN_TOOL_PENCIL),
LABEL(BTN_TOOL_AIRBRUSH),
LABEL(BTN_TOOL_FINGER),
LABEL(BTN_TOOL_MOUSE),
LABEL(BTN_TOOL_LENS),
LABEL(BTN_TOOL_QUINTTAP),
LABEL(BTN_STYLUS3),
LABEL(BTN_TOUCH),
LABEL(BTN_STYLUS),
LABEL(BTN_STYLUS2),
LABEL(BTN_TOOL_DOUBLETAP),
LABEL(BTN_TOOL_TRIPLETAP),
LABEL(BTN_TOOL_QUADTAP),
LABEL(BTN_WHEEL),
LABEL(BTN_GEAR_DOWN),
LABEL(BTN_GEAR_UP),
LABEL(KEY_OK),
LABEL(KEY_SELECT),
LABEL(KEY_GOTO),
LABEL(KEY_CLEAR),
LABEL(KEY_POWER2),
LABEL(KEY_OPTION),
LABEL(KEY_INFO),
LABEL(KEY_TIME),
LABEL(KEY_VENDOR),
LABEL(KEY_ARCHIVE),
LABEL(KEY_PROGRAM),
LABEL(KEY_CHANNEL),
LABEL(KEY_FAVORITES),
LABEL(KEY_EPG),
LABEL(KEY_PVR),
LABEL(KEY_MHP),
LABEL(KEY_LANGUAGE),
LABEL(KEY_TITLE),
LABEL(KEY_SUBTITLE),
LABEL(KEY_ANGLE),
LABEL(KEY_ZOOM),
LABEL(KEY_MODE),
LABEL(KEY_KEYBOARD),
LABEL(KEY_SCREEN),
LABEL(KEY_PC),
LABEL(KEY_TV),
LABEL(KEY_TV2),
LABEL(KEY_VCR),
LABEL(KEY_VCR2),
LABEL(KEY_SAT),
LABEL(KEY_SAT2),
LABEL(KEY_CD),
LABEL(KEY_TAPE),
LABEL(KEY_RADIO),
LABEL(KEY_TUNER),
LABEL(KEY_PLAYER),
LABEL(KEY_TEXT),
LABEL(KEY_DVD),
LABEL(KEY_AUX),
LABEL(KEY_MP3),
LABEL(KEY_AUDIO),
LABEL(KEY_VIDEO),
LABEL(KEY_DIRECTORY),
LABEL(KEY_LIST),
LABEL(KEY_MEMO),
LABEL(KEY_CALENDAR),
LABEL(KEY_RED),
LABEL(KEY_GREEN),
LABEL(KEY_YELLOW),
LABEL(KEY_BLUE),
LABEL(KEY_CHANNELUP),
LABEL(KEY_CHANNELDOWN),
LABEL(KEY_FIRST),
LABEL(KEY_LAST),
LABEL(KEY_AB),
LABEL(KEY_NEXT),
LABEL(KEY_RESTART),
LABEL(KEY_SLOW),
LABEL(KEY_SHUFFLE),
LABEL(KEY_BREAK),
LABEL(KEY_PREVIOUS),
LABEL(KEY_DIGITS),
LABEL(KEY_TEEN),
LABEL(KEY_TWEN),
LABEL(KEY_VIDEOPHONE),
LABEL(KEY_GAMES),
LABEL(KEY_ZOOMIN),
LABEL(KEY_ZOOMOUT),
LABEL(KEY_ZOOMRESET),
LABEL(KEY_WORDPROCESSOR),
LABEL(KEY_EDITOR),
LABEL(KEY_SPREADSHEET),
LABEL(KEY_GRAPHICSEDITOR),
LABEL(KEY_PRESENTATION),
LABEL(KEY_DATABASE),
LABEL(KEY_NEWS),
LABEL(KEY_VOICEMAIL),
LABEL(KEY_ADDRESSBOOK),
LABEL(KEY_MESSENGER),
LABEL(KEY_DISPLAYTOGGLE),
LABEL(KEY_SPELLCHECK),
LABEL(KEY_LOGOFF),
LABEL(KEY_DOLLAR),
LABEL(KEY_EURO),
LABEL(KEY_FRAMEBACK),
LABEL(KEY_FRAMEFORWARD),
LABEL(KEY_CONTEXT_MENU),
LABEL(KEY_MEDIA_REPEAT),
LABEL(KEY_10CHANNELSUP),
LABEL(KEY_10CHANNELSDOWN),
LABEL(KEY_IMAGES),
LABEL(KEY_DEL_EOL),
LABEL(KEY_DEL_EOS),
LABEL(KEY_INS_LINE),
LABEL(KEY_DEL_LINE),
LABEL(KEY_FN),
LABEL(KEY_FN_ESC),
LABEL(KEY_FN_F1),
LABEL(KEY_FN_F2),
LABEL(KEY_FN_F3),
LABEL(KEY_FN_F4),
LABEL(KEY_FN_F5),
LABEL(KEY_FN_F6),
LABEL(KEY_FN_F7),
LABEL(KEY_FN_F8),
LABEL(KEY_FN_F9),
LABEL(KEY_FN_F10),
LABEL(KEY_FN_F11),
LABEL(KEY_FN_F12),
LABEL(KEY_FN_1),
LABEL(KEY_FN_2),
LABEL(KEY_FN_D),
LABEL(KEY_FN_E),
LABEL(KEY_FN_F),
LABEL(KEY_FN_S),
LABEL(KEY_FN_B),
LABEL(KEY_BRL_DOT1),
LABEL(KEY_BRL_DOT2),
LABEL(KEY_BRL_DOT3),
LABEL(KEY_BRL_DOT4),
LABEL(KEY_BRL_DOT5),
LABEL(KEY_BRL_DOT6),
LABEL(KEY_BRL_DOT7),
LABEL(KEY_BRL_DOT8),
LABEL(KEY_BRL_DOT9),
LABEL(KEY_BRL_DOT10),
LABEL(KEY_NUMERIC_0),
LABEL(KEY_NUMERIC_1),
LABEL(KEY_NUMERIC_2),
LABEL(KEY_NUMERIC_3),
LABEL(KEY_NUMERIC_4),
LABEL(KEY_NUMERIC_5),
LABEL(KEY_NUMERIC_6),
LABEL(KEY_NUMERIC_7),
LABEL(KEY_NUMERIC_8),
LABEL(KEY_NUMERIC_9),
LABEL(KEY_NUMERIC_STAR),
LABEL(KEY_NUMERIC_POUND),
LABEL(KEY_NUMERIC_A),
LABEL(KEY_NUMERIC_B),
LABEL(KEY_NUMERIC_C),
LABEL(KEY_NUMERIC_D),
LABEL(KEY_CAMERA_FOCUS),
LABEL(KEY_WPS_BUTTON),
LABEL(KEY_TOUCHPAD_TOGGLE),
LABEL(KEY_TOUCHPAD_ON),
LABEL(KEY_TOUCHPAD_OFF),
LABEL(KEY_CAMERA_ZOOMIN),
LABEL(KEY_CAMERA_ZOOMOUT),
LABEL(KEY_CAMERA_UP),
LABEL(KEY_CAMERA_DOWN),
LABEL(KEY_CAMERA_LEFT),
LABEL(KEY_CAMERA_RIGHT),
LABEL(KEY_ATTENDANT_ON),
LABEL(KEY_ATTENDANT_OFF),
LABEL(KEY_ATTENDANT_TOGGLE),
LABEL(KEY_LIGHTS_TOGGLE),
LABEL(BTN_DPAD_UP),
LABEL(BTN_DPAD_DOWN),
LABEL(BTN_DPAD_LEFT),
LABEL(BTN_DPAD_RIGHT),
LABEL(KEY_ALS_TOGGLE),
LABEL(KEY_BUTTONCONFIG),
LABEL(KEY_TASKMANAGER),
LABEL(KEY_JOURNAL),
LABEL(KEY_CONTROLPANEL),
LABEL(KEY_APPSELECT),
LABEL(KEY_SCREENSAVER),
LABEL(KEY_VOICECOMMAND),
LABEL(KEY_ASSISTANT),
LABEL(KEY_BRIGHTNESS_MIN),
LABEL(KEY_BRIGHTNESS_MAX),
LABEL(KEY_KBDINPUTASSIST_PREV),
LABEL(KEY_KBDINPUTASSIST_NEXT),
LABEL(KEY_KBDINPUTASSIST_PREVGROUP),
LABEL(KEY_KBDINPUTASSIST_NEXTGROUP),
LABEL(KEY_KBDINPUTASSIST_ACCEPT),
LABEL(KEY_KBDINPUTASSIST_CANCEL),
LABEL(KEY_RIGHT_UP),
LABEL(KEY_RIGHT_DOWN),
LABEL(KEY_LEFT_UP),
LABEL(KEY_LEFT_DOWN),
LABEL(KEY_ROOT_MENU),
LABEL(KEY_MEDIA_TOP_MENU),
LABEL(KEY_NUMERIC_11),
LABEL(KEY_NUMERIC_12),
LABEL(KEY_AUDIO_DESC),
LABEL(KEY_3D_MODE),
LABEL(KEY_NEXT_FAVORITE),
LABEL(KEY_STOP_RECORD),
LABEL(KEY_PAUSE_RECORD),
LABEL(KEY_VOD),
LABEL(KEY_UNMUTE),
LABEL(KEY_FASTREVERSE),
LABEL(KEY_SLOWREVERSE),
LABEL(KEY_DATA),
LABEL(KEY_ONSCREEN_KEYBOARD),
LABEL(BTN_TRIGGER_HAPPY),
LABEL(BTN_TRIGGER_HAPPY1),
LABEL(BTN_TRIGGER_HAPPY2),
LABEL(BTN_TRIGGER_HAPPY3),
LABEL(BTN_TRIGGER_HAPPY4),
LABEL(BTN_TRIGGER_HAPPY5),
LABEL(BTN_TRIGGER_HAPPY6),
LABEL(BTN_TRIGGER_HAPPY7),
LABEL(BTN_TRIGGER_HAPPY8),
LABEL(BTN_TRIGGER_HAPPY9),
LABEL(BTN_TRIGGER_HAPPY10),
LABEL(BTN_TRIGGER_HAPPY11),
LABEL(BTN_TRIGGER_HAPPY12),
LABEL(BTN_TRIGGER_HAPPY13),
LABEL(BTN_TRIGGER_HAPPY14),
LABEL(BTN_TRIGGER_HAPPY15),
LABEL(BTN_TRIGGER_HAPPY16),
LABEL(BTN_TRIGGER_HAPPY17),
LABEL(BTN_TRIGGER_HAPPY18),
LABEL(BTN_TRIGGER_HAPPY19),
LABEL(BTN_TRIGGER_HAPPY20),
LABEL(BTN_TRIGGER_HAPPY21),
LABEL(BTN_TRIGGER_HAPPY22),
LABEL(BTN_TRIGGER_HAPPY23),
LABEL(BTN_TRIGGER_HAPPY24),
LABEL(BTN_TRIGGER_HAPPY25),
LABEL(BTN_TRIGGER_HAPPY26),
LABEL(BTN_TRIGGER_HAPPY27),
LABEL(BTN_TRIGGER_HAPPY28),
LABEL(BTN_TRIGGER_HAPPY29),
LABEL(BTN_TRIGGER_HAPPY30),
LABEL(BTN_TRIGGER_HAPPY31),
LABEL(BTN_TRIGGER_HAPPY32),
LABEL(BTN_TRIGGER_HAPPY33),
LABEL(BTN_TRIGGER_HAPPY34),
LABEL(BTN_TRIGGER_HAPPY35),
LABEL(BTN_TRIGGER_HAPPY36),
LABEL(BTN_TRIGGER_HAPPY37),
LABEL(BTN_TRIGGER_HAPPY38),
LABEL(BTN_TRIGGER_HAPPY39),
LABEL(BTN_TRIGGER_HAPPY40),
LABEL(KEY_MAX),
LABEL_END,
};
static struct label rel_labels[] = {
LABEL(REL_X),
LABEL(REL_Y),
LABEL(REL_Z),
LABEL(REL_RX),
LABEL(REL_RY),
LABEL(REL_RZ),
LABEL(REL_HWHEEL),
LABEL(REL_DIAL),
LABEL(REL_WHEEL),
LABEL(REL_MISC),
LABEL(REL_MAX),
LABEL_END,
};
static struct label abs_labels[] = {
LABEL(ABS_X),
LABEL(ABS_Y),
LABEL(ABS_Z),
LABEL(ABS_RX),
LABEL(ABS_RY),
LABEL(ABS_RZ),
LABEL(ABS_THROTTLE),
LABEL(ABS_RUDDER),
LABEL(ABS_WHEEL),
LABEL(ABS_GAS),
LABEL(ABS_BRAKE),
LABEL(ABS_HAT0X),
LABEL(ABS_HAT0Y),
LABEL(ABS_HAT1X),
LABEL(ABS_HAT1Y),
LABEL(ABS_HAT2X),
LABEL(ABS_HAT2Y),
LABEL(ABS_HAT3X),
LABEL(ABS_HAT3Y),
LABEL(ABS_PRESSURE),
LABEL(ABS_DISTANCE),
LABEL(ABS_TILT_X),
LABEL(ABS_TILT_Y),
LABEL(ABS_TOOL_WIDTH),
LABEL(ABS_VOLUME),
LABEL(ABS_MISC),
LABEL(ABS_MT_SLOT),
LABEL(ABS_MT_TOUCH_MAJOR),
LABEL(ABS_MT_TOUCH_MINOR),
LABEL(ABS_MT_WIDTH_MAJOR),
LABEL(ABS_MT_WIDTH_MINOR),
LABEL(ABS_MT_ORIENTATION),
LABEL(ABS_MT_POSITION_X),
LABEL(ABS_MT_POSITION_Y),
LABEL(ABS_MT_TOOL_TYPE),
LABEL(ABS_MT_BLOB_ID),
LABEL(ABS_MT_TRACKING_ID),
LABEL(ABS_MT_PRESSURE),
LABEL(ABS_MT_DISTANCE),
LABEL(ABS_MT_TOOL_X),
LABEL(ABS_MT_TOOL_Y),
LABEL(ABS_MAX),
LABEL_END,
};
static struct label sw_labels[] = {
LABEL(SW_LID),
LABEL(SW_TABLET_MODE),
LABEL(SW_HEADPHONE_INSERT),
LABEL(SW_RFKILL_ALL),
LABEL(SW_MICROPHONE_INSERT),
LABEL(SW_DOCK),
LABEL(SW_LINEOUT_INSERT),
LABEL(SW_JACK_PHYSICAL_INSERT),
LABEL(SW_VIDEOOUT_INSERT),
LABEL(SW_CAMERA_LENS_COVER),
LABEL(SW_KEYPAD_SLIDE),
LABEL(SW_FRONT_PROXIMITY),
LABEL(SW_ROTATE_LOCK),
LABEL(SW_LINEIN_INSERT),
LABEL(SW_MUTE_DEVICE),
LABEL(SW_PEN_INSERTED),
LABEL(SW_MAX),
LABEL_END,
};
static struct label msc_labels[] = {
LABEL(MSC_SERIAL),
LABEL(MSC_PULSELED),
LABEL(MSC_GESTURE),
LABEL(MSC_RAW),
LABEL(MSC_SCAN),
LABEL(MSC_TIMESTAMP),
LABEL(MSC_MAX),
LABEL_END,
};
static struct label led_labels[] = {
LABEL(LED_NUML),
LABEL(LED_CAPSL),
LABEL(LED_SCROLLL),
LABEL(LED_COMPOSE),
LABEL(LED_KANA),
LABEL(LED_SLEEP),
LABEL(LED_SUSPEND),
LABEL(LED_MUTE),
LABEL(LED_MISC),
LABEL(LED_MAIL),
LABEL(LED_CHARGING),
LABEL(LED_MAX),
LABEL_END,
};
static struct label rep_labels[] = {
LABEL(REP_DELAY),
LABEL(REP_PERIOD),
LABEL(REP_MAX),
LABEL_END,
};
static struct label snd_labels[] = {
LABEL(SND_CLICK),
LABEL(SND_BELL),
LABEL(SND_TONE),
LABEL(SND_MAX),
LABEL_END,
};
static struct label mt_tool_labels[] = {
LABEL(MT_TOOL_FINGER),
LABEL(MT_TOOL_PEN),
LABEL(MT_TOOL_PALM),
LABEL(MT_TOOL_MAX),
LABEL_END,
};
static struct label ff_status_labels[] = {
LABEL(FF_STATUS_STOPPED),
LABEL(FF_STATUS_PLAYING),
LABEL(FF_STATUS_MAX),
LABEL_END,
};
static struct label ff_labels[] = {
LABEL(FF_RUMBLE),
LABEL(FF_PERIODIC),
LABEL(FF_CONSTANT),
LABEL(FF_SPRING),
LABEL(FF_FRICTION),
LABEL(FF_DAMPER),
LABEL(FF_INERTIA),
LABEL(FF_RAMP),
LABEL(FF_SQUARE),
LABEL(FF_TRIANGLE),
LABEL(FF_SINE),
LABEL(FF_SAW_UP),
LABEL(FF_SAW_DOWN),
LABEL(FF_CUSTOM),
LABEL(FF_GAIN),
LABEL(FF_AUTOCENTER),
LABEL(FF_MAX),
LABEL_END,
};
-588
View File
@@ -1,588 +0,0 @@
#include <dirent.h>
#include <errno.h>
#include <grp.h>
#include <limits.h>
#include <pwd.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/sysmacros.h>
#include <sys/types.h>
#include <time.h>
#include <unistd.h>
#include <selinux/selinux.h>
// simple dynamic array of strings.
typedef struct {
int count;
int capacity;
void** items;
} strlist_t;
#define STRLIST_INITIALIZER { 0, 0, NULL }
/* Used to iterate over a strlist_t
* _list :: pointer to strlist_t object
* _item :: name of local variable name defined within the loop with
* type 'char*'
* _stmnt :: C statement executed in each iteration
*
* This macro is only intended for simple uses. Do not add or remove items
* to/from the list during iteration.
*/
#define STRLIST_FOREACH(_list,_item,_stmnt) \
do { \
int _nn_##__LINE__ = 0; \
for (;_nn_##__LINE__ < (_list)->count; ++ _nn_##__LINE__) { \
char* _item = (char*)(_list)->items[_nn_##__LINE__]; \
_stmnt; \
} \
} while (0)
static void dynarray_reserve_more( strlist_t *a, int count ) {
int old_cap = a->capacity;
int new_cap = old_cap;
const int max_cap = INT_MAX/sizeof(void*);
void** new_items;
int new_count = a->count + count;
if (count <= 0)
return;
if (count > max_cap - a->count)
abort();
new_count = a->count + count;
while (new_cap < new_count) {
old_cap = new_cap;
new_cap += (new_cap >> 2) + 4;
if (new_cap < old_cap || new_cap > max_cap) {
new_cap = max_cap;
}
}
new_items = realloc(a->items, new_cap*sizeof(void*));
if (new_items == NULL)
abort();
a->items = new_items;
a->capacity = new_cap;
}
void strlist_init( strlist_t *list ) {
list->count = list->capacity = 0;
list->items = NULL;
}
// append a new string made of the first 'slen' characters from 'str'
// followed by a trailing zero.
void strlist_append_b( strlist_t *list, const void* str, size_t slen ) {
char *copy = malloc(slen+1);
memcpy(copy, str, slen);
copy[slen] = '\0';
if (list->count >= list->capacity)
dynarray_reserve_more(list, 1);
list->items[list->count++] = copy;
}
// append the copy of a given input string to a strlist_t.
void strlist_append_dup( strlist_t *list, const char *str) {
strlist_append_b(list, str, strlen(str));
}
// note: strlist_done will free all the strings owned by the list.
void strlist_done( strlist_t *list ) {
STRLIST_FOREACH(list, string, free(string));
free(list->items);
list->items = NULL;
list->count = list->capacity = 0;
}
static int strlist_compare_strings(const void* a, const void* b) {
const char *sa = *(const char **)a;
const char *sb = *(const char **)b;
return strcmp(sa, sb);
}
/* sort the strings in a given list (using strcmp) */
void strlist_sort( strlist_t *list ) {
if (list->count > 0) {
qsort(list->items, (size_t)list->count, sizeof(void*), strlist_compare_strings);
}
}
// bits for flags argument
#define LIST_LONG (1 << 0)
#define LIST_ALL (1 << 1)
#define LIST_RECURSIVE (1 << 2)
#define LIST_DIRECTORIES (1 << 3)
#define LIST_SIZE (1 << 4)
#define LIST_LONG_NUMERIC (1 << 5)
#define LIST_CLASSIFY (1 << 6)
#define LIST_MACLABEL (1 << 7)
#define LIST_INODE (1 << 8)
// fwd
static int listpath(const char *name, int flags);
static char mode2kind(mode_t mode)
{
switch(mode & S_IFMT){
case S_IFSOCK: return 's';
case S_IFLNK: return 'l';
case S_IFREG: return '-';
case S_IFDIR: return 'd';
case S_IFBLK: return 'b';
case S_IFCHR: return 'c';
case S_IFIFO: return 'p';
default: return '?';
}
}
void strmode(mode_t mode, char *out)
{
*out++ = mode2kind(mode);
*out++ = (mode & 0400) ? 'r' : '-';
*out++ = (mode & 0200) ? 'w' : '-';
if(mode & 04000) {
*out++ = (mode & 0100) ? 's' : 'S';
} else {
*out++ = (mode & 0100) ? 'x' : '-';
}
*out++ = (mode & 040) ? 'r' : '-';
*out++ = (mode & 020) ? 'w' : '-';
if(mode & 02000) {
*out++ = (mode & 010) ? 's' : 'S';
} else {
*out++ = (mode & 010) ? 'x' : '-';
}
*out++ = (mode & 04) ? 'r' : '-';
*out++ = (mode & 02) ? 'w' : '-';
if(mode & 01000) {
*out++ = (mode & 01) ? 't' : 'T';
} else {
*out++ = (mode & 01) ? 'x' : '-';
}
*out = 0;
}
static void user2str(uid_t uid, char *out, size_t out_size)
{
struct passwd *pw = getpwuid(uid);
if(pw) {
strlcpy(out, pw->pw_name, out_size);
} else {
snprintf(out, out_size, "%d", uid);
}
}
static void group2str(gid_t gid, char *out, size_t out_size)
{
struct group *gr = getgrgid(gid);
if(gr) {
strlcpy(out, gr->gr_name, out_size);
} else {
snprintf(out, out_size, "%d", gid);
}
}
static int show_total_size(const char *dirname, DIR *d, int flags)
{
struct dirent *de;
char tmp[1024];
struct stat s;
int sum = 0;
/* run through the directory and sum up the file block sizes */
while ((de = readdir(d)) != 0) {
if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0)
continue;
if (de->d_name[0] == '.' && (flags & LIST_ALL) == 0)
continue;
if (strcmp(dirname, "/") == 0)
snprintf(tmp, sizeof(tmp), "/%s", de->d_name);
else
snprintf(tmp, sizeof(tmp), "%s/%s", dirname, de->d_name);
if (lstat(tmp, &s) < 0) {
fprintf(stderr, "stat failed on %s: %s\n", tmp, strerror(errno));
rewinddir(d);
return -1;
}
sum += s.st_blocks / 2;
}
printf("total %d\n", sum);
rewinddir(d);
return 0;
}
static int listfile_size(const char *path, const char *filename, struct stat *s,
int flags)
{
if(!s || !path) {
return -1;
}
/* blocks are 512 bytes, we want output to be KB */
if ((flags & LIST_SIZE) != 0) {
printf("%lld ", (long long)s->st_blocks / 2);
}
if ((flags & LIST_CLASSIFY) != 0) {
char filetype = mode2kind(s->st_mode);
if (filetype != 'l') {
printf("%c ", filetype);
} else {
struct stat link_dest;
if (!stat(path, &link_dest)) {
printf("l%c ", mode2kind(link_dest.st_mode));
} else {
fprintf(stderr, "stat '%s' failed: %s\n", path, strerror(errno));
printf("l? ");
}
}
}
printf("%s\n", filename);
return 0;
}
static int listfile_long(const char *path, struct stat *s, int flags)
{
char date[32];
char mode[16];
char user[32];
char group[32];
const char *name;
if(!s || !path) {
return -1;
}
/* name is anything after the final '/', or the whole path if none*/
name = strrchr(path, '/');
if(name == 0) {
name = path;
} else {
name++;
}
strmode(s->st_mode, mode);
if (flags & LIST_LONG_NUMERIC) {
snprintf(user, sizeof(user), "%u", s->st_uid);
snprintf(group, sizeof(group), "%u", s->st_gid);
} else {
user2str(s->st_uid, user, sizeof(user));
group2str(s->st_gid, group, sizeof(group));
}
strftime(date, 32, "%Y-%m-%d %H:%M", localtime((const time_t*)&s->st_mtime));
date[31] = 0;
// 12345678901234567890123456789012345678901234567890123456789012345678901234567890
// MMMMMMMM UUUUUUUU GGGGGGGGG XXXXXXXX YYYY-MM-DD HH:MM NAME (->LINK)
switch(s->st_mode & S_IFMT) {
case S_IFBLK:
case S_IFCHR:
printf("%s %-8s %-8s %3d, %3d %s %s\n",
mode, user, group,
major(s->st_rdev), minor(s->st_rdev),
date, name);
break;
case S_IFREG:
printf("%s %-8s %-8s %8lld %s %s\n",
mode, user, group, (long long)s->st_size, date, name);
break;
case S_IFLNK: {
char linkto[256];
ssize_t len;
len = readlink(path, linkto, 256);
if(len < 0) return -1;
if(len > 255) {
linkto[252] = '.';
linkto[253] = '.';
linkto[254] = '.';
linkto[255] = 0;
} else {
linkto[len] = 0;
}
printf("%s %-8s %-8s %s %s -> %s\n",
mode, user, group, date, name, linkto);
break;
}
default:
printf("%s %-8s %-8s %s %s\n",
mode, user, group, date, name);
}
return 0;
}
static int listfile_maclabel(const char *path, struct stat *s)
{
char mode[16];
char user[32];
char group[32];
char *maclabel = NULL;
const char *name;
if(!s || !path) {
return -1;
}
/* name is anything after the final '/', or the whole path if none*/
name = strrchr(path, '/');
if(name == 0) {
name = path;
} else {
name++;
}
lgetfilecon(path, &maclabel);
if (!maclabel) {
return -1;
}
strmode(s->st_mode, mode);
user2str(s->st_uid, user, sizeof(user));
group2str(s->st_gid, group, sizeof(group));
switch(s->st_mode & S_IFMT) {
case S_IFLNK: {
char linkto[256];
ssize_t len;
len = readlink(path, linkto, sizeof(linkto));
if(len < 0) return -1;
if((size_t)len > sizeof(linkto)-1) {
linkto[sizeof(linkto)-4] = '.';
linkto[sizeof(linkto)-3] = '.';
linkto[sizeof(linkto)-2] = '.';
linkto[sizeof(linkto)-1] = 0;
} else {
linkto[len] = 0;
}
printf("%s %-8s %-8s %s %s -> %s\n",
mode, user, group, maclabel, name, linkto);
break;
}
default:
printf("%s %-8s %-8s %s %s\n",
mode, user, group, maclabel, name);
}
free(maclabel);
return 0;
}
static int listfile(const char *dirname, const char *filename, int flags)
{
struct stat s;
if ((flags & (LIST_LONG | LIST_SIZE | LIST_CLASSIFY | LIST_MACLABEL | LIST_INODE)) == 0) {
printf("%s\n", filename);
return 0;
}
char tmp[4096];
const char* pathname = filename;
if (dirname != NULL) {
snprintf(tmp, sizeof(tmp), "%s/%s", dirname, filename);
pathname = tmp;
} else {
pathname = filename;
}
if(lstat(pathname, &s) < 0) {
fprintf(stderr, "lstat '%s' failed: %s\n", pathname, strerror(errno));
return -1;
}
if(flags & LIST_INODE) {
printf("%8llu ", (unsigned long long)s.st_ino);
}
if ((flags & LIST_MACLABEL) != 0) {
return listfile_maclabel(pathname, &s);
} else if ((flags & LIST_LONG) != 0) {
return listfile_long(pathname, &s, flags);
} else /*((flags & LIST_SIZE) != 0)*/ {
return listfile_size(pathname, filename, &s, flags);
}
}
static int listdir(const char *name, int flags)
{
char tmp[4096];
DIR *d;
struct dirent *de;
strlist_t files = STRLIST_INITIALIZER;
d = opendir(name);
if(d == 0) {
fprintf(stderr, "opendir failed, %s\n", strerror(errno));
return -1;
}
if ((flags & LIST_SIZE) != 0) {
show_total_size(name, d, flags);
}
while((de = readdir(d)) != 0){
if (!strcmp(de->d_name, ".") || !strcmp(de->d_name, "..")) continue;
if(de->d_name[0] == '.' && (flags & LIST_ALL) == 0) continue;
strlist_append_dup(&files, de->d_name);
}
strlist_sort(&files);
STRLIST_FOREACH(&files, filename, listfile(name, filename, flags));
strlist_done(&files);
if (flags & LIST_RECURSIVE) {
strlist_t subdirs = STRLIST_INITIALIZER;
rewinddir(d);
while ((de = readdir(d)) != 0) {
struct stat s;
int err;
if (!strcmp(de->d_name, ".") || !strcmp(de->d_name, ".."))
continue;
if (de->d_name[0] == '.' && (flags & LIST_ALL) == 0)
continue;
if (!strcmp(name, "/"))
snprintf(tmp, sizeof(tmp), "/%s", de->d_name);
else
snprintf(tmp, sizeof(tmp), "%s/%s", name, de->d_name);
/*
* If the name ends in a '/', use stat() so we treat it like a
* directory even if it's a symlink.
*/
if (tmp[strlen(tmp)-1] == '/')
err = stat(tmp, &s);
else
err = lstat(tmp, &s);
if (err < 0) {
perror(tmp);
closedir(d);
return -1;
}
if (S_ISDIR(s.st_mode)) {
strlist_append_dup(&subdirs, tmp);
}
}
strlist_sort(&subdirs);
STRLIST_FOREACH(&subdirs, path, {
printf("\n%s:\n", path);
listdir(path, flags);
});
strlist_done(&subdirs);
}
closedir(d);
return 0;
}
static int listpath(const char *name, int flags)
{
struct stat s;
int err;
/*
* If the name ends in a '/', use stat() so we treat it like a
* directory even if it's a symlink.
*/
if (name[strlen(name)-1] == '/')
err = stat(name, &s);
else
err = lstat(name, &s);
if (err < 0) {
perror(name);
return -1;
}
if ((flags & LIST_DIRECTORIES) == 0 && S_ISDIR(s.st_mode)) {
if (flags & LIST_RECURSIVE)
printf("\n%s:\n", name);
return listdir(name, flags);
} else {
/* yeah this calls stat() again*/
return listfile(NULL, name, flags);
}
}
int ls_main(int argc, char **argv)
{
int flags = 0;
if(argc > 1) {
int i;
int err = 0;
strlist_t files = STRLIST_INITIALIZER;
for (i = 1; i < argc; i++) {
if (argv[i][0] == '-') {
/* an option ? */
const char *arg = argv[i]+1;
while (arg[0]) {
switch (arg[0]) {
case 'l': flags |= LIST_LONG; break;
case 'n': flags |= LIST_LONG | LIST_LONG_NUMERIC; break;
case 's': flags |= LIST_SIZE; break;
case 'R': flags |= LIST_RECURSIVE; break;
case 'd': flags |= LIST_DIRECTORIES; break;
case 'Z': flags |= LIST_MACLABEL; break;
case 'a': flags |= LIST_ALL; break;
case 'F': flags |= LIST_CLASSIFY; break;
case 'i': flags |= LIST_INODE; break;
default:
fprintf(stderr, "%s: Unknown option '-%c'. Aborting.\n", "ls", arg[0]);
exit(1);
}
arg++;
}
} else {
/* not an option ? */
strlist_append_dup(&files, argv[i]);
}
}
if (files.count > 0) {
STRLIST_FOREACH(&files, path, {
if (listpath(path, flags) != 0) {
err = EXIT_FAILURE;
}
});
strlist_done(&files);
return err;
}
}
// list working directory if no files or directories were specified
return listpath(".", flags);
}
-18
View File
@@ -1,18 +0,0 @@
#include <stdio.h>
#include <cutils/properties.h>
int setprop_main(int argc, char *argv[])
{
if(argc != 3) {
fprintf(stderr,"usage: setprop <key> <value>\n");
return 1;
}
if(property_set(argv[1], argv[2])){
fprintf(stderr,"could not set property\n");
return 1;
}
return 0;
}
-21
View File
@@ -1,21 +0,0 @@
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <cutils/properties.h>
int start_main(int argc, char *argv[])
{
if(argc > 1) {
property_set("ctl.start", argv[1]);
} else {
/* defaults to starting the common services stopped by stop.c */
property_set("ctl.start", "netd");
property_set("ctl.start", "surfaceflinger");
property_set("ctl.start", "zygote");
property_set("ctl.start", "zygote_secondary");
}
return 0;
}
-19
View File
@@ -1,19 +0,0 @@
#include <stdio.h>
#include <string.h>
#include <cutils/properties.h>
int stop_main(int argc, char *argv[])
{
if(argc > 1) {
property_set("ctl.stop", argv[1]);
} else{
/* defaults to stopping the common services */
property_set("ctl.stop", "zygote_secondary");
property_set("ctl.stop", "zygote");
property_set("ctl.stop", "surfaceflinger");
property_set("ctl.stop", "netd");
}
return 0;
}
-599
View File
@@ -1,599 +0,0 @@
#
# Copyright (C) 2014 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
ifneq ($(wildcard external/toybox/Android.mk),)
ifeq ($(TW_USE_TOOLBOX), true)
LOCAL_PATH := external/toybox
#
# To update:
#
# git remote add toybox https://github.com/landley/toybox.git
# git fetch toybox
# git merge toybox/master
# mm -j32
# # (Make any necessary Android.mk changes and test the new toybox.)
# git push aosp HEAD:master # Push directly, avoiding gerrit.
# git push aosp HEAD:refs/for/master # Push to gerrit.
#
# # Now commit any necessary Android.mk changes like normal:
# repo start post-sync .
# git commit -a
#
# To add a toy:
#
# make menuconfig
# # (Select the toy you want to add.)
# make clean && make # Regenerate the generated files.
# # Edit LOCAL_SRC_FILES below to add the toy.
# # If you just want to use it as "toybox x" rather than "x", you can stop now.
# # If you want this toy to have a symbolic link in /system/bin, add the toy to ALL_TOOLS.
include $(CLEAR_VARS)
LOCAL_SRC_FILES := \
lib/args.c \
lib/dirtree.c \
lib/getmountlist.c \
lib/help.c \
lib/interestingtimes.c \
lib/lib.c \
lib/llist.c \
lib/net.c \
lib/portability.c \
lib/xwrap.c \
main.c \
toys/android/getenforce.c \
toys/android/getprop.c \
toys/android/load_policy.c \
toys/android/restorecon.c \
toys/android/runcon.c \
toys/android/setenforce.c \
toys/android/setprop.c \
toys/lsb/hostname.c \
toys/lsb/killall.c \
toys/lsb/md5sum.c \
toys/lsb/mknod.c \
toys/lsb/mktemp.c \
toys/lsb/mount.c \
toys/lsb/pidof.c \
toys/lsb/seq.c \
toys/lsb/sync.c \
toys/lsb/umount.c \
toys/other/acpi.c \
toys/other/base64.c \
toys/other/blkid.c \
toys/other/blockdev.c \
toys/other/bzcat.c \
toys/other/chcon.c \
toys/other/chroot.c \
toys/other/clear.c \
toys/other/dos2unix.c \
toys/other/fallocate.c \
toys/other/free.c \
toys/other/freeramdisk.c \
toys/other/fsfreeze.c \
toys/other/help.c \
toys/other/inotifyd.c \
toys/other/insmod.c \
toys/other/losetup.c \
toys/other/lsattr.c \
toys/other/lsmod.c \
toys/other/lsusb.c \
toys/other/makedevs.c \
toys/other/mkswap.c \
toys/other/modinfo.c \
toys/other/mountpoint.c \
toys/other/nbd_client.c \
toys/other/partprobe.c \
toys/other/pivot_root.c \
toys/other/pmap.c \
toys/other/printenv.c \
toys/other/pwdx.c \
toys/other/readlink.c \
toys/other/realpath.c \
toys/other/rev.c \
toys/other/rmmod.c \
toys/other/setsid.c \
toys/other/stat.c \
toys/other/swapoff.c \
toys/other/swapon.c \
toys/other/sysctl.c \
toys/other/tac.c \
toys/other/taskset.c \
toys/other/timeout.c \
toys/other/truncate.c \
toys/other/usleep.c \
toys/other/vconfig.c \
toys/other/vmstat.c \
toys/other/which.c \
toys/other/yes.c \
toys/pending/dd.c \
toys/pending/expr.c \
toys/pending/more.c \
toys/pending/route.c \
toys/pending/tar.c \
toys/pending/tr.c \
toys/pending/traceroute.c \
toys/posix/basename.c \
toys/posix/cal.c \
toys/posix/cat.c \
toys/posix/chgrp.c \
toys/posix/chmod.c \
toys/posix/cksum.c \
toys/posix/cmp.c \
toys/posix/comm.c \
toys/posix/cp.c \
toys/posix/cpio.c \
toys/posix/cut.c \
toys/posix/date.c \
toys/posix/df.c \
toys/posix/dirname.c \
toys/posix/du.c \
toys/posix/echo.c \
toys/posix/env.c \
toys/posix/expand.c \
toys/posix/false.c \
toys/posix/find.c \
toys/posix/grep.c \
toys/posix/head.c \
toys/posix/id.c \
toys/posix/kill.c \
toys/posix/ln.c \
toys/posix/ls.c \
toys/posix/mkdir.c \
toys/posix/mkfifo.c \
toys/posix/nice.c \
toys/posix/nl.c \
toys/posix/nohup.c \
toys/posix/od.c \
toys/posix/paste.c \
toys/posix/patch.c \
toys/posix/printf.c \
toys/posix/pwd.c \
toys/posix/renice.c \
toys/posix/rm.c \
toys/posix/rmdir.c \
toys/posix/sed.c \
toys/posix/sleep.c \
toys/posix/sort.c \
toys/posix/split.c \
toys/posix/strings.c \
toys/posix/tail.c \
toys/posix/tee.c \
toys/posix/time.c \
toys/posix/touch.c \
toys/posix/true.c \
toys/posix/tty.c \
toys/posix/uname.c \
toys/posix/uniq.c \
toys/posix/wc.c \
toys/posix/xargs.c
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -eq 26; echo $$?),0)
# Android 8.0 had some tools in different paths
LOCAL_SRC_FILES += \
toys/pending/dmesg.c
else
LOCAL_SRC_FILES += \
toys/lsb/dmesg.c
endif
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 23; echo $$?),0)
# there are some conflicts here with AOSP-7.[01] and CM-14.[01]
# the following items have been removed for compatibility
# ifconfig, netcat, netstat, rfkill, switch_root
LOCAL_STATIC_LIBRARIES := libcrypto_static
LOCAL_C_INCLUDES += \
external/boringssl/include \
bionic/libc/dns/include
LOCAL_SRC_FILES += \
lib/linestack.c \
lib/password.c \
toys/other/flock.c \
toys/other/hwclock.c \
toys/other/ionice.c \
toys/other/lspci.c \
toys/other/readahead.c \
toys/other/reset.c \
toys/other/uptime.c \
toys/other/xxd.c \
toys/pending/arp.c \
toys/pending/diff.c \
toys/pending/lsof.c \
toys/pending/telnet.c \
toys/pending/test.c \
toys/pending/watch.c \
toys/posix/ps.c \
toys/posix/ulimit.c
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 27; echo $$?),0)
LOCAL_SRC_FILES += \
toys/pending/xzcat.c
endif
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 25; echo $$?),0)
# Android 8.0/8.1 had some tools in different paths
LOCAL_SRC_FILES += \
toys/net/ftpget.c
else
LOCAL_SRC_FILES += \
toys/pending/ftpget.c
endif
# Account for master branch changes pulld into CM14.1
ifneq ($(CM_BUILD),)
LOCAL_SRC_FILES += \
toys/android/log.c \
toys/android/sendevent.c \
toys/android/start.c \
toys/net/ifconfig.c \
toys/net/netcat.c \
toys/net/netstat.c \
toys/net/rfkill.c \
toys/net/tunctl.c \
toys/other/setfattr.c \
toys/pending/chrt.c \
toys/pending/fdisk.c \
toys/pending/getfattr.c \
toys/pending/host.c \
toys/pending/resize.c \
toys/posix/file.c
else
LOCAL_SRC_FILES += \
toys/other/switch_root.c
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 25; echo $$?),0)
# Android 8.0 had some tools in different paths
LOCAL_SRC_FILES += \
toys/android/log.c \
toys/android/sendevent.c \
toys/android/start.c \
toys/net/ifconfig.c \
toys/net/microcom.c \
toys/net/netcat.c \
toys/net/netstat.c \
toys/net/rfkill.c \
toys/net/tunctl.c \
toys/pending/getfattr.c \
toys/pending/modprobe.c \
toys/posix/file.c \
toys/posix/uudecode.c \
toys/posix/uuencode.c
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 26; echo $$?),0)
# Android 8.1 had some tools in different paths
LOCAL_SRC_FILES += \
toys/other/chrt.c \
toys/pending/gzip.c
else
LOCAL_SRC_FILES += \
toys/pending/chrt.c
endif
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 27; echo $$?),0)
# Android 9.0
LOCAL_SRC_FILES += \
toys/other/setfattr.c \
toys/pending/fmt.c \
toys/pending/stty.c
else
LOCAL_SRC_FILES += \
toys/pending/setfattr.c
endif
LOCAL_SHARED_LIBRARIES += liblog
else
LOCAL_SRC_FILES += \
toys/other/ifconfig.c \
toys/other/netcat.c \
toys/other/rfkill.c \
toys/pending/netstat.c
endif
endif
else
LOCAL_SRC_FILES += \
toys/other/ifconfig.c \
toys/other/netcat.c \
toys/other/rfkill.c \
toys/other/switch_root.c \
toys/pending/hwclock.c \
toys/pending/netstat.c \
toys/pending/pgrep.c \
toys/pending/top.c
endif
LOCAL_CFLAGS += \
-std=c99 \
-std=gnu11 \
-Os \
-Wno-char-subscripts \
-Wno-sign-compare \
-Wno-string-plus-int \
-Wno-uninitialized \
-Wno-unused-parameter \
-funsigned-char \
-ffunction-sections -fdata-sections \
-fno-asynchronous-unwind-tables \
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 24; echo $$?),0)
toybox_version := $(shell git -C $(LOCAL_PATH) rev-parse --short=12 HEAD 2>/dev/null)-android
LOCAL_CFLAGS += -DTOYBOX_VERSION='"$(toybox_version)"'
else
toybox_version := $(shell sed 's/#define.*TOYBOX_VERSION.*"\(.*\)"/\1/p;d' $(LOCAL_PATH)/main.c)
LOCAL_CFLAGS += -DTOYBOX_VERSION=\"$(toybox_version)\"
endif
LOCAL_CLANG := true
LOCAL_SHARED_LIBRARIES += libcutils libselinux
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 26; echo $$?),0)
LOCAL_CFLAGS += \
-Wno-gnu-variable-sized-type-not-at-end \
-Wno-missing-field-initializers
LOCAL_SHARED_LIBRARIES += libz
endif
LOCAL_MODULE := toybox_recovery
LOCAL_MODULE_STEM := toybox
LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
LOCAL_MODULE_TAGS := optional
# dupes: dd df du ls mount renice
# useless?: freeramdisk fsfreeze install makedevs mkfifo nbd-client
# partprobe pivot_root pwdx rev rfkill switch_root tty vconfig
# prefer BSD netcat instead?: nc netcat
# prefer efs2progs instead?: blkid chattr lsattr
ALL_TOOLS := \
acpi \
basename \
blkid \
blockdev \
bzcat \
cal \
cat \
chcon \
chgrp \
chmod \
chown \
chroot \
cksum \
clear \
comm \
cmp \
cp \
cpio \
cut \
date \
dirname \
dmesg \
dos2unix \
echo \
env \
expand \
expr \
fallocate \
false \
find \
free \
getenforce \
groups \
head \
hostname \
hwclock \
id \
ifconfig \
inotifyd \
insmod \
kill \
load_policy \
ln \
logname \
losetup \
lsmod \
lsusb \
md5sum \
mkdir \
mknod \
mkswap \
mktemp \
modinfo \
more \
mountpoint \
mv \
netstat \
nice \
nl \
nohup \
od \
paste \
patch \
pgrep \
pidof \
pkill \
pmap \
printenv \
printf \
pwd \
readlink \
realpath \
restorecon \
rm \
rmdir \
rmmod \
route \
runcon \
sed \
seq \
setenforce \
setprop \
setsid \
sha1sum \
sleep \
sort \
split \
stat \
strings \
swapoff \
swapon \
sync \
sysctl \
tac \
tail \
tar \
taskset \
tee \
time \
timeout \
touch \
tr \
true \
truncate \
umount \
uname \
uniq \
unix2dos \
usleep \
vmstat \
wc \
which \
whoami \
xargs \
yes
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 23; echo $$?),0)
ALL_TOOLS += \
arp \
base64 \
chattr \
df \
diff \
flock \
freeramdisk \
fsfreeze \
fstype \
ftpget \
ftpput \
help \
install \
ionice \
iorenice \
iotop \
killall \
ls \
lsattr \
lsof \
lspci \
makedevs \
mkfifo \
mount \
nbd-client \
nc \
netcat \
nproc \
partprobe \
pivot_root \
ps \
pwdx \
readahead \
renice \
reset \
rev \
rfkill \
sha224sum \
sha256sum \
sha384sum \
sha512sum \
telnet \
test \
top \
traceroute \
traceroute6 \
tty \
tunctl \
ulimit \
uptime \
vconfig \
watch \
xxd
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -le 27; echo $$?),0)
ALL_TOOLS += \
getprop \
xzcat
endif
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 24; echo $$?),0)
ALL_TOOLS += \
du \
gzip \
gunzip \
zcat
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 25; echo $$?),0)
ALL_TOOLS += \
fmt \
start \
stop \
stty
endif
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 28; echo $$?),0)
ALL_TOOLS += \
dd
endif
endif
# Account for master branch changes pulld into CM14.1
ifneq ($(CM_BUILD),)
ALL_TOOLS += \
chrt \
fdisk \
file \
getfattr \
host \
log \
resize \
setfattr
endif
endif
# Install the symlinks.
# LOCAL_POST_INSTALL_CMD := $(hide) $(foreach t,$(ALL_TOOLS),ln -sf toybox $(TARGET_RECOVERY_ROOT_OUT)/sbin/$(t);)
LOCAL_POST_INSTALL_CMD := $(foreach t,$(ALL_TOOLS),ln -sf toybox $(TARGET_RECOVERY_ROOT_OUT)/sbin/$(t);)
include $(BUILD_EXECUTABLE)
# Make /sbin/toolbox launchers for each tool
SYMLINKS := $(addprefix $(TARGET_RECOVERY_ROOT_OUT)/sbin/,$(ALL_TOOLS))
$(SYMLINKS): TOYBOX_BINARY := $(LOCAL_MODULE_STEM)
$(SYMLINKS): $(LOCAL_INSTALLED_MODULE) $(LOCAL_PATH)/Android.mk
@echo "Symlink: $@ -> $(TOYBOX_BINARY)"
@mkdir -p $(dir $@)
@rm -rf $@
$(hide) ln -sf $(TOYBOX_BINARY) $@
include $(CLEAR_VARS)
LOCAL_MODULE := toybox_symlinks
LOCAL_MODULE_TAGS := optional
LOCAL_ADDITIONAL_DEPENDENCIES := $(SYMLINKS)
include $(BUILD_PHONY_PACKAGE)
endif
endif