Implement vendor-available vold interface
Bug: 362567323
Test: mmm system/vold
Change-Id: I967faeb221741cbd8d6c13b25cd57c37fbb6e839
diff --git a/VendorVoldNativeService.cpp b/VendorVoldNativeService.cpp
new file mode 100644
index 0000000..6d13a14
--- /dev/null
+++ b/VendorVoldNativeService.cpp
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#include "VendorVoldNativeService.h"
+
+#include <mutex>
+
+#include <android-base/logging.h>
+#include <binder/IServiceManager.h>
+#include <private/android_filesystem_config.h>
+#include <utils/Trace.h>
+
+#include "Checkpoint.h"
+#include "VoldNativeServiceValidation.h"
+#include "VolumeManager.h"
+
+#define ENFORCE_SYSTEM_OR_ROOT \
+ { \
+ binder::Status status = CheckUidOrRoot(AID_SYSTEM); \
+ if (!status.isOk()) { \
+ return status; \
+ } \
+ }
+
+#define ACQUIRE_LOCK \
+ std::lock_guard<std::mutex> lock(VolumeManager::Instance()->getLock()); \
+ ATRACE_CALL();
+
+namespace android::vold {
+
+status_t VendorVoldNativeService::try_start() {
+ auto service_name = String16("android.system.vold.IVold/default");
+ if (!defaultServiceManager()->isDeclared(service_name)) {
+ LOG(DEBUG) << "Service for VendorVoldNativeService (" << service_name << ") not declared.";
+ return OK;
+ }
+ return defaultServiceManager()->addService(std::move(service_name),
+ new VendorVoldNativeService());
+}
+
+binder::Status VendorVoldNativeService::registerCheckpointListener(
+ const sp<android::system::vold::IVoldCheckpointListener>& listener,
+ android::system::vold::CheckpointingState* _aidl_return) {
+ ENFORCE_SYSTEM_OR_ROOT;
+ ACQUIRE_LOCK;
+
+ bool possible_checkpointing = cp_registerCheckpointListener(listener);
+ *_aidl_return = possible_checkpointing
+ ? android::system::vold::CheckpointingState::POSSIBLE_CHECKPOINTING
+ : android::system::vold::CheckpointingState::CHECKPOINTING_COMPLETE;
+ return binder::Status::ok();
+}
+
+} // namespace android::vold