svn commit: samba r16440 - in branches/SAMBA_4_0/source/smb_server/smb: .

metze at samba.org metze at samba.org
Wed Jun 21 17:22:55 GMT 2006


Author: metze
Date: 2006-06-21 17:22:55 +0000 (Wed, 21 Jun 2006)
New Revision: 16440

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=16440

Log:
split out passthru level into a new functions,
so they can we reused for smb2 later

metze
Modified:
   branches/SAMBA_4_0/source/smb_server/smb/trans2.c


Changeset:
Modified: branches/SAMBA_4_0/source/smb_server/smb/trans2.c
===================================================================
--- branches/SAMBA_4_0/source/smb_server/smb/trans2.c	2006-06-21 14:13:06 UTC (rev 16439)
+++ branches/SAMBA_4_0/source/smb_server/smb/trans2.c	2006-06-21 17:22:55 UTC (rev 16440)
@@ -576,24 +576,15 @@
 	return ntvfs_mkdir(req->ntvfs, io);
 }
 
-static NTSTATUS trans2_push_fileinfo(struct smbsrv_connection *smb_conn,
-				     TALLOC_CTX *mem_ctx,
-				     DATA_BLOB *blob,
-				     union smb_fileinfo *st,
-				     int default_str_flags)
+static NTSTATUS trans2_push_passthru_fileinfo(TALLOC_CTX *mem_ctx,
+					      DATA_BLOB *blob,
+					      enum smb_fileinfo_level level,
+					      union smb_fileinfo *st,
+					      int default_str_flags)
 {
 	uint_t i;
-	uint32_t list_size;
 
-	switch (st->generic.level) {
-	case RAW_FILEINFO_GENERIC:
-	case RAW_FILEINFO_GETATTR:
-	case RAW_FILEINFO_GETATTRE:
-	case RAW_FILEINFO_SEC_DESC:
-		/* handled elsewhere */
-		return NT_STATUS_INVALID_LEVEL;
-
-	case RAW_FILEINFO_BASIC_INFO:
+	switch (level) {
 	case RAW_FILEINFO_BASIC_INFORMATION:
 		TRANS2_CHECK(trans2_grow_data(mem_ctx, blob, 40));
 
@@ -605,29 +596,6 @@
 		SIVAL(blob->data,       36, 0); /* padding */
 		return NT_STATUS_OK;
 
-	case RAW_FILEINFO_STANDARD:
-		TRANS2_CHECK(trans2_grow_data(mem_ctx, blob, 22));
-
-		srv_push_dos_date2(smb_conn, blob->data, 0, st->standard.out.create_time);
-		srv_push_dos_date2(smb_conn, blob->data, 4, st->standard.out.access_time);
-		srv_push_dos_date2(smb_conn, blob->data, 8, st->standard.out.write_time);
-		SIVAL(blob->data,        12, st->standard.out.size);
-		SIVAL(blob->data,        16, st->standard.out.alloc_size);
-		SSVAL(blob->data,        20, st->standard.out.attrib);
-		return NT_STATUS_OK;
-
-	case RAW_FILEINFO_EA_SIZE:
-		TRANS2_CHECK(trans2_grow_data(mem_ctx, blob, 26));
-
-		srv_push_dos_date2(smb_conn, blob->data, 0, st->ea_size.out.create_time);
-		srv_push_dos_date2(smb_conn, blob->data, 4, st->ea_size.out.access_time);
-		srv_push_dos_date2(smb_conn, blob->data, 8, st->ea_size.out.write_time);
-		SIVAL(blob->data,        12, st->ea_size.out.size);
-		SIVAL(blob->data,        16, st->ea_size.out.alloc_size);
-		SSVAL(blob->data,        20, st->ea_size.out.attrib);
-		SIVAL(blob->data,        22, st->ea_size.out.ea_size);
-		return NT_STATUS_OK;
-
 	case RAW_FILEINFO_NETWORK_OPEN_INFORMATION:
 		TRANS2_CHECK(trans2_grow_data(mem_ctx, blob, 56));
 
@@ -641,7 +609,6 @@
 		SIVAL(blob->data,       52, 0); /* padding */
 		return NT_STATUS_OK;
 
-	case RAW_FILEINFO_STANDARD_INFO:
 	case RAW_FILEINFO_STANDARD_INFORMATION:
 		TRANS2_CHECK(trans2_grow_data(mem_ctx, blob, 24));
 
@@ -660,7 +627,6 @@
 		SIVAL(blob->data,  4, st->attribute_tag_information.out.reparse_tag);
 		return NT_STATUS_OK;
 
-	case RAW_FILEINFO_EA_INFO:
 	case RAW_FILEINFO_EA_INFORMATION:
 		TRANS2_CHECK(trans2_grow_data(mem_ctx, blob, 4));
 
@@ -680,24 +646,6 @@
 		      st->alignment_information.out.alignment_requirement);
 		return NT_STATUS_OK;
 
-	case RAW_FILEINFO_EA_LIST:
-		list_size = ea_list_size(st->ea_list.out.num_eas,
-					 st->ea_list.out.eas);
-		TRANS2_CHECK(trans2_grow_data(mem_ctx, blob, list_size));
-
-		ea_put_list(blob->data, 
-			    st->ea_list.out.num_eas, st->ea_list.out.eas);
-		return NT_STATUS_OK;
-
-	case RAW_FILEINFO_ALL_EAS:
-		list_size = ea_list_size(st->all_eas.out.num_eas,
-						  st->all_eas.out.eas);
-		TRANS2_CHECK(trans2_grow_data(mem_ctx, blob, list_size));
-
-		ea_put_list(blob->data, 
-			    st->all_eas.out.num_eas, st->all_eas.out.eas);
-		return NT_STATUS_OK;
-
 	case RAW_FILEINFO_ACCESS_INFORMATION:
 		TRANS2_CHECK(trans2_grow_data(mem_ctx, blob, 4));
 
@@ -710,7 +658,6 @@
 		SBVAL(blob->data,  0, st->position_information.out.position);
 		return NT_STATUS_OK;
 
-	case RAW_FILEINFO_COMPRESSION_INFO:
 	case RAW_FILEINFO_COMPRESSION_INFORMATION:
 		TRANS2_CHECK(trans2_grow_data(mem_ctx, blob, 16));
 
@@ -723,16 +670,12 @@
 		SCVAL(blob->data, 15, 0);
 		return NT_STATUS_OK;
 
-	case RAW_FILEINFO_IS_NAME_VALID:
-		return NT_STATUS_OK;
-
 	case RAW_FILEINFO_INTERNAL_INFORMATION:
 		TRANS2_CHECK(trans2_grow_data(mem_ctx, blob, 8));
 
 		SBVAL(blob->data,  0, st->internal_information.out.file_id);
 		return NT_STATUS_OK;
 
-	case RAW_FILEINFO_ALL_INFO:
 	case RAW_FILEINFO_ALL_INFORMATION:
 		TRANS2_CHECK(trans2_grow_data(mem_ctx, blob, 72));
 
@@ -741,7 +684,7 @@
 		push_nttime(blob->data, 16, st->all_info.out.write_time);
 		push_nttime(blob->data, 24, st->all_info.out.change_time);
 		SIVAL(blob->data,       32, st->all_info.out.attrib);
-		SIVAL(blob->data,       36, 0);
+		SIVAL(blob->data,       36, 0); /* padding */
 		SBVAL(blob->data,       40, st->all_info.out.alloc_size);
 		SBVAL(blob->data,       48, st->all_info.out.size);
 		SIVAL(blob->data,       56, st->all_info.out.nlink);
@@ -755,7 +698,6 @@
 						       STR_UNICODE));
 		return NT_STATUS_OK;
 
-	case RAW_FILEINFO_NAME_INFO:
 	case RAW_FILEINFO_NAME_INFORMATION:
 		TRANS2_CHECK(trans2_grow_data(mem_ctx, blob, 4));
 
@@ -765,7 +707,6 @@
 						       STR_UNICODE));
 		return NT_STATUS_OK;
 
-	case RAW_FILEINFO_ALT_NAME_INFO:
 	case RAW_FILEINFO_ALT_NAME_INFORMATION:
 		TRANS2_CHECK(trans2_grow_data(mem_ctx, blob, 4));
 
@@ -775,7 +716,6 @@
 						       STR_UNICODE));
 		return NT_STATUS_OK;
 
-	case RAW_FILEINFO_STREAM_INFO:
 	case RAW_FILEINFO_STREAM_INFORMATION:
 		for (i=0;i<st->stream_info.out.num_streams;i++) {
 			uint32_t data_size = blob->length;
@@ -798,17 +738,122 @@
 			}
 		}
 		return NT_STATUS_OK;
-		
-	case RAW_FILEINFO_UNIX_BASIC:
-	case RAW_FILEINFO_UNIX_LINK:
+
+	default:
 		return NT_STATUS_INVALID_LEVEL;
+	}
 
+	return NT_STATUS_INVALID_LEVEL;
+}
+
+static NTSTATUS trans2_push_fileinfo(struct smbsrv_connection *smb_conn,
+				     TALLOC_CTX *mem_ctx,
+				     DATA_BLOB *blob,
+				     union smb_fileinfo *st,
+				     int default_str_flags)
+{
+	uint32_t list_size;
+	enum smb_fileinfo_level passthru_level;
+
+	switch (st->generic.level) {
+	case RAW_FILEINFO_GENERIC:
+	case RAW_FILEINFO_GETATTR:
+	case RAW_FILEINFO_GETATTRE:
+	case RAW_FILEINFO_SEC_DESC:
 	case RAW_FILEINFO_SMB2_ALL_EAS:
 	case RAW_FILEINFO_SMB2_ALL_INFORMATION:
+		/* handled elsewhere */
 		return NT_STATUS_INVALID_LEVEL;
+
+	case RAW_FILEINFO_UNIX_BASIC:
+	case RAW_FILEINFO_UNIX_LINK:
+		/* not implemented yet */
+		return NT_STATUS_INVALID_LEVEL;
+
+	case RAW_FILEINFO_STANDARD:
+		TRANS2_CHECK(trans2_grow_data(mem_ctx, blob, 22));
+
+		srv_push_dos_date2(smb_conn, blob->data, 0, st->standard.out.create_time);
+		srv_push_dos_date2(smb_conn, blob->data, 4, st->standard.out.access_time);
+		srv_push_dos_date2(smb_conn, blob->data, 8, st->standard.out.write_time);
+		SIVAL(blob->data,        12, st->standard.out.size);
+		SIVAL(blob->data,        16, st->standard.out.alloc_size);
+		SSVAL(blob->data,        20, st->standard.out.attrib);
+		return NT_STATUS_OK;
+
+	case RAW_FILEINFO_EA_SIZE:
+		TRANS2_CHECK(trans2_grow_data(mem_ctx, blob, 26));
+
+		srv_push_dos_date2(smb_conn, blob->data, 0, st->ea_size.out.create_time);
+		srv_push_dos_date2(smb_conn, blob->data, 4, st->ea_size.out.access_time);
+		srv_push_dos_date2(smb_conn, blob->data, 8, st->ea_size.out.write_time);
+		SIVAL(blob->data,        12, st->ea_size.out.size);
+		SIVAL(blob->data,        16, st->ea_size.out.alloc_size);
+		SSVAL(blob->data,        20, st->ea_size.out.attrib);
+		SIVAL(blob->data,        22, st->ea_size.out.ea_size);
+		return NT_STATUS_OK;
+
+	case RAW_FILEINFO_EA_LIST:
+		list_size = ea_list_size(st->ea_list.out.num_eas,
+					 st->ea_list.out.eas);
+		TRANS2_CHECK(trans2_grow_data(mem_ctx, blob, list_size));
+
+		ea_put_list(blob->data, 
+			    st->ea_list.out.num_eas, st->ea_list.out.eas);
+		return NT_STATUS_OK;
+
+	case RAW_FILEINFO_ALL_EAS:
+		list_size = ea_list_size(st->all_eas.out.num_eas,
+						  st->all_eas.out.eas);
+		TRANS2_CHECK(trans2_grow_data(mem_ctx, blob, list_size));
+
+		ea_put_list(blob->data, 
+			    st->all_eas.out.num_eas, st->all_eas.out.eas);
+		return NT_STATUS_OK;
+
+	case RAW_FILEINFO_IS_NAME_VALID:
+		return NT_STATUS_OK;
+
+	case RAW_FILEINFO_BASIC_INFO:
+		passthru_level = RAW_FILEINFO_BASIC_INFORMATION;
+		break;
+
+	case RAW_FILEINFO_STANDARD_INFO:
+		passthru_level = RAW_FILEINFO_STANDARD_INFORMATION;
+		break;
+
+	case RAW_FILEINFO_EA_INFO:
+		passthru_level = RAW_FILEINFO_EA_INFORMATION;
+		break;
+
+	case RAW_FILEINFO_COMPRESSION_INFO:
+		passthru_level = RAW_FILEINFO_COMPRESSION_INFORMATION;
+		break;
+
+	case RAW_FILEINFO_ALL_INFO:
+		passthru_level = RAW_FILEINFO_ALL_INFORMATION;
+		break;
+
+	case RAW_FILEINFO_NAME_INFO:
+		passthru_level = RAW_FILEINFO_NAME_INFORMATION;
+		break;
+
+	case RAW_FILEINFO_ALT_NAME_INFO:
+		passthru_level = RAW_FILEINFO_ALT_NAME_INFORMATION;
+		break;
+
+	case RAW_FILEINFO_STREAM_INFO:
+		passthru_level = RAW_FILEINFO_STREAM_INFORMATION;
+		break;
+
+	default:
+		passthru_level = st->generic.level;
+		break;
 	}
 
-	return NT_STATUS_INVALID_LEVEL;
+	return trans2_push_passthru_fileinfo(mem_ctx, blob,
+					     passthru_level, st,
+					     default_str_flags);
 }
 
 /*



More information about the samba-cvs mailing list