Make TWRP compile for arm64

-Remove dosfstools for arm64 until we can make it compile
-Fix TW_USE_TOOLBOX flag to work again
-Fix symlinking and handling of sh when using mksh
-Fix legacy properties to find futex_wake function
-Fix libcrecovery to not use bsd_signal anymore
-Fix rules for building with regards to libcrecovery
-Update toolbox_recovery rules to compile tools in lollipop
-Fix a few compile errors specific to arm64

Testers report that TWRP does not boot on Nexus 9 and we fail to
get a shell for adb shell. At least it compiles without errors.

Change-Id: I286be8628defb60cc527b8a548c0bdfcb0ebb574
diff --git a/toolbox/Android.mk b/toolbox/Android.mk
index 8a96c81..ad2e24c 100644
--- a/toolbox/Android.mk
+++ b/toolbox/Android.mk
@@ -1,7 +1,15 @@
 LOCAL_PATH:= system/core/toolbox/
+
+
+common_cflags := \
+    -std=gnu99 \
+    -Werror -Wno-unused-parameter \
+    -I$(LOCAL_PATH)/upstream-netbsd/include/ \
+    -include bsd-compatibility.h
+
 include $(CLEAR_VARS)
 
-TOOLS := \
+OUR_TOOLS := \
 	start \
 	stop \
 	getprop \
@@ -20,103 +28,130 @@
 		getsebool \
 		setsebool \
 		load_policy
-	TOOLS += $(filter-out $(RECOVERY_BUSYBOX_TOOLS), $(TOOLS_FOR_SELINUX))
+	OUR_TOOLS += $(filter-out $(RECOVERY_BUSYBOX_TOOLS), $(TOOLS_FOR_SELINUX))
 endif
 
+
 ifeq ($(TW_USE_TOOLBOX), true)
-	TOOLS += \
-		mount \
-		cat \
-		ps \
-		kill \
-		ln \
-		insmod \
-		rmmod \
-		lsmod \
-		ifconfig \
-		setconsole \
-		rm \
-		mkdir \
-		rmdir \
-		getevent \
-		sendevent \
-		date \
-		wipe \
-		sync \
-		umount \
-		notify \
-		cmp \
-		dmesg \
-		route \
-		hd \
-		dd \
-		df \
-		watchprops \
-		log \
-		sleep \
-		renice \
-		printenv \
-		smd \
-		chmod \
-		chown \
-		newfs_msdos \
-		netstat \
-		ioctl \
-		mv \
-		schedtop \
-		top \
-		iftop \
-		id \
-		uptime \
-		vmstat \
-		nandread \
-		ionice \
-		touch \
-		lsof \
-		du \
-		md5 \
-		clear \
-		swapon \
-		swapoff \
-		mkswap \
-		readlink
-	ifneq ($(TWHAVE_SELINUX), true)
-		TOOLS += ls
-	endif
+BSD_TOOLS := \
+    cat \
+    chown \
+    cp \
+    dd \
+    du \
+    grep \
+    kill \
+    ln \
+    mv \
+    printenv \
+    rm \
+    rmdir \
+    sleep \
+    sync \
+
+OUR_TOOLS += \
+    chmod \
+    clear \
+    cmp \
+    date \
+    df \
+    dmesg \
+    getevent \
+    hd \
+    id \
+    ifconfig \
+    iftop \
+    insmod \
+    ioctl \
+    ionice \
+    log \
+    lsmod \
+    lsof \
+    md5 \
+    mkdir \
+    mknod \
+    mkswap \
+    mount \
+    nandread \
+    netstat \
+    newfs_msdos \
+    nohup \
+    notify \
+    ps \
+    readlink \
+    renice \
+    rmmod \
+    route \
+    schedtop \
+    sendevent \
+    smd \
+    swapoff \
+    swapon \
+    top \
+    touch \
+    umount \
+    uptime \
+    vmstat \
+    watchprops \
+    wipe
+    ifneq ($(TWHAVE_SELINUX), true)
+        TOOLS += ls
+    endif
+    LOCAL_SHARED_LIBRARIES += libcrypto
 endif
 
+ifneq (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT)))
+OUR_TOOLS += r
+endif
+
+ALL_TOOLS = $(BSD_TOOLS) $(OUR_TOOLS)
+
 LOCAL_SRC_FILES := \
-	toolbox.c \
-	$(patsubst %,%.c,$(TOOLS))
+    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 \
+    dynarray.c \
+    pwcache.c \
+    $(patsubst %,%.c,$(OUR_TOOLS)) \
+    toolbox.c \
 
-ifneq ($(wildcard system/core/toolbox/dynarray.c),)
-    LOCAL_SRC_FILES += dynarray.c
-endif
+LOCAL_CFLAGS += $(common_cflags)
 
-# reboot.c was removed in 4.4 kitkat
-#TOOLS += reboot
+LOCAL_C_INCLUDES += external/openssl/include
 
-#ifeq ($(BOARD_USES_BOOTMENU),true)
-#	LOCAL_SRC_FILES += ../../../external/bootmenu/libreboot/reboot.c
-#else
-#	LOCAL_SRC_FILES += reboot.c
-#endif
-
-LOCAL_C_INCLUDES := bionic/libc/bionic
-
-LOCAL_SHARED_LIBRARIES := \
-	libcutils \
-	liblog \
-	libc
+LOCAL_SHARED_LIBRARIES += libcutils
 
 ifeq ($(TWHAVE_SELINUX), true)
-	LOCAL_SHARED_LIBRARIES += libselinux
+    LOCAL_SHARED_LIBRARIES += libselinux
+    LOCAL_STATIC_LIBRARIES += \
+        libtoolbox_cat \
+        libtoolbox_chown \
+        libtoolbox_cp \
+        libtoolbox_dd \
+        libtoolbox_grep \
+        libtoolbox_kill \
+        libtoolbox_ln \
+        libtoolbox_mv \
+        libtoolbox_printenv \
+        libtoolbox_rm \
+        libtoolbox_rmdir \
+        libtoolbox_sleep \
+        libtoolbox_sync
 endif
 
+# 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))
+
 LOCAL_MODULE := toolbox_recovery
 LOCAL_MODULE_STEM := toolbox
 LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
-LOCAL_MODULE_TAGS := optional
+LOCAL_ADDITIONAL_DEPENDENCIES += $(LOCAL_PATH)/Android.mk
 
 # Including this will define $(intermediates).
 #
@@ -125,7 +160,7 @@
 $(LOCAL_PATH)/toolbox.c: $(intermediates)/tools.h
 
 TOOLS_H := $(intermediates)/tools.h
-$(TOOLS_H): PRIVATE_TOOLS := $(TOOLS)
+$(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): $(LOCAL_PATH)/Android.mk
 $(TOOLS_H):
@@ -133,7 +168,7 @@
 
 # Make #!/system/bin/toolbox launchers for each tool.
 #
-SYMLINKS := $(addprefix $(TARGET_RECOVERY_ROOT_OUT)/sbin/,$(TOOLS))
+SYMLINKS := $(addprefix $(TARGET_RECOVERY_ROOT_OUT)/sbin/,$(ALL_TOOLS))
 $(SYMLINKS): TOOLBOX_BINARY := $(LOCAL_MODULE_STEM)
 $(SYMLINKS): $(LOCAL_INSTALLED_MODULE) $(LOCAL_PATH)/Android.mk
 	@echo "Symlink: $@ -> $(TOOLBOX_BINARY)"
@@ -147,3 +182,8 @@
 LOCAL_ADDITIONAL_DEPENDENCIES := $(SYMLINKS)
 include $(BUILD_PHONY_PACKAGE)
 SYMLINKS :=
+
+# We need this so that the installed files could be picked up based on the
+# local module name
+ALL_MODULES.$(LOCAL_MODULE).INSTALLED := \
+    $(ALL_MODULES.$(LOCAL_MODULE).INSTALLED) $(SYMLINKS)