]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/home/homed-operation.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
4 #include "homed-operation.h"
6 Operation
*operation_new(OperationType type
, sd_bus_message
*m
) {
10 assert(type
< _OPERATION_MAX
);
12 o
= new(Operation
, 1);
19 .message
= sd_bus_message_ref(m
),
27 static Operation
*operation_free(Operation
*o
) {
33 if (o
->message
&& o
->result
>= 0) {
36 /* Propagate success */
38 r
= sd_bus_reply_method_return(o
->message
, NULL
);
40 r
= sd_bus_reply_method_return(o
->message
, "h", o
->send_fd
);
43 /* Propagate failure */
44 if (sd_bus_error_is_set(&o
->error
))
45 r
= sd_bus_reply_method_error(o
->message
, &o
->error
);
47 r
= sd_bus_reply_method_errnof(o
->message
, o
->ret
, "Failed to execute operation: %m");
50 log_warning_errno(r
, "Failed to reply to %s method call, ignoring: %m", sd_bus_message_get_member(o
->message
));
53 sd_bus_message_unref(o
->message
);
54 user_record_unref(o
->secret
);
55 safe_close(o
->send_fd
);
56 sd_bus_error_free(&o
->error
);
61 DEFINE_TRIVIAL_REF_UNREF_FUNC(Operation
, operation
, operation_free
);
63 void operation_result(Operation
*o
, int ret
, const sd_bus_error
*error
) {
71 sd_bus_error_free(&o
->error
);
72 sd_bus_error_copy(&o
->error
, error
);