Merge changes I4b804906,I7550c3bc,I03dbaeed,Ie136b852,Iab14c0fb, ...

* changes:
  Merge remote-tracking branch 'toybox/master' into HEAD
  Factor out AF_UNIX socket openting, use FLAG() macros, xsocket() already does CLOEXEC (should fix macos build).
  find: support -printf \0 octal escapes and \c.
  Add instructions for doing install_flat by hand.
  ls: fix -Z, add a test.
  DIRTREE_STATLESS doesn't have to test 3 stat fields, it sets a flag
  Convenience script to build gcc+musl cross compiler toolchains for various targets using https://github.com/richfelker/musl-cross-make
  Update roadmap (what android is using out of pending).
diff --git a/Config.in b/Config.in
index 16a04f9..6758337 100644
--- a/Config.in
+++ b/Config.in
@@ -20,8 +20,10 @@
 
 	  --long	Show path to each command
 
-	  To install command symlinks, try:
+	  To install command symlinks with paths, try:
 	    for i in $(/bin/toybox --long); do ln -s /bin/toybox $i; done
+	  or all in one directory:
+	    for i in $(./toybox); do ln -s toybox $i; done; PATH=$PWD:$PATH
 
 	  Most toybox commands also understand the following arguments:
 
diff --git a/android/device/generated/help.h b/android/device/generated/help.h
index 9a89bff..162d219 100644
--- a/android/device/generated/help.h
+++ b/android/device/generated/help.h
@@ -32,7 +32,7 @@
 
 #define HELP_toybox_suid "Support for the Set User ID bit, to install toybox suid root and drop\npermissions for commands which do not require root access. To use\nthis change ownership of the file to the root user and set the suid\nbit in the file permissions:\n\nchown root:root toybox; chmod +s toybox\n\nprompt \"Security Blanket\"\ndefault TOYBOX_LSM_NONE\nhelp\nSelect a Linux Security Module to complicate your system\nuntil you can't find holes in it."
 
-#define HELP_toybox "usage: toybox [--long | --help | --version | [command] [arguments...]]\n\nWith no arguments, shows available commands. First argument is\nname of a command to run, followed by any arguments to that command.\n\n--long	Show path to each command\n\nTo install command symlinks, try:\n  for i in $(/bin/toybox --long); do ln -s /bin/toybox $i; done\n\nMost toybox commands also understand the following arguments:\n\n--help		Show command help (only)\n--version	Show toybox version (only)\n\nThe filename \"-\" means stdin/stdout, and \"--\" stops argument parsing.\n\nNumerical arguments accept a single letter suffix for\nkilo, mega, giga, tera, peta, and exabytes, plus an additional\n\"d\" to indicate decimal 1000's instead of 1024.\n\nDurations can be decimal fractions and accept minute (\"m\"), hour (\"h\"),\nor day (\"d\") suffixes (so 0.1m = 6s)."
+#define HELP_toybox "usage: toybox [--long | --help | --version | [command] [arguments...]]\n\nWith no arguments, shows available commands. First argument is\nname of a command to run, followed by any arguments to that command.\n\n--long	Show path to each command\n\nTo install command symlinks with paths, try:\n  for i in $(/bin/toybox --long); do ln -s /bin/toybox $i; done\nor all in one directory:\n  for i in $(./toybox); do ln -s toybox $i; done; PATH=$PWD:$PATH\n\nMost toybox commands also understand the following arguments:\n\n--help		Show command help (only)\n--version	Show toybox version (only)\n\nThe filename \"-\" means stdin/stdout, and \"--\" stops argument parsing.\n\nNumerical arguments accept a single letter suffix for\nkilo, mega, giga, tera, peta, and exabytes, plus an additional\n\"d\" to indicate decimal 1000's instead of 1024.\n\nDurations can be decimal fractions and accept minute (\"m\"), hour (\"h\"),\nor day (\"d\") suffixes (so 0.1m = 6s)."
 
 #define HELP_setenforce "usage: setenforce [enforcing|permissive|1|0]\n\nSets whether SELinux is enforcing (1) or permissive (0)."
 
diff --git a/android/linux/generated/help.h b/android/linux/generated/help.h
index c2a6088..642ece4 100644
--- a/android/linux/generated/help.h
+++ b/android/linux/generated/help.h
@@ -32,7 +32,7 @@
 
 #define HELP_toybox_suid "Support for the Set User ID bit, to install toybox suid root and drop\npermissions for commands which do not require root access. To use\nthis change ownership of the file to the root user and set the suid\nbit in the file permissions:\n\nchown root:root toybox; chmod +s toybox\n\nprompt \"Security Blanket\"\ndefault TOYBOX_LSM_NONE\nhelp\nSelect a Linux Security Module to complicate your system\nuntil you can't find holes in it."
 
-#define HELP_toybox "usage: toybox [--long | --help | --version | [command] [arguments...]]\n\nWith no arguments, shows available commands. First argument is\nname of a command to run, followed by any arguments to that command.\n\n--long	Show path to each command\n\nTo install command symlinks, try:\n  for i in $(/bin/toybox --long); do ln -s /bin/toybox $i; done\n\nMost toybox commands also understand the following arguments:\n\n--help		Show command help (only)\n--version	Show toybox version (only)\n\nThe filename \"-\" means stdin/stdout, and \"--\" stops argument parsing.\n\nNumerical arguments accept a single letter suffix for\nkilo, mega, giga, tera, peta, and exabytes, plus an additional\n\"d\" to indicate decimal 1000's instead of 1024.\n\nDurations can be decimal fractions and accept minute (\"m\"), hour (\"h\"),\nor day (\"d\") suffixes (so 0.1m = 6s)."
+#define HELP_toybox "usage: toybox [--long | --help | --version | [command] [arguments...]]\n\nWith no arguments, shows available commands. First argument is\nname of a command to run, followed by any arguments to that command.\n\n--long	Show path to each command\n\nTo install command symlinks with paths, try:\n  for i in $(/bin/toybox --long); do ln -s /bin/toybox $i; done\nor all in one directory:\n  for i in $(./toybox); do ln -s toybox $i; done; PATH=$PWD:$PATH\n\nMost toybox commands also understand the following arguments:\n\n--help		Show command help (only)\n--version	Show toybox version (only)\n\nThe filename \"-\" means stdin/stdout, and \"--\" stops argument parsing.\n\nNumerical arguments accept a single letter suffix for\nkilo, mega, giga, tera, peta, and exabytes, plus an additional\n\"d\" to indicate decimal 1000's instead of 1024.\n\nDurations can be decimal fractions and accept minute (\"m\"), hour (\"h\"),\nor day (\"d\") suffixes (so 0.1m = 6s)."
 
 #define HELP_setenforce "usage: setenforce [enforcing|permissive|1|0]\n\nSets whether SELinux is enforcing (1) or permissive (0)."
 
diff --git a/android/mac/generated/help.h b/android/mac/generated/help.h
index c2a6088..642ece4 100644
--- a/android/mac/generated/help.h
+++ b/android/mac/generated/help.h
@@ -32,7 +32,7 @@
 
 #define HELP_toybox_suid "Support for the Set User ID bit, to install toybox suid root and drop\npermissions for commands which do not require root access. To use\nthis change ownership of the file to the root user and set the suid\nbit in the file permissions:\n\nchown root:root toybox; chmod +s toybox\n\nprompt \"Security Blanket\"\ndefault TOYBOX_LSM_NONE\nhelp\nSelect a Linux Security Module to complicate your system\nuntil you can't find holes in it."
 
-#define HELP_toybox "usage: toybox [--long | --help | --version | [command] [arguments...]]\n\nWith no arguments, shows available commands. First argument is\nname of a command to run, followed by any arguments to that command.\n\n--long	Show path to each command\n\nTo install command symlinks, try:\n  for i in $(/bin/toybox --long); do ln -s /bin/toybox $i; done\n\nMost toybox commands also understand the following arguments:\n\n--help		Show command help (only)\n--version	Show toybox version (only)\n\nThe filename \"-\" means stdin/stdout, and \"--\" stops argument parsing.\n\nNumerical arguments accept a single letter suffix for\nkilo, mega, giga, tera, peta, and exabytes, plus an additional\n\"d\" to indicate decimal 1000's instead of 1024.\n\nDurations can be decimal fractions and accept minute (\"m\"), hour (\"h\"),\nor day (\"d\") suffixes (so 0.1m = 6s)."
+#define HELP_toybox "usage: toybox [--long | --help | --version | [command] [arguments...]]\n\nWith no arguments, shows available commands. First argument is\nname of a command to run, followed by any arguments to that command.\n\n--long	Show path to each command\n\nTo install command symlinks with paths, try:\n  for i in $(/bin/toybox --long); do ln -s /bin/toybox $i; done\nor all in one directory:\n  for i in $(./toybox); do ln -s toybox $i; done; PATH=$PWD:$PATH\n\nMost toybox commands also understand the following arguments:\n\n--help		Show command help (only)\n--version	Show toybox version (only)\n\nThe filename \"-\" means stdin/stdout, and \"--\" stops argument parsing.\n\nNumerical arguments accept a single letter suffix for\nkilo, mega, giga, tera, peta, and exabytes, plus an additional\n\"d\" to indicate decimal 1000's instead of 1024.\n\nDurations can be decimal fractions and accept minute (\"m\"), hour (\"h\"),\nor day (\"d\") suffixes (so 0.1m = 6s)."
 
 #define HELP_setenforce "usage: setenforce [enforcing|permissive|1|0]\n\nSets whether SELinux is enforcing (1) or permissive (0)."
 
diff --git a/scripts/mcm-buildall.sh b/scripts/mcm-buildall.sh
new file mode 100755
index 0000000..7197f8d
--- /dev/null
+++ b/scripts/mcm-buildall.sh
@@ -0,0 +1,151 @@
+#!/bin/bash
+
+# Script to build all supported cross and native compilers using
+# https://github.com/richfelker/musl-cross-make
+# (Check that out and run this script in that directory.)
+
+# This isn't directly used by toybox, but is useful for testing.
+
+# All toolchains after the first are themselves cross compiled (so they
+# can be statically linked against musl on the host, for binary portability.)
+# static i686 binaries are basically "poor man's x32".
+BOOTSTRAP=i686-linux-musl
+
+[ -z "$OUTPUT" ] && OUTPUT="$PWD/ccc"
+
+if [ "$1" == clean ]
+then
+  rm -rf "$OUTPUT" host-* *.log
+  make clean
+  exit
+fi
+
+make_toolchain()
+{
+  # Set cross compiler path
+  LP="$PATH"
+  if [ -z "$TYPE" ]
+  then
+    OUTPUT="$PWD/host-$TARGET"
+    EXTRASUB=y
+  else
+    if [ "$TYPE" == static ]
+    then
+      HOST=$BOOTSTRAP
+      [ "$TARGET" = "$HOST" ] && LP="$PWD/host-$HOST/bin:$LP"
+      TYPE=cross
+      EXTRASUB=y
+      LP="$OUTPUT/$HOST-cross/bin:$LP"
+    else
+      HOST="$TARGET"
+      export NATIVE=y
+      LP="$OUTPUT/${RENAME:-$TARGET}-cross/bin:$LP"
+    fi
+    COMMON_CONFIG="CC=\"$HOST-gcc -static --static\" CXX=\"$HOST-g++ -static --static\""
+    export -n HOST
+    OUTPUT="$OUTPUT/${RENAME:-$TARGET}-$TYPE"
+  fi
+
+  if [ -e "$OUTPUT.sqf" ] || [ -e "$OUTPUT/bin/$TARGET-ld" ] ||
+     [ -e "$OUTPUT/bin/ld" ]
+  then
+    return
+  fi
+
+  # Change title bar to say what we're currently building
+
+  echo === building $TARGET-$TYPE
+  echo -en "\033]2;$TARGET-$TYPE\007"
+
+  rm -rf build/"$TARGET" "$OUTPUT" &&
+  if [ -z "$CPUS" ]
+  then
+    CPUS="$(nproc)"
+    [ "$CPUS" != 1 ] && CPUS=$(($CPUS+1))
+  fi
+  set -x &&
+  PATH="$LP" make OUTPUT="$OUTPUT" TARGET="$TARGET" \
+    GCC_CONFIG="--disable-nls --disable-libquadmath --disable-decimal-float --disable-multilib --enable-languages=c,c++ $GCC_CONFIG" \
+    COMMON_CONFIG="CFLAGS=\"$CFLAGS -g0 -Os\" CXXFLAGS=\"$CXXFLAGS -g0 -Os\" LDFLAGS=\"$LDFLAGS -s\" $COMMON_CONFIG" \
+    install -j$CPUS || exit 1
+  set +x
+  echo -e '#ifndef __MUSL__\n#define __MUSL__ 1\n#endif' \
+    >> "$OUTPUT/${EXTRASUB:+$TARGET/}include/features.h"
+
+  if [ ! -z "$RENAME" ] && [ "$TYPE" == cross ]
+  then
+    CONTEXT="output/$RENAME-cross/bin"
+    for i in "$CONTEXT/$TARGET-"*
+    do
+      X="$(echo $i | sed "s@.*/$TARGET-\([^-]*\)@\1@")"
+      ln -sf "$TARGET-$X" "$CONTEXT/$RENAME-$X"
+    done
+  fi
+
+  # Prevent cross compiler reusing dynamically linked host build files for
+  # $BOOTSTRAP arch
+  [ -z "$TYPE" ] && make clean
+
+  if [ "$TYPE" == native ]
+  then
+    # gcc looks in "../usr/include" but not "/bin/../include" (relative to the
+    # executable). That means /usr/bin/gcc looks in /usr/usr/include, so that's
+    # not a fix either. So add a NOP symlink as a workaround for The Crazy.
+    ln -s . "$OUTPUT/usr" || exit 1
+    [ ! -z "$(which mksquashfs 2>/dev/null)" ] &&
+      mksquashfs "$OUTPUT" "$OUTPUT.sqf" -all-root &&
+      [ -z "$CLEANUP" ] && rm -rf "$OUTPUT"
+  fi
+}
+
+# Expand compressed target into binutils/gcc "tuple" and call make_toolchain
+make_tuple()
+{
+  PART1=${1/:*/}
+  PART3=${1/*:/}
+  PART2=${1:$((${#PART1}+1)):$((${#1}-${#PART3}-${#PART1}-2))}
+
+  # Do we need to rename this toolchain after building it?
+  RENAME=${PART1/*@/}
+  [ "$RENAME" == "$PART1" ] && RENAME=
+  PART1=${PART1/@*/}
+  TARGET=${PART1}-linux-musl${PART2} 
+
+  [ -z "$NOCLEAN" ] && rm -rf build
+
+  for TYPE in static native
+  do
+    TYPE=$TYPE TARGET=$TARGET GCC_CONFIG="$PART3" RENAME="$RENAME" \
+      make_toolchain 2>&1 | tee "$OUTPUT"/log/${RENAME:-$PART1}-${TYPE}.log
+  done
+}
+
+mkdir -p "$OUTPUT"/log
+
+# Make bootstrap compiler (no $TYPE, dynamically linked against host libc)
+# We build the rest of the cross compilers with this so they're linked against
+# musl-libc, because glibc doesn't fully support static linking and dynamic
+# binaries aren't really portable between distributions
+TARGET=$BOOTSTRAP make_toolchain 2>&1 | tee -a "$OUTPUT/log/$BOOTSTRAP"-host.log
+
+if [ $# -gt 0 ]
+then
+  for i in "$@"
+  do
+    make_tuple "$i"
+  done
+else
+  # First target builds a proper version of the $BOOTSTRAP compiler above,
+  # used to build the rest (which are in alphabetical order)
+  for i in i686:: \
+         aarch64:eabi: armv4l:eabihf:"--with-arch=armv5t --with-float=soft" \
+         armv5l:eabihf:--with-arch=armv5t armv7l:eabihf:--with-arch=armv7-a \
+         "armv7m:eabi:--with-arch=armv7-m --with-mode=thumb --disable-libatomic --enable-default-pie" \
+         armv7r:eabihf:"--with-arch=armv7-r --enable-default-pie" \
+         i486:: m68k:: microblaze:: mips:: mips64:: mipsel:: powerpc:: \
+         powerpc64:: powerpc64le:: s390x:: sh2eb:fdpic:--with-cpu=mj2 \
+         sh4::--enable-incomplete-targets x86_64:: x86_64@x32:x32:
+  do
+    make_tuple "$i"
+  done
+fi
diff --git a/tests/find.test b/tests/find.test
index 1f59149..9129a60 100755
--- a/tests/find.test
+++ b/tests/find.test
@@ -101,6 +101,13 @@
 testing "-printf" "find dir -name file -printf '%f %p %P %s'" \
   "file dir/file file 0" "" ""
 testing "-printf .N" "find dir -name file -printf %.2f" "fi" "" ""
+# findutils find supports C letter escapes and \0 octal, but not \x or \u.
+testing "-printf escapes" \
+  "find dir -name file -printf '\0 \007 \t \079' | xxd -p" \
+  "0020072009200739\n" "" ""
+# findutils find treats \c as "no more output from this -printf", not "no more
+# output from find".
+testing "-printf \\c escape" "find dir -name f* -printf 'x\cy'" "xx" "" ""
 
 # No error message for a dangling link.
 ln -s does-not-exist dir/dangler
diff --git a/toys/net/netcat.c b/toys/net/netcat.c
index 0a235d1..1729bd5 100644
--- a/toys/net/netcat.c
+++ b/toys/net/netcat.c
@@ -71,10 +71,30 @@
   alarm(seconds);
 }
 
+// open AF_UNIX socket
+static int usock(char *name, int type, int out)
+{
+  int sockfd;
+  struct sockaddr_un sockaddr;
+
+  memset(&sockaddr, 0, sizeof(struct sockaddr_un));
+
+  if (strlen(name) + 1 > sizeof(sockaddr.sun_path))
+    error_exit("socket path too long %s", name);
+  strcpy(sockaddr.sun_path, name);
+  sockaddr.sun_family = AF_UNIX;
+
+  sockfd = xsocket(AF_UNIX, type, 0);
+  (out?xconnect:xbind)(sockfd, (struct sockaddr*)&sockaddr, sizeof(sockaddr));
+
+  return sockfd;
+}
+ 
+
 void netcat_main(void)
 {
-  int sockfd = -1, in1 = 0, in2 = 0, out1 = 1, out2 = 1;
-  int family = AF_UNSPEC, type = SOCK_STREAM;
+  int sockfd = -1, in1 = 0, in2 = 0, out1 = 1, out2 = 1, family = AF_UNSPEC,
+    ll = FLAG(L)|FLAG(l), type = FLAG(u) ? SOCK_DGRAM : SOCK_STREAM;
   pid_t child;
 
   // Addjust idle and quit_delay to ms or -1 for no timeout
@@ -85,68 +105,37 @@
 
   // The argument parsing logic can't make "<2" conditional on other
   // arguments like -f and -l, so do it by hand here.
-  if ((toys.optflags&FLAG_f) ? toys.optc :
-      (!(toys.optflags&(FLAG_l|FLAG_L)) &&
-       toys.optc!=(toys.optflags&FLAG_U?1:2)))
-        help_exit("bad argument count");
+  if (FLAG(f) ? toys.optc : (!ll && toys.optc!=(FLAG(U)?1:2)))
+    help_exit("bad argument count");
 
-  if (toys.optflags&FLAG_4) family = AF_INET;
-  else if (toys.optflags&FLAG_6) family = AF_INET6;
-  else if (toys.optflags&FLAG_U) family = AF_UNIX;
-
-  if (toys.optflags&FLAG_u) type = SOCK_DGRAM;
+  if (FLAG(4)) family = AF_INET;
+  else if (FLAG(6)) family = AF_INET6;
+  else if (FLAG(U)) family = AF_UNIX;
 
   if (TT.f) in1 = out2 = xopen(TT.f, O_RDWR);
   else {
     // Setup socket
-    if (!(toys.optflags&(FLAG_L|FLAG_l))) {
-      if (toys.optflags&FLAG_U) {
-        struct sockaddr_un sockaddr;
-
-        memset(&sockaddr, 0, sizeof(struct sockaddr_un));
-
-        if (strlen(toys.optargs[0]) + 1 > sizeof(sockaddr.sun_path))
-          error_exit("socket path too long %s", toys.optargs[0]);
-        strcpy(sockaddr.sun_path, toys.optargs[0]);
-        sockaddr.sun_family = AF_UNIX;
-
-        sockfd = xsocket(AF_UNIX, type | SOCK_CLOEXEC, 0);
-        xconnect(sockfd, (struct sockaddr*)&sockaddr, sizeof(sockaddr));
-      } else {
-        sockfd = xconnectany(xgetaddrinfo(toys.optargs[0], toys.optargs[1],
+    if (!ll) {
+      if (FLAG(U)) sockfd = usock(toys.optargs[0], type, 1);
+      else sockfd = xconnectany(xgetaddrinfo(toys.optargs[0], toys.optargs[1],
                                           family, type, 0, 0));
-      }
 
-      // We have a connection. Disarm timeout.
+      // We have a connection. Disarm timeout and start poll/send loop.
       set_alarm(0);
-
       in1 = out2 = sockfd;
-
       pollinate(in1, in2, out1, out2, TT.W, TT.q);
     } else {
       // Listen for incoming connections
-      if (toys.optflags&FLAG_U) {
-        struct sockaddr_un sockaddr;
-
-        memset(&sockaddr, 0, sizeof(struct sockaddr_un));
-
-        if (!(toys.optflags&FLAG_s))
-          error_exit("-s must be provided if using -U with -L/-l");
-
-        if (strlen(TT.s) + 1 > sizeof(sockaddr.sun_path))
-          error_exit("socket path too long %s", TT.s);
-        strcpy(sockaddr.sun_path, TT.s);
-        sockaddr.sun_family = AF_UNIX;
-
-        sockfd = xsocket(AF_UNIX, type | SOCK_CLOEXEC, 0);
-        xbind(sockfd, (struct sockaddr*)&sockaddr, sizeof(sockaddr));
+      if (FLAG(U)) {
+        if (!FLAG(s)) error_exit("-s must be provided if using -U with -L/-l");
+        sockfd = usock(TT.s, type, 0);
       } else {
         sprintf(toybuf, "%ld", TT.p);
         sockfd = xbindany(xgetaddrinfo(TT.s, toybuf, family, type, 0, 0));
       }
 
       if (listen(sockfd, 5)) error_exit("listen");
-      if (!TT.p && !(toys.optflags&FLAG_U)) {
+      if (!TT.p && !FLAG(U)) {
         struct sockaddr* address = (void*)toybuf;
         socklen_t len = sizeof(struct sockaddr_storage);
         short port_be;
@@ -156,11 +145,9 @@
           port_be = ((struct sockaddr_in*)address)->sin_port;
         else if (address->sa_family == AF_INET6)
           port_be = ((struct sockaddr_in6*)address)->sin6_port;
-        else
-          perror_exit("getsockname: bad family");
+        else perror_exit("getsockname: bad family");
 
-        printf("%d\n", SWAP_BE16(port_be));
-        fflush(stdout);
+        dprintf(1, "%d\n", SWAP_BE16(port_be));
         // Return immediately if no -p and -Ll has arguments, so wrapper
         // script can use port number.
         if (CFG_TOYBOX_FORK && toys.optc && xfork()) goto cleanup;
@@ -168,7 +155,7 @@
 
       do {
         child = 0;
-        in1 = out2 = accept(sockfd, NULL, NULL);
+        in1 = out2 = accept(sockfd, 0, 0);
         if (in1<0) perror_exit("accept");
 
         // We have a connection. Disarm timeout.
@@ -184,21 +171,23 @@
 
           // Do we need to fork and/or redirect for exec?
 
-          if (toys.optflags&FLAG_L) NOEXIT(child = XVFORK());
+// TODO xpopen_both() here?
+
+          if (FLAG(L)) NOEXIT(child = XVFORK());
           if (child) {
             close(in1);
             continue;
           }
           dup2(in1, 0);
           dup2(in1, 1);
-          if (toys.optflags&FLAG_L) dup2(in1, 2);
+          if (FLAG(L)) dup2(in1, 2);
           if (in1>2) close(in1);
           xexec(toys.optargs);
         }
 
         pollinate(in1, in2, out1, out2, TT.W, TT.q);
         close(in1);
-      } while (!(toys.optflags&FLAG_l));
+      } while (!FLAG(l));
     }
   }
 
diff --git a/toys/posix/find.c b/toys/posix/find.c
index 02fdf3c..64270c0 100644
--- a/toys/posix/find.c
+++ b/toys/posix/find.c
@@ -217,7 +217,7 @@
   // skip . and .. below topdir, handle -xdev and -depth
   if (new) {
     // Handle stat failures first.
-    if (!new->st.st_blksize && !new->st.st_dev && !new->st.st_ino) {
+    if (new->again&2) {
       if (!new->parent || errno != ENOENT) {
         perror_msg("'%s'", s = dirtree_path(new, 0));
         free(s);
@@ -569,7 +569,15 @@
         if (check) for (fmt = ss[1]; *fmt; fmt++) {
           // Print the parts that aren't escapes
           if (*fmt == '\\') {
-            if (!(ch = unescape(*++fmt))) error_exit("bad \\%c", *fmt);
+            int slash = *++fmt, n = unescape(slash);
+
+            if (n) ch = n;
+            else if (slash=='c') break;
+            else if (slash=='0') {
+              ch = 0;
+              while (*fmt>='0' && *fmt<='7' && n++<3) ch=(ch*8)+*(fmt++)-'0';
+              --fmt;
+            } else error_exit("bad \\%c", *fmt);
             putchar(ch);
           } else if (*fmt != '%') putchar(*fmt);
           else if (*++fmt == '%') putchar('%');
diff --git a/toys/posix/ls.c b/toys/posix/ls.c
index 8b9cfe1..148beb0 100644
--- a/toys/posix/ls.c
+++ b/toys/posix/ls.c
@@ -585,7 +585,7 @@
 
     // note: double_list->prev temporarily goes in dirtree->parent
     if (dt) {
-      if (!dt->st.st_blksize && !dt->st.st_dev && !dt->st.st_ino) {
+      if (dt->again&2) {
         perror_msg_raw(*s);
         free(dt);
       } else dlist_add_nomalloc((void *)&TT.files->child, (void *)dt);
diff --git a/www/roadmap.html b/www/roadmap.html
index 9c284db..c06f897 100755
--- a/www/roadmap.html
+++ b/www/roadmap.html
@@ -346,11 +346,10 @@
 </b></blockquote>
 
 <p>Update: Android.mk is currently building the following toybox files out
-of "pending". These should be a priority for cleanup (ones marked with *
-don't have a symlink, so they're a lot less visible):</p>
+of "pending". These should be a priority for cleanup:</p>
 
 <blockquote><b>
-chrt dd expr getfattr* lsof modprobe more setfattr* tar tr traceroute
+bc dd diff expr lsof tr getfattr modprobe more traceroute
 </b></blockquote>
 
 <p>Android wishlist:</p>