s3-eventlog: add evlog_pull_record_tdb function.
authorGünther Deschner <gd@samba.org>
Thu, 15 Jan 2009 19:28:30 +0000 (20:28 +0100)
committerGünther Deschner <gd@samba.org>
Tue, 3 Feb 2009 15:06:57 +0000 (16:06 +0100)
Guenther

source3/include/proto.h
source3/rpc_server/srv_eventlog_lib.c

index 19d131cb6311560c2890f721a208bf7749f82bc7..bf4976ec49190f407a55b9c1c7f9d6803ae6a410 100644 (file)
@@ -6263,6 +6263,9 @@ int elog_close_tdb( ELOG_TDB *etdb, bool force_close );
 int write_eventlog_tdb( TDB_CONTEXT * the_tdb, Eventlog_entry * ee );
 void fixup_eventlog_entry( Eventlog_entry * ee );
 bool parse_logentry( TALLOC_CTX *mem_ctx, char *line, Eventlog_entry * entry, bool * eor );
+struct eventlog_Record_tdb *evlog_pull_record_tdb(TALLOC_CTX *mem_ctx,
+                                                 TDB_CONTEXT *tdb,
+                                                 uint32_t record_number);
 
 /* The following definitions come from rpc_server/srv_eventlog_nt.c  */
 
index 2890dc952870ef95119877908849909f279fb522..d6c4f1ab61c761ecc068035f3b3865865cc83fd8 100644 (file)
@@ -748,3 +748,58 @@ bool parse_logentry( TALLOC_CTX *mem_ctx, char *line, Eventlog_entry * entry, bo
        }
        return true;
 }
+
+/********************************************************************
+ ********************************************************************/
+
+struct eventlog_Record_tdb *evlog_pull_record_tdb(TALLOC_CTX *mem_ctx,
+                                                 TDB_CONTEXT *tdb,
+                                                 uint32_t record_number)
+{
+       struct eventlog_Record_tdb *r;
+       TDB_DATA data, key;
+
+       int32_t srecno;
+       enum ndr_err_code ndr_err;
+       DATA_BLOB blob;
+
+       srecno = record_number;
+       key.dptr = (unsigned char *)&srecno;
+       key.dsize = sizeof(int32_t);
+
+       data = tdb_fetch(tdb, key);
+       if (data.dsize == 0) {
+               DEBUG(8,("evlog_pull_record_tdb: "
+                       "Can't find a record for the key, record %d\n",
+                       record_number));
+               return NULL;
+       }
+
+       r = talloc_zero(mem_ctx, struct eventlog_Record_tdb);
+       if (!r) {
+               goto done;
+       }
+
+       blob = data_blob_const(data.dptr, data.dsize);
+
+       ndr_err = ndr_pull_struct_blob(&blob, mem_ctx, NULL, r,
+                          (ndr_pull_flags_fn_t)ndr_pull_eventlog_Record_tdb);
+
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               DEBUG(10,("evlog_pull_record_tdb: failed to decode record %d\n",
+                       record_number));
+               TALLOC_FREE(r);
+               goto done;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_DEBUG(eventlog_Record_tdb, r);
+       }
+
+       DEBUG(10,("evlog_pull_record_tdb: retrieved entry for record %d\n",
+               record_number));
+ done:
+       SAFE_FREE(data.dptr);
+
+       return r;
+}