#include <boost/filesystem/path.hpp>
+#include <glib.h>
#include <grp.h>
#include <gum/gum-user.h>
#include <gum/gum-user-service.h>
const int32_t kPWBufSize = sysconf(_SC_GETPW_R_SIZE_MAX);
const int32_t kGRBufSize = sysconf(_SC_GETGR_R_SIZE_MAX);
+const int kRetryMax = 5;
+const int kRetryDelay = 1000000 / 2;
+
}
namespace common_installer {
UserList GetUserList() {
- GumUserService* service =
- gum_user_service_create_sync((getuid() == 0) ? TRUE : FALSE);
gchar** user_type_strv = gum_user_type_to_strv(
GUM_USERTYPE_ADMIN | GUM_USERTYPE_GUEST | GUM_USERTYPE_NORMAL |
GUM_USERTYPE_SECURITY);
- GumUserList* gum_user_list =
- gum_user_service_get_user_list_sync(service, user_type_strv);
+ GumUserService* service = nullptr;
+ GumUserList* gum_user_list = nullptr;
+ int count = 0;
+ // FIXME: Temporary retry logic, this should be removed
+ while (count < kRetryMax) {
+ service = gum_user_service_create_sync((getuid() == 0) ? TRUE : FALSE);
+ if (service == nullptr) {
+ count++;
+ LOG(WARNING) << "Failed to create gum user service! ("
+ << count << "/" << kRetryMax << ")";
+ usleep(kRetryDelay);
+ continue;
+ }
+
+ gum_user_list =
+ gum_user_service_get_user_list_sync(service, user_type_strv);
+ if (gum_user_list == nullptr) {
+ g_object_unref(service);
+ count++;
+ LOG(WARNING) << "Failed to get gum user list! ("
+ << count << "/" << kRetryMax << ")";
+ usleep(kRetryDelay);
+ continue;
+ } else {
+ break;
+ }
+ };
UserList list;
for (GumUser* guser : GListRange<GumUser*>(gum_user_list)) {
uid_t uid;
}
g_strfreev(user_type_strv);
gum_user_service_list_free(gum_user_list);
+ g_object_unref(service);
return list;
}