static int bus_get_uint64_property(sd_bus *bus, const char *path, const char *interface, const char *property, uint64_t *val) { _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; int r; assert(bus); assert(path); assert(interface); assert(property); assert(val); r = sd_bus_get_property_trivial( bus, "org.freedesktop.systemd1", path, interface, property, &error, 't', val); if (r < 0) { log_error("Failed to parse reply: %s", bus_error_message(&error, -r)); return r; } return 0; }
static usec_t get_startup_time(Context *c) { _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; usec_t t = 0; int r; assert(c); r = sd_bus_get_property_trivial( c->bus, "org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", "UserspaceTimestamp", &error, 't', &t); if (r < 0) { log_error("Failed to get timestamp: %s", bus_error_message(&error, -r)); return 0; } return t; }
int main(int argc, char *argv[]) { static const char *matchfmt = "type='signal'," "interface='org.freedesktop.DBus.Properties'," "member='PropertiesChanged'," "arg0='org.openbmc.control.Power'," "path='%s'," "sender='%s'"; static const char *usage = "Usage: %s OBJECTPATH on|off\n"; static const size_t LEN = 256; sd_bus *conn = NULL; sd_event *loop = NULL; sd_bus_slot *slot = NULL; sd_bus_error error = SD_BUS_ERROR_NULL; char *service = NULL; int r, dest = -1, state; char match[LEN]; if(argc < 3) { fprintf(stderr, usage, argv[0]); exit(EXIT_FAILURE); } if(!strcmp(argv[2], "on")) dest = 1; if(!strcmp(argv[2], "off")) dest = 0; if(dest != 0 && dest != 1) { fprintf(stderr, usage, argv[0]); exit(EXIT_FAILURE); } r = sd_bus_default_system(&conn); if(r < 0) { fprintf(stderr, "Error connecting to system bus: %s\n", strerror(-r)); goto finish; } r = mapper_get_service(conn, argv[1], &service); if (r < 0) { fprintf(stderr, "Error obtaining host service: %s\n", strerror(-r)); goto finish; } r = sd_event_default(&loop); if (r < 0) { fprintf(stderr, "Error obtaining event loop: %s\n", strerror(-r)); goto finish; } r = sd_bus_attach_event(conn, loop, SD_EVENT_PRIORITY_NORMAL); if (r < 0) { fprintf(stderr, "Failed to attach system " "bus to event loop: %s\n", strerror(-r)); goto finish; } if(strlen(matchfmt) + strnlen(argv[1], LEN) > LEN) { r = -E2BIG; fprintf(stderr, "Error adding match rule: %s\n", strerror(-r)); goto finish; } sprintf(match, matchfmt, argv[1], service); r = sd_bus_add_match(conn, &slot, match, callback, loop); if(r < 0) { fprintf(stderr, "Error adding match rule: %s\n", strerror(-r)); goto finish; } r = sd_bus_get_property_trivial(conn, service, argv[1], "org.openbmc.control.Power", "pgood", &error, 'i', &state); if(r < 0) { fprintf(stderr, "Error getting property: %s\n", strerror(-r)); goto finish; } if(dest == state) goto finish; r = sd_event_loop(loop); if(r < 0) { fprintf(stderr, "Error starting event loop: %s\n", strerror(-r)); goto finish; } finish: exit(r < 0 ? EXIT_FAILURE : EXIT_SUCCESS); }