aboutsummaryrefslogtreecommitdiff
path: root/src/npassd/session.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/npassd/session.c')
-rw-r--r--src/npassd/session.c64
1 files changed, 56 insertions, 8 deletions
diff --git a/src/npassd/session.c b/src/npassd/session.c
index e674bb7..7190aec 100644
--- a/src/npassd/session.c
+++ b/src/npassd/session.c
@@ -11,6 +11,9 @@
static int handle_close(__attribute__((unused)) sd_bus_message *msg, void *data,
__attribute__((unused)) sd_bus_error *ret_error);
+static int handle_nameownerchanged(sd_bus_message *msg, void *data,
+ __attribute__((unused))
+ sd_bus_error *ret_error);
static const sd_bus_vtable session_vtable[] = {
SD_BUS_VTABLE_START(0),
@@ -19,6 +22,28 @@ static const sd_bus_vtable session_vtable[] = {
SD_BUS_VTABLE_END,
};
+static int handle_nameownerchanged(sd_bus_message *msg, void *data,
+ __attribute__((unused))
+ sd_bus_error *ret_error)
+{
+ struct session *session = data;
+ const char *name;
+ int ret;
+
+ ret = sd_bus_message_read(msg, "ss", NULL, &name);
+ if (ret < 0) {
+ print_err("%s", strerror(-ret));
+ return ret;
+ }
+
+ ret = strcmp(session->owner, name);
+ if (ret)
+ return 0;
+
+ session_free(session);
+ return 0;
+}
+
static int handle_close(__attribute__((unused)) sd_bus_message *msg, void *data,
__attribute__((unused)) sd_bus_error *ret_error)
{
@@ -28,7 +53,7 @@ static int handle_close(__attribute__((unused)) sd_bus_message *msg, void *data,
if (ret < 0)
print_err("Failed to free session: %s", strerror(-ret));
- return ret;
+ return sd_bus_reply_method_return(msg, "");
}
int session_slot_available(struct session *s, size_t n)
@@ -47,25 +72,48 @@ int session_slot_available(struct session *s, size_t n)
return -ENOMEM;
}
-int session_new(sd_bus *bus, struct session *session, unsigned session_no)
+int session_new(sd_bus *bus, struct session *session, unsigned session_no,
+ const char *owner)
{
int ret;
- snprintf(session->path, sizeof(session->path),
- DBUS_OBJECT_PATH "/session/%d", session_no);
+ ret = snprintf(session->path, sizeof(session->path),
+ DBUS_OBJECT_PATH "/session/%d", session_no);
+ if (ret < 0 || (size_t)ret > sizeof(session->path)) {
+ print_err("%s", "Failed to create session path");
+ return -ENOMEM;
+ }
+
+ ret = snprintf(session->owner, sizeof(session->owner), "%s", owner);
+ if (ret < 0 || (size_t)ret > sizeof(session->owner)) {
+ print_err("%s", "Failed to set session owner");
+ return -ENOMEM;
+ }
+
ret = sd_bus_add_object_vtable(bus, &session->slot, session->path,
SESSION_IFACE, session_vtable, session);
- if (ret < 0)
+ if (ret < 0) {
print_err("Failed to create session: %s", strerror(-ret));
- else
- session->isactive = true;
+ return ret;
+ }
+ session->isactive = true;
+
+ ret = sd_bus_match_signal(bus, NULL, "org.freedesktop.DBus",
+ "/org/freedesktop/DBus",
+ "org.freedesktop.DBus", "NameOwnerChanged",
+ handle_nameownerchanged, session);
+ if (ret < 0) {
+ session_free(session);
+ print_err("%s", strerror(-ret));
+ return ret;
+ }
return ret;
}
int session_free(struct session *s)
{
- if (!s->isactive)
+ if (s->isactive == false)
return -EINVAL;
s->isactive = false;