Skip to content
Snippets Groups Projects
Commit 897f42ee authored by Martyn Welch's avatar Martyn Welch
Browse files

Adding functions


Signed-off-by: default avatarMartyn Welch <martyn@welchs.me.uk>
parent d0522088
No related branches found
No related tags found
No related merge requests found
......@@ -10,46 +10,130 @@
#include <errno.h>
#include <systemd/sd-bus.h>
static int method_multiply(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
int64_t x, y;
char *app_name;
static void say(const char *message) {
printf("%s:%s\n", app_name, message);
}
static int method_foo(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
char *message;
int r;
char *ret = "Foo called.";
/* Read the parameters */
r = sd_bus_message_read(m, "s", &message);
if (r < 0) {
fprintf(stderr, "Failed to parse parameters: %s\n", strerror(-r));
return r;
}
say(ret);
/* Reply with the response */
return sd_bus_reply_method_return(m, "s", ret);
}
static int method_foo2(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
char *message;
int r;
char *ret = "Foo2 called.";
/* Read the parameters */
r = sd_bus_message_read(m, "s", &message);
if (r < 0) {
fprintf(stderr, "Failed to parse parameters: %s\n", strerror(-r));
return r;
}
say(ret);
/* Reply with the response */
return sd_bus_reply_method_return(m, "s", ret);
}
static int method_accept(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
char *message;
int r;
char *ret = "Accept called.";
/* Read the parameters */
r = sd_bus_message_read(m, "xx", &x, &y);
r = sd_bus_message_read(m, "s", &message);
if (r < 0) {
fprintf(stderr, "Failed to parse parameters: %s\n", strerror(-r));
return r;
}
say(ret);
/* Reply with the response */
return sd_bus_reply_method_return(m, "x", x * y);
return sd_bus_reply_method_return(m, "s", ret);
}
static int method_divide(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
int64_t x, y;
static int method_aaa(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
char *message;
int r;
char *ret = "AuditAndAccept called.";
/* Read the parameters */
r = sd_bus_message_read(m, "xx", &x, &y);
r = sd_bus_message_read(m, "s", &message);
if (r < 0) {
fprintf(stderr, "Failed to parse parameters: %s\n", strerror(-r));
return r;
}
/* Return an error on division by zero */
if (y == 0) {
sd_bus_error_set_const(ret_error, "net.poettering.DivisionByZero", "Sorry, can't allow division by zero.");
return -EINVAL;
say(ret);
/* Reply with the response */
return sd_bus_reply_method_return(m, "s", ret);
}
static int method_deny(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
char *message;
int r;
char *ret = "Deny called.";
/* Read the parameters */
r = sd_bus_message_read(m, "s", &message);
if (r < 0) {
fprintf(stderr, "Failed to parse parameters: %s\n", strerror(-r));
return r;
}
return sd_bus_reply_method_return(m, "x", x / y);
say(ret);
/* Reply with the response */
return sd_bus_reply_method_return(m, "s", ret);
}
/* The vtable of our little object, implements the net.poettering.Calculator interface */
static const sd_bus_vtable calculator_vtable[] = {
static int method_aad(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
char *message;
int r;
char *ret = "AuditAndDeny called.";
/* Read the parameters */
r = sd_bus_message_read(m, "s", &message);
if (r < 0) {
fprintf(stderr, "Failed to parse parameters: %s\n", strerror(-r));
return r;
}
say(ret);
/* Reply with the response */
return sd_bus_reply_method_return(m, "s", ret);
}
/* The vtable of our little object, implements the org.Test interface */
static const sd_bus_vtable test_vtable[] = {
SD_BUS_VTABLE_START(0),
SD_BUS_METHOD("Multiply", "xx", "x", method_multiply, SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD("Divide", "xx", "x", method_divide, SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD("Foo", "s", "s", method_foo, SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD("Foo2", "s", "s", method_foo2, SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD("Accept", "s", "s", method_accept, SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD("AuditAndAccept", "s", "s", method_aaa, SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD("Deny", "s", "s", method_deny, SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD("AuditAndDeny", "s", "s", method_aad, SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_VTABLE_END
};
......@@ -58,6 +142,8 @@ int main(int argc, char *argv[]) {
sd_bus *bus = NULL;
int r;
app_name = argv[0];
/* Connect to the user bus this time */
r = sd_bus_open_user(&bus);
if (r < 0) {
......@@ -68,9 +154,9 @@ int main(int argc, char *argv[]) {
/* Install the object */
r = sd_bus_add_object_vtable(bus,
&slot,
"/net/poettering/Calculator", /* object path */
"net.poettering.Calculator", /* interface name */
calculator_vtable,
"/org/Test", /* object path */
"org.Test", /* interface name */
test_vtable,
NULL);
if (r < 0) {
fprintf(stderr, "Failed to issue method call: %s\n", strerror(-r));
......@@ -78,7 +164,7 @@ int main(int argc, char *argv[]) {
}
/* Take a well-known service name so that clients can find us */
r = sd_bus_request_name(bus, "net.poettering.Calculator", 0);
r = sd_bus_request_name(bus, "org.Test", 0);
if (r < 0) {
fprintf(stderr, "Failed to acquire service name: %s\n", strerror(-r));
goto finish;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment