[SCM] Samba Shared Repository - branch master updated - release-4-0-0alpha6-464-gf24eecf

Günther Deschner gd at samba.org
Wed Feb 4 21:12:52 GMT 2009


The branch, master has been updated
       via  f24eecffde12937103dfce9bf91a69742eb75b29 (commit)
       via  456bd5ad08d754691706f955970cddba3846c3a7 (commit)
      from  63a992168db48568c91fe622e81141ca00c9bc45 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit f24eecffde12937103dfce9bf91a69742eb75b29
Author: Günther Deschner <gd at samba.org>
Date:   Fri Jan 16 12:48:11 2009 +0100

    s3-eventlog: add my copyright.
    
    Guenther

commit 456bd5ad08d754691706f955970cddba3846c3a7
Author: Günther Deschner <gd at samba.org>
Date:   Thu Jan 15 20:10:09 2009 +0100

    s3-eventlog: use pidl for _eventlog_ReadEventLogW.
    
    Guenther

-----------------------------------------------------------------------

Summary of changes:
 source3/rpc_server/srv_eventlog.c     |   22 +------
 source3/rpc_server/srv_eventlog_lib.c |    1 +
 source3/rpc_server/srv_eventlog_nt.c  |  124 ++++++++++++++++++---------------
 3 files changed, 71 insertions(+), 76 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/rpc_server/srv_eventlog.c b/source3/rpc_server/srv_eventlog.c
index 39e3115..dd00a24 100644
--- a/source3/rpc_server/srv_eventlog.c
+++ b/source3/rpc_server/srv_eventlog.c
@@ -63,27 +63,7 @@ static bool api_eventlog_get_oldest_entry(pipes_struct *p)
 
 static bool api_eventlog_read_eventlog(pipes_struct *p)
 {
-	EVENTLOG_Q_READ_EVENTLOG q_u;
-	EVENTLOG_R_READ_EVENTLOG r_u;
-	prs_struct *data = &p->in_data.data;
-	prs_struct *rdata = &p->out_data.rdata;
-
-	ZERO_STRUCT(q_u);
-	ZERO_STRUCT(r_u);
-
-	if (!(eventlog_io_q_read_eventlog("", &q_u, data, 0))) {
-		DEBUG(0, ("eventlog_io_q_read_eventlog: unable to unmarshall EVENTLOG_Q_READ_EVENTLOG.\n"));
-		return False;
-	}
-
-	r_u.status = _eventlog_read_eventlog(p, &q_u, &r_u);
-
-	if (!(eventlog_io_r_read_eventlog("", &q_u, &r_u, rdata, 0))) {
-		DEBUG(0, ("eventlog_io_r_read_eventlog: unable to marshall EVENTLOG_R_READ_EVENTLOG.\n"));
-		return False;
-	}
-
-	return True;
+	return proxy_eventlog_call(p, NDR_EVENTLOG_READEVENTLOGW);
 }
 
 static bool api_eventlog_clear_eventlog(pipes_struct *p)
diff --git a/source3/rpc_server/srv_eventlog_lib.c b/source3/rpc_server/srv_eventlog_lib.c
index 2c70141..d894ab0 100644
--- a/source3/rpc_server/srv_eventlog_lib.c
+++ b/source3/rpc_server/srv_eventlog_lib.c
@@ -4,6 +4,7 @@
  *  Copyright (C) Marcin Krzysztof Porwit    2005,
  *  Copyright (C) Brian Moran                2005.
  *  Copyright (C) Gerald (Jerry) Carter      2005.
+ *  Copyright (C) Guenther Deschner          2009.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
diff --git a/source3/rpc_server/srv_eventlog_nt.c b/source3/rpc_server/srv_eventlog_nt.c
index 990b03a..b4f7afc 100644
--- a/source3/rpc_server/srv_eventlog_nt.c
+++ b/source3/rpc_server/srv_eventlog_nt.c
@@ -4,6 +4,7 @@
  *  Copyright (C) Marcin Krzysztof Porwit    2005,
  *  Copyright (C) Brian Moran                2005,
  *  Copyright (C) Gerald (Jerry) Carter      2005.
+ *  Copyright (C) Guenther Deschner          2009.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -706,98 +707,117 @@ NTSTATUS _eventlog_CloseEventLog(pipes_struct * p,
 }
 
 /********************************************************************
+ _eventlog_ReadEventLogW
  ********************************************************************/
 
-NTSTATUS _eventlog_read_eventlog( pipes_struct * p,
-				EVENTLOG_Q_READ_EVENTLOG * q_u,
-				EVENTLOG_R_READ_EVENTLOG * r_u )
+NTSTATUS _eventlog_ReadEventLogW(pipes_struct *p,
+				 struct eventlog_ReadEventLogW *r)
 {
-	EVENTLOG_INFO *info = find_eventlog_info_by_hnd( p, &q_u->handle );
-	Eventlog_entry *entry = NULL, *ee_new = NULL;
-	uint32 num_records_read = 0;
+	EVENTLOG_INFO *info = find_eventlog_info_by_hnd( p, r->in.handle );
+	uint32_t num_records_read = 0;
 	int bytes_left, record_number;
-	uint32 elog_read_type, elog_read_dir;
+	uint32_t elog_read_type, elog_read_dir;
 
-	if (info == NULL) {
+	if (!info) {
 		return NT_STATUS_INVALID_HANDLE;
 	}
 
-	info->flags = q_u->flags;
+	info->flags	= r->in.flags;
+	bytes_left	= r->in.number_of_bytes;
 
-	bytes_left = q_u->max_read_size;
-
-	if ( !info->etdb )
+	if (!info->etdb) {
 		return NT_STATUS_ACCESS_DENIED;
+	}
 
 	/* check for valid flags.  Can't use the sequential and seek flags together */
 
-	elog_read_type = q_u->flags & (EVENTLOG_SEQUENTIAL_READ|EVENTLOG_SEEK_READ);
-	elog_read_dir = q_u->flags & (EVENTLOG_FORWARDS_READ|EVENTLOG_BACKWARDS_READ);
+	elog_read_type = r->in.flags & (EVENTLOG_SEQUENTIAL_READ|EVENTLOG_SEEK_READ);
+	elog_read_dir  = r->in.flags & (EVENTLOG_FORWARDS_READ|EVENTLOG_BACKWARDS_READ);
 
-	if ( elog_read_type == (EVENTLOG_SEQUENTIAL_READ|EVENTLOG_SEEK_READ)
-		||  elog_read_dir == (EVENTLOG_FORWARDS_READ|EVENTLOG_BACKWARDS_READ) )
+	if (r->in.flags == 0 ||
+	    elog_read_type == (EVENTLOG_SEQUENTIAL_READ|EVENTLOG_SEEK_READ) ||
+	    elog_read_dir == (EVENTLOG_FORWARDS_READ|EVENTLOG_BACKWARDS_READ))
 	{
-		DEBUG(3,("_eventlog_read_eventlog: Invalid flags [0x%x] for ReadEventLog\n", q_u->flags));
+		DEBUG(3,("_eventlog_ReadEventLogW: "
+			"Invalid flags [0x%08x] for ReadEventLog\n",
+			r->in.flags));
 		return NT_STATUS_INVALID_PARAMETER;
 	}
 
 	/* a sequential read should ignore the offset */
 
-	if ( elog_read_type & EVENTLOG_SEQUENTIAL_READ )
+	if (elog_read_type & EVENTLOG_SEQUENTIAL_READ) {
 		record_number = info->current_record;
-	else
-		record_number = q_u->offset;
+	} else {
+		record_number = r->in.offset;
+	}
 
-	while ( bytes_left > 0 ) {
+	if (r->in.number_of_bytes == 0) {
+		struct EVENTLOGRECORD *e;
+		e = evlog_pull_record(p->mem_ctx, ELOG_TDB_CTX(info->etdb),
+				      record_number);
+		if (!e) {
+			return NT_STATUS_END_OF_FILE;
+		}
+		*r->out.real_size = e->Length;
+		return NT_STATUS_BUFFER_TOO_SMALL;
+	}
+
+	while (bytes_left > 0) {
 
-		/* assume that when the record fetch fails, that we are done */
+		DATA_BLOB blob;
+		enum ndr_err_code ndr_err;
+		struct EVENTLOGRECORD *e;
 
-		entry = get_eventlog_record (p->mem_ctx, ELOG_TDB_CTX(info->etdb), record_number);
-		if (!entry) {
+		e = evlog_pull_record(p->mem_ctx, ELOG_TDB_CTX(info->etdb),
+				      record_number);
+		if (!e) {
 			break;
 		}
 
-		DEBUG( 8, ( "Retrieved record %d\n", record_number ) );
-
-		/* Now see if there is enough room to add */
-
-		if ( !(ee_new = read_package_entry( p->mem_ctx, entry )) )
-			return NT_STATUS_NO_MEMORY;
+		ndr_err = ndr_push_struct_blob(&blob, p->mem_ctx, NULL, e,
+			      (ndr_push_flags_fn_t)ndr_push_EVENTLOGRECORD);
+		if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+			return ndr_map_error2ntstatus(ndr_err);
+		}
 
-		if ( r_u->num_bytes_in_resp + ee_new->record.length > q_u->max_read_size ) {
-			r_u->bytes_in_next_record = ee_new->record.length;
+		if (DEBUGLEVEL >= 10) {
+			NDR_PRINT_DEBUG(EVENTLOGRECORD, e);
+		}
 
-			/* response would be too big to fit in client-size buffer */
+		if (blob.length > r->in.number_of_bytes) {
+			*r->out.real_size = blob.length;
+			return NT_STATUS_BUFFER_TOO_SMALL;
+		}
 
-			bytes_left = 0;
+		if (*r->out.sent_size + blob.length > r->in.number_of_bytes) {
 			break;
 		}
 
-		add_record_to_resp( r_u, ee_new );
-		bytes_left -= ee_new->record.length;
-		TALLOC_FREE(entry);
-		num_records_read = r_u->num_records - num_records_read;
+		bytes_left -= blob.length;
 
-		DEBUG( 10, ( "_eventlog_read_eventlog: read [%d] records for a total "
-			"of [%d] records using [%d] bytes out of a max of [%d].\n",
-			 num_records_read, r_u->num_records,
-			 r_u->num_bytes_in_resp,
-			 q_u->max_read_size ) );
-
-		if ( info->flags & EVENTLOG_FORWARDS_READ )
+		if (info->flags & EVENTLOG_FORWARDS_READ) {
 			record_number++;
-		else
+		} else {
 			record_number--;
+		}
 
 		/* update the eventlog record pointer */
 
 		info->current_record = record_number;
+
+		memcpy(&r->out.data[*(r->out.sent_size)],
+		       blob.data, blob.length);
+		*(r->out.sent_size) += blob.length;
+
+		num_records_read++;
 	}
 
-	/* crazy by WinXP uses NT_STATUS_BUFFER_TOO_SMALL to
-	   say when there are no more records */
+	if (r->in.offset == 0 && record_number == 0 && *r->out.sent_size == 0) {
+		return NT_STATUS_END_OF_FILE;
+	}
 
-	return (num_records_read ? NT_STATUS_OK : NT_STATUS_BUFFER_TOO_SMALL);
+	return NT_STATUS_OK;
 }
 
 /********************************************************************
@@ -872,12 +892,6 @@ NTSTATUS _eventlog_OpenBackupEventLogW(pipes_struct *p, struct eventlog_OpenBack
 	return NT_STATUS_NOT_IMPLEMENTED;
 }
 
-NTSTATUS _eventlog_ReadEventLogW(pipes_struct *p, struct eventlog_ReadEventLogW *r)
-{
-	p->rng_fault_state = True;
-	return NT_STATUS_NOT_IMPLEMENTED;
-}
-
 NTSTATUS _eventlog_ReportEventW(pipes_struct *p, struct eventlog_ReportEventW *r)
 {
 	p->rng_fault_state = True;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list