chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
5a884f9
)
bus: wrap KDBUS_CMD_BYEBYE with a high-level call sd_bus_try_close()
author
Lennart Poettering
<lennart@poettering.net>
Fri, 20 Dec 2013 22:25:43 +0000
(23:25 +0100)
committer
Lennart Poettering
<lennart@poettering.net>
Fri, 20 Dec 2013 22:26:11 +0000
(23:26 +0100)
src/libsystemd-bus/bus-kernel.c
patch
|
blob
|
history
src/libsystemd-bus/bus-kernel.h
patch
|
blob
|
history
src/libsystemd-bus/libsystemd-bus.sym
patch
|
blob
|
history
src/libsystemd-bus/sd-bus.c
patch
|
blob
|
history
src/libsystemd-bus/test-bus-kernel.c
patch
|
blob
|
history
src/systemd/sd-bus.h
patch
|
blob
|
history
diff --git
a/src/libsystemd-bus/bus-kernel.c
b/src/libsystemd-bus/bus-kernel.c
index 369eac468b21454a68e141e92042b8b874cd5467..2802187e70aa44e71bf718d2a7d0f7cc2e484399 100644
(file)
--- a/
src/libsystemd-bus/bus-kernel.c
+++ b/
src/libsystemd-bus/bus-kernel.c
@@
-1266,3
+1266,13
@@
int bus_kernel_create_monitor(const char *bus) {
return fd;
}
return fd;
}
+
+int bus_kernel_try_close(sd_bus *bus) {
+ assert(bus);
+ assert(bus->is_kernel);
+
+ if (ioctl(bus->input_fd, KDBUS_CMD_BYEBYE) < 0)
+ return -errno;
+
+ return 0;
+}
diff --git
a/src/libsystemd-bus/bus-kernel.h
b/src/libsystemd-bus/bus-kernel.h
index 0a825d7b8eab08768947a2eff77d773460e9b43d..67690f8dee1012440eeedf4cebb65da4d7e07874 100644
(file)
--- a/
src/libsystemd-bus/bus-kernel.h
+++ b/
src/libsystemd-bus/bus-kernel.h
@@
-75,3
+75,5
@@
int bus_kernel_parse_unique_name(const char *s, uint64_t *id);
int kdbus_translate_request_name_flags(uint64_t sd_bus_flags, uint64_t *kdbus_flags);
int kdbus_translate_attach_flags(uint64_t sd_bus_flags, uint64_t *kdbus_flags);
int kdbus_translate_request_name_flags(uint64_t sd_bus_flags, uint64_t *kdbus_flags);
int kdbus_translate_attach_flags(uint64_t sd_bus_flags, uint64_t *kdbus_flags);
+
+int bus_kernel_try_close(sd_bus *bus);
diff --git
a/src/libsystemd-bus/libsystemd-bus.sym
b/src/libsystemd-bus/libsystemd-bus.sym
index 7dbfcf9acbce57e778f673252cf9368ea0c982fc..3529b7942fd194841d04707a3d677fa89f98924f 100644
(file)
--- a/
src/libsystemd-bus/libsystemd-bus.sym
+++ b/
src/libsystemd-bus/libsystemd-bus.sym
@@
-31,6
+31,7
@@
global:
sd_bus_negotiate_attach_creds;
sd_bus_start;
sd_bus_close;
sd_bus_negotiate_attach_creds;
sd_bus_start;
sd_bus_close;
+ sd_bus_try_close;
sd_bus_ref;
sd_bus_unref;
sd_bus_is_open;
sd_bus_ref;
sd_bus_unref;
sd_bus_is_open;
diff --git
a/src/libsystemd-bus/sd-bus.c
b/src/libsystemd-bus/sd-bus.c
index 9c564de76403b9c928b95e504374df9f062f738d..a39495541b64bf9327a848e5018216c007e37d9e 100644
(file)
--- a/
src/libsystemd-bus/sd-bus.c
+++ b/
src/libsystemd-bus/sd-bus.c
@@
-2956,3
+2956,19
@@
_public_ int sd_bus_get_peer_creds(sd_bus *bus, uint64_t mask, sd_bus_creds **re
*ret = c;
return 0;
}
*ret = c;
return 0;
}
+
+_public_ int sd_bus_try_close(sd_bus *bus) {
+ int r;
+
+ assert_return(bus, -EINVAL);
+ assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
+ assert_return(!bus_pid_changed(bus), -ECHILD);
+ assert_return(bus->is_kernel, -ENOTSUP);
+
+ r = bus_kernel_try_close(bus);
+ if (r < 0)
+ return r;
+
+ sd_bus_close(bus);
+ return 0;
+}
diff --git
a/src/libsystemd-bus/test-bus-kernel.c
b/src/libsystemd-bus/test-bus-kernel.c
index 785e2450bfdb6d08eea49f81fead346958544491..8380b2c3114ed0ad521d3bf1c5f91935d8d412af 100644
(file)
--- a/
src/libsystemd-bus/test-bus-kernel.c
+++ b/
src/libsystemd-bus/test-bus-kernel.c
@@
-95,6
+95,9
@@
int main(int argc, char *argv[]) {
r = sd_bus_emit_signal(a, "/foo/bar/waldo", "waldo.com", "Piep", "sss", "I am a string", "/this/is/a/path", "and.this.a.domain.name");
assert_se(r >= 0);
r = sd_bus_emit_signal(a, "/foo/bar/waldo", "waldo.com", "Piep", "sss", "I am a string", "/this/is/a/path", "and.this.a.domain.name");
assert_se(r >= 0);
+ r = sd_bus_try_close(b);
+ assert_se(r == -EBUSY);
+
r = sd_bus_process(b, &m);
assert_se(r > 0);
assert_se(m);
r = sd_bus_process(b, &m);
assert_se(r > 0);
assert_se(m);
@@
-160,6
+163,9
@@
int main(int argc, char *argv[]) {
r = sd_bus_release_name(a, "net.x0pointer.foobar");
assert_se(r == -ESRCH);
r = sd_bus_release_name(a, "net.x0pointer.foobar");
assert_se(r == -ESRCH);
+ r = sd_bus_try_close(a);
+ assert_se(r >= 0);
+
sd_bus_unref(a);
sd_bus_unref(b);
sd_bus_unref(a);
sd_bus_unref(b);
diff --git
a/src/systemd/sd-bus.h
b/src/systemd/sd-bus.h
index 3c3cea042ed6b87798438e2afb4fd1631aeb24d5..e757d1d45fde2753827c44db0e38c54905a52cfa 100644
(file)
--- a/
src/systemd/sd-bus.h
+++ b/
src/systemd/sd-bus.h
@@
-115,6
+115,7
@@
int sd_bus_negotiate_attach_timestamp(sd_bus *bus, int b);
int sd_bus_negotiate_attach_creds(sd_bus *bus, uint64_t creds_mask);
int sd_bus_start(sd_bus *ret);
int sd_bus_negotiate_attach_creds(sd_bus *bus, uint64_t creds_mask);
int sd_bus_start(sd_bus *ret);
+int sd_bus_try_close(sd_bus *bus);
void sd_bus_close(sd_bus *bus);
sd_bus *sd_bus_ref(sd_bus *bus);
void sd_bus_close(sd_bus *bus);
sd_bus *sd_bus_ref(sd_bus *bus);