Skip to content

Instantly share code, notes, and snippets.

@mkmkme
Last active December 25, 2017 16:06
Show Gist options
  • Save mkmkme/1b88a10df3260dfff773795545c5fec9 to your computer and use it in GitHub Desktop.
Save mkmkme/1b88a10df3260dfff773795545c5fec9 to your computer and use it in GitHub Desktop.
[libdbus-1][c++] NameHasOwner
#include <iostream>
#include <string>
#include <dbus/dbus.h>
DBusMessage *sendDBusMessage(DBusMessage *msg)
{
DBusError err;
DBusConnection *con;
dbus_error_init(&err);
con = dbus_bus_get(DBUS_BUS_SYSTEM, &err);
if (dbus_error_is_set(&err)) {
std::cerr << err.message << std::endl;
dbus_error_free(&err);
return nullptr;
}
if (con == nullptr)
return nullptr;
DBusMessage *ret = dbus_connection_send_with_reply_and_block(
con, msg, -1, &err);
dbus_connection_unref(con);
if (dbus_error_is_set(&err)) {
std::cerr << err.message << std::endl;
dbus_error_free(&err);
return nullptr;
}
return ret;
}
bool nameHasOwner(const char *name)
{
DBusMessage *msg = dbus_message_new_method_call(
"org.freedesktop.DBus",
"/org/freedesktop/dbus",
"org.freedesktop.DBus",
"NameHasOwner");
dbus_message_append_args(
msg,
DBUS_TYPE_STRING, &name,
DBUS_TYPE_INVALID);
DBusMessage *reply = sendDBusMessage(msg);
dbus_message_unref(msg);
if (reply == nullptr)
return false;
DBusError err;
dbus_error_init(&err);
if (dbus_set_error_from_message(&err, reply)) {
std::cerr << err.message << std::endl;
dbus_error_free(&err);
return false;
}
dbus_bool_t ret;
dbus_message_get_args(
reply, &err,
DBUS_TYPE_BOOLEAN, &ret,
DBUS_TYPE_INVALID);
dbus_message_unref(reply);
if (dbus_error_is_set(&err)) {
std::cerr << err.message << std::endl;
dbus_error_free(&err);
return false;
}
return ret == TRUE;
}
int main(int argc, char *argv[])
{
if (argc != 2) {
std::cerr << "usage: " << argv[0] << " NAME\n";
return 1;
}
std::cout
<< std::boolalpha
<< argv[1] << ": " << nameHasOwner(argv[1]) << std::endl;
return 0;
}
CXXFLAGS = -Wall -Wextra $(shell pkg-config --cflags --libs dbus-1) -std=c++11
TGT = dbus-has-owner
$(TGT): $(TGT).cpp
$(CXX) $(TGT).cpp $(CXXFLAGS) -o $(TGT)
clean:
rm -f $(TGT)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment