d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina/*
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina Authors:
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina Pavel Březina <pbrezina@redhat.com>
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina Copyright (C) 2016 Red Hat
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina This program is free software; you can redistribute it and/or modify
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina it under the terms of the GNU General Public License as published by
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina the Free Software Foundation; either version 3 of the License, or
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina (at your option) any later version.
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina This program is distributed in the hope that it will be useful,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina but WITHOUT ANY WARRANTY; without even the implied warranty of
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina GNU General Public License for more details.
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina You should have received a copy of the GNU General Public License
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina along with this program. If not, see <http://www.gnu.org/licenses/>.
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina*/
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#ifndef _DP_PRIVATE_H_
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#define _DP_PRIVATE_H_
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include <tevent.h>
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include <dhash.h>
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "sbus/sssd_dbus.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "providers/data_provider/dp.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "util/util.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#define DP_REQ_DEBUG(level, name, fmt, ...) \
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(level, "DP Request [%s]: " fmt "\n", (name ?: "Unknown"), ##__VA_ARGS__)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinaenum dp_clients {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DPC_NSS,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DPC_PAM,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DPC_IFP,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DPC_PAC,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DPC_SUDO,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DPC_HOST,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DPC_AUTOFS,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DP_CLIENT_SENTINEL
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina};
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastruct dp_req;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastruct dp_client;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastruct dp_module {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina bool initialized;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *name;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina void *module_data;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina void *libhandle;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina};
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastruct dp_target {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *name;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *module_name;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina bool explicitly_configured;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina bool initialized;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina enum dp_targets target;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct dp_module *module;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct dp_method *methods;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina};
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastruct dp_method {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina dp_req_send_fn send_fn;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina dp_req_recv_fn recv_fn;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina void *method_data;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *method_dtype;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *request_dtype;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *output_dtype;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina uint32_t output_size;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina};
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastruct data_provider {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina uid_t uid;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina gid_t gid;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct be_ctx *be_ctx;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct tevent_context *ev;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct sbus_connection *srv_conn;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct dp_client *clients[DP_CLIENT_SENTINEL];
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina bool terminating;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* Numeric identificator that will be assigned to next request. */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina uint32_t index;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* List of all ongoing requests. */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina uint32_t num_active;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct dp_req *active;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* Table containing list of sbus_requests where DP sends reply when
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina * a request is finished. Value of this table is pair
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina * <tevent_req, list of sbus_request>
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina hash_table_t *reply_table;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina } requests;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct dp_module **modules;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct dp_target **targets;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina};
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinaerrno_t dp_find_method(struct data_provider *provider,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina enum dp_targets target,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina enum dp_methods method,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct dp_method **_execute);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastruct dp_module *dp_load_module(TALLOC_CTX *mem_ctx,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct be_ctx *be_ctx,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct data_provider *provider,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct dp_module **modules,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *name);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinaerrno_t dp_init_modules(TALLOC_CTX *mem_ctx, struct dp_module ***_modules);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinaconst char *dp_target_to_string(enum dp_targets target);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinabool dp_target_initialized(struct dp_target **targets, enum dp_targets type);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinaerrno_t dp_init_targets(TALLOC_CTX *mem_ctx,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct be_ctx *be_ctx,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct data_provider *provider,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct dp_module **modules);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina/* Reply callbacks. */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinatypedef void (*dp_req_post_fn)(const char *req_name,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct data_provider *provider,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina void *post_data,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina void *reply_data);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinatypedef void (*dp_req_reply_fn)(const char *req_name,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct sbus_request *sbus_req,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina void *data);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinavoid dp_req_reply_default(const char *req_name,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct sbus_request *sbus_req,
6211a202301e6f61d46cdb2bf0be332a70c7fdeaPavel Březina void **data);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina/* Data provider request table. */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastruct dp_sbus_req_item;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastruct dp_table_value {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina hash_table_t *table;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *key;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct tevent_req *req;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct dp_sbus_req_item *list;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina};
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastruct dp_sbus_req_item {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct dp_table_value *parent;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct sbus_request *sbus_req;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct dp_sbus_req_item *prev;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct dp_sbus_req_item *next;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina};
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinachar *dp_req_table_key(TALLOC_CTX *mem_ctx,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina enum dp_targets target,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina enum dp_methods method,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina uint32_t dp_flags,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *custom_part);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinaerrno_t dp_req_table_init(TALLOC_CTX *mem_ctx, hash_table_t **_table);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastruct dp_table_value *dp_req_table_lookup(hash_table_t *table,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *key);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinaerrno_t dp_req_table_add(hash_table_t *table,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *key,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct tevent_req *req,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct sbus_request *sbus_req);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinavoid dp_req_table_del(hash_table_t *table,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *key);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinavoid dp_req_table_del_and_free(hash_table_t *table,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *key);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinabool dp_req_table_has_key(hash_table_t *table,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *key);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina/* Data provider request. */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinavoid dp_terminate_active_requests(struct data_provider *provider);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinavoid dp_req_reply_error(struct sbus_request *sbus_req,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *req_name,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina errno_t ret);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinavoid _dp_req_with_reply(struct dp_client *dp_cli,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *domain,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *request_name,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *custom_key,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct sbus_request *sbus_req,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina enum dp_targets target,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina enum dp_methods method,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina uint32_t dp_flags,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina void *request_data,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina dp_req_post_fn postprocess_fn,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina void *postprocess_data,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina dp_req_reply_fn reply_fn,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *output_dtype);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina/**
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina * If @domain is NULL, be_ctx->domain is used.
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina * If req_key is NULL, address of sbus_req is used.
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina *
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina * If @pp_fn (post process function) is set it is call on a successful
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina * DP request before reply is sent.
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#define dp_req_with_reply_pp(dp_cli, domain, req_name, req_key, sbus_req, \
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina target, method, dp_flags, req_data, pp_fn, \
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina pp_data, pp_dtype, reply_fn, output_dtype) \
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina do { \
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* Check postprocess function parameter types. */ \
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina void (*__pp_fn)(const char *, struct data_provider *, \
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina pp_dtype *, output_dtype *) = (pp_fn); \
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina pp_dtype *__pp_data = (pp_data); \
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina \
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* Check reply function parameter types. */ \
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina void (*__reply_fn)(const char *, struct sbus_request *, \
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina output_dtype *) = (reply_fn); \
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina \
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina _dp_req_with_reply(dp_cli, domain, req_name, req_key, sbus_req, \
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina target, method, dp_flags, req_data, \
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina (dp_req_post_fn)__pp_fn, __pp_data, \
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina (dp_req_reply_fn)__reply_fn, #output_dtype); \
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina } while(0)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#define dp_req_with_reply(dp_cli, domain, req_name, req_key, sbus_req, target,\
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina method, dp_flags, req_data, reply_fn, \
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina output_dtype) \
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina dp_req_with_reply_pp(dp_cli, domain, req_name, req_key, sbus_req, target, \
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina method, dp_flags, req_data, NULL, NULL, void, \
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina reply_fn, output_dtype)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina/* Client shared functions. */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinaerrno_t dp_client_init(struct sbus_connection *conn, void *data);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastruct data_provider *dp_client_provider(struct dp_client *dp_cli);
2f18b8d67c86a1a277b59894f24ea6e09b41b7eaPavel Březinastruct be_ctx *dp_client_be(struct dp_client *dp_cli);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastruct sbus_connection *dp_client_conn(struct dp_client *dp_cli);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#endif /* _DP_PRIVATE_H_ */