Add strerrordesc_np() and strerrorname_np().

strerrordesc_np() isn't very useful (being just another name for
strerror()), but strerrorname_np() lets you get "ENOSYS" for ENOSYS,
which will make some of our test assertion messages clearer when we
switch over from strerror().

This also adds `%#m` formatting to all the relevant functions.

Test: treehugger
Change-Id: Icfe07a39a307d591c3f4f2a09d008dc021643062
diff --git a/libc/async_safe/async_safe_log.cpp b/libc/async_safe/async_safe_log.cpp
index 2bff616..451cb8c 100644
--- a/libc/async_safe/async_safe_log.cpp
+++ b/libc/async_safe/async_safe_log.cpp
@@ -361,7 +361,19 @@
       buffer[1] = 'x';
       format_integer(buffer + 2, sizeof(buffer) - 2, value, 'x');
     } else if (c == 'm') {
-      strerror_r(errno, buffer, sizeof(buffer));
+#if __ANDROID_API_LEVEL__ >= 35 // This library is used in mainline modules.
+      if (alternate) {
+        const char* name = strerrorname_np(errno);
+        if (name) {
+          strcpy(buffer, name);
+        } else {
+          format_integer(buffer, sizeof(buffer), errno, 'd');
+        }
+      } else
+#endif
+      {
+        strerror_r(errno, buffer, sizeof(buffer));
+      }
     } else if (tolower(c) == 'b' || c == 'd' || c == 'i' || c == 'o' || c == 'u' ||
                tolower(c) == 'x') {
       /* integers - first read value from stack */