diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 05:31:45 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 05:31:45 +0000 |
commit | 74aa0bc6779af38018a03fd2cf4419fe85917904 (patch) | |
tree | 9cb0681aac9a94a49c153d5823e7a55d1513d91f /src/sbus/codegen/templates/client_sync.c.tpl | |
parent | Initial commit. (diff) | |
download | sssd-74aa0bc6779af38018a03fd2cf4419fe85917904.tar.xz sssd-74aa0bc6779af38018a03fd2cf4419fe85917904.zip |
Adding upstream version 2.9.4.upstream/2.9.4
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/sbus/codegen/templates/client_sync.c.tpl')
-rw-r--r-- | src/sbus/codegen/templates/client_sync.c.tpl | 444 |
1 files changed, 444 insertions, 0 deletions
diff --git a/src/sbus/codegen/templates/client_sync.c.tpl b/src/sbus/codegen/templates/client_sync.c.tpl new file mode 100644 index 0000000..fe9a3a4 --- /dev/null +++ b/src/sbus/codegen/templates/client_sync.c.tpl @@ -0,0 +1,444 @@ +<template name="file-header"> + /* + Generated by sbus code generator + + Copyright (C) 2017 Red Hat + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + + #include <errno.h> + #include <talloc.h> + #include <dbus/dbus.h> + + #include "${sbus-path}/sbus_sync.h" + #include "${sbus-path}/sbus_sync_private.h" + #include "${sbus-path}/sbus_message.h" + #include "${sbus-path}/interface/sbus_iterator_readers.h" + #include "${sbus-path}/interface_dbus/sbus_dbus_client_sync.h" + #include "${header:arguments}" + #include "${header:client_properties}" + +</template> + +<template name="method-invoker"> + static errno_t + sbus_method_in_${input-signature}_out_${output-signature} + (<toggle name="if-use-talloc">TALLOC_CTX *mem_ctx, + struct sbus_sync_connection *conn, + <or>struct sbus_sync_connection *conn, + </toggle><toggle name="if-raw-input"> + DBusMessage *raw_message<or> + const char *bus, + const char *path, + const char *iface, + const char *method<loop name="in">, + ${type} arg${index}</loop></toggle> + <toggle name="if-raw-output">, + DBusMessage **_reply) + <or><loop name="out">, + ${type} _arg${index}</loop>) + </toggle> + { + TALLOC_CTX *tmp_ctx; + <toggle name="if-input-arguments"> + struct _sbus_invoker_args_${input-signature} in; + </toggle> + <toggle name="if-output-arguments"> + struct _sbus_invoker_args_${output-signature} *out; + </toggle> + DBusMessage *reply; + errno_t ret; + + tmp_ctx = talloc_new(NULL); + if (tmp_ctx == NULL) { + DEBUG(SSSDBG_FATAL_FAILURE, "Out of memory!\n"); + return ENOMEM; + } + + <toggle name="if-output-arguments"> + out = talloc_zero(tmp_ctx, struct _sbus_invoker_args_${output-signature}); + if (out == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, + "Unable to allocate space for output parameters!\n"); + ret = ENOMEM; + goto done; + } + + </toggle> + <loop name="in"> + in.arg${index} = arg${index}; + </loop> + + <toggle name="if-raw-input"> + ret = sbus_sync_call_method(tmp_ctx, conn, raw_message, NULL, NULL, + dbus_message_get_path(raw_message), + dbus_message_get_interface(raw_message), + dbus_message_get_member(raw_message), + NULL, &reply); + </toggle> + <toggle name="if-input-arguments"> + ret = sbus_sync_call_method(tmp_ctx, conn, NULL, + (sbus_invoker_writer_fn)_sbus_invoker_write_${input-signature}, + bus, path, iface, method, &in, &reply); + </toggle> + <toggle name="if-empty-input"> + ret = sbus_sync_call_method(tmp_ctx, conn, NULL, NULL, + bus, path, iface, method, NULL, &reply); + </toggle> + if (ret != EOK) { + goto done; + } + + <toggle name="if-raw-output"> + /* Bounded reference cannot be unreferenced with dbus_message_unref. + * For that reason we do not allow NULL memory context as it would + * result in leaking the message memory. */ + if (mem_ctx == NULL) { + ret = EINVAL; + goto done; + } + + ret = sbus_message_bound_steal(mem_ctx, reply); + if (ret != EOK) { + DEBUG(SSSDBG_CRIT_FAILURE, "Unable to steal message [%d]: %s\n", + ret, sss_strerror(ret)); + goto done; + } + + *_reply = reply; + + </toggle> + <toggle name="if-output-arguments"> + ret = sbus_read_output(out, reply, (sbus_invoker_reader_fn)_sbus_invoker_read_${output-signature}, out); + if (ret != EOK) { + goto done; + } + + <loop name="out-static"> + *_arg${index} = out->arg${index}; + </loop> + <loop name="out-talloc"> + *_arg${index} = talloc_steal(mem_ctx, out->arg${index}); + </loop> + + </toggle> + ret = EOK; + + done: + talloc_free(tmp_ctx); + + return ret; + } + +</template> + +<template name="method-caller"> + errno_t + sbus_call_${token} + (<toggle name="if-use-talloc">TALLOC_CTX *mem_ctx, + struct sbus_sync_connection *conn, + <or>struct sbus_sync_connection *conn, + </toggle><toggle name="if-raw-input"> + DBusMessage *raw_message<or> + const char *busname, + const char *object_path<loop name="in">, + ${type} arg_${name}</loop></toggle> + <toggle name="if-raw-output">, + DBusMessage **_reply) + <or><loop name="out">, + ${type} _arg_${name}</loop>) + </toggle> + { + return sbus_method_in_${input-signature}_out_${output-signature}(<toggle name="if-use-talloc">mem_ctx, </toggle>conn, + <toggle name="if-raw-input"> + raw_message<or> + busname, object_path, "${iface}", "${method}"<loop name="in">, arg_${name}</loop></toggle> + <toggle name="if-raw-output">, + _reply); + <or><loop name="out">, + _arg_${name}</loop>); + </toggle> + } + +</template> + +<template name="signal-invoker"> + static void + sbus_emit_signal_${input-signature} + (struct sbus_sync_connection *conn, + <toggle name="if-raw-input"> + DBusMessage *raw_message) + <or> + const char *path, + const char *iface, + const char *signal_name<loop name="in">, + ${type} arg${index}</loop>) + </toggle> + { + <toggle name="if-input-arguments"> + struct _sbus_invoker_args_${input-signature} args; + + <loop name="in"> + args.arg${index} = arg${index}; + </loop> + + </toggle> + <toggle name="if-raw-input"> + sbus_sync_call_signal(conn, raw_message, NULL, + dbus_message_get_path(raw_message), + dbus_message_get_interface(raw_message), + dbus_message_get_member(raw_message), NULL); + </toggle> + <toggle name="if-input-arguments"> + sbus_sync_call_signal(conn, NULL, (sbus_invoker_writer_fn)_sbus_invoker_write_${input-signature}, + path, iface, signal_name, &args); + </toggle> + <toggle name="if-empty-input"> + sbus_sync_call_signal(conn, NULL, NULL, path, iface, signal_name, NULL); + </toggle> + } + +</template> + +<template name="signal-caller"> + void + sbus_sync_emit_${token} + (struct sbus_sync_connection *conn, + <toggle name="if-raw-input"> + DBusMessage *raw_message) + <or> + const char *object_path<loop name="in">, + ${type} arg_${name}</loop>) + </toggle> + { + <toggle name="if-raw-input"> + sbus_emit_signal_${input-signature}(conn, raw_message); + <or> + sbus_emit_signal_${input-signature}(conn, object_path, + "${iface}", "${signal}"<loop name="in">, arg_${name}</loop>); + </toggle> + } + +</template> + +<template name="get-invoker"> + static errno_t + sbus_get_${output-signature} + (<toggle name="if-use-talloc">TALLOC_CTX *mem_ctx, + struct sbus_sync_connection *conn, + <or>struct sbus_sync_connection *conn, + </toggle> + const char *bus, + const char *path, + const char *iface, + const char *property, + ${output-type} _value) + { + TALLOC_CTX *tmp_ctx; + struct _sbus_invoker_args_${output-signature} *out; + sbus_value_reader_fn reader; + sbus_value_reader_talloc_fn reader_talloc; + DBusMessage *reply; + errno_t ret; + + tmp_ctx = talloc_new(NULL); + if (tmp_ctx == NULL) { + DEBUG(SSSDBG_FATAL_FAILURE, "Out of memory!\n"); + return ENOMEM; + } + + out = talloc_zero(tmp_ctx, struct _sbus_invoker_args_${output-signature}); + if (out == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, + "Unable to allocate space for output parameters!\n"); + ret = ENOMEM; + goto done; + } + + ret = sbus_call_DBusProperties_Get(tmp_ctx, conn, + bus, path, iface, property, &reply); + if (ret != EOK) { + goto done; + } + + reader = <toggle line name="if-use-talloc">NULL<or>(sbus_value_reader_fn)sbus_iterator_read_${output-signature}</toggle>; + reader_talloc = <toggle line name="if-use-talloc">(sbus_value_reader_talloc_fn)sbus_iterator_read_${output-signature}<or>NULL</toggle>; + ret = sbus_parse_get_message(out, reader, reader_talloc, reply, &out->arg0); + if (ret != EOK) { + goto done; + } + + *_value = <toggle line name="if-use-talloc">talloc_steal(mem_ctx, out->arg0)<or>out->arg0</toggle>; + + ret = EOK; + + done: + talloc_free(tmp_ctx); + + return ret; + } + +</template> + +<template name="set-invoker"> + static errno_t + sbus_set_${input-signature} + (struct sbus_sync_connection *conn, + const char *bus, + const char *path, + const char *iface, + const char *property, + ${input-type} value) + { + TALLOC_CTX *tmp_ctx; + struct _sbus_invoker_args_${input-signature} in; + DBusMessage *raw_message; + errno_t ret; + + tmp_ctx = talloc_new(NULL); + if (tmp_ctx == NULL) { + DEBUG(SSSDBG_FATAL_FAILURE, "Out of memory!\n"); + return ENOMEM; + } + + in.arg0 = value; + + raw_message = sbus_create_set_call(tmp_ctx, + (sbus_invoker_writer_fn)_sbus_invoker_write_${input-signature}, + bus, path, iface, property, + "${dbus-type}", &in); + if (raw_message == NULL) { + ret = ENOMEM; + goto done; + } + + ret = sbus_call_DBusProperties_Set(conn, raw_message); + if (ret != EOK) { + goto done; + } + + ret = EOK; + + done: + talloc_free(tmp_ctx); + + return ret; + } + +</template> + +<template name="property-caller"> + <toggle name="get-static"> + errno_t + sbus_get_${token} + (struct sbus_sync_connection *conn, + const char *busname, + const char *object_path, + ${output-type} _value) + { + return sbus_get_${output-signature}(conn, busname, object_path, + "${iface}", "${property}", _value); + } + + </toggle> + <toggle name="get-talloc"> + errno_t + sbus_get_${token} + (TALLOC_CTX *mem_ctx, + struct sbus_sync_connection *conn, + const char *busname, + const char *object_path, + ${output-type} _value) + { + return sbus_get_${output-signature}(mem_ctx, conn, busname, object_path, + "${iface}", "${property}", _value); + } + + </toggle> + <toggle name="set"> + errno_t + sbus_set_${token} + (struct sbus_sync_connection *conn, + const char *busname, + const char *object_path, + ${input-type} value) + { + return sbus_set_${input-signature}(conn, busname, object_path, + "${iface}", "${property}", value); + } + + </toggle> +</template> + +<template name="getall-caller"> + errno_t + sbus_getall_${token} + (TALLOC_CTX *mem_ctx, + struct sbus_sync_connection *conn, + const char *busname, + const char *object_path, + struct sbus_all_${token} **_properties) + { + TALLOC_CTX *tmp_ctx; + struct sbus_all_${token} *properties; + DBusMessage *reply; + errno_t ret; + + tmp_ctx = talloc_new(NULL); + if (tmp_ctx == NULL) { + DEBUG(SSSDBG_FATAL_FAILURE, "Out of memory!\n"); + return ENOMEM; + } + + properties = talloc_zero(tmp_ctx, struct sbus_all_${token}); + if (properties == NULL) { + ret = ENOMEM; + goto done; + } + + struct sbus_parse_getall_table table[] = { + <loop name="property-static"> + {"${name}", (sbus_value_reader_fn)sbus_iterator_read_${output-signature}, NULL, + &properties->${name}.value, &properties->${name}.is_set}, + </loop> + <loop name="property-talloc"> + {"${name}", NULL, (sbus_value_reader_talloc_fn)sbus_iterator_read_${output-signature}, + &properties->${name}.value, &properties->${name}.is_set}, + </loop> + {NULL, NULL, NULL, NULL, NULL} + }; + + ret = sbus_call_DBusProperties_GetAll(tmp_ctx, conn, + busname, object_path, "${iface}", &reply); + if (ret != EOK) { + goto done; + } + + ret = sbus_parse_getall_message(properties, table, reply); + if (ret != EOK) { + goto done; + } + + *_properties = talloc_steal(mem_ctx, properties); + + ret = EOK; + + done: + talloc_free(tmp_ctx); + + return ret; + } + +</template> |