return status;
}
-static NTSTATUS dbwrap_record_get_watchers(struct db_context *db,
- struct db_record *rec,
- TALLOC_CTX *mem_ctx,
- struct server_id **p_ids,
- size_t *p_num_ids)
-{
- struct db_context *w_db;
- size_t wkey_len = dbwrap_record_watchers_key(db, rec, NULL, 0);
- uint8_t wkey_buf[wkey_len];
- TDB_DATA wkey = { .dptr = wkey_buf, .dsize = wkey_len };
- TDB_DATA value = { 0, };
- struct server_id *ids;
- NTSTATUS status;
-
- dbwrap_record_watchers_key(db, rec, wkey_buf, wkey_len);
-
- w_db = dbwrap_record_watchers_db();
- if (w_db == NULL) {
- status = NT_STATUS_INTERNAL_ERROR;
- goto fail;
- }
- status = dbwrap_fetch(w_db, mem_ctx, wkey, &value);
- if (!NT_STATUS_IS_OK(status)) {
- goto fail;
- }
- if ((value.dsize % sizeof(struct server_id)) != 0) {
- status = NT_STATUS_INTERNAL_DB_CORRUPTION;
- goto fail;
- }
- ids = (struct server_id *)value.dptr;
- *p_ids = talloc_move(mem_ctx, &ids);
- *p_num_ids = value.dsize / sizeof(struct server_id);
- return NT_STATUS_OK;
-fail:
- TALLOC_FREE(value.dptr);
- return status;
-}
-
struct dbwrap_record_watch_state {
struct tevent_context *ev;
struct db_context *db;
return 0;
}
+static void dbwrap_watch_record_stored_fn(TDB_DATA key, TDB_DATA data,
+ void *private_data)
+{
+ struct messaging_context *msg = private_data;
+ size_t i, num_ids;
+
+ if ((data.dsize % sizeof(struct server_id)) != 0) {
+ DBG_WARNING("%s: Invalid data size: %zu\n", __func__,
+ data.dsize);
+ return;
+ }
+ num_ids = data.dsize / sizeof(struct server_id);
+
+ for (i=0; i<num_ids; i++) {
+ struct server_id dst;
+ NTSTATUS status;
+
+ memcpy(&dst, data.dptr + i * sizeof(struct server_id),
+ sizeof(struct server_id));
+
+ status = messaging_send_buf(msg, dst, MSG_DBWRAP_MODIFIED,
+ key.dptr, key.dsize);
+ if (!NT_STATUS_IS_OK(status)) {
+ struct server_id_buf tmp;
+ DBG_WARNING("%s: messaging_send to %s failed: %s\n",
+ __func__, server_id_str_buf(dst, &tmp),
+ nt_errstr(status));
+ }
+ }
+}
+
static void dbwrap_watch_record_stored(struct db_context *db,
struct db_record *rec,
void *private_data)
{
struct messaging_context *msg = talloc_get_type_abort(
private_data, struct messaging_context);
- struct server_id *ids = NULL;
- size_t num_ids = 0;
+ struct db_context *watchers_db;
size_t wkey_len = dbwrap_record_watchers_key(db, rec, NULL, 0);
uint8_t wkey_buf[wkey_len];
TDB_DATA wkey = { .dptr = wkey_buf, .dsize = wkey_len };
NTSTATUS status;
- uint32_t i;
+
+ watchers_db = dbwrap_record_watchers_db();
+ if (watchers_db == NULL) {
+ return;
+ }
dbwrap_record_watchers_key(db, rec, wkey_buf, wkey_len);
- status = dbwrap_record_get_watchers(db, rec, talloc_tos(),
- &ids, &num_ids);
+ status = dbwrap_parse_record(watchers_db, wkey,
+ dbwrap_watch_record_stored_fn, msg);
if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_FOUND)) {
- goto done;
+ return;
}
if (!NT_STATUS_IS_OK(status)) {
- DEBUG(1, ("dbwrap_record_get_watchers failed: %s\n",
- nt_errstr(status)));
- goto done;
+ DBG_WARNING("%s: dbwrap_parse_record failed: %s\n",
+ __func__, nt_errstr(status));
}
-
- for (i=0; i<num_ids; i++) {
- status = messaging_send_buf(msg, ids[i], MSG_DBWRAP_MODIFIED,
- wkey.dptr, wkey.dsize);
- if (!NT_STATUS_IS_OK(status)) {
- struct server_id_buf tmp;
- DEBUG(1, ("messaging_send to %s failed: %s\n",
- server_id_str_buf(ids[i], &tmp),
- nt_errstr(status)));
- }
- }
-done:
- TALLOC_FREE(ids);
- return;
}
void dbwrap_watch_db(struct db_context *db, struct messaging_context *msg)