/*
* Check if a message handler exists
*/
-int srvid_exists(struct srvid_context *srv, uint64_t srvid)
+int srvid_exists(struct srvid_context *srv, uint64_t srvid, void *private_data)
{
struct srvid_handler_list *list;
+ struct srvid_handler *h;
int ret;
ret = srvid_fetch(srv, srvid, &list);
return ENOENT;
}
+ if (private_data != NULL) {
+ for (h = list->h; h != NULL; h = h->next) {
+ if (h->private_data == private_data) {
+ return 0;
+ }
+ }
+
+ return ENOENT;
+ }
+
return 0;
}
/**
* @brief Check if any message handler is registered for srvid
*
+ * If private_data is NULL, then check if there is any registration
+ * for * specified srvid. If private_data is not NULL, then check for
+ * registration that matches the specified private data.
+ *
* @param[in] srv The srvid message handler database context
* @param[in] srvid The srvid
+ * @param[in] private_data Private data
* @return 0 on success, errno on failure
*/
-int srvid_exists(struct srvid_context *srv, uint64_t srvid);
+int srvid_exists(struct srvid_context *srv, uint64_t srvid,
+ void *private_data);
/**
* @brief Call message handlers for given srvid
ret = srvid_register(srv, tmp_ctx, TEST_SRVID, test_handler, &count);
assert(ret == 0);
- ret = srvid_exists(srv, TEST_SRVID);
+ ret = srvid_exists(srv, TEST_SRVID, NULL);
+ assert(ret == 0);
+
+ ret = srvid_exists(srv, TEST_SRVID, &count);
assert(ret == 0);
ret = srvid_dispatch(srv, TEST_SRVID, 0, tdb_null);
assert(ret == 0);
talloc_free(tmp_ctx);
- ret = srvid_exists(srv, TEST_SRVID);
+ ret = srvid_exists(srv, TEST_SRVID, NULL);
assert(ret == ENOENT);
ret = srvid_dispatch(srv, TEST_SRVID, 0, tdb_null);
ret = srvid_register(srv, tmp_ctx, TEST_SRVID, test_handler, NULL);
assert(ret == 0);
+ ret = srvid_exists(srv, TEST_SRVID, &count);
+ assert(ret == ENOENT);
+
ret = srvid_register(srv, tmp_ctx, TEST_SRVID, test_handler, &count);
assert(ret == 0);
+ ret = srvid_exists(srv, TEST_SRVID, &count);
+ assert(ret == 0);
talloc_free(srv);
assert(talloc_get_size(mem_ctx) == 0);