static void *server(void *p) { struct context *c = p; sd_bus *bus = NULL; sd_id128_t id; int r; c->quit = false; assert_se(sd_id128_randomize(&id) >= 0); assert_se(sd_bus_new(&bus) >= 0); assert_se(sd_bus_set_fd(bus, c->fds[0], c->fds[0]) >= 0); assert_se(sd_bus_set_server(bus, 1, id) >= 0); assert_se(sd_bus_add_object_vtable(bus, NULL, "/foo", "org.freedesktop.systemd.test", vtable, c) >= 0); assert_se(sd_bus_add_object_vtable(bus, NULL, "/foo", "org.freedesktop.systemd.test2", vtable, c) >= 0); assert_se(sd_bus_add_fallback_vtable(bus, NULL, "/value", "org.freedesktop.systemd.ValueTest", vtable2, NULL, UINT_TO_PTR(20)) >= 0); assert_se(sd_bus_add_node_enumerator(bus, NULL, "/value", enumerator_callback, NULL) >= 0); assert_se(sd_bus_add_node_enumerator(bus, NULL, "/value/a", enumerator2_callback, NULL) >= 0); assert_se(sd_bus_add_object_manager(bus, NULL, "/value") >= 0); assert_se(sd_bus_add_object_manager(bus, NULL, "/value/a") >= 0); assert_se(sd_bus_start(bus) >= 0); log_error("Entering event loop on server"); while (!c->quit) { log_error("Loop!"); r = sd_bus_process(bus, NULL); if (r < 0) { log_error_errno(r, "Failed to process requests: %m"); goto fail; } if (r == 0) { r = sd_bus_wait(bus, (uint64_t) -1); if (r < 0) { log_error_errno(r, "Failed to wait: %m"); goto fail; } continue; } } r = 0; fail: if (bus) { sd_bus_flush(bus); sd_bus_unref(bus); } return INT_TO_PTR(r); }
static int connect_bus(Context *c, sd_event *event, sd_bus **_bus) { _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL; int r; assert(c); assert(event); assert(_bus); r = sd_bus_default_system(&bus); if (r < 0) return log_error_errno(r, "Failed to get system bus connection: %m"); r = sd_bus_add_object_vtable(bus, NULL, "/org/freedesktop/hostname1", "org.freedesktop.hostname1", hostname_vtable, c); if (r < 0) return log_error_errno(r, "Failed to register object: %m"); r = sd_bus_request_name(bus, "org.freedesktop.hostname1", 0); if (r < 0) return log_error_errno(r, "Failed to register name: %m"); r = sd_bus_attach_event(bus, event, 0); if (r < 0) return log_error_errno(r, "Failed to attach bus to event loop: %m"); *_bus = bus; bus = NULL; return 0; }
void DbusApiInit(int sock) { fd = sock; sd_event_source *busSource = NULL; sd_bus_slot *slot = NULL; int ret = sd_event_default(&event); char tmp = '0'; read(fd, &tmp, sizeof(char)); ret = sd_bus_open_system(&bus); ret = sd_bus_add_object_vtable(bus, &slot, "/org/watchdogd1", "org.watchdogd1", watchdogPmon, NULL); ret = sd_bus_request_name(bus, "org.watchdogd1", 0); if (ret < 0) { ReloadDbusDaemon(); ret = sd_bus_request_name(bus, "org.watchdogd1", 0); } sd_event_add_io(event, &busSource, sd_bus_get_fd(bus), EPOLLIN, BusHandler, NULL); sd_event_loop(event); }
//------------------------------------------------------ // Called by IPMID as part of the start up // ----------------------------------------------------- int start_host_service(sd_bus *bus, sd_bus_slot *slot) { int rc = 0; /* Install the object */ rc = sd_bus_add_object_vtable(bus, &slot, "/org/openbmc/HostServices", /* object path */ "org.openbmc.HostServices", /* interface name */ host_services_vtable, NULL); if (rc < 0) { fprintf(stderr, "Failed to issue method call: %s\n", strerror(-rc)); } else { /* Take one in OpenBmc */ rc = sd_bus_request_name(bus, "org.openbmc.HostServices", 0); if (rc < 0) { fprintf(stderr, "Failed to acquire service name: %s\n", strerror(-rc)); } } return rc < 0 ? EXIT_FAILURE : EXIT_SUCCESS; }
int kirstu_dbus_init(void) { int r = sd_bus_default_user(&bus); if (r < 0) { fprintf(stderr, "Failed to connect to system bus: %s\n", strerror(-r)); exit(EXIT_FAILURE); } r = sd_bus_add_object_vtable(bus, &slot, "/org/freedesktop/Notifications", "org.freedesktop.Notifications", vtable, NULL); if (r < 0) { fprintf(stderr, "Failed to issue method call: %s\n", strerror(-r)); exit(EXIT_FAILURE); } r = sd_bus_request_name(bus, "org.freedesktop.Notifications", 0); if (r < 0) { fprintf(stderr, "Failed to acquire service name: %s\n", strerror(-r)); exit(EXIT_FAILURE); } return sd_bus_get_fd(bus); }
int cc_server_Smartie_new( const char *address, const struct cc_server_Smartie_impl *impl, void *data, struct cc_server_Smartie **instance) { int result; struct cc_server_Smartie *ii; struct cc_instance *i; CC_LOG_DEBUG("invoked cc_server_Smartie_new\n"); assert(address); assert(impl); assert(instance); ii = (struct cc_server_Smartie *) calloc(1, sizeof(*ii)); if (!ii) { CC_LOG_ERROR("failed to allocate instance memory\n"); return -ENOMEM; } result = cc_instance_new(address, true, &i); if (result < 0) { CC_LOG_ERROR("failed to create instance: %s\n", strerror(-result)); goto fail; } ii->instance = i; ii->impl = impl; ii->data = data; result = sd_bus_add_object_vtable( i->backend->bus, &ii->vtable_slot, i->path, i->interface, vtable_Smartie, ii); if (result < 0) { CC_LOG_ERROR("unable to initialize instance vtable: %s\n", strerror(-result)); goto fail; } *instance = ii; return 0; fail: ii = cc_server_Smartie_free(ii); return result; }
static int ipmi_dbus_setup(struct ipmi_intf *intf) { const char *name; int rc; rc = sd_bus_default(&bus); if (rc < 0) { lprintf(LOG_ERR, "Can't connect to session bus: %s\n", strerror(-rc)); return -1; } sd_bus_add_object_vtable(bus, NULL, object_path, interface, dbus_vtable, NULL); sd_bus_request_name(bus, bus_name, SD_BUS_NAME_REPLACE_EXISTING); sd_bus_flush(bus); sd_bus_get_unique_name(bus, &name); intf->opened = 1; return 0; }
static int manager_connect_bus(Manager *m) { _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; int r; assert(m); assert(!m->bus); r = sd_bus_default_system(&m->bus); if (r < 0) return log_error_errno(r, "Failed to connect to system bus: %m"); r = sd_bus_add_object_vtable(m->bus, NULL, "/org/freedesktop/machine1", "org.freedesktop.machine1.Manager", manager_vtable, m); if (r < 0) return log_error_errno(r, "Failed to add manager object vtable: %m"); r = sd_bus_add_fallback_vtable(m->bus, NULL, "/org/freedesktop/machine1/machine", "org.freedesktop.machine1.Machine", machine_vtable, machine_object_find, m); if (r < 0) return log_error_errno(r, "Failed to add machine object vtable: %m"); r = sd_bus_add_node_enumerator(m->bus, NULL, "/org/freedesktop/machine1/machine", machine_node_enumerator, m); if (r < 0) return log_error_errno(r, "Failed to add machine enumerator: %m"); r = sd_bus_add_fallback_vtable(m->bus, NULL, "/org/freedesktop/machine1/image", "org.freedesktop.machine1.Image", image_vtable, image_object_find, m); if (r < 0) return log_error_errno(r, "Failed to add image object vtable: %m"); r = sd_bus_add_node_enumerator(m->bus, NULL, "/org/freedesktop/machine1/image", image_node_enumerator, m); if (r < 0) return log_error_errno(r, "Failed to add image enumerator: %m"); r = sd_bus_add_match(m->bus, NULL, "type='signal'," "sender='org.freedesktop.systemd1'," "interface='org.freedesktop.systemd1.Manager'," "member='JobRemoved'," "path='/org/freedesktop/systemd1'", match_job_removed, m); if (r < 0) return log_error_errno(r, "Failed to add match for JobRemoved: %m"); r = sd_bus_add_match(m->bus, NULL, "type='signal'," "sender='org.freedesktop.systemd1'," "interface='org.freedesktop.systemd1.Manager'," "member='UnitRemoved'," "path='/org/freedesktop/systemd1'", match_unit_removed, m); if (r < 0) return log_error_errno(r, "Failed to add match for UnitRemoved: %m"); r = sd_bus_add_match(m->bus, NULL, "type='signal'," "sender='org.freedesktop.systemd1'," "interface='org.freedesktop.DBus.Properties'," "member='PropertiesChanged'," "arg0='org.freedesktop.systemd1.Unit'", match_properties_changed, m); if (r < 0) return log_error_errno(r, "Failed to add match for PropertiesChanged: %m"); r = sd_bus_add_match(m->bus, NULL, "type='signal'," "sender='org.freedesktop.systemd1'," "interface='org.freedesktop.systemd1.Manager'," "member='Reloading'," "path='/org/freedesktop/systemd1'", match_reloading, m); if (r < 0) return log_error_errno(r, "Failed to add match for Reloading: %m"); r = sd_bus_call_method( m->bus, "org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", "Subscribe", &error, NULL, NULL); if (r < 0) { log_error("Failed to enable subscription: %s", bus_error_message(&error, r)); return r; } r = sd_bus_request_name(m->bus, "org.freedesktop.machine1", 0); if (r < 0) return log_error_errno(r, "Failed to register name: %m"); r = sd_bus_attach_event(m->bus, m->event, 0); if (r < 0) return log_error_errno(r, "Failed to attach bus to event loop: %m"); return 0; }
int main(int argc, char *argv[]) { sd_bus_slot *slot = NULL; sd_bus *bus = NULL; int r; char **acquired = NULL, **activatable = NULL, **i; /* Connect to the user bus this time */ r = sd_bus_open_system(&bus); if (r < 0) { fprintf(stderr, "Failed to connect to system bus: %s\n", strerror(-r)); goto finish; } /* Install an object */ r = sd_bus_add_object_vtable(bus, &slot, "/org/openbmc/examples/path0/SDBusObj", /* object path */ "org.openbmc.examples.Echo", /* interface name */ echo_vtable, NULL); if (r < 0) { fprintf(stderr, "Failed to issue method call: %s\n", strerror(-r)); goto finish; } /* Install an object */ r = sd_bus_add_object_vtable(bus, &slot, "/org/openbmc/examples/path1/SDBusObj", /* object path */ "org.openbmc.examples.Echo", /* interface name */ echo_vtable, NULL); if (r < 0) { fprintf(stderr, "Failed to issue method call: %s\n", strerror(-r)); goto finish; } /* Take a well-known service name so that clients can find us */ r = sd_bus_request_name(bus, "org.openbmc.examples.SDBusService", 0); if (r < 0) { fprintf(stderr, "Failed to acquire service name: %s\n", strerror(-r)); goto finish; } for (;;) { /* Process requests */ r = sd_bus_process(bus, NULL); if (r < 0) { fprintf(stderr, "Failed to process bus: %s\n", strerror(-r)); goto finish; } if (r > 0) /* we processed a request, try to process another one, right-away */ continue; /* Wait for the next request to process */ r = sd_bus_wait(bus, (uint64_t) -1); if (r < 0) { fprintf(stderr, "Failed to wait on bus: %s\n", strerror(-r)); goto finish; } } finish: sd_bus_slot_unref(slot); sd_bus_unref(bus); return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; }
/* * ------------------------------------------------ * Called as part of setting up skeleton services. * ----------------------------------------------- */ int start_led_services() { /* Generic error reporter. */ int rc = -1; int num_leds = 0; int count_leds = 0; /* Bus and slot where we are offering the LED dbus service. */ sd_bus *bus_type = NULL; sd_bus_slot *led_slot = NULL; /* For walking '/sys/class/leds/' looking for names of LED.*/ struct dirent **led_list; /* Get a hook onto system bus. */ rc = sd_bus_open_system(&bus_type); if(rc < 0) { fprintf(stderr,"Error opening system bus.\n"); return rc; } count_leds = num_leds = scandir("/sys/class/leds/", &led_list, led_select, alphasort); if(num_leds <= 0) { fprintf(stderr,"No LEDs present in the system\n"); sd_bus_slot_unref(led_slot); sd_bus_unref(bus_type); return rc; } /* Fully qualified Dbus object for a particular LED */ char led_object[128] = {0}; int len = 0; /* For each led present, announce the service on dbus. */ while(num_leds--) { memset(led_object, 0x0, sizeof(led_object)); len = snprintf(led_object, sizeof(led_object), "%s%s", "/org/openbmc/controller/led/", led_list[num_leds]->d_name); if(len >= sizeof(led_object)) { fprintf(stderr, "Error. LED object is too long:[%d]\n",len); rc = -1; break; } /* Install the object */ rc = sd_bus_add_object_vtable(bus_type, &led_slot, led_object, /* object path */ "org.openbmc.controller.led", /* interface name */ led_control_vtable, NULL); if (rc < 0) { fprintf(stderr, "Failed to add object to dbus: %s\n", strerror(-rc)); break; } } /* Done with all registration. */ while (count_leds > 0) { free(led_list[--count_leds]); if(count_leds == 0) { free(led_list); } } /* If we had success in adding the providers, request for a bus name. */ if(rc == 0) { /* Take one in OpenBmc */ rc = sd_bus_request_name(bus_type, "org.openbmc.controller.led", 0); if (rc < 0) { fprintf(stderr, "Failed to acquire service name: %s\n", strerror(-rc)); } else { for (;;) { /* Process requests */ rc = sd_bus_process(bus_type, NULL); if (rc < 0) { fprintf(stderr, "Failed to process bus: %s\n", strerror(-rc)); break; } if (rc > 0) { continue; } rc = sd_bus_wait(bus_type, (uint64_t) - 1); if (rc < 0) { fprintf(stderr, "Failed to wait on bus: %s\n", strerror(-rc)); break; } } } } sd_bus_slot_unref(led_slot); sd_bus_unref(bus_type); return rc; }
static plugin_status_t update_map(sd_bus *bus, sd_bus_slot *slot, struct dmmp_mpath *map) { plugin_status_t return_code = PLUGIN_OK; int i = 0; int path_count = 0; char map_name[256], group_name[256], path_name[256]; struct dmmp_path_group **dmmp_pgs = NULL; uint32_t dmmp_pg_count = 0; struct dmmp_path **mp_ps = NULL; uint32_t mp_p_count = 0; uint32_t j = 0; const char *blk_name = NULL; int r; snprintf(map_name, 256, "%s/%s", MULTIPATH_BASE_PATH, dmmp_mpath_wwid_get(map)); r = sd_bus_add_object_vtable(bus, &slot, map_name, MULTIPATH_BASE_INTERFACE, map_vtable, map); if (r < 0) { fprintf(stderr, "Failed to issue method call: %s\n", strerror(-r)); return -1; } dmmp_path_group_array_get(map, &dmmp_pgs, &dmmp_pg_count); if (dmmp_pg_count == 0) printf("dmmp_path_group_array_get(): Got 0 path group\n"); for (i = 0; i < dmmp_pg_count; ++i) { snprintf(group_name, 256, "%s/group%d", map_name, dmmp_path_group_id_get(dmmp_pgs[i])); r = sd_bus_add_object_vtable(bus, &slot, group_name, MULTIPATH_BASE_INTERFACE, group_vtable, dmmp_pgs[i]); if (r < 0) { fprintf(stderr, "Failed to issue method call: %s\n", strerror(-r)); return -1; } /* * Loop though the paths */ dmmp_path_array_get(dmmp_pgs[i], &mp_ps, &mp_p_count); if (mp_p_count == 0) printf("dmmp_path_array_get(): Got no path\n"); for (j = 0; j < mp_p_count; ++j) { blk_name = dmmp_path_blk_name_get(mp_ps[j]); if (blk_name == NULL) printf("dmmp_path_blk_name_get(): Got NULL\n"); snprintf(path_name, 256, "%s/%s", group_name, blk_name); r = sd_bus_add_object_vtable(bus, &slot, path_name, MULTIPATH_BASE_INTERFACE, group_vtable, mp_ps[j]); if (r < 0) { fprintf(stderr, "Failed to issue method call: %s\n", strerror(-r)); return -1; } } } finished: return return_code; }
static int manager_connect_bus(Manager *m) { int r; assert(m); assert(!m->bus); r = sd_bus_default_system(&m->bus); if (r < 0) return log_error_errno(r, "Failed to connect to system bus: %m"); r = sd_bus_add_object_vtable(m->bus, NULL, "/org/freedesktop/machine1", "org.freedesktop.machine1.Manager", manager_vtable, m); if (r < 0) return log_error_errno(r, "Failed to add manager object vtable: %m"); r = sd_bus_add_fallback_vtable(m->bus, NULL, "/org/freedesktop/machine1/machine", "org.freedesktop.machine1.Machine", machine_vtable, machine_object_find, m); if (r < 0) return log_error_errno(r, "Failed to add machine object vtable: %m"); r = sd_bus_add_node_enumerator(m->bus, NULL, "/org/freedesktop/machine1/machine", machine_node_enumerator, m); if (r < 0) return log_error_errno(r, "Failed to add machine enumerator: %m"); r = sd_bus_add_fallback_vtable(m->bus, NULL, "/org/freedesktop/machine1/image", "org.freedesktop.machine1.Image", image_vtable, image_object_find, m); if (r < 0) return log_error_errno(r, "Failed to add image object vtable: %m"); r = sd_bus_add_node_enumerator(m->bus, NULL, "/org/freedesktop/machine1/image", image_node_enumerator, m); if (r < 0) return log_error_errno(r, "Failed to add image enumerator: %m"); r = sd_bus_match_signal_async( m->bus, NULL, "org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", "JobRemoved", match_job_removed, NULL, m); if (r < 0) return log_error_errno(r, "Failed to add match for JobRemoved: %m"); r = sd_bus_match_signal_async( m->bus, NULL, "org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", "UnitRemoved", match_unit_removed, NULL, m); if (r < 0) return log_error_errno(r, "Failed to request match for UnitRemoved: %m"); r = sd_bus_match_signal_async( m->bus, NULL, "org.freedesktop.systemd1", NULL, "org.freedesktop.DBus.Properties", "PropertiesChanged", match_properties_changed, NULL, m); if (r < 0) return log_error_errno(r, "Failed to request match for PropertiesChanged: %m"); r = sd_bus_match_signal_async( m->bus, NULL, "org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", "Reloading", match_reloading, NULL, m); if (r < 0) return log_error_errno(r, "Failed to request match for Reloading: %m"); r = sd_bus_call_method_async( m->bus, NULL, "org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", "Subscribe", NULL, NULL, NULL); if (r < 0) return log_error_errno(r, "Failed to enable subscription: %m"); r = sd_bus_request_name_async(m->bus, NULL, "org.freedesktop.machine1", 0, NULL, NULL); if (r < 0) return log_error_errno(r, "Failed to request name: %m"); r = sd_bus_attach_event(m->bus, m->event, 0); if (r < 0) return log_error_errno(r, "Failed to attach bus to event loop: %m"); return 0; }
int main(int argc, char *argv[]) { sd_bus_slot *slot = NULL; int r; char *mode = NULL; if (argc != 2) { fprintf(stderr, "syntax: %s [server|client]\n", argv[0]); return 1; } mode = argv[1]; /* Connect to system bus */ r = sd_bus_open_system(&bus); if (r < 0) { fprintf(stderr, "Failed to connect to system bus: %s\n", strerror(-r)); goto finish; } if (!strcmp("server", mode)) { r = sd_bus_add_object_vtable(bus, &slot, OBJ, /* object path */ INT, /* interface name */ signal_vtable, NULL); if (r < 0) { fprintf(stderr, "Failed to issue method call: %s\n", strerror(-r)); goto finish; } /* Take a well-known service name so that clients can find us */ r = sd_bus_request_name(bus, INT, 0); if (r < 0) { fprintf(stderr, "Failed to acquire service name: %s\n", strerror(-r)); goto finish; } } else if (!strcmp("client", mode)) { r = sd_bus_add_match(bus, &slot, FILTER, bus_signal_cb, NULL); if (r < 0) { fprintf(stderr, "Failed: sd_bus_add_match: %s\n", strerror(-r)); goto finish; } } else { fprintf(stderr, "Invalid operating mode %s", mode); return 1; } for (;;) { /* Process requests */ r = sd_bus_process(bus, NULL); if (r < 0) { fprintf(stderr, "Failed to process bus: %s\n", strerror(-r)); goto finish; } if (r > 0) { continue; } r = sd_bus_wait(bus, (uint64_t) - 1); if (r < 0) { fprintf(stderr, "Failed to wait on bus: %s\n", strerror(-r)); goto finish; } } finish: sd_bus_slot_unref(slot); sd_bus_unref(bus); return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; }