// Copyright (C) 2020 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#define LOG_TAG "netjniutils"

#include "netjniutils/netjniutils.h"

#include <dlfcn.h>
#include <stdbool.h>
#include <string.h>
#include <sys/system_properties.h>

#include <android/api-level.h>
#include <android/log.h>

namespace android {
namespace netjniutils {

namespace {

bool IsAtLeastS() {
  // TODO(b/158749603#comment19): move to android::modules::sdklevel::IsAtLeastS().
  int api_level = android_get_device_api_level();

  // Guarded check for branches that do not have __ANDROID_API_S__.
#ifdef __ANDROID_API_S__
  if (api_level >= __ANDROID_API_S__) {
    return true;
  }
#endif

  if (api_level < __ANDROID_API_R__) {
    return false;
  }

  // Device looks like R or above, check codename as it could be (S or above).
  static constexpr const char* kCodenameProperty = "ro.build.version.codename";
  char codename[PROP_VALUE_MAX] = { 0 };
  return (__system_property_get(kCodenameProperty, codename) > 0 &&
          codename[0] >= 'S' && codename[1] == '\0');
}

int GetNativeFileDescriptorWithoutNdk(JNIEnv* env, jobject javaFd) {
  // Prior to Android S, we need to find the descriptor field in the FileDescriptor class. The
  // symbol name has been stable in libcore, but is a private implementation detail.
  // Older libnativehelper_compat_c++ versions had a jniGetFdFromFileDescriptor method, but this
  // was removed in S to replace it with the NDK API in libnativehelper.
  // The code is copied here instead. This code can be removed once R is not supported anymore.
  static const jfieldID descriptorFieldID = [env]() -> jfieldID {
    jclass cls = env->FindClass("java/io/FileDescriptor");
    jfieldID fieldID = env->GetFieldID(cls, "descriptor", "I");
    env->DeleteLocalRef(cls);
    if (fieldID == nullptr) {
      __android_log_print(ANDROID_LOG_FATAL, LOG_TAG, "Failed to get descriptor field.");
    }
    return fieldID;
  }();

  return javaFd != nullptr ? env->GetIntField(javaFd, descriptorFieldID) : -1;
}

int GetNativeFileDescriptorWithNdk(JNIEnv* env, jobject javaFd) {
  // Since Android S, there is an NDK API to get a file descriptor present in libnativehelper.so.
  // libnativehelper is loaded into all processes by the zygote since the zygote uses it
  // to load the Android Runtime and is also a public library (because of the NDK API).
  typedef int (*ndkGetFD_t)(JNIEnv*, jobject);
  static const ndkGetFD_t ndkGetFD = []() -> ndkGetFD_t {
    void* handle = dlopen("libnativehelper.so", RTLD_NOLOAD | RTLD_NODELETE);
    auto ndkGetFD = reinterpret_cast<ndkGetFD_t>(dlsym(handle, "AFileDescriptor_getFD"));
    if (ndkGetFD == nullptr) {
      __android_log_print(ANDROID_LOG_FATAL, LOG_TAG,
                          "Failed to dlsym(AFileDescriptor_getFD): %s", dlerror());
      dlclose(handle);
    }
    return ndkGetFD;
  }();

  return javaFd != nullptr ? ndkGetFD(env, javaFd) : -1;
}

}  //  namespace

int GetNativeFileDescriptor(JNIEnv* env, jobject javaFd) {
  static const bool preferNdkFileDescriptorApi = []() -> bool { return IsAtLeastS(); }();
  if (preferNdkFileDescriptorApi) {
    return GetNativeFileDescriptorWithNdk(env, javaFd);
  } else {
    return GetNativeFileDescriptorWithoutNdk(env, javaFd);
  }
}

}  // namespace netjniutils
}  // namespace android
