const char kSharedTrustedDir[] = "shared/trusted";
const char kSkelAppDir[] = "/etc/skel/apps_rw";
const char kLegacyAppDir[] = "/opt/usr/apps";
+const char kExternalStoragePrivilege[] =
+ "http://tizen.org/privilege/externalstorage.appdata";
const int32_t kPWBufSize = sysconf(_SC_GETPW_R_SIZE_MAX);
const int32_t kGRBufSize = sysconf(_SC_GETGR_R_SIZE_MAX);
return true;
}
+int PrivilegeCallback(const pkgmgrinfo_pkginfo_h handle, void* user_data) {
+ uid_t uid = (uid_t)user_data;
+ char* pkgid = nullptr;
+
+ int ret = pkgmgrinfo_pkginfo_get_pkgid(handle, &pkgid);
+ if (ret != PMINFO_R_OK)
+ return -1;
+ if (!PerformExternalDirectoryCreationForUser(uid, pkgid))
+ return -1;
+
+ return 0;
+}
+
+bool PerformExternalDirectoryCreationForAllPkgs(void) {
+ user_list list = GetUserList();
+ for (auto l : list) {
+ uid_t uid = std::get<0>(l);
+ pkgmgrinfo_pkginfo_filter_h filter_handle = nullptr;
+ int ret = pkgmgrinfo_pkginfo_filter_create(&filter_handle);
+ if (ret != PMINFO_R_OK)
+ return false;
+ ret = pkgmgrinfo_pkginfo_filter_add_string(filter_handle,
+ PMINFO_PKGINFO_PROP_PACKAGE_PRIVILEGE, kExternalStoragePrivilege);
+ if (ret != PMINFO_R_OK) {
+ pkgmgrinfo_pkginfo_filter_destroy(filter_handle);
+ return false;
+ }
+
+ ret = pkgmgrinfo_pkginfo_filter_foreach_pkginfo(filter_handle,
+ PrivilegeCallback, reinterpret_cast<void*>(uid));
+ if (ret != PMINFO_R_OK) {
+ LOG(DEBUG) << "Failed to create external directoy";
+ pkgmgrinfo_pkginfo_filter_destroy(filter_handle);
+ return false;
+ }
+ pkgmgrinfo_pkginfo_filter_destroy(filter_handle);
+ }
+
+ return true;
+}
+
bool PerformExternalDirectoryDeletionForAllUsers(const std::string& pkgid) {
user_list list = GetUserList();
for (auto l : list) {
bool PerformExternalDirectoryCreationForAllUsers(const std::string& pkgid);
/**
+ * \brief Find pkgs which has external storage privilege for each user and make
+ * directories in external storage (eg. SD card)
+ *
+ * \return true if succeed, false otherwise
+ *
+ */
+bool PerformExternalDirectoryCreationForAllPkgs(void);
+
+/**
* \brief Performs a removal of directories in external storage (eg. SD card)
* \param pkgid id of package
*
" </method>"
" <method name='DeleteLegacyDirs'>"
" <arg type='s' name='pkgid' direction='in'/>"
+ " <method name='CreateExternalDirsForAllPkgs'>"
" <arg type='b' name='result' direction='out'/>"
" </method>"
" </interface>"
UNUSED(interface_name);
UNUSED(user_data);
char* val;
- g_variant_get(parameters, "(s)", &val);
-
bool r = false;
- LOG(INFO) << "Incomming method call: " << method_name;
+ LOG(INFO) << "Incomming method call: " << method_name;
if (g_strcmp0(method_name, "CopyUserDirs") == 0) {
+ g_variant_get(parameters, "(&s)", &val);
r = ci::CopyUserDirectories(std::string(val));
} else if (g_strcmp0(method_name, "DeleteUserDirs") == 0) {
+ g_variant_get(parameters, "(&s)", &val);
r = ci::DeleteUserDirectories(std::string(val));
} else if (g_strcmp0(method_name, "CreateExternalDirs") == 0) {
+ g_variant_get(parameters, "(&s)", &val);
r = ci::PerformExternalDirectoryCreationForAllUsers(std::string(val));
} else if (g_strcmp0(method_name, "DeleteExternalDirs") == 0) {
+ g_variant_get(parameters, "(&s)", &val);
r = ci::PerformExternalDirectoryDeletionForAllUsers(std::string(val));
} else if (g_strcmp0(method_name, "CreateLegacyDirs") == 0) {
+ g_variant_get(parameters, "(&s)", &val);
r = ci::CreateLegacyDirectories(std::string(val));
} else if (g_strcmp0(method_name, "DeleteLegacyDirs") == 0) {
+ g_variant_get(parameters, "(&s)", &val);
int sender_uid = GetSenderUnixId(connection, sender);
if (sender_uid < 0) {
LOG(ERROR) << "Failed to get sender_uid: " << sender_uid;
} else {
r = ci::DeleteLegacyDirectories((uid_t)sender_uid, std::string(val));
}
+ } else if (g_strcmp0(method_name, "CreateExternalDirsForAllPkgs") == 0) {
+ r = ci::PerformExternalDirectoryCreationForAllPkgs();
} else {
LOG(ERROR) << "Unknown method call: " << method_name;
}