1 From 96469b8ff2cd0e7dc77b7974c431f1dd97981356 Mon Sep 17 00:00:00 2001
2 From: Zhang zhengguang <zhengguang.zhang@intel.com>
3 Date: Sat, 11 Oct 2014 16:46:50 +0800
4 Subject: [PATCH 30/32] multi-user: Add multi-user support for auto connect
9 For wifi auto connect mechamnism, only when the user who owns the
10 wifi service login, the service is allowed to be auto connected.
12 Change-Id: I99135117facafda41532e0280c89194b27baac16
14 src/service.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
15 1 file changed, 62 insertions(+)
17 diff --git a/src/service.c b/src/service.c
18 index a1124ae..55cf02c 100644
28 #include <connman/storage.h>
29 #include <connman/setting.h>
30 @@ -379,6 +381,61 @@ connman_service_is_user_allowed(struct connman_service *service, uid_t uid)
34 +static GList *connman_service_get_login_users()
38 + GList *user_list = NULL;
42 + while ((utmp = getutxent()) != NULL) {
43 + if (utmp->ut_user != USER_ROOT && utmp->ut_type != USER_PROCESS)
46 + pwd = getpwnam(utmp->ut_user);
48 + if (!g_list_find(user_list, GUINT_TO_POINTER(pwd->pw_uid)))
49 + user_list = g_list_append(user_list,
50 + GUINT_TO_POINTER(pwd->pw_uid));
52 + DBG("User Name: %s, UID: %d", utmp->ut_user, pwd->pw_uid);
60 +static bool is_service_owner_user_login(struct connman_service *service)
62 + GList *list, *user_list;
65 + /* Here we only care about wifi service */
66 + if (service->type != CONNMAN_SERVICE_TYPE_WIFI)
69 + user_list = connman_service_get_login_users();
71 + DBG("service favorite user id is: %d", service->user.favorite_user);
73 + for (list = user_list; list; list = list->next) {
74 + uid_t uid = GPOINTER_TO_UINT(list->data);
76 + DBG("login user id is %d", uid);
78 + if (service->user.favorite_user == uid) {
84 + g_list_free(user_list);
89 int __connman_service_load_modifiable(struct connman_service *service)
92 @@ -3800,6 +3857,11 @@ static bool auto_connect_service(GList *services,
96 + if (!is_service_owner_user_login(service)) {
97 + DBG("favorite user not login, wifi auto connect denied");
101 DBG("service %p %s %s", service, service->name,
102 (preferred) ? "preferred" : reason2string(reason));