static int method_echo(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) { char *str; const char *intf = sd_bus_message_get_interface(m), *path = sd_bus_message_get_path(m); sd_bus *bus = sd_bus_message_get_bus(m); char response[512] = {0}; int r; /* Read the parameters */ r = sd_bus_message_read(m, "s", &str); if (r < 0) { fprintf(stderr, "Failed to parse parameters: %s\n", strerror(-r)); return r; } r = sd_bus_emit_signal(bus, path, intf, "MethodInvoked", "ss", "Echo method was invoked", path); if (r < 0) { fprintf(stderr, "Failed to emit signal: %s\n", strerror(-r)); return r; } strncat(response, path, 128); strcat(response, " says "); strncat(response, str, 128); /* Reply with the response */ return sd_bus_reply_method_return(m, "s", &response); }
/* called when the object for the service is called */ static int api_dbus_server_on_object_called(sd_bus_message *message, void *userdata, sd_bus_error *ret_error) { int rc; const char *method; const char *uuid; struct dbus_req *dreq; struct api_dbus *api = userdata; struct afb_req areq; uint32_t flags; /* check the interface */ if (strcmp(sd_bus_message_get_interface(message), api->name) != 0) return 0; /* get the method */ method = sd_bus_message_get_member(message); /* create the request */ dreq = calloc(1 , sizeof *dreq); if (dreq == NULL) { sd_bus_reply_method_errorf(message, SD_BUS_ERROR_NO_MEMORY, "out of memory"); return 1; } /* get the data */ rc = sd_bus_message_read(message, "ssu", &dreq->request, &uuid, &flags); if (rc < 0) { sd_bus_reply_method_errorf(message, SD_BUS_ERROR_INVALID_SIGNATURE, "invalid signature"); free(dreq); return 1; } /* connect to the context */ if (afb_context_connect(&dreq->context, uuid, NULL) < 0) { sd_bus_reply_method_errorf(message, SD_BUS_ERROR_NO_MEMORY, "out of memory"); free(dreq); return 1; } /* fulfill the request and emit it */ dreq->context.flags = flags; dreq->message = sd_bus_message_ref(message); dreq->json = NULL; dreq->refcount = 1; areq.itf = &dbus_req_itf; areq.closure = dreq; afb_apis_call_(areq, &dreq->context, api->api, method); dbus_req_unref(dreq); return 1; }
static int match_callback(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) { log_info("Match triggered! interface=%s member=%s", strna(sd_bus_message_get_interface(m)), strna(sd_bus_message_get_member(m))); return 0; }