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
diff --git a/Android.mk b/Android.mk
index f017ce5..2134c69 100755
--- a/Android.mk
+++ b/Android.mk
@@ -418,22 +418,12 @@
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 @@
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 @@
$(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 \
diff --git a/prebuilt/Android.mk b/prebuilt/Android.mk
index 689d58b..cd806a8 100755
--- a/prebuilt/Android.mk
+++ b/prebuilt/Android.mk
@@ -15,51 +15,48 @@
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
+ 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
- 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
- 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 @@
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 @@
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 @@
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)
diff --git a/prebuilt/fix_permissions.sh b/prebuilt/fix_permissions.sh
deleted file mode 100755
index 3723a12..0000000
--- a/prebuilt/fix_permissions.sh
+++ /dev/null
@@ -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
diff --git a/toolbox/Android.mk b/toolbox/Android.mk
deleted file mode 100755
index 4a2546e..0000000
--- a/toolbox/Android.mk
+++ /dev/null
@@ -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 :=
diff --git a/toolbox/dynarray.h b/toolbox/dynarray.h
deleted file mode 100644
index 0ca54fd..0000000
--- a/toolbox/dynarray.h
+++ /dev/null
@@ -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 */
diff --git a/toolbox/getprop.c b/toolbox/getprop.c
deleted file mode 100644
index dcc0ea0..0000000
--- a/toolbox/getprop.c
+++ /dev/null
@@ -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;
-}
diff --git a/toolbox/input.h-labels.h b/toolbox/input.h-labels.h
deleted file mode 100644
index 430586e..0000000
--- a/toolbox/input.h-labels.h
+++ /dev/null
@@ -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,
-};
diff --git a/toolbox/ls.c b/toolbox/ls.c
deleted file mode 100644
index 9a89dd4..0000000
--- a/toolbox/ls.c
+++ /dev/null
@@ -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);
-}
diff --git a/toolbox/setprop.c b/toolbox/setprop.c
deleted file mode 100644
index 63ad2b4..0000000
--- a/toolbox/setprop.c
+++ /dev/null
@@ -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;
-}
diff --git a/toolbox/start.c b/toolbox/start.c
deleted file mode 100644
index 6c8a3f2..0000000
--- a/toolbox/start.c
+++ /dev/null
@@ -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;
-}
diff --git a/toolbox/stop.c b/toolbox/stop.c
deleted file mode 100644
index 5e3ce3c..0000000
--- a/toolbox/stop.c
+++ /dev/null
@@ -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;
-}
diff --git a/toybox/Android.mk b/toybox/Android.mk
deleted file mode 100755
index 0fb345d..0000000
--- a/toybox/Android.mk
+++ /dev/null
@@ -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