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:
+7
-59
@@ -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
@@ -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)
|
||||
|
||||
@@ -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
|
||||
@@ -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 :=
|
||||
@@ -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 */
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user