responder_cmd.c revision ae526063fcbc4b4c440e35e01e4eca35358c2906
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/*
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen SSSD
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen SSS Client Responder, command parser
bdd36cfdba3ff66d25570a9ff568d69e1eb543cfTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen Copyright (C) Simo Sorce <ssorce@redhat.com> 2008
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen This program is free software; you can redistribute it and/or modify
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen it under the terms of the GNU General Public License as published by
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen the Free Software Foundation; either version 3 of the License, or
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen (at your option) any later version.
9522aa5f33cc37fe8ccd0d647cc51dd3ba6a9b55Timo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen This program is distributed in the hope that it will be useful,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen but WITHOUT ANY WARRANTY; without even the implied warranty of
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen GNU General Public License for more details.
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen You should have received a copy of the GNU General Public License
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen along with this program. If not, see <http://www.gnu.org/licenses/>.
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen*/
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#include <errno.h>
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#include "db/sysdb.h"
f158d9a303bb15a6848ca276c9391c7ca52e452bTimo Sirainen#include "util/util.h"
f158d9a303bb15a6848ca276c9391c7ca52e452bTimo Sirainen#include "responder/common/responder.h"
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#include "responder/common/responder_packet.h"
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenint sss_cmd_send_error(struct cli_ctx *cctx, int err)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen{
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen int ret;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* create response packet */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ret = sss_packet_new(cctx->creq, 0,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen sss_packet_get_cmd(cctx->creq->in),
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen &cctx->creq->out);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (ret != EOK) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("Cannot create new packet: %d\n", ret));
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen return ret;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen }
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen sss_packet_set_error(cctx->creq->out, err);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen return EOK;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen}
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenint sss_cmd_empty_packet(struct sss_packet *packet)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen{
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen uint8_t *body;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen size_t blen;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen int ret;
cf9d67e4a9bfee31cf3be05244555d51a3d1b9feTimo Sirainen
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen ret = sss_packet_grow(packet, 2*sizeof(uint32_t));
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (ret != EOK) return ret;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
093b42b11c1236a687d3da564b26a324e2189ae6Timo Sirainen sss_packet_get_body(packet, &body, &blen);
a5ddfd7a8b473f73135b93d5e081e470a87f0f7eTimo Sirainen ((uint32_t *)body)[0] = 0; /* num results */
a5ddfd7a8b473f73135b93d5e081e470a87f0f7eTimo Sirainen ((uint32_t *)body)[1] = 0; /* reserved */
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen return EOK;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen}
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenint sss_cmd_send_empty(struct cli_ctx *cctx, TALLOC_CTX *freectx)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen{
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen int ret;
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen /* create response packet */
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen ret = sss_packet_new(cctx->creq, 0,
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen sss_packet_get_cmd(cctx->creq->in),
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen &cctx->creq->out);
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen if (ret != EOK) {
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen return ret;
eb209d12e3b1cfed564c35cf19fdb1bf7fcc6811Timo Sirainen }
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen ret = sss_cmd_empty_packet(cctx->creq->out);
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen if (ret != EOK) {
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen return ret;
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen }
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen sss_packet_set_error(cctx->creq->out, EOK);
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen sss_cmd_done(cctx, freectx);
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen return EOK;
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen}
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainenvoid sss_cmd_done(struct cli_ctx *cctx, void *freectx)
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen{
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen /* now that the packet is in place, unlock queue
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen * making the event writable */
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen TEVENT_FD_WRITEABLE(cctx->cfde);
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen /* free all request related data through the talloc hierarchy */
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen talloc_free(freectx);
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen}
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainenint sss_cmd_get_version(struct cli_ctx *cctx)
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen{
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen uint8_t *req_body;
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen size_t req_blen;
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen uint8_t *body;
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen size_t blen;
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen int ret;
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen uint32_t client_version;
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen int i;
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen static struct cli_protocol_version *cli_protocol_version = NULL;
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen cctx->cli_protocol_version = NULL;
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen if (cli_protocol_version == NULL) {
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen cli_protocol_version = register_cli_protocol_version();
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen }
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen if (cli_protocol_version != NULL) {
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen cctx->cli_protocol_version = &cli_protocol_version[0];
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen sss_packet_get_body(cctx->creq->in, &req_body, &req_blen);
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen if (req_blen == sizeof(uint32_t)) {
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen memcpy(&client_version, req_body, sizeof(uint32_t));
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen DEBUG(5, ("Received client version [%d].\n", client_version));
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen i=0;
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen while(cli_protocol_version[i].version>0) {
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen if (cli_protocol_version[i].version == client_version) {
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen cctx->cli_protocol_version = &cli_protocol_version[i];
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen break;
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen }
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen i++;
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen }
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen }
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen }
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen /* create response packet */
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen ret = sss_packet_new(cctx->creq, sizeof(uint32_t),
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen sss_packet_get_cmd(cctx->creq->in),
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen &cctx->creq->out);
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen if (ret != EOK) {
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen return ret;
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen }
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen sss_packet_get_body(cctx->creq->out, &body, &blen);
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen ((uint32_t *)body)[0] = cctx->cli_protocol_version!=NULL ?
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen cctx->cli_protocol_version->version : 0;
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen DEBUG(5, ("Offered version [%d].\n", ((uint32_t *)body)[0]));
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen sss_cmd_done(cctx, NULL);
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen return EOK;
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen}
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainenint sss_cmd_execute(struct cli_ctx *cctx, struct sss_cmd_table *sss_cmds)
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen{
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen enum sss_cli_command cmd;
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen int i;
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen cmd = sss_packet_get_cmd(cctx->creq->in);
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen for (i = 0; sss_cmds[i].cmd != SSS_CLI_NULL; i++) {
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen if (cmd == sss_cmds[i].cmd) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen return sss_cmds[i].fn(cctx);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen }
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen }
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen return EINVAL;
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen}
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainenstruct setent_req_list {
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen struct setent_req_list *prev;
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen struct setent_req_list *next;
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen /* Need to modify the list from a talloc destructor */
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen struct setent_req_list **head;
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen void *pvt;
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen struct tevent_req *req;
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen};
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainenstruct tevent_req *
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainensetent_get_req(struct setent_req_list *sl)
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen{
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen return sl->req;
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen}
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainenint setent_remove_ref(TALLOC_CTX *ctx)
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen{
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen struct setent_req_list *entry =
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen talloc_get_type(ctx, struct setent_req_list);
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen DLIST_REMOVE(*(entry->head), entry);
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen return 0;
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen}
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainenerrno_t setent_add_ref(TALLOC_CTX *memctx,
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen void *pvt,
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen struct setent_req_list **list,
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen struct tevent_req *req)
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen{
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen struct setent_req_list *entry;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen entry = talloc_zero(memctx, struct setent_req_list);
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen if (!entry) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen return ENOMEM;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen }
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen entry->req = req;
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen entry->pvt = pvt;
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen DLIST_ADD_END(*list, entry, struct setent_req_list *);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen entry->head = list;
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen
009217abb57a24a4076092e8e4e165545747839eStephan Bosch talloc_set_destructor((TALLOC_CTX *)entry, setent_remove_ref);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen return EOK;
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen}
49ec317299dedfbc27be79ab97d5b7a8ba7a4eacTimo Sirainen
009217abb57a24a4076092e8e4e165545747839eStephan Boschvoid setent_notify(struct setent_req_list **list, errno_t err)
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen{
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen struct setent_req_list *reql;
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen /* Notify the waiting clients */
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen while ((reql = *list) != NULL) {
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen /* Each tevent_req_done() call will free
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen * the request, removing it from the list.
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen */
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen if (err == EOK) {
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen tevent_req_done(reql->req);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen } else {
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen tevent_req_error(reql->req, err);
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen }
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen if (reql == *list) {
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen /* The consumer failed to free the
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen * request. Log a bug and continue.
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen */
009217abb57a24a4076092e8e4e165545747839eStephan Bosch DEBUG(SSSDBG_FATAL_FAILURE,
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen ("BUG: a callback did not free its request. "
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen "May leak memory\n"));
49ec317299dedfbc27be79ab97d5b7a8ba7a4eacTimo Sirainen /* Skip to the next since a memory leak is non-fatal */
009217abb57a24a4076092e8e4e165545747839eStephan Bosch *list = (*list)->next;
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen }
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen }
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen}
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainenvoid setent_notify_done(struct setent_req_list **list)
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen{
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen return setent_notify(list, EOK);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen}
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen/*
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen * Return values:
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen * EOK - cache hit
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen * EAGAIN - cache hit, but schedule off band update
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen * ENOENT - cache miss
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen */
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainenerrno_t
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainensss_cmd_check_cache(struct ldb_message *msg,
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen int cache_refresh_percent,
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen uint64_t cache_expire)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen{
cf9d67e4a9bfee31cf3be05244555d51a3d1b9feTimo Sirainen uint64_t lastUpdate;
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen uint64_t midpoint_refresh = 0;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen time_t now;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
8ae72ad7d0c69e972cfa65d1e2ce4e3e9a8b765cTimo Sirainen now = time(NULL);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen lastUpdate = ldb_msg_find_attr_as_uint64(msg, SYSDB_LAST_UPDATE, 0);
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen midpoint_refresh = 0;
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen if(cache_refresh_percent) {
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen midpoint_refresh = lastUpdate +
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen (cache_expire - lastUpdate)*cache_refresh_percent/100;
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen if (midpoint_refresh - lastUpdate < 10) {
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen /* If the percentage results in an expiration
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen * less than ten seconds after the lastUpdate time,
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen * that's too often we will simply set it to 10s
a4502a71879d6018bd2c64f13614bb619911dd9fTimo Sirainen */
a4502a71879d6018bd2c64f13614bb619911dd9fTimo Sirainen midpoint_refresh = lastUpdate+10;
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen }
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen }
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (cache_expire > now) {
8ae72ad7d0c69e972cfa65d1e2ce4e3e9a8b765cTimo Sirainen /* cache still valid */
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen if (midpoint_refresh && midpoint_refresh < now) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* We're past the cache refresh timeout
cf9d67e4a9bfee31cf3be05244555d51a3d1b9feTimo Sirainen * We'll return the value from the cache, but we'll also
a4502a71879d6018bd2c64f13614bb619911dd9fTimo Sirainen * queue the cache entry for update out-of-band.
a4502a71879d6018bd2c64f13614bb619911dd9fTimo Sirainen */
a4502a71879d6018bd2c64f13614bb619911dd9fTimo Sirainen return EAGAIN;
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen } else {
a4502a71879d6018bd2c64f13614bb619911dd9fTimo Sirainen /* Cache is still valid. */
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen return EOK;
9058f3006fffd25835ad701e1b2c3c8faafd3c80Timo Sirainen }
9058f3006fffd25835ad701e1b2c3c8faafd3c80Timo Sirainen }
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen
28789c7ce1aa66ab21798bfb73ec64308b9a4de8Timo Sirainen /* Cache needs to be updated */
28789c7ce1aa66ab21798bfb73ec64308b9a4de8Timo Sirainen return ENOENT;
28789c7ce1aa66ab21798bfb73ec64308b9a4de8Timo Sirainen}
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen