29 #include <systemd/sd-login.h>
39 static void user_update_current_user(
void);
40 static void user_set_current_user (uid_t uid);
47 static gboolean user_watch_monitor_event_cb(GIOChannel *iochannel, GIOCondition cond, gpointer data);
48 static bool user_watch_connect (
void);
49 static void user_watch_disconnect (
void);
50 bool user_watch_init (
void);
51 void user_watch_stop (
void);
57 static sd_login_monitor *user_watch_monitor = NULL;
58 static guint user_change_watch_id = 0;
59 static uid_t user_current_uid = UID_UNKNOWN;
71 static void user_update_current_user(
void)
73 #ifdef SAILFISH_ACCESS_CONTROL
74 uid_t uid = UID_UNKNOWN;
75 sd_seat_get_active(
"seat0", 0, &uid);
76 user_set_current_user(uid);
78 user_set_current_user(0);
82 static void user_set_current_user(uid_t uid)
85 if ( user_current_uid != uid ) {
86 log_debug(
"user_current_uid: %d -> %d",
87 (
int)user_current_uid, (
int)uid);
88 user_current_uid = uid;
106 return user_current_uid;
111 static gboolean user_watch_monitor_event_cb(GIOChannel *iochannel G_GNUC_UNUSED, GIOCondition cond,
112 gpointer data G_GNUC_UNUSED)
114 LOG_REGISTER_CONTEXT;
117 if( cond & (G_IO_ERR | G_IO_HUP | G_IO_NVAL) ) {
118 log_crit(
"user watch hangup/error");
122 user_update_current_user();
124 sd_login_monitor_flush(user_watch_monitor);
128 user_change_watch_id = 0;
129 user_watch_disconnect();
130 return G_SOURCE_REMOVE;
132 return G_SOURCE_CONTINUE;
135 static bool user_watch_connect(
void)
137 LOG_REGISTER_CONTEXT;
139 bool success =
false;
140 GIOChannel *iochan = NULL;
142 if ( sd_login_monitor_new(
"uid", &user_watch_monitor) < 0 ) {
143 log_err(
"Failed to create login monitor\n");
147 user_update_current_user();
149 iochan = g_io_channel_unix_new(sd_login_monitor_get_fd(user_watch_monitor));
151 log_err(
"Failed to setup I/O channel for sd_login_monitor\n");
155 user_change_watch_id = g_io_add_watch(iochan,
156 G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL,
157 user_watch_monitor_event_cb,
159 if ( user_change_watch_id )
164 g_io_channel_unref(iochan);
166 user_watch_disconnect();
170 static void user_watch_disconnect(
void)
172 LOG_REGISTER_CONTEXT;
174 if ( user_change_watch_id ) {
175 g_source_remove(user_change_watch_id);
176 user_change_watch_id = 0;
178 if ( user_watch_monitor ) {
179 sd_login_monitor_unref(user_watch_monitor);
180 user_watch_monitor = NULL;
184 bool user_watch_init(
void)
186 LOG_REGISTER_CONTEXT;
188 return user_watch_connect();
191 void user_watch_stop(
void)
193 LOG_REGISTER_CONTEXT;
195 user_watch_disconnect();