summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/login/inhibit.c69
-rw-r--r--src/login/loginctl.c653
-rw-r--r--src/login/logind-dbus.c31
-rw-r--r--src/login/logind.c47
-rw-r--r--src/shared/dbus-common.c73
-rw-r--r--src/shared/dbus-common.h10
-rw-r--r--src/systemctl/systemctl.c1249
-rw-r--r--src/update-utmp/update-utmp.c118
8 files changed, 650 insertions, 1600 deletions
diff --git a/src/login/inhibit.c b/src/login/inhibit.c
index 6f24a1b671..029c9549d2 100644
--- a/src/login/inhibit.c
+++ b/src/login/inhibit.c
@@ -42,73 +42,53 @@ static enum {
} arg_action = ACTION_INHIBIT;
static int inhibit(DBusConnection *bus, DBusError *error) {
- DBusMessage *m = NULL, *reply = NULL;
+ DBusMessage *reply = NULL;
int fd;
- assert(bus);
-
- m = dbus_message_new_method_call(
+ fd = bus_method_call_with_reply (
+ bus,
"org.freedesktop.login1",
"/org/freedesktop/login1",
"org.freedesktop.login1.Manager",
- "Inhibit");
- if (!m)
- return -ENOMEM;
-
- if (!dbus_message_append_args(m,
- DBUS_TYPE_STRING, &arg_what,
- DBUS_TYPE_STRING, &arg_who,
- DBUS_TYPE_STRING, &arg_why,
- DBUS_TYPE_STRING, &arg_mode,
- DBUS_TYPE_INVALID)) {
- fd = -ENOMEM;
- goto finish;
- }
-
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, error);
- if (!reply) {
- fd = -EIO;
- goto finish;
- }
+ "Inhibit",
+ &reply,
+ NULL,
+ DBUS_TYPE_STRING, &arg_what,
+ DBUS_TYPE_STRING, &arg_who,
+ DBUS_TYPE_STRING, &arg_why,
+ DBUS_TYPE_STRING, &arg_mode,
+ DBUS_TYPE_INVALID);
+ if (fd)
+ return fd;
if (!dbus_message_get_args(reply, error,
DBUS_TYPE_UNIX_FD, &fd,
- DBUS_TYPE_INVALID)){
+ DBUS_TYPE_INVALID))
fd = -EIO;
- goto finish;
- }
-
-finish:
- if (m)
- dbus_message_unref(m);
- if (reply)
- dbus_message_unref(reply);
+ dbus_message_unref(reply);
return fd;
}
static int print_inhibitors(DBusConnection *bus, DBusError *error) {
- DBusMessage *m, *reply;
+ DBusMessage *reply;
unsigned n = 0;
DBusMessageIter iter, sub, sub2;
int r;
- assert(bus);
-
- m = dbus_message_new_method_call(
+ r = bus_method_call_with_reply (
+ bus,
"org.freedesktop.login1",
"/org/freedesktop/login1",
"org.freedesktop.login1.Manager",
- "ListInhibitors");
- if (!m)
+ "ListInhibitors",
+ &reply,
+ NULL,
+ DBUS_TYPE_INVALID);
+ if (r)
return -ENOMEM;
-
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, error);
- if (!reply) {
- r = -EIO;
goto finish;
- }
if (!dbus_message_iter_init(reply, &iter)) {
r = -ENOMEM;
@@ -170,9 +150,6 @@ static int print_inhibitors(DBusConnection *bus, DBusError *error) {
r = 0;
finish:
- if (m)
- dbus_message_unref(m);
-
if (reply)
dbus_message_unref(reply);
diff --git a/src/login/loginctl.c b/src/login/loginctl.c
index b80b2e6a9f..5ff8ea6810 100644
--- a/src/login/loginctl.c
+++ b/src/login/loginctl.c
@@ -87,34 +87,24 @@ static void polkit_agent_open_if_enabled(void) {
}
static int list_sessions(DBusConnection *bus, char **args, unsigned n) {
- DBusMessage *m = NULL, *reply = NULL;
- DBusError error;
+ DBusMessage *reply = NULL;
int r;
DBusMessageIter iter, sub, sub2;
unsigned k = 0;
- dbus_error_init(&error);
-
- assert(bus);
-
pager_open_if_enabled();
- m = dbus_message_new_method_call(
+ r = bus_method_call_with_reply (
+ bus,
"org.freedesktop.login1",
"/org/freedesktop/login1",
"org.freedesktop.login1.Manager",
- "ListSessions");
- if (!m) {
- log_error("Could not allocate message.");
- return -ENOMEM;
- }
-
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
- if (!reply) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- r = -EIO;
+ "ListSessions",
+ &reply,
+ NULL,
+ DBUS_TYPE_INVALID);
+ if (r)
goto finish;
- }
if (!dbus_message_iter_init(reply, &iter) ||
dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY ||
@@ -164,46 +154,31 @@ static int list_sessions(DBusConnection *bus, char **args, unsigned n) {
r = 0;
finish:
- if (m)
- dbus_message_unref(m);
-
if (reply)
dbus_message_unref(reply);
- dbus_error_free(&error);
-
return r;
}
static int list_users(DBusConnection *bus, char **args, unsigned n) {
- DBusMessage *m = NULL, *reply = NULL;
- DBusError error;
+ DBusMessage *reply = NULL;
int r;
DBusMessageIter iter, sub, sub2;
unsigned k = 0;
- dbus_error_init(&error);
-
- assert(bus);
-
pager_open_if_enabled();
- m = dbus_message_new_method_call(
+ r = bus_method_call_with_reply (
+ bus,
"org.freedesktop.login1",
"/org/freedesktop/login1",
"org.freedesktop.login1.Manager",
- "ListUsers");
- if (!m) {
- log_error("Could not allocate message.");
- return -ENOMEM;
- }
-
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
- if (!reply) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- r = -EIO;
- goto finish;
- }
+ "ListUsers",
+ &reply,
+ NULL,
+ DBUS_TYPE_INVALID);
+ if (r)
+ goto finish;
if (!dbus_message_iter_init(reply, &iter) ||
dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY ||
@@ -251,46 +226,31 @@ static int list_users(DBusConnection *bus, char **args, unsigned n) {
r = 0;
finish:
- if (m)
- dbus_message_unref(m);
-
if (reply)
dbus_message_unref(reply);
- dbus_error_free(&error);
-
return r;
}
static int list_seats(DBusConnection *bus, char **args, unsigned n) {
- DBusMessage *m = NULL, *reply = NULL;
- DBusError error;
+ DBusMessage *reply = NULL;
int r;
DBusMessageIter iter, sub, sub2;
unsigned k = 0;
- dbus_error_init(&error);
-
- assert(bus);
-
pager_open_if_enabled();
- m = dbus_message_new_method_call(
+ r = bus_method_call_with_reply (
+ bus,
"org.freedesktop.login1",
"/org/freedesktop/login1",
"org.freedesktop.login1.Manager",
- "ListSeats");
- if (!m) {
- log_error("Could not allocate message.");
- return -ENOMEM;
- }
-
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
- if (!reply) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- r = -EIO;
+ "ListSeats",
+ &reply,
+ NULL,
+ DBUS_TYPE_INVALID);
+ if (r)
goto finish;
- }
if (!dbus_message_iter_init(reply, &iter) ||
dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY ||
@@ -336,14 +296,9 @@ static int list_seats(DBusConnection *bus, char **args, unsigned n) {
r = 0;
finish:
- if (m)
- dbus_message_unref(m);
-
if (reply)
dbus_message_unref(reply);
- dbus_error_free(&error);
-
return r;
}
@@ -907,16 +862,14 @@ static int print_property(const char *name, DBusMessageIter *iter) {
}
static int show_one(const char *verb, DBusConnection *bus, const char *path, bool show_properties, bool *new_line) {
- DBusMessage *m = NULL, *reply = NULL;
+ DBusMessage *reply = NULL;
const char *interface = "";
int r;
- DBusError error;
DBusMessageIter iter, sub, sub2, sub3;
SessionStatusInfo session_info;
UserStatusInfo user_info;
SeatStatusInfo seat_info;
- assert(bus);
assert(path);
assert(new_line);
@@ -924,33 +877,18 @@ static int show_one(const char *verb, DBusConnection *bus, const char *path, boo
zero(user_info);
zero(seat_info);
- dbus_error_init(&error);
-
- m = dbus_message_new_method_call(
+ r = bus_method_call_with_reply (
+ bus,
"org.freedesktop.login1",
path,
"org.freedesktop.DBus.Properties",
- "GetAll");
- if (!m) {
- log_error("Could not allocate message.");
- r = -ENOMEM;
+ "GetAll",
+ &reply,
+ NULL,
+ DBUS_TYPE_STRING, &interface,
+ DBUS_TYPE_INVALID);
+ if (r)
goto finish;
- }
-
- if (!dbus_message_append_args(m,
- DBUS_TYPE_STRING, &interface,
- DBUS_TYPE_INVALID)) {
- log_error("Could not append arguments to message.");
- r = -ENOMEM;
- goto finish;
- }
-
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
- if (!reply) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- r = -EIO;
- goto finish;
- }
if (!dbus_message_iter_init(reply, &iter) ||
dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY ||
@@ -1025,19 +963,14 @@ static int show_one(const char *verb, DBusConnection *bus, const char *path, boo
r = 0;
finish:
- if (m)
- dbus_message_unref(m);
-
if (reply)
dbus_message_unref(reply);
- dbus_error_free(&error);
-
return r;
}
static int show(DBusConnection *bus, char **args, unsigned n) {
- DBusMessage *m = NULL, *reply = NULL;
+ DBusMessage *reply = NULL;
int r, ret = 0;
DBusError error;
unsigned i;
@@ -1066,24 +999,16 @@ static int show(DBusConnection *bus, char **args, unsigned n) {
if (strstr(args[0], "session")) {
- m = dbus_message_new_method_call(
+ ret = bus_method_call_with_reply (
+ bus,
"org.freedesktop.login1",
"/org/freedesktop/login1",
"org.freedesktop.login1.Manager",
- "GetSession");
- if (!m) {
- log_error("Could not allocate message.");
- ret = -ENOMEM;
- goto finish;
- }
-
- if (!dbus_message_append_args(m,
- DBUS_TYPE_STRING, &args[i],
- DBUS_TYPE_INVALID)) {
- log_error("Could not append arguments to message.");
- ret = -ENOMEM;
- goto finish;
- }
+ "GetSession",
+ &reply,
+ NULL,
+ DBUS_TYPE_STRING, &args[i],
+ DBUS_TYPE_INVALID);
} else if (strstr(args[0], "user")) {
uid_t uid;
@@ -1095,53 +1020,32 @@ static int show(DBusConnection *bus, char **args, unsigned n) {
goto finish;
}
- m = dbus_message_new_method_call(
+ u = (uint32_t) uid;
+ ret = bus_method_call_with_reply (
+ bus,
"org.freedesktop.login1",
"/org/freedesktop/login1",
"org.freedesktop.login1.Manager",
- "GetUser");
- if (!m) {
- log_error("Could not allocate message.");
- ret = -ENOMEM;
- goto finish;
- }
-
- u = (uint32_t) uid;
- if (!dbus_message_append_args(m,
- DBUS_TYPE_UINT32, &u,
- DBUS_TYPE_INVALID)) {
- log_error("Could not append arguments to message.");
- ret = -ENOMEM;
- goto finish;
- }
+ "GetUser",
+ &reply,
+ NULL,
+ DBUS_TYPE_UINT32, &u,
+ DBUS_TYPE_INVALID);
} else {
- m = dbus_message_new_method_call(
+ ret = bus_method_call_with_reply (
+ bus,
"org.freedesktop.login1",
"/org/freedesktop/login1",
"org.freedesktop.login1.Manager",
- "GetSeat");
- if (!m) {
- log_error("Could not allocate message.");
- ret = -ENOMEM;
- goto finish;
- }
-
- if (!dbus_message_append_args(m,
- DBUS_TYPE_STRING, &args[i],
- DBUS_TYPE_INVALID)) {
- log_error("Could not append arguments to message.");
- ret = -ENOMEM;
- goto finish;
- }
+ "GetSeat",
+ &reply,
+ NULL,
+ DBUS_TYPE_STRING, &args[i],
+ DBUS_TYPE_INVALID);
}
-
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
- if (!reply) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- ret = -EIO;
+ if (ret)
goto finish;
- }
if (!dbus_message_get_args(reply, &error,
DBUS_TYPE_OBJECT_PATH, &path,
@@ -1155,15 +1059,11 @@ static int show(DBusConnection *bus, char **args, unsigned n) {
if (r != 0)
ret = r;
- dbus_message_unref(m);
dbus_message_unref(reply);
- m = reply = NULL;
+ reply = NULL;
}
finish:
- if (m)
- dbus_message_unref(m);
-
if (reply)
dbus_message_unref(reply);
@@ -1173,153 +1073,79 @@ finish:
}
static int activate(DBusConnection *bus, char **args, unsigned n) {
- DBusMessage *m = NULL;
int ret = 0;
- DBusError error;
unsigned i;
- assert(bus);
assert(args);
- dbus_error_init(&error);
-
for (i = 1; i < n; i++) {
- DBusMessage *reply;
- m = dbus_message_new_method_call(
+ ret = bus_method_call_with_reply (
+ bus,
"org.freedesktop.login1",
"/org/freedesktop/login1",
"org.freedesktop.login1.Manager",
streq(args[0], "lock-session") ? "LockSession" :
streq(args[0], "unlock-session") ? "UnlockSession" :
streq(args[0], "terminate-session") ? "TerminateSession" :
- "ActivateSession");
- if (!m) {
- log_error("Could not allocate message.");
- ret = -ENOMEM;
- goto finish;
- }
-
- if (!dbus_message_append_args(m,
- DBUS_TYPE_STRING, &args[i],
- DBUS_TYPE_INVALID)) {
- log_error("Could not append arguments to message.");
- ret = -ENOMEM;
+ "ActivateSession",
+ NULL,
+ NULL,
+ DBUS_TYPE_STRING, &args[i],
+ DBUS_TYPE_INVALID);
+ if (ret)
goto finish;
- }
-
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
- if (!reply) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- ret = -EIO;
- goto finish;
- }
-
- dbus_message_unref(m);
- dbus_message_unref(reply);
- m = reply = NULL;
}
finish:
- if (m)
- dbus_message_unref(m);
-
- dbus_error_free(&error);
-
return ret;
}
static int kill_session(DBusConnection *bus, char **args, unsigned n) {
- DBusMessage *m = NULL;
int ret = 0;
- DBusError error;
unsigned i;
- assert(bus);
assert(args);
- dbus_error_init(&error);
-
if (!arg_kill_who)
arg_kill_who = "all";
for (i = 1; i < n; i++) {
- DBusMessage *reply;
-
- m = dbus_message_new_method_call(
+ ret = bus_method_call_with_reply (
+ bus,
"org.freedesktop.login1",
"/org/freedesktop/login1",
"org.freedesktop.login1.Manager",
- "KillSession");
- if (!m) {
- log_error("Could not allocate message.");
- ret = -ENOMEM;
- goto finish;
- }
-
- if (!dbus_message_append_args(m,
- DBUS_TYPE_STRING, &args[i],
- DBUS_TYPE_STRING, &arg_kill_who,
- DBUS_TYPE_INT32, &arg_signal,
- DBUS_TYPE_INVALID)) {
- log_error("Could not append arguments to message.");
- ret = -ENOMEM;
+ "KillSession",
+ NULL,
+ NULL,
+ DBUS_TYPE_STRING, &args[i],
+ DBUS_TYPE_STRING, &arg_kill_who,
+ DBUS_TYPE_INT32, &arg_signal,
+ DBUS_TYPE_INVALID);
+ if (ret)
goto finish;
- }
-
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
- if (!reply) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- ret = -EIO;
- goto finish;
- }
-
- dbus_message_unref(m);
- dbus_message_unref(reply);
- m = reply = NULL;
}
finish:
- if (m)
- dbus_message_unref(m);
-
- dbus_error_free(&error);
-
return ret;
}
static int enable_linger(DBusConnection *bus, char **args, unsigned n) {
- DBusMessage *m = NULL;
int ret = 0;
- DBusError error;
unsigned i;
dbus_bool_t b, interactive = true;
- assert(bus);
assert(args);
- dbus_error_init(&error);
-
polkit_agent_open_if_enabled();
b = streq(args[0], "enable-linger");
for (i = 1; i < n; i++) {
- DBusMessage *reply;
uint32_t u;
uid_t uid;
- m = dbus_message_new_method_call(
- "org.freedesktop.login1",
- "/org/freedesktop/login1",
- "org.freedesktop.login1.Manager",
- "SetUserLinger");
- if (!m) {
- log_error("Could not allocate message.");
- ret = -ENOMEM;
- goto finish;
- }
-
ret = get_user_creds((const char**) (args+i), &uid, NULL, NULL, NULL);
if (ret < 0) {
log_error("Failed to resolve user %s: %s", args[i], strerror(-ret));
@@ -1327,65 +1153,35 @@ static int enable_linger(DBusConnection *bus, char **args, unsigned n) {
}
u = (uint32_t) uid;
- if (!dbus_message_append_args(m,
- DBUS_TYPE_UINT32, &u,
- DBUS_TYPE_BOOLEAN, &b,
- DBUS_TYPE_BOOLEAN, &interactive,
- DBUS_TYPE_INVALID)) {
- log_error("Could not append arguments to message.");
- ret = -ENOMEM;
- goto finish;
- }
-
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
- if (!reply) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- ret = -EIO;
+ ret = bus_method_call_with_reply (
+ bus,
+ "org.freedesktop.login1",
+ "/org/freedesktop/login1",
+ "org.freedesktop.login1.Manager",
+ "SetUserLinger",
+ NULL,
+ NULL,
+ DBUS_TYPE_UINT32, &u,
+ DBUS_TYPE_BOOLEAN, &b,
+ DBUS_TYPE_BOOLEAN, &interactive,
+ DBUS_TYPE_INVALID);
+ if (ret)
goto finish;
- }
-
- dbus_message_unref(m);
- dbus_message_unref(reply);
- m = reply = NULL;
}
- ret = 0;
-
finish:
- if (m)
- dbus_message_unref(m);
-
- dbus_error_free(&error);
-
return ret;
}
static int terminate_user(DBusConnection *bus, char **args, unsigned n) {
- DBusMessage *m = NULL;
int ret = 0;
- DBusError error;
unsigned i;
- assert(bus);
assert(args);
- dbus_error_init(&error);
-
for (i = 1; i < n; i++) {
uint32_t u;
uid_t uid;
- DBusMessage *reply;
-
- m = dbus_message_new_method_call(
- "org.freedesktop.login1",
- "/org/freedesktop/login1",
- "org.freedesktop.login1.Manager",
- "TerminateUser");
- if (!m) {
- log_error("Could not allocate message.");
- ret = -ENOMEM;
- goto finish;
- }
ret = get_user_creds((const char**) (args+i), &uid, NULL, NULL, NULL);
if (ret < 0) {
@@ -1394,67 +1190,37 @@ static int terminate_user(DBusConnection *bus, char **args, unsigned n) {
}
u = (uint32_t) uid;
- if (!dbus_message_append_args(m,
- DBUS_TYPE_UINT32, &u,
- DBUS_TYPE_INVALID)) {
- log_error("Could not append arguments to message.");
- ret = -ENOMEM;
- goto finish;
- }
-
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
- if (!reply) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- ret = -EIO;
+ ret = bus_method_call_with_reply (
+ bus,
+ "org.freedesktop.login1",
+ "/org/freedesktop/login1",
+ "org.freedesktop.login1.Manager",
+ "TerminateUser",
+ NULL,
+ NULL,
+ DBUS_TYPE_UINT32, &u,
+ DBUS_TYPE_INVALID);
+ if (ret)
goto finish;
- }
-
- dbus_message_unref(m);
- dbus_message_unref(reply);
- m = reply = NULL;
}
- ret = 0;
-
finish:
- if (m)
- dbus_message_unref(m);
-
- dbus_error_free(&error);
-
return ret;
}
static int kill_user(DBusConnection *bus, char **args, unsigned n) {
- DBusMessage *m = NULL;
int ret = 0;
- DBusError error;
unsigned i;
- assert(bus);
assert(args);
- dbus_error_init(&error);
-
if (!arg_kill_who)
arg_kill_who = "all";
for (i = 1; i < n; i++) {
- DBusMessage *reply;
uid_t uid;
uint32_t u;
- m = dbus_message_new_method_call(
- "org.freedesktop.login1",
- "/org/freedesktop/login1",
- "org.freedesktop.login1.Manager",
- "KillUser");
- if (!m) {
- log_error("Could not allocate message.");
- ret = -ENOMEM;
- goto finish;
- }
-
ret = get_user_creds((const char**) (args+i), &uid, NULL, NULL, NULL);
if (ret < 0) {
log_error("Failed to look up user %s: %s", args[i], strerror(-ret));
@@ -1462,241 +1228,110 @@ static int kill_user(DBusConnection *bus, char **args, unsigned n) {
}
u = (uint32_t) uid;
- if (!dbus_message_append_args(m,
- DBUS_TYPE_UINT32, &u,
- DBUS_TYPE_INT32, &arg_signal,
- DBUS_TYPE_INVALID)) {
- log_error("Could not append arguments to message.");
- ret = -ENOMEM;
- goto finish;
- }
-
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
- if (!reply) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- ret = -EIO;
+ ret = bus_method_call_with_reply (
+ bus,
+ "org.freedesktop.login1",
+ "/org/freedesktop/login1",
+ "org.freedesktop.login1.Manager",
+ "KillUser",
+ NULL,
+ NULL,
+ DBUS_TYPE_UINT32, &u,
+ DBUS_TYPE_INT32, &arg_signal,
+ DBUS_TYPE_INVALID);
+ if (ret)
goto finish;
- }
-
- dbus_message_unref(m);
- dbus_message_unref(reply);
- m = reply = NULL;
}
- ret = 0;
-
finish:
- if (m)
- dbus_message_unref(m);
-
- dbus_error_free(&error);
-
return ret;
}
static int attach(DBusConnection *bus, char **args, unsigned n) {
- DBusMessage *m = NULL;
int ret = 0;
- DBusError error;
unsigned i;
dbus_bool_t interactive = true;
- assert(bus);
assert(args);
- dbus_error_init(&error);
-
polkit_agent_open_if_enabled();
for (i = 2; i < n; i++) {
- DBusMessage *reply;
-
- m = dbus_message_new_method_call(
+ ret = bus_method_call_with_reply (
+ bus,
"org.freedesktop.login1",
"/org/freedesktop/login1",
"org.freedesktop.login1.Manager",
- "AttachDevice");
- if (!m) {
- log_error("Could not allocate message.");
- ret = -ENOMEM;
- goto finish;
- }
-
- if (!dbus_message_append_args(m,
- DBUS_TYPE_STRING, &args[1],
- DBUS_TYPE_STRING, &args[i],
- DBUS_TYPE_BOOLEAN, &interactive,
- DBUS_TYPE_INVALID)) {
- log_error("Could not append arguments to message.");
- ret = -ENOMEM;
- goto finish;
- }
-
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
- if (!reply) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- ret = -EIO;
+ "AttachDevice",
+ NULL,
+ NULL,
+ DBUS_TYPE_STRING, &args[1],
+ DBUS_TYPE_STRING, &args[i],
+ DBUS_TYPE_BOOLEAN, &interactive,
+ DBUS_TYPE_INVALID);
+ if (ret)
goto finish;
- }
-
- dbus_message_unref(m);
- dbus_message_unref(reply);
- m = reply = NULL;
}
finish:
- if (m)
- dbus_message_unref(m);
-
- dbus_error_free(&error);
-
return ret;
}
static int flush_devices(DBusConnection *bus, char **args, unsigned n) {
- DBusMessage *m = NULL, *reply = NULL;
- int ret = 0;
- DBusError error;
dbus_bool_t interactive = true;
- assert(bus);
assert(args);
- dbus_error_init(&error);
-
polkit_agent_open_if_enabled();
- m = dbus_message_new_method_call(
+ return bus_method_call_with_reply (
+ bus,
"org.freedesktop.login1",
"/org/freedesktop/login1",
"org.freedesktop.login1.Manager",
- "FlushDevices");
- if (!m) {
- log_error("Could not allocate message.");
- ret = -ENOMEM;
- goto finish;
- }
-
- if (!dbus_message_append_args(m,
- DBUS_TYPE_BOOLEAN, &interactive,
- DBUS_TYPE_INVALID)) {
- log_error("Could not append arguments to message.");
- ret = -ENOMEM;
- goto finish;
- }
-
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
- if (!reply) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- ret = -EIO;
- goto finish;
- }
-
-finish:
- if (m)
- dbus_message_unref(m);
-
- if (reply)
- dbus_message_unref(reply);
-
- dbus_error_free(&error);
-
- return ret;
+ "FlushDevices",
+ NULL,
+ NULL,
+ DBUS_TYPE_BOOLEAN, &interactive,
+ DBUS_TYPE_INVALID);
}
static int lock_sessions(DBusConnection *bus, char **args, unsigned n) {
- DBusMessage *m = NULL, *reply = NULL;
- int ret = 0;
- DBusError error;
-
- assert(bus);
- assert(args);
-
- dbus_error_init(&error);
-
polkit_agent_open_if_enabled();
- m = dbus_message_new_method_call(
+ return bus_method_call_with_reply (
+ bus,
"org.freedesktop.login1",
"/org/freedesktop/login1",
"org.freedesktop.login1.Manager",
- "LockSessions");
- if (!m) {
- log_error("Could not allocate message.");
- ret = -ENOMEM;
- goto finish;
- }
-
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
- if (!reply) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- ret = -EIO;
- goto finish;
- }
-
-finish:
- if (m)
- dbus_message_unref(m);
-
- if (reply)
- dbus_message_unref(reply);
-
- dbus_error_free(&error);
-
- return ret;
+ "LockSessions",
+ NULL,
+ NULL,
+ DBUS_TYPE_INVALID);
}
static int terminate_seat(DBusConnection *bus, char **args, unsigned n) {
- DBusMessage *m = NULL;
int ret = 0;
- DBusError error;
unsigned i;
- assert(bus);
assert(args);
- dbus_error_init(&error);
-
for (i = 1; i < n; i++) {
- DBusMessage *reply;
-
- m = dbus_message_new_method_call(
+ ret = bus_method_call_with_reply (
+ bus,
"org.freedesktop.login1",
"/org/freedesktop/login1",
"org.freedesktop.login1.Manager",
- "TerminateSeat");
- if (!m) {
- log_error("Could not allocate message.");
- ret = -ENOMEM;
- goto finish;
- }
-
- if (!dbus_message_append_args(m,
- DBUS_TYPE_STRING, &args[i],
- DBUS_TYPE_INVALID)) {
- log_error("Could not append arguments to message.");
- ret = -ENOMEM;
- goto finish;
- }
-
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
- if (!reply) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- ret = -EIO;
+ "TerminateSeat",
+ NULL,
+ NULL,
+ DBUS_TYPE_STRING, &args[i],
+ DBUS_TYPE_INVALID);
+ if (ret)
goto finish;
- }
-
- dbus_message_unref(m);
- dbus_message_unref(reply);
- m = reply = NULL;
}
finish:
- if (m)
- dbus_message_unref(m);
-
- dbus_error_free(&error);
-
return ret;
}
diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c
index 86ca654518..ae9671bb1e 100644
--- a/src/login/logind-dbus.c
+++ b/src/login/logind-dbus.c
@@ -968,36 +968,21 @@ static int have_multiple_sessions(
}
static int send_start_unit(DBusConnection *connection, const char *unit_name, DBusError *error) {
- DBusMessage *message, *reply;
const char *mode = "replace";
- assert(connection);
assert(unit_name);
- message = dbus_message_new_method_call(
+ return bus_method_call_with_reply (
+ connection,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
- "StartUnit");
- if (!message)
- return -ENOMEM;
-
- if (!dbus_message_append_args(message,
- DBUS_TYPE_STRING, &unit_name,
- DBUS_TYPE_STRING, &mode,
- DBUS_TYPE_INVALID)) {
- dbus_message_unref(message);
- return -ENOMEM;
- }
-
- reply = dbus_connection_send_with_reply_and_block(connection, message, -1, error);
- dbus_message_unref(message);
-
- if (!reply)
- return -EIO;
-
- dbus_message_unref(reply);
- return 0;
+ "StartUnit",
+ NULL,
+ NULL,
+ DBUS_TYPE_STRING, &unit_name,
+ DBUS_TYPE_STRING, &mode,
+ DBUS_TYPE_INVALID);
}
static int send_prepare_for(Manager *m, InhibitWhat w, bool _active) {
diff --git a/src/login/logind.c b/src/login/logind.c
index bae9a95f38..229af714f8 100644
--- a/src/login/logind.c
+++ b/src/login/logind.c
@@ -942,16 +942,12 @@ static int vt_is_busy(int vtnr) {
int manager_spawn_autovt(Manager *m, int vtnr) {
int r;
- DBusMessage *message = NULL, *reply = NULL;
char *name = NULL;
const char *mode = "fail";
- DBusError error;
assert(m);
assert(vtnr >= 1);
- dbus_error_init(&error);
-
if ((unsigned) vtnr > m->n_autovts)
return 0;
@@ -961,47 +957,26 @@ int manager_spawn_autovt(Manager *m, int vtnr) {
else if (r > 0)
return -EBUSY;
- message = dbus_message_new_method_call("org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", "StartUnit");
- if (!message) {
- log_error("Could not allocate message.");
- r = -ENOMEM;
- goto finish;
- }
-
if (asprintf(&name, "autovt@tty%i.service", vtnr) < 0) {
log_error("Could not allocate service name.");
r = -ENOMEM;
goto finish;
}
-
- if (!dbus_message_append_args(message,
- DBUS_TYPE_STRING, &name,
- DBUS_TYPE_STRING, &mode,
- DBUS_TYPE_INVALID)) {
- log_error("Could not attach target and flag information to message.");
- r = -ENOMEM;
- goto finish;
- }
-
- reply = dbus_connection_send_with_reply_and_block(m->bus, message, -1, &error);
- if (!reply) {
- log_error("Failed to start unit: %s", bus_error_message(&error));
- goto finish;
- }
-
- r = 0;
+ r = bus_method_call_with_reply (
+ m->bus,
+ "org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1",
+ "org.freedesktop.systemd1.Manager",
+ "StartUnit",
+ NULL,
+ NULL,
+ DBUS_TYPE_STRING, &name,
+ DBUS_TYPE_STRING, &mode,
+ DBUS_TYPE_INVALID);
finish:
free(name);
- if (message)
- dbus_message_unref(message);
-
- if (reply)
- dbus_message_unref(reply);
-
- dbus_error_free(&error);
-
return r;
}
diff --git a/src/shared/dbus-common.c b/src/shared/dbus-common.c
index 5d64568c34..7f0dce5ad3 100644
--- a/src/shared/dbus-common.c
+++ b/src/shared/dbus-common.c
@@ -1237,3 +1237,76 @@ finish:
return (pid_t) pid;
}
+
+bool bus_error_is_no_service(const DBusError *error) {
+ assert(error);
+
+ if (!dbus_error_is_set(error))
+ return false;
+
+ if (dbus_error_has_name(error, DBUS_ERROR_NAME_HAS_NO_OWNER))
+ return true;
+
+ if (dbus_error_has_name(error, DBUS_ERROR_SERVICE_UNKNOWN))
+ return true;
+
+ return startswith(error->name, "org.freedesktop.DBus.Error.Spawn.");
+}
+
+int bus_method_call_with_reply(DBusConnection *bus,
+ const char *destination,
+ const char *path,
+ const char *interface,
+ const char *method,
+ DBusMessage **return_reply,
+ DBusError *return_error,
+ int first_arg_type, ...) {
+ DBusError error;
+ DBusMessage *m, *reply;
+ va_list ap;
+ int r = 0;
+
+ dbus_error_init(&error);
+ assert(bus);
+
+ m = dbus_message_new_method_call(destination, path, interface, method);
+ if (!m) {
+ r = log_oom();
+ goto finish;
+ }
+
+ va_start(ap, first_arg_type);
+ if (!dbus_message_append_args_valist(m, first_arg_type, ap)) {
+ va_end(ap);
+ dbus_message_unref(m);
+ r = log_oom();
+ goto finish;
+ }
+ va_end(ap);
+
+ reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
+ dbus_message_unref(m);
+ if (!reply) {
+ log_error("Failed to issue method call: %s", bus_error_message(&error));
+ if (bus_error_is_no_service(&error))
+ r = -ENOENT;
+ else if (dbus_error_has_name(&error, DBUS_ERROR_ACCESS_DENIED))
+ r = -EACCES;
+ else if (dbus_error_has_name(&error, DBUS_ERROR_NO_REPLY))
+ r = -ETIMEDOUT;
+ else
+ r = -EIO;
+ goto finish;
+ }
+ if (return_reply)
+ *return_reply = reply;
+ else
+ dbus_message_unref(reply);
+finish:
+ if(return_error)
+ *return_error=error;
+ else
+ dbus_error_free(&error);
+
+ return r;
+}
diff --git a/src/shared/dbus-common.h b/src/shared/dbus-common.h
index a6703a78d0..e49c3b5258 100644
--- a/src/shared/dbus-common.h
+++ b/src/shared/dbus-common.h
@@ -203,3 +203,13 @@ void bus_async_unregister_and_exit(DBusConnection *bus, const char *name);
DBusHandlerResult bus_exit_idle_filter(DBusConnection *bus, DBusMessage *m, void *userdata);
pid_t bus_get_unix_process_id(DBusConnection *connection, const char *name, DBusError *error);
+
+bool bus_error_is_no_service(const DBusError *error);
+int bus_method_call_with_reply(DBusConnection *bus,
+ const char *destination,
+ const char *path,
+ const char *interface,
+ const char *method,
+ DBusMessage **return_reply,
+ DBusError *return_error,
+ int first_arg_type, ...);
diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
index 00cd252351..2e0aaaa9fa 100644
--- a/src/systemctl/systemctl.c
+++ b/src/systemctl/systemctl.c
@@ -202,21 +202,6 @@ static const char *ansi_highlight_green(bool b) {
return b ? ANSI_HIGHLIGHT_GREEN_ON : ANSI_HIGHLIGHT_OFF;
}
-static bool error_is_no_service(const DBusError *error) {
- assert(error);
-
- if (!dbus_error_is_set(error))
- return false;
-
- if (dbus_error_has_name(error, DBUS_ERROR_NAME_HAS_NO_OWNER))
- return true;
-
- if (dbus_error_has_name(error, DBUS_ERROR_SERVICE_UNKNOWN))
- return true;
-
- return startswith(error->name, "org.freedesktop.DBus.Error.Spawn.");
-}
-
static int translate_bus_error_to_exit_status(int r, const DBusError *error) {
assert(error);
@@ -448,33 +433,25 @@ static void output_units_list(const struct unit_info *unit_infos, unsigned c) {
}
static int list_units(DBusConnection *bus, char **args) {
- DBusMessage *m = NULL, *reply = NULL;
- DBusError error;
+ DBusMessage *reply = NULL;
int r;
DBusMessageIter iter, sub, sub2;
unsigned c = 0, n_units = 0;
struct unit_info *unit_infos = NULL;
- dbus_error_init(&error);
-
- assert(bus);
-
pager_open_if_enabled();
- if (!(m = dbus_message_new_method_call(
- "org.freedesktop.systemd1",
- "/org/freedesktop/systemd1",
- "org.freedesktop.systemd1.Manager",
- "ListUnits"))) {
- log_error("Could not allocate message.");
- return -ENOMEM;
- }
-
- if (!(reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error))) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- r = -EIO;
+ r = bus_method_call_with_reply (
+ bus,
+ "org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1",
+ "org.freedesktop.systemd1.Manager",
+ "ListUnits",
+ &reply,
+ NULL,
+ DBUS_TYPE_INVALID);
+ if (r)
goto finish;
- }
if (!dbus_message_iter_init(reply, &iter) ||
dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY ||
@@ -538,19 +515,12 @@ static int list_units(DBusConnection *bus, char **args) {
output_units_list(unit_infos, c);
}
- r = 0;
-
finish:
- if (m)
- dbus_message_unref(m);
-
if (reply)
dbus_message_unref(reply);
free(unit_infos);
- dbus_error_free(&error);
-
return r;
}
@@ -641,15 +611,12 @@ static void output_unit_file_list(const UnitFileList *units, unsigned c) {
}
static int list_unit_files(DBusConnection *bus, char **args) {
- DBusMessage *m = NULL, *reply = NULL;
- DBusError error;
+ DBusMessage *reply = NULL;
int r;
DBusMessageIter iter, sub, sub2;
unsigned c = 0, n_units = 0;
UnitFileList *units = NULL;
- dbus_error_init(&error);
-
pager_open_if_enabled();
if (avoid_bus()) {
@@ -682,24 +649,17 @@ static int list_unit_files(DBusConnection *bus, char **args) {
hashmap_free(h);
} else {
- assert(bus);
-
- m = dbus_message_new_method_call(
+ r = bus_method_call_with_reply (
+ bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
- "ListUnitFiles");
- if (!m) {
- log_error("Could not allocate message.");
- return -ENOMEM;
- }
-
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
- if (!reply) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- r = -EIO;
+ "ListUnitFiles",
+ &reply,
+ NULL,
+ DBUS_TYPE_INVALID);
+ if (r)
goto finish;
- }
if (!dbus_message_iter_init(reply, &iter) ||
dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY ||
@@ -762,16 +722,11 @@ static int list_unit_files(DBusConnection *bus, char **args) {
r = 0;
finish:
- if (m)
- dbus_message_unref(m);
-
if (reply)
dbus_message_unref(reply);
free(units);
- dbus_error_free(&error);
-
return r;
}
@@ -834,40 +789,25 @@ static int dot_one_property(const char *name, const char *prop, DBusMessageIter
}
static int dot_one(DBusConnection *bus, const char *name, const char *path) {
- DBusMessage *m = NULL, *reply = NULL;
+ DBusMessage *reply = NULL;
const char *interface = "org.freedesktop.systemd1.Unit";
int r;
- DBusError error;
DBusMessageIter iter, sub, sub2, sub3;
- assert(bus);
assert(path);
- dbus_error_init(&error);
-
- if (!(m = dbus_message_new_method_call(
- "org.freedesktop.systemd1",
- path,
- "org.freedesktop.DBus.Properties",
- "GetAll"))) {
- log_error("Could not allocate message.");
- r = -ENOMEM;
- goto finish;
- }
-
- if (!dbus_message_append_args(m,
- DBUS_TYPE_STRING, &interface,
- DBUS_TYPE_INVALID)) {
- log_error("Could not append arguments to message.");
- r = -ENOMEM;
- goto finish;
- }
-
- if (!(reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error))) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- r = -EIO;
+ r = bus_method_call_with_reply (
+ bus,
+ "org.freedesktop.systemd1",
+ path,
+ "org.freedesktop.DBus.Properties",
+ "GetAll",
+ &reply,
+ NULL,
+ DBUS_TYPE_STRING, &interface,
+ DBUS_TYPE_INVALID);
+ if (r)
goto finish;
- }
if (!dbus_message_iter_init(reply, &iter) ||
dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY ||
@@ -913,44 +853,29 @@ static int dot_one(DBusConnection *bus, const char *name, const char *path) {
dbus_message_iter_next(&sub);
}
- r = 0;
-
finish:
- if (m)
- dbus_message_unref(m);
-
if (reply)
dbus_message_unref(reply);
- dbus_error_free(&error);
-
return r;
}
static int dot(DBusConnection *bus, char **args) {
- DBusMessage *m = NULL, *reply = NULL;
- DBusError error;
+ DBusMessage *reply = NULL;
int r;
DBusMessageIter iter, sub, sub2;
- dbus_error_init(&error);
-
- assert(bus);
-
- if (!(m = dbus_message_new_method_call(
- "org.freedesktop.systemd1",
- "/org/freedesktop/systemd1",
- "org.freedesktop.systemd1.Manager",
- "ListUnits"))) {
- log_error("Could not allocate message.");
- return -ENOMEM;
- }
-
- if (!(reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error))) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- r = -EIO;
+ r = bus_method_call_with_reply (
+ bus,
+ "org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1",
+ "org.freedesktop.systemd1.Manager",
+ "ListUnits",
+ &reply,
+ NULL,
+ DBUS_TYPE_INVALID);
+ if (r)
goto finish;
- }
if (!dbus_message_iter_init(reply, &iter) ||
dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY ||
@@ -1008,44 +933,31 @@ static int dot(DBusConnection *bus, char **args) {
r = 0;
finish:
- if (m)
- dbus_message_unref(m);
-
if (reply)
dbus_message_unref(reply);
- dbus_error_free(&error);
-
return r;
}
static int list_jobs(DBusConnection *bus, char **args) {
- DBusMessage *m = NULL, *reply = NULL;
- DBusError error;
+ DBusMessage *reply = NULL;
int r;
DBusMessageIter iter, sub, sub2;
unsigned k = 0;
- dbus_error_init(&error);
-
- assert(bus);
-
pager_open_if_enabled();
- if (!(m = dbus_message_new_method_call(
- "org.freedesktop.systemd1",
- "/org/freedesktop/systemd1",
- "org.freedesktop.systemd1.Manager",
- "ListJobs"))) {
- log_error("Could not allocate message.");
- return -ENOMEM;
- }
-
- if (!(reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error))) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- r = -EIO;
+ r = bus_method_call_with_reply (
+ bus,
+ "org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1",
+ "org.freedesktop.systemd1.Manager",
+ "ListJobs",
+ &reply,
+ NULL,
+ DBUS_TYPE_INVALID);
+ if (r)
goto finish;
- }
if (!dbus_message_iter_init(reply, &iter) ||
dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY ||
@@ -1099,87 +1011,44 @@ static int list_jobs(DBusConnection *bus, char **args) {
r = 0;
finish:
- if (m)
- dbus_message_unref(m);
-
if (reply)
dbus_message_unref(reply);
- dbus_error_free(&error);
-
return r;
}
static int load_unit(DBusConnection *bus, char **args) {
- DBusMessage *m = NULL;
- DBusError error;
- int r;
- char **name;
-
- dbus_error_init(&error);
+ int r = 0;
+ char **name, *n;
- assert(bus);
assert(args);
STRV_FOREACH(name, args+1) {
- DBusMessage *reply;
- bool b;
- char *n;
-
- if (!(m = dbus_message_new_method_call(
- "org.freedesktop.systemd1",
- "/org/freedesktop/systemd1",
- "org.freedesktop.systemd1.Manager",
- "LoadUnit"))) {
- log_error("Could not allocate message.");
- r = -ENOMEM;
- goto finish;
- }
-
n = unit_name_mangle(*name);
- b = dbus_message_append_args(m,
- DBUS_TYPE_STRING, n ? &n : name,
- DBUS_TYPE_INVALID);
+ r = bus_method_call_with_reply (
+ bus,
+ "org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1",
+ "org.freedesktop.systemd1.Manager",
+ "LoadUnit",
+ NULL,
+ NULL,
+ DBUS_TYPE_STRING, n ? &n : name,
+ DBUS_TYPE_INVALID);
free(n);
- if (!b) {
- log_error("Could not append arguments to message.");
- r = -ENOMEM;
- goto finish;
- }
-
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
- if (!reply) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- r = -EIO;
+ if (r)
goto finish;
- }
-
- dbus_message_unref(m);
- dbus_message_unref(reply);
-
- m = reply = NULL;
}
- r = 0;
-
finish:
- if (m)
- dbus_message_unref(m);
-
- dbus_error_free(&error);
-
return r;
}
static int cancel_job(DBusConnection *bus, char **args) {
- DBusMessage *m = NULL, *reply = NULL;
- DBusError error;
- int r;
+ DBusMessage *reply = NULL;
+ int r = 0;
char **name;
- dbus_error_init(&error);
-
- assert(bus);
assert(args);
if (strv_length(args) <= 1)
@@ -1189,83 +1058,55 @@ static int cancel_job(DBusConnection *bus, char **args) {
unsigned id;
const char *path;
- if (!(m = dbus_message_new_method_call(
- "org.freedesktop.systemd1",
- "/org/freedesktop/systemd1",
- "org.freedesktop.systemd1.Manager",
- "GetJob"))) {
- log_error("Could not allocate message.");
- r = -ENOMEM;
- goto finish;
- }
-
- if ((r = safe_atou(*name, &id)) < 0) {
+ r = safe_atou(*name, &id);
+ if (r < 0) {
log_error("Failed to parse job id: %s", strerror(-r));
goto finish;
}
-
assert_cc(sizeof(uint32_t) == sizeof(id));
- if (!dbus_message_append_args(m,
- DBUS_TYPE_UINT32, &id,
- DBUS_TYPE_INVALID)) {
- log_error("Could not append arguments to message.");
- r = -ENOMEM;
- goto finish;
- }
- if (!(reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error))) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- r = -EIO;
+ r = bus_method_call_with_reply (
+ bus,
+ "org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1",
+ "org.freedesktop.systemd1.Manager",
+ "GetJob",
+ &reply,
+ NULL,
+ DBUS_TYPE_UINT32, &id,
+ DBUS_TYPE_INVALID);
+ if (r)
goto finish;
- }
- if (!dbus_message_get_args(reply, &error,
+ if (!dbus_message_get_args(reply, NULL,
DBUS_TYPE_OBJECT_PATH, &path,
DBUS_TYPE_INVALID)) {
- log_error("Failed to parse reply: %s", bus_error_message(&error));
+ log_error("Failed to parse reply");
+ dbus_message_unref(reply);
r = -EIO;
goto finish;
}
-
- dbus_message_unref(m);
- if (!(m = dbus_message_new_method_call(
- "org.freedesktop.systemd1",
- path,
- "org.freedesktop.systemd1.Job",
- "Cancel"))) {
- log_error("Could not allocate message.");
- r = -ENOMEM;
- goto finish;
- }
-
dbus_message_unref(reply);
- if (!(reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error))) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- r = -EIO;
- goto finish;
- }
- dbus_message_unref(m);
- dbus_message_unref(reply);
- m = reply = NULL;
+ r = bus_method_call_with_reply (
+ bus,
+ "org.freedesktop.systemd1",
+ path,
+ "org.freedesktop.systemd1.Job",
+ "Cancel",
+ NULL,
+ NULL,
+ DBUS_TYPE_INVALID);
+ if (r)
+ goto finish;
}
- r = 0;
-
finish:
- if (m)
- dbus_message_unref(m);
-
- if (reply)
- dbus_message_unref(reply);
-
- dbus_error_free(&error);
-
return r;
}
static bool need_daemon_reload(DBusConnection *bus, const char *unit) {
- DBusMessage *m = NULL, *reply = NULL;
+ DBusMessage *reply = NULL;
dbus_bool_t b = FALSE;
DBusMessageIter iter, sub;
const char
@@ -1273,28 +1114,23 @@ static bool need_daemon_reload(DBusConnection *bus, const char *unit) {
*property = "NeedDaemonReload",
*path;
char *n;
- bool k;
+ int r;
/* We ignore all errors here, since this is used to show a warning only */
- m = dbus_message_new_method_call(
- "org.freedesktop.systemd1",
- "/org/freedesktop/systemd1",
- "org.freedesktop.systemd1.Manager",
- "GetUnit");
- if (!m)
- goto finish;
-
n = unit_name_mangle(unit);
- k = dbus_message_append_args(m,
- DBUS_TYPE_STRING, n ? (const char**) &n : &unit,
- DBUS_TYPE_INVALID);
+ r = bus_method_call_with_reply (
+ bus,
+ "org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1",
+ "org.freedesktop.systemd1.Manager",
+ "GetUnit",
+ &reply,
+ NULL,
+ DBUS_TYPE_STRING, n ? (const char**) &n : &unit,
+ DBUS_TYPE_INVALID);
free(n);
- if (!k)
- goto finish;
-
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, NULL);
- if (!reply)
+ if (r)
goto finish;
if (!dbus_message_get_args(reply, NULL,
@@ -1302,25 +1138,19 @@ static bool need_daemon_reload(DBusConnection *bus, const char *unit) {
DBUS_TYPE_INVALID))
goto finish;
- dbus_message_unref(m);
- m = dbus_message_new_method_call(
+ dbus_message_unref(reply);
+ r = bus_method_call_with_reply (
+ bus,
"org.freedesktop.systemd1",
path,
"org.freedesktop.DBus.Properties",
- "Get");
- if (!m)
- goto finish;
-
- if (!dbus_message_append_args(m,
- DBUS_TYPE_STRING, &interface,
- DBUS_TYPE_STRING, &property,
- DBUS_TYPE_INVALID)) {
- goto finish;
- }
-
- dbus_message_unref(reply);
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, NULL);
- if (!reply)
+ "Get",
+ &reply,
+ NULL,
+ DBUS_TYPE_STRING, &interface,
+ DBUS_TYPE_STRING, &property,
+ DBUS_TYPE_INVALID);
+ if (r)
goto finish;
if (!dbus_message_iter_init(reply, &iter) ||
@@ -1335,9 +1165,6 @@ static bool need_daemon_reload(DBusConnection *bus, const char *unit) {
dbus_message_iter_get_basic(&sub, &b);
finish:
- if (m)
- dbus_message_unref(m);
-
if (reply)
dbus_message_unref(reply);
@@ -1516,90 +1343,58 @@ finish:
}
static int check_one_unit(DBusConnection *bus, char *name, bool quiet) {
- DBusMessage *m = NULL, *reply = NULL;
- DBusError error;
+ DBusMessage *reply = NULL;
DBusMessageIter iter, sub;
const char
*interface = "org.freedesktop.systemd1.Unit",
*property = "ActiveState";
const char *path = NULL;
const char *state;
- int r = 3; /* According to LSB: "program is not running" */
+ int r;
char *n;
- bool b;
- assert(bus);
assert(name);
- dbus_error_init(&error);
-
- m = dbus_message_new_method_call(
- "org.freedesktop.systemd1",
- "/org/freedesktop/systemd1",
- "org.freedesktop.systemd1.Manager",
- "GetUnit");
- if (!m) {
- log_error("Could not allocate message.");
- r = -ENOMEM;
- goto finish;
- }
-
n = unit_name_mangle(name);
- b = dbus_message_append_args(m,
- DBUS_TYPE_STRING, n ? &n : &name,
- DBUS_TYPE_INVALID);
+ r = bus_method_call_with_reply (
+ bus,
+ "org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1",
+ "org.freedesktop.systemd1.Manager",
+ "GetUnit",
+ &reply,
+ NULL,
+ DBUS_TYPE_STRING, n ? &n : &name,
+ DBUS_TYPE_INVALID);
free(n);
- if (!b) {
- log_error("Could not append arguments to message.");
- r = -ENOMEM;
- goto finish;
- }
-
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
- if (!reply) {
- /* Hmm, cannot figure out anything about this unit... */
- if (!quiet)
+ if (r) {
+ if ((r != -ENOMEM) && (!quiet))
puts("unknown");
-
goto finish;
}
- if (!dbus_message_get_args(reply, &error,
+ if (!dbus_message_get_args(reply, NULL,
DBUS_TYPE_OBJECT_PATH, &path,
DBUS_TYPE_INVALID)) {
- log_error("Failed to parse reply: %s", bus_error_message(&error));
+ log_error("Failed to parse reply.");
r = -EIO;
goto finish;
}
- dbus_message_unref(m);
- m = dbus_message_new_method_call(
- "org.freedesktop.systemd1",
- path,
- "org.freedesktop.DBus.Properties",
- "Get");
- if (!m) {
- log_error("Could not allocate message.");
- r = -ENOMEM;
- goto finish;
- }
-
- if (!dbus_message_append_args(m,
- DBUS_TYPE_STRING, &interface,
- DBUS_TYPE_STRING, &property,
- DBUS_TYPE_INVALID)) {
- log_error("Could not append arguments to message.");
- r = -ENOMEM;
- goto finish;
- }
-
dbus_message_unref(reply);
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
- if (!reply) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- r = -EIO;
+ r = bus_method_call_with_reply (
+ bus,
+ "org.freedesktop.systemd1",
+ path,
+ "org.freedesktop.DBus.Properties",
+ "Get",
+ &reply,
+ NULL,
+ DBUS_TYPE_STRING, &interface,
+ DBUS_TYPE_STRING, &property,
+ DBUS_TYPE_INVALID);
+ if (r)
goto finish;
- }
if (!dbus_message_iter_init(reply, &iter) ||
dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT) {
@@ -1623,16 +1418,13 @@ static int check_one_unit(DBusConnection *bus, char *name, bool quiet) {
if (streq(state, "active") || streq(state, "reloading"))
r = 0;
+ else
+ r = 3; /* According to LSB: "program is not running" */
finish:
- if (m)
- dbus_message_unref(m);
-
if (reply)
dbus_message_unref(reply);
- dbus_error_free(&error);
-
return r;
}
@@ -1640,8 +1432,7 @@ static void check_triggering_units(
DBusConnection *bus,
const char *unit_name) {
- DBusError error;
- DBusMessage *m = NULL, *reply = NULL;
+ DBusMessage *reply = NULL;
DBusMessageIter iter, sub;
char *service_trigger = NULL;
const char *interface = "org.freedesktop.systemd1.Unit",
@@ -1649,8 +1440,7 @@ static void check_triggering_units(
char *unit_path = NULL, *n = NULL;
bool print_warning_label = true;
-
- dbus_error_init(&error);
+ int r;
n = unit_name_mangle(unit_name);
unit_path = unit_dbus_path_from_name(n ? n : unit_name);
@@ -1660,32 +1450,23 @@ static void check_triggering_units(
goto finish;
}
- m = dbus_message_new_method_call("org.freedesktop.systemd1",
- unit_path,
- "org.freedesktop.DBus.Properties",
- "Get");
- if (!m) {
- log_error("Could not allocate message.");
- goto finish;
- }
-
- if (!dbus_message_append_args(m,
- DBUS_TYPE_STRING, &interface,
- DBUS_TYPE_STRING, &triggered_by_property,
- DBUS_TYPE_INVALID)) {
- log_error("Could not append arguments to message.");
- goto finish;
- }
-
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
- if (!reply) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
+ r = bus_method_call_with_reply (
+ bus,
+ "org.freedesktop.systemd1",
+ unit_path,
+ "org.freedesktop.DBus.Properties",
+ "Get",
+ &reply,
+ NULL,
+ DBUS_TYPE_STRING, &interface,
+ DBUS_TYPE_STRING, &triggered_by_property,
+ DBUS_TYPE_INVALID);
+ if (r)
goto finish;
- }
if (!dbus_message_iter_init(reply, &iter) ||
dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT) {
- log_error("Failed to parse reply: %s", bus_error_message(&error));
+ log_error("Failed to parse reply.");
goto finish;
}
@@ -1695,10 +1476,9 @@ static void check_triggering_units(
sub = iter;
while (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_INVALID) {
- int r;
if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_STRING) {
- log_error("Failed to parse reply: %s", bus_error_message(&error));
+ log_error("Failed to parse reply.");
goto finish;
}
@@ -1718,14 +1498,9 @@ static void check_triggering_units(
dbus_message_iter_next(&sub);
}
finish:
- if (m)
- dbus_message_unref(m);
-
if (reply)
dbus_message_unref(reply);
- dbus_error_free(&error);
-
free(unit_path);
}
@@ -1737,54 +1512,36 @@ static int start_unit_one(
DBusError *error,
Set *s) {
- DBusMessage *m = NULL, *reply = NULL;
+ DBusMessage *reply = NULL;
const char *path;
int r;
char *n;
- bool b;
- assert(bus);
assert(method);
assert(name);
assert(mode);
assert(error);
assert(arg_no_block || s);
- m = dbus_message_new_method_call(
+ n = unit_name_mangle(name);
+ r = bus_method_call_with_reply (
+ bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
- method);
- if (!m) {
- log_error("Could not allocate message.");
- r = -ENOMEM;
- goto finish;
- }
-
- n = unit_name_mangle(name);
- b = dbus_message_append_args(m,
- DBUS_TYPE_STRING, n ? (const char **) &n : &name,
- DBUS_TYPE_STRING, &mode,
- DBUS_TYPE_INVALID);
+ method,
+ &reply,
+ error,
+ DBUS_TYPE_STRING, n ? (const char **) &n : &name,
+ DBUS_TYPE_STRING, &mode,
+ DBUS_TYPE_INVALID);
free(n);
- if (!b) {
- log_error("Could not append arguments to message.");
- r = -ENOMEM;
- goto finish;
- }
-
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, error);
- if (!reply) {
-
- if (arg_action != ACTION_SYSTEMCTL && error_is_no_service(error)) {
+ if (r) {
+ if (r == -ENOENT && arg_action != ACTION_SYSTEMCTL ) {
/* There's always a fallback possible for
* legacy actions. */
r = -EADDRNOTAVAIL;
- goto finish;
}
-
- log_error("Failed to issue method call: %s", bus_error_message(error));
- r = -EIO;
goto finish;
}
@@ -1824,9 +1581,6 @@ static int start_unit_one(
r = 0;
finish:
- if (m)
- dbus_message_unref(m);
-
if (reply)
dbus_message_unref(reply);
@@ -1974,12 +1728,7 @@ finish:
static int reboot_with_logind(DBusConnection *bus, enum action a) {
#ifdef HAVE_LOGIND
const char *method;
- DBusMessage *m = NULL, *reply = NULL;
- DBusError error;
dbus_bool_t interactive = true;
- int r;
-
- dbus_error_init(&error);
polkit_agent_open_if_enabled();
@@ -2005,56 +1754,16 @@ static int reboot_with_logind(DBusConnection *bus, enum action a) {
return -EINVAL;
}
- m = dbus_message_new_method_call(
- "org.freedesktop.login1",
- "/org/freedesktop/login1",
- "org.freedesktop.login1.Manager",
- method);
- if (!m) {
- log_error("Could not allocate message.");
- r = -ENOMEM;
- goto finish;
- }
-
- if (!dbus_message_append_args(m,
- DBUS_TYPE_BOOLEAN, &interactive,
- DBUS_TYPE_INVALID)) {
- log_error("Could not append arguments to message.");
- r = -ENOMEM;
- goto finish;
- }
-
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
- if (!reply) {
- if (error_is_no_service(&error)) {
- log_debug("Failed to issue method call: %s", bus_error_message(&error));
- r = -ENOENT;
- goto finish;
- }
-
- if (dbus_error_has_name(&error, DBUS_ERROR_ACCESS_DENIED)) {
- log_debug("Failed to issue method call: %s", bus_error_message(&error));
- r = -EACCES;
- goto finish;
- }
-
- log_info("Failed to issue method call: %s", bus_error_message(&error));
- r = -EIO;
- goto finish;
- }
-
- r = 0;
-
-finish:
- if (m)
- dbus_message_unref(m);
-
- if (reply)
- dbus_message_unref(reply);
-
- dbus_error_free(&error);
-
- return r;
+ return bus_method_call_with_reply (
+ bus,
+ "org.freedesktop.login1",
+ "/org/freedesktop/login1",
+ "org.freedesktop.login1.Manager",
+ method,
+ NULL,
+ NULL,
+ DBUS_TYPE_BOOLEAN, &interactive,
+ DBUS_TYPE_INVALID);
#else
return -ENOSYS;
#endif
@@ -2124,69 +1833,33 @@ static int check_unit(DBusConnection *bus, char **args) {
}
static int kill_unit(DBusConnection *bus, char **args) {
- DBusMessage *m = NULL;
int r = 0;
- DBusError error;
- char **name;
+ char **name, *n;
- assert(bus);
assert(args);
- dbus_error_init(&error);
-
if (!arg_kill_who)
arg_kill_who = "all";
STRV_FOREACH(name, args+1) {
- DBusMessage *reply;
- char *n;
- bool b;
-
- m = dbus_message_new_method_call(
+ n = unit_name_mangle(*name);
+ r = bus_method_call_with_reply (
+ bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
- "KillUnit");
- if (!m) {
- log_error("Could not allocate message.");
- r = -ENOMEM;
- goto finish;
- }
-
- n = unit_name_mangle(*name);
- b = dbus_message_append_args(m,
- DBUS_TYPE_STRING, n ? &n : name,
- DBUS_TYPE_STRING, &arg_kill_who,
- DBUS_TYPE_INT32, &arg_signal,
- DBUS_TYPE_INVALID);
+ "KillUnit",
+ NULL,
+ NULL,
+ DBUS_TYPE_STRING, n ? &n : name,
+ DBUS_TYPE_STRING, &arg_kill_who,
+ DBUS_TYPE_INT32, &arg_signal,
+ DBUS_TYPE_INVALID);
free(n);
- if (!b) {
- log_error("Could not append arguments to message.");
- r = -ENOMEM;
- goto finish;
- }
-
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
- if (!reply) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- dbus_error_free(&error);
- r = -EIO;
- }
-
- dbus_message_unref(m);
-
- if (reply)
- dbus_message_unref(reply);
- m = reply = NULL;
+ if (r)
+ return r;
}
-
-finish:
- if (m)
- dbus_message_unref(m);
-
- dbus_error_free(&error);
-
- return r;
+ return 0;
}
typedef struct ExecStatusInfo {
@@ -3070,44 +2743,30 @@ static int print_property(const char *name, DBusMessageIter *iter) {
}
static int show_one(const char *verb, DBusConnection *bus, const char *path, bool show_properties, bool *new_line) {
- DBusMessage *m = NULL, *reply = NULL;
+ DBusMessage *reply = NULL;
const char *interface = "";
int r;
- DBusError error;
DBusMessageIter iter, sub, sub2, sub3;
UnitStatusInfo info;
ExecStatusInfo *p;
- assert(bus);
assert(path);
assert(new_line);
zero(info);
- dbus_error_init(&error);
-
- if (!(m = dbus_message_new_method_call(
- "org.freedesktop.systemd1",
- path,
- "org.freedesktop.DBus.Properties",
- "GetAll"))) {
- log_error("Could not allocate message.");
- r = -ENOMEM;
- goto finish;
- }
-
- if (!dbus_message_append_args(m,
- DBUS_TYPE_STRING, &interface,
- DBUS_TYPE_INVALID)) {
- log_error("Could not append arguments to message.");
- r = -ENOMEM;
- goto finish;
- }
- if (!(reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error))) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- r = -EIO;
+ r = bus_method_call_with_reply (
+ bus,
+ "org.freedesktop.systemd1",
+ path,
+ "org.freedesktop.DBus.Properties",
+ "GetAll",
+ &reply,
+ NULL,
+ DBUS_TYPE_STRING, &interface,
+ DBUS_TYPE_INVALID);
+ if (r)
goto finish;
- }
if (!dbus_message_iter_init(reply, &iter) ||
dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY ||
@@ -3186,50 +2845,32 @@ static int show_one(const char *verb, DBusConnection *bus, const char *path, boo
}
finish:
- if (m)
- dbus_message_unref(m);
-
if (reply)
dbus_message_unref(reply);
- dbus_error_free(&error);
-
return r;
}
static int show_one_by_pid(const char *verb, DBusConnection *bus, uint32_t pid, bool *new_line) {
- DBusMessage *m = NULL, *reply = NULL;
+ DBusMessage *reply = NULL;
const char *path = NULL;
DBusError error;
int r;
dbus_error_init(&error);
- m = dbus_message_new_method_call(
- "org.freedesktop.systemd1",
- "/org/freedesktop/systemd1",
- "org.freedesktop.systemd1.Manager",
- "GetUnitByPID");
- if (!m) {
- log_error("Could not allocate message.");
- r = -ENOMEM;
- goto finish;
- }
-
- if (!dbus_message_append_args(m,
- DBUS_TYPE_UINT32, &pid,
- DBUS_TYPE_INVALID)) {
- log_error("Could not append arguments to message.");
- r = -ENOMEM;
- goto finish;
- }
-
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
- if (!reply) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- r = -EIO;
+ r = bus_method_call_with_reply (
+ bus,
+ "org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1",
+ "org.freedesktop.systemd1.Manager",
+ "GetUnitByPID",
+ &reply,
+ NULL,
+ DBUS_TYPE_UINT32, &pid,
+ DBUS_TYPE_INVALID);
+ if (r)
goto finish;
- }
if (!dbus_message_get_args(reply, &error,
DBUS_TYPE_OBJECT_PATH, &path,
@@ -3242,9 +2883,6 @@ static int show_one_by_pid(const char *verb, DBusConnection *bus, uint32_t pid,
r = show_one(verb, bus, path, false, new_line);
finish:
- if (m)
- dbus_message_unref(m);
-
if (reply)
dbus_message_unref(reply);
@@ -3320,7 +2958,7 @@ static int show(DBusConnection *bus, char **args) {
}
static int dump(DBusConnection *bus, char **args) {
- DBusMessage *m = NULL, *reply = NULL;
+ DBusMessage *reply = NULL;
DBusError error;
int r;
const char *text;
@@ -3329,20 +2967,17 @@ static int dump(DBusConnection *bus, char **args) {
pager_open_if_enabled();
- if (!(m = dbus_message_new_method_call(
- "org.freedesktop.systemd1",
- "/org/freedesktop/systemd1",
- "org.freedesktop.systemd1.Manager",
- "Dump"))) {
- log_error("Could not allocate message.");
- return -ENOMEM;
- }
-
- if (!(reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error))) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- r = -EIO;
+ r = bus_method_call_with_reply (
+ bus,
+ "org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1",
+ "org.freedesktop.systemd1.Manager",
+ "Dump",
+ &reply,
+ NULL,
+ DBUS_TYPE_INVALID);
+ if (r)
goto finish;
- }
if (!dbus_message_get_args(reply, &error,
DBUS_TYPE_STRING, &text,
@@ -3354,12 +2989,7 @@ static int dump(DBusConnection *bus, char **args) {
fputs(text, stdout);
- r = 0;
-
finish:
- if (m)
- dbus_message_unref(m);
-
if (reply)
dbus_message_unref(reply);
@@ -3369,51 +2999,37 @@ finish:
}
static int snapshot(DBusConnection *bus, char **args) {
- DBusMessage *m = NULL, *reply = NULL;
+ DBusMessage *reply = NULL;
DBusError error;
int r;
- const char *name = "", *path, *id;
dbus_bool_t cleanup = FALSE;
DBusMessageIter iter, sub;
const char
+ *name = "", *path, *id,
*interface = "org.freedesktop.systemd1.Unit",
*property = "Id";
char *n;
- bool b;
dbus_error_init(&error);
- m = dbus_message_new_method_call(
- "org.freedesktop.systemd1",
- "/org/freedesktop/systemd1",
- "org.freedesktop.systemd1.Manager",
- "CreateSnapshot");
- if (!m) {
- log_error("Could not allocate message.");
- return -ENOMEM;
- }
-
if (strv_length(args) > 1)
name = args[1];
n = unit_name_mangle(name);
- b = dbus_message_append_args(m,
- DBUS_TYPE_STRING, n ? (const char**) &n : &name,
- DBUS_TYPE_BOOLEAN, &cleanup,
- DBUS_TYPE_INVALID);
+ r = bus_method_call_with_reply (
+ bus,
+ "org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1",
+ "org.freedesktop.systemd1.Manager",
+ "CreateSnapshot",
+ &reply,
+ NULL,
+ DBUS_TYPE_STRING, n ? (const char**) &n : &name,
+ DBUS_TYPE_BOOLEAN, &cleanup,
+ DBUS_TYPE_INVALID);
free(n);
- if (!b) {
- log_error("Could not append arguments to message.");
- r = -ENOMEM;
+ if (r)
goto finish;
- }
-
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
- if (!reply) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- r = -EIO;
- goto finish;
- }
if (!dbus_message_get_args(reply, &error,
DBUS_TYPE_OBJECT_PATH, &path,
@@ -3423,33 +3039,20 @@ static int snapshot(DBusConnection *bus, char **args) {
goto finish;
}
- dbus_message_unref(m);
- m = dbus_message_new_method_call(
- "org.freedesktop.systemd1",
- path,
- "org.freedesktop.DBus.Properties",
- "Get");
- if (!m) {
- log_error("Could not allocate message.");
- return -ENOMEM;
- }
-
- if (!dbus_message_append_args(m,
- DBUS_TYPE_STRING, &interface,
- DBUS_TYPE_STRING, &property,
- DBUS_TYPE_INVALID)) {
- log_error("Could not append arguments to message.");
- r = -ENOMEM;
- goto finish;
- }
-
dbus_message_unref(reply);
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
- if (!reply) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- r = -EIO;
+ r = bus_method_call_with_reply (
+ bus,
+ "org.freedesktop.systemd1",
+ path,
+ "org.freedesktop.DBus.Properties",
+ "Get",
+ &reply,
+ NULL,
+ DBUS_TYPE_STRING, &interface,
+ DBUS_TYPE_STRING, &property,
+ DBUS_TYPE_INVALID);
+ if (r)
goto finish;
- }
if (!dbus_message_iter_init(reply, &iter) ||
dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT) {
@@ -3470,12 +3073,8 @@ static int snapshot(DBusConnection *bus, char **args) {
if (!arg_quiet)
puts(id);
- r = 0;
finish:
- if (m)
- dbus_message_unref(m);
-
if (reply)
dbus_message_unref(reply);
@@ -3485,12 +3084,11 @@ finish:
}
static int delete_snapshot(DBusConnection *bus, char **args) {
- DBusMessage *m = NULL, *reply = NULL;
- int r;
+ DBusMessage *reply = NULL;
+ int r = 0;
DBusError error;
char **name;
- assert(bus);
assert(args);
dbus_error_init(&error);
@@ -3498,92 +3096,54 @@ static int delete_snapshot(DBusConnection *bus, char **args) {
STRV_FOREACH(name, args+1) {
const char *path = NULL;
char *n;
- bool b;
- m = dbus_message_new_method_call(
+ n = unit_name_mangle(*name);
+ r = bus_method_call_with_reply (
+ bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
- "GetUnit");
- if (!m) {
- log_error("Could not allocate message.");
- r = -ENOMEM;
- goto finish;
- }
-
- n = unit_name_mangle(*name);
- b = dbus_message_append_args(m,
- DBUS_TYPE_STRING, n ? &n : name,
- DBUS_TYPE_INVALID);
+ "GetUnit",
+ &reply,
+ NULL,
+ DBUS_TYPE_STRING, n ? &n : name,
+ DBUS_TYPE_INVALID);
free(n);
- if (!b) {
- log_error("Could not append arguments to message.");
- r = -ENOMEM;
- goto finish;
- }
-
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
- if (!reply) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- r = -EIO;
+ if (r)
goto finish;
- }
if (!dbus_message_get_args(reply, &error,
DBUS_TYPE_OBJECT_PATH, &path,
DBUS_TYPE_INVALID)) {
log_error("Failed to parse reply: %s", bus_error_message(&error));
r = -EIO;
+ dbus_message_unref(reply);
+ dbus_error_free(&error);
goto finish;
}
+ dbus_message_unref(reply);
- dbus_message_unref(m);
- m = dbus_message_new_method_call(
+ r = bus_method_call_with_reply (
+ bus,
"org.freedesktop.systemd1",
path,
"org.freedesktop.systemd1.Snapshot",
- "Remove");
- if (!m) {
- log_error("Could not allocate message.");
- r = -ENOMEM;
- goto finish;
- }
-
- dbus_message_unref(reply);
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
- if (!reply) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- r = -EIO;
+ "Remove",
+ NULL,
+ NULL,
+ DBUS_TYPE_INVALID);
+ if (r)
goto finish;
- }
-
- dbus_message_unref(m);
- dbus_message_unref(reply);
- m = reply = NULL;
}
- r = 0;
-
finish:
- if (m)
- dbus_message_unref(m);
-
- if (reply)
- dbus_message_unref(reply);
-
- dbus_error_free(&error);
-
return r;
}
static int daemon_reload(DBusConnection *bus, char **args) {
- DBusMessage *m = NULL, *reply = NULL;
- DBusError error;
int r;
const char *method;
- dbus_error_init(&error);
-
if (arg_action == ACTION_RELOAD)
method = "Reload";
else if (arg_action == ACTION_REEXEC)
@@ -3604,148 +3164,79 @@ static int daemon_reload(DBusConnection *bus, char **args) {
/* "daemon-reload" */ "Reload";
}
- if (!(m = dbus_message_new_method_call(
- "org.freedesktop.systemd1",
- "/org/freedesktop/systemd1",
- "org.freedesktop.systemd1.Manager",
- method))) {
- log_error("Could not allocate message.");
- return -ENOMEM;
- }
-
- if (!(reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error))) {
-
- if (arg_action != ACTION_SYSTEMCTL && error_is_no_service(&error)) {
- /* There's always a fallback possible for
- * legacy actions. */
- r = -EADDRNOTAVAIL;
- goto finish;
- }
-
- if (streq(method, "Reexecute") && dbus_error_has_name(&error, DBUS_ERROR_NO_REPLY)) {
- /* On reexecution, we expect a disconnect, not
- * a reply */
- r = 0;
- goto finish;
- }
-
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- r = -EIO;
- goto finish;
- }
-
- r = 0;
-
-finish:
- if (m)
- dbus_message_unref(m);
-
- if (reply)
- dbus_message_unref(reply);
-
- dbus_error_free(&error);
+ r = bus_method_call_with_reply (
+ bus,
+ "org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1",
+ "org.freedesktop.systemd1.Manager",
+ method,
+ NULL,
+ NULL,
+ DBUS_TYPE_INVALID);
+
+ if (r == -ENOENT && arg_action != ACTION_SYSTEMCTL)
+ /* There's always a fallback possible for
+ * legacy actions. */
+ r = -EADDRNOTAVAIL;
+ else if (r == -ETIMEDOUT && streq(method, "Reexecute"))
+ /* On reexecution, we expect a disconnect, not
+ * a reply */
+ r = 0;
return r;
}
static int reset_failed(DBusConnection *bus, char **args) {
- DBusMessage *m = NULL;
- int r;
- DBusError error;
- char **name;
-
- assert(bus);
- dbus_error_init(&error);
+ int r = 0;
+ char **name, *n;
if (strv_length(args) <= 1)
return daemon_reload(bus, args);
STRV_FOREACH(name, args+1) {
- DBusMessage *reply;
- char *n;
- bool b;
-
- m = dbus_message_new_method_call(
+ n = unit_name_mangle(*name);
+ r = bus_method_call_with_reply (
+ bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
- "ResetFailedUnit");
- if (!m) {
- log_error("Could not allocate message.");
- r = -ENOMEM;
- goto finish;
- }
-
- n = unit_name_mangle(*name);
- b = dbus_message_append_args(m,
- DBUS_TYPE_STRING, n ? &n : name,
- DBUS_TYPE_INVALID);
+ "ResetFailedUnit",
+ NULL,
+ NULL,
+ DBUS_TYPE_STRING, n ? &n : name,
+ DBUS_TYPE_INVALID);
free(n);
- if (!b) {
- log_error("Could not append arguments to message.");
- r = -ENOMEM;
- goto finish;
- }
-
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
- if (!reply) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- r = -EIO;
+ if (r)
goto finish;
- }
-
- dbus_message_unref(m);
- dbus_message_unref(reply);
- m = reply = NULL;
}
- r = 0;
-
finish:
- if (m)
- dbus_message_unref(m);
-
- dbus_error_free(&error);
-
return r;
}
static int show_enviroment(DBusConnection *bus, char **args) {
- DBusMessage *m = NULL, *reply = NULL;
- DBusError error;
+ DBusMessage *reply = NULL;
DBusMessageIter iter, sub, sub2;
int r;
const char
*interface = "org.freedesktop.systemd1.Manager",
*property = "Environment";
- dbus_error_init(&error);
-
pager_open_if_enabled();
- if (!(m = dbus_message_new_method_call(
- "org.freedesktop.systemd1",
- "/org/freedesktop/systemd1",
- "org.freedesktop.DBus.Properties",
- "Get"))) {
- log_error("Could not allocate message.");
- return -ENOMEM;
- }
-
- if (!dbus_message_append_args(m,
- DBUS_TYPE_STRING, &interface,
- DBUS_TYPE_STRING, &property,
- DBUS_TYPE_INVALID)) {
- log_error("Could not append arguments to message.");
- r = -ENOMEM;
- goto finish;
- }
-
- if (!(reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error))) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- r = -EIO;
+ r = bus_method_call_with_reply (
+ bus,
+ "org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1",
+ "org.freedesktop.DBus.Properties",
+ "Get",
+ &reply,
+ NULL,
+ DBUS_TYPE_STRING, &interface,
+ DBUS_TYPE_STRING, &property,
+ DBUS_TYPE_INVALID);
+ if (r)
goto finish;
- }
if (!dbus_message_iter_init(reply, &iter) ||
dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT) {
@@ -3783,25 +3274,15 @@ static int show_enviroment(DBusConnection *bus, char **args) {
r = 0;
finish:
- if (m)
- dbus_message_unref(m);
-
if (reply)
dbus_message_unref(reply);
- dbus_error_free(&error);
-
return r;
}
static int switch_root(DBusConnection *bus, char **args) {
- DBusMessage *m = NULL, *reply = NULL;
unsigned l;
const char *root, *init;
- DBusError error;
- int r;
-
- dbus_error_init(&error);
l = strv_length(args);
if (l < 2 || l > 3) {
@@ -3812,45 +3293,17 @@ static int switch_root(DBusConnection *bus, char **args) {
root = args[1];
init = l >= 3 ? args[2] : "";
- m = dbus_message_new_method_call(
+ return bus_method_call_with_reply (
+ bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
- "SwitchRoot");
- if (!m) {
- log_error("Could not allocate message.");
- return -ENOMEM;
- }
-
- if (!dbus_message_append_args(
- m,
- DBUS_TYPE_STRING, &root,
- DBUS_TYPE_STRING, &init,
- DBUS_TYPE_INVALID)) {
- log_error("Could not append arguments to message.");
- r = -ENOMEM;
- goto finish;
- }
-
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
- if (!reply) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- r = -EIO;
- goto finish;
- }
-
- r = 0;
-
-finish:
- if (m)
- dbus_message_unref(m);
-
- if (reply)
- dbus_message_unref(reply);
-
- dbus_error_free(&error);
-
- return r;
+ "SwitchRoot",
+ NULL,
+ NULL,
+ DBUS_TYPE_STRING, &root,
+ DBUS_TYPE_STRING, &init,
+ DBUS_TYPE_INVALID);
}
static int set_environment(DBusConnection *bus, char **args) {
@@ -4290,7 +3743,7 @@ finish:
static int unit_is_enabled(DBusConnection *bus, char **args) {
DBusError error;
int r;
- DBusMessage *m = NULL, *reply = NULL;
+ DBusMessage *reply = NULL;
bool enabled;
char **name;
@@ -4326,30 +3779,18 @@ static int unit_is_enabled(DBusConnection *bus, char **args) {
STRV_FOREACH(name, args+1) {
const char *s;
- m = dbus_message_new_method_call(
+ r = bus_method_call_with_reply (
+ bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
- "GetUnitFileState");
- if (!m) {
- r = log_oom();
+ "GetUnitFileState",
+ &reply,
+ NULL,
+ DBUS_TYPE_STRING, name,
+ DBUS_TYPE_INVALID);
+ if (r)
goto finish;
- }
-
- if (!dbus_message_append_args(m,
- DBUS_TYPE_STRING, name,
- DBUS_TYPE_INVALID)) {
- log_error("Could not append arguments to message.");
- r = -ENOMEM;
- goto finish;
- }
-
- reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
- if (!reply) {
- log_error("Failed to issue method call: %s", bus_error_message(&error));
- r = -EIO;
- goto finish;
- }
if (!dbus_message_get_args(reply, &error,
DBUS_TYPE_STRING, &s,
@@ -4359,9 +3800,8 @@ static int unit_is_enabled(DBusConnection *bus, char **args) {
goto finish;
}
- dbus_message_unref(m);
dbus_message_unref(reply);
- m = reply = NULL;
+ reply = NULL;
if (streq(s, "enabled") ||
streq(s, "enabled-runtime") ||
@@ -4376,9 +3816,6 @@ static int unit_is_enabled(DBusConnection *bus, char **args) {
r = enabled ? 0 : 1;
finish:
- if (m)
- dbus_message_unref(m);
-
if (reply)
dbus_message_unref(reply);
@@ -5316,7 +4753,7 @@ static int talk_upstart(void) {
if (!(reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error))) {
- if (error_is_no_service(&error)) {
+ if (bus_error_is_no_service(&error)) {
r = -EADDRNOTAVAIL;
goto finish;
}
diff --git a/src/update-utmp/update-utmp.c b/src/update-utmp/update-utmp.c
index ee9105bf47..fceeed8b44 100644
--- a/src/update-utmp/update-utmp.c
+++ b/src/update-utmp/update-utmp.c
@@ -50,36 +50,24 @@ static usec_t get_startup_time(Context *c) {
*interface = "org.freedesktop.systemd1.Manager",
*property = "StartupTimestamp";
- DBusError error;
usec_t t = 0;
- DBusMessage *m = NULL, *reply = NULL;
+ DBusMessage *reply = NULL;
DBusMessageIter iter, sub;
- dbus_error_init(&error);
-
assert(c);
- if (!(m = dbus_message_new_method_call(
- "org.freedesktop.systemd1",
- "/org/freedesktop/systemd1",
- "org.freedesktop.DBus.Properties",
- "Get"))) {
- log_error("Could not allocate message.");
- goto finish;
- }
-
- if (!dbus_message_append_args(m,
- DBUS_TYPE_STRING, &interface,
- DBUS_TYPE_STRING, &property,
- DBUS_TYPE_INVALID)) {
- log_error("Could not append arguments to message.");
- goto finish;
- }
-
- if (!(reply = dbus_connection_send_with_reply_and_block(c->bus, m, -1, &error))) {
- log_error("Failed to send command: %s", bus_error_message(&error));
+ if (bus_method_call_with_reply (
+ c->bus,
+ "org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1",
+ "org.freedesktop.DBus.Properties",
+ "Get",
+ &reply,
+ NULL,
+ DBUS_TYPE_STRING, &interface,
+ DBUS_TYPE_STRING, &property,
+ DBUS_TYPE_INVALID))
goto finish;
- }
if (!dbus_message_iter_init(reply, &iter) ||
dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT) {
@@ -97,14 +85,8 @@ static usec_t get_startup_time(Context *c) {
dbus_message_iter_get_basic(&sub, &t);
finish:
- if (m)
- dbus_message_unref(m);
-
if (reply)
dbus_message_unref(reply);
-
- dbus_error_free(&error);
-
return t;
}
@@ -128,7 +110,7 @@ static int get_current_runlevel(Context *c) {
*interface = "org.freedesktop.systemd1.Unit",
*property = "ActiveState";
- DBusMessage *m = NULL, *reply = NULL;
+ DBusMessage *reply = NULL;
int r = 0;
unsigned i;
DBusError error;
@@ -141,28 +123,20 @@ static int get_current_runlevel(Context *c) {
const char *path = NULL, *state;
DBusMessageIter iter, sub;
- if (!(m = dbus_message_new_method_call(
- "org.freedesktop.systemd1",
- "/org/freedesktop/systemd1",
- "org.freedesktop.systemd1.Manager",
- "GetUnit"))) {
- log_error("Could not allocate message.");
- r = -ENOMEM;
+ r = bus_method_call_with_reply (
+ c->bus,
+ "org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1",
+ "org.freedesktop.systemd1.Manager",
+ "GetUnit",
+ &reply,
+ NULL,
+ DBUS_TYPE_STRING, &table[i].special,
+ DBUS_TYPE_INVALID);
+ if (r == -ENOMEM)
goto finish;
- }
-
- if (!dbus_message_append_args(m,
- DBUS_TYPE_STRING, &table[i].special,
- DBUS_TYPE_INVALID)) {
- log_error("Could not append arguments to message.");
- r = -ENOMEM;
- goto finish;
- }
-
- if (!(reply = dbus_connection_send_with_reply_and_block(c->bus, m, -1, &error))) {
- dbus_error_free(&error);
+ if (r)
continue;
- }
if (!dbus_message_get_args(reply, &error,
DBUS_TYPE_OBJECT_PATH, &path,
@@ -172,32 +146,20 @@ static int get_current_runlevel(Context *c) {
goto finish;
}
- dbus_message_unref(m);
- if (!(m = dbus_message_new_method_call(
- "org.freedesktop.systemd1",
- path,
- "org.freedesktop.DBus.Properties",
- "Get"))) {
- log_error("Could not allocate message.");
- r = -ENOMEM;
- goto finish;
- }
-
- if (!dbus_message_append_args(m,
- DBUS_TYPE_STRING, &interface,
- DBUS_TYPE_STRING, &property,
- DBUS_TYPE_INVALID)) {
- log_error("Could not append arguments to message.");
- r = -ENOMEM;
- goto finish;
- }
-
dbus_message_unref(reply);
- if (!(reply = dbus_connection_send_with_reply_and_block(c->bus, m, -1, &error))) {
- log_error("Failed to send command: %s", bus_error_message(&error));
- r = -EIO;
+ r = bus_method_call_with_reply (
+ c->bus,
+ "org.freedesktop.systemd1",
+ path,
+ "org.freedesktop.DBus.Properties",
+ "Get",
+ &reply,
+ NULL,
+ DBUS_TYPE_STRING, &interface,
+ DBUS_TYPE_STRING, &property,
+ DBUS_TYPE_INVALID);
+ if (r)
goto finish;
- }
if (!dbus_message_iter_init(reply, &iter) ||
dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT) {
@@ -219,18 +181,14 @@ static int get_current_runlevel(Context *c) {
if (streq(state, "active") || streq(state, "reloading"))
r = table[i].runlevel;
- dbus_message_unref(m);
dbus_message_unref(reply);
- m = reply = NULL;
+ reply = NULL;
if (r)
break;
}
finish:
- if (m)
- dbus_message_unref(m);
-
if (reply)
dbus_message_unref(reply);