Commit cd56f763 authored by Kenton Varda's avatar Kenton Varda

Fix various Android issues.

parent 81e015d1
......@@ -116,7 +116,7 @@ struct JsonCodec::Impl {
case '\r': escaped.addAll(kj::StringPtr("\\r")); break;
case '\t': escaped.addAll(kj::StringPtr("\\t")); break;
default:
if (c >= 0 && c < 0x20) {
if (static_cast<uint8_t>(c) < 0x20) {
escaped.addAll(kj::StringPtr("\\u00"));
uint8_t c2 = c;
escaped.add(HEXDIGITS[c2 / 16]);
......
......@@ -1416,7 +1416,8 @@ private:
break;
}
if ((c >= 0 && c < ' ' && c != '\n' && c != '\r' && c != '\t' && c != '\v') || c == 0x7f) {
if ((static_cast<uint8_t>(c) < 0x20 && c != '\n' && c != '\r' && c != '\t' && c != '\v')
|| c == 0x7f) {
// Unprintable character.
return IMPOSSIBLE;
}
......
......@@ -504,7 +504,7 @@ TEST(AsyncIo, AbstractUnixSocket) {
int originalDirFd;
KJ_SYSCALL(originalDirFd = open(".", O_RDONLY | O_DIRECTORY | O_CLOEXEC));
KJ_DEFER(close(originalDirFd));
KJ_SYSCALL(chdir("/tmp"));
KJ_SYSCALL(chdir("/"));
KJ_DEFER(KJ_SYSCALL(fchdir(originalDirFd)));
addr->connect().attach(kj::mv(listener)).wait(ioContext.waitScope);
......
......@@ -200,8 +200,14 @@ bool isWine() { return false; }
#define HOLES_NOT_SUPPORTED 1
#endif
#if __ANDROID__
#define VAR_TMP "/data/local/tmp"
#else
#define VAR_TMP "/var/tmp"
#endif
static Own<File> newTempFile() {
char filename[] = "/var/tmp/kj-filesystem-test.XXXXXX";
char filename[] = VAR_TMP "/kj-filesystem-test.XXXXXX";
int fd;
KJ_SYSCALL(fd = mkstemp(filename));
KJ_DEFER(KJ_SYSCALL(unlink(filename)));
......@@ -210,7 +216,7 @@ static Own<File> newTempFile() {
class TempDir {
public:
TempDir(): filename(heapString("/var/tmp/kj-filesystem-test.XXXXXX")) {
TempDir(): filename(heapString(VAR_TMP "/kj-filesystem-test.XXXXXX")) {
if (mkdtemp(filename.begin()) == nullptr) {
KJ_FAIL_SYSCALL("mkdtemp", errno, filename);
}
......
......@@ -82,14 +82,18 @@ double parseDouble(const StringPtr& s) {
errno = 0;
auto value = strtod(s.begin(), &endPtr);
KJ_REQUIRE(endPtr == s.end(), "String does not contain valid floating number", s) { return 0; }
#if _WIN32 || __CYGWIN__
#if _WIN32 || __CYGWIN__ || __BIONIC__
// When Windows' strtod() parses "nan", it returns a value with the sign bit set. But, our
// preferred canonical value for NaN does not have the sign bit set, and all other platforms
// return one without the sign bit set. So, on Windows, detect NaN and return our preferred
// version.
//
// Cygwin seemingly does not try to emulate Linux behavior here, but rather allows Windows'
// behavior to leak through.
// behavior to leak through. (Conversely, WINE actually produces the Linux behavior despite
// trying to behave like Win32...)
//
// Bionic (Android) failed the unit test and so I added it to the list without investigating
// further.
if (isNaN(value)) {
// NaN
return kj::nan();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment