#include <sys/types.h>
#include <time.h>
+#include <filesystem>
#include <memory>
#include <string>
#include <utility>
#include "lib/app_status/app_status_manager.hh"
#include "lib/launch/launch_context.hh"
+namespace {
+
+namespace fs = std::filesystem;
+
+std::string GetAppIdFromFile(pid_t pid, uid_t uid) {
+ std::string appid;
+ try {
+ fs::path path =
+ fs::path("/run/aul/apps") / std::to_string(uid) / std::to_string(pid);
+ for (const auto& entry : fs::directory_iterator(path)) {
+ if (entry.is_directory() || entry.path().filename().string()[0] == '.')
+ continue;
+
+ appid = entry.path().filename().string();
+ break;
+ }
+ } catch (const fs::filesystem_error& e) {
+ _E("Exception occurs. error(%s)", e.what());
+ }
+
+ return appid;
+}
+
+} // namespace
+
int _app_status_term_bg_apps(GCompareFunc func) {
return amd::AppStatusManager::GetInst().
TerminateBackgroundApps(func);
static int DispatchAppNotifyStart(request_h request) {
auto* req = static_cast<amd::Request*>(request);
pid_t pid = req->GetPID();
- auto handle = amd::AppStatusManager::GetInst().Find(pid);
+ auto& manager = amd::AppStatusManager::GetInst();
+ auto handle = manager.Find(pid);
+ if (handle == nullptr) {
+ uid_t uid = req->GetUID();
+ if (uid >= REGULAR_UID_MIN) {
+ std::string appid = GetAppIdFromFile(pid, uid);
+ _W("appid(%s), pid(%d), uid(%u)", appid.c_str(), pid, uid);
+ manager.RegisterPID(pid, appid, uid, pid);
+ handle = manager.Find(pid);
+ }
+ }
+
if (handle != nullptr && !handle->SocketExists()) {
handle->SetStarting(true);
handle->UnsetStartupTimer();
- amd::AppStatusManager::GetInst().UpdateAppStatusDAO(handle);
+ manager.UpdateAppStatusDAO(handle);
handle->SetSocketExists(true);
handle->SetRealPID(pid);
auto found = pid_map_.find(context->GetPid());
if (found != pid_map_.end()) {
auto& app_status = found->second;
- if (app_status->GetUID() == context->GetTargetUid())
+ if (app_status->GetUID() == context->GetTargetUid()) {
+ app_status->request_id_ = context->GetRequestId();
+ app_status->instance_id_ = context->GetInstanceId();
+ app_status->org_caller_pid_ = context->GetCallerPid();
+ app_status->SetBackgroundLaunch(context->IsBackgroundLaunch());
+ app_status->subapp_ = context->IsSubApp();
+ app_status->debug_mode_ = context->IsDebugMode();
return app_status;
+ }
Remove(app_status);
}