diff --git a/src/posix/platform/daemon.cpp b/src/posix/platform/daemon.cpp index bf905992c..245ad480b 100644 --- a/src/posix/platform/daemon.cpp +++ b/src/posix/platform/daemon.cpp @@ -28,6 +28,9 @@ #include "posix/platform/daemon.hpp" +#if defined(__ANDROID__) && !OPENTHREAD_CONFIG_ANDROID_NDK_ENABLE +#include +#endif #include #include #include @@ -169,10 +172,28 @@ exit: } } -void Daemon::SetUp(void) +#if defined(__ANDROID__) && !OPENTHREAD_CONFIG_ANDROID_NDK_ENABLE +void Daemon::createListenSocketOrDie(void) +{ + Filename socketFile; + + // Don't use OPENTHREAD_POSIX_DAEMON_SOCKET_NAME because android_get_control_socket + // below already assumes parent /dev/socket dir + GetFilename(socketFile, "ot-daemon/%s.sock"); + + // This returns the init-managed stream socket which is already bind to + // /dev/socket/ot-daemon/.sock + mListenSocket = android_get_control_socket(socketFile); + if (mListenSocket == -1) + { + DieNowWithMessage("android_get_control_socket", OT_EXIT_ERROR_ERRNO); + } +} +#else +void Daemon::createListenSocketOrDie(void) { struct sockaddr_un sockname; - int ret; + int ret; class AllowAllGuard { @@ -180,7 +201,7 @@ void Daemon::SetUp(void) AllowAllGuard(void) { const char *allowAll = getenv("OT_DAEMON_ALLOW_ALL"); - mAllowAll = (allowAll != nullptr && strcmp("1", allowAll) == 0); + mAllowAll = (allowAll != nullptr && strcmp("1", allowAll) == 0); if (mAllowAll) { @@ -196,13 +217,10 @@ void Daemon::SetUp(void) } private: - bool mAllowAll = false; - mode_t mMode = 0; + bool mAllowAll = false; + mode_t mMode = 0; }; - // This allows implementing pseudo reset. - VerifyOrExit(mListenSocket == -1); - mListenSocket = SocketWithCloseExec(AF_UNIX, SOCK_STREAM, 0, kSocketNonBlock); if (mListenSocket == -1) @@ -246,6 +264,16 @@ void Daemon::SetUp(void) { DieNowWithMessage("bind", OT_EXIT_ERROR_ERRNO); } +} +#endif // defined(__ANDROID__) && !OPENTHREAD_CONFIG_ANDROID_NDK_ENABLE + +void Daemon::SetUp(void) +{ + int ret; + + // This allows implementing pseudo reset. + VerifyOrExit(mListenSocket == -1); + createListenSocketOrDie(); // // only accept 1 connection. @@ -281,6 +309,8 @@ void Daemon::TearDown(void) mSessionSocket = -1; } +#if !defined(__ANDROID__) || OPENTHREAD_CONFIG_ANDROID_NDK_ENABLE + // The `mListenSocket` is managed by `init` on Android if (mListenSocket != -1) { close(mListenSocket); @@ -302,6 +332,7 @@ void Daemon::TearDown(void) close(mDaemonLock); mDaemonLock = -1; } +#endif } void Daemon::Update(otSysMainloopContext &aContext) diff --git a/src/posix/platform/daemon.hpp b/src/posix/platform/daemon.hpp index 4fdd3b3f8..deba85b43 100644 --- a/src/posix/platform/daemon.hpp +++ b/src/posix/platform/daemon.hpp @@ -49,6 +49,7 @@ public: private: int OutputFormat(const char *aFormat, ...); int OutputFormatV(const char *aFormat, va_list aArguments); + void createListenSocketOrDie(void); void InitializeSessionSocket(void); int mListenSocket = -1;