[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Wed Oct 28 16:44:41 MDT 2009


The branch, master has been updated
       via  25f96a4... Add in Metze's new code to ndr encode the user.DOSATTRIB blobs. Next I'll change the create timestamp and dos attribute code to use this.
      from  c27194a... Fix bug 6572 - libsmbclient: unable to access 'msdfs proxy' share.

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


- Log -----------------------------------------------------------------
commit 25f96a4058c731e302e2d45bd670e598a7e591b7
Author: Stefan (metze) Metzmacher <metze at samba.org>
Date:   Wed Oct 28 15:42:47 2009 -0700

    Add in Metze's new code to ndr encode the user.DOSATTRIB
    blobs. Next I'll change the create timestamp and dos attribute
    code to use this.

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

Summary of changes:
 librpc/gen_ndr/ndr_xattr.c |  234 +++++++++++++++++++++++++++++++++++++++++++-
 librpc/gen_ndr/ndr_xattr.h |   19 ++++-
 librpc/gen_ndr/xattr.h     |   40 ++++++++-
 librpc/idl/xattr.idl       |   53 +++++++++-
 librpc/ndr/ndr_xattr.c     |  148 ++++++++++++++++++++++++++++
 librpc/ndr/ndr_xattr.h     |   37 +++++++
 source3/Makefile.in        |    1 +
 source4/librpc/config.mk   |    2 +-
 8 files changed, 525 insertions(+), 9 deletions(-)
 create mode 100644 librpc/ndr/ndr_xattr.c
 create mode 100644 librpc/ndr/ndr_xattr.h


Changeset truncated at 500 lines:

diff --git a/librpc/gen_ndr/ndr_xattr.c b/librpc/gen_ndr/ndr_xattr.c
index 6bcc831..bbffd50 100644
--- a/librpc/gen_ndr/ndr_xattr.c
+++ b/librpc/gen_ndr/ndr_xattr.c
@@ -4,6 +4,38 @@
 #include "../librpc/gen_ndr/ndr_xattr.h"
 
 #include "librpc/gen_ndr/ndr_security.h"
+static enum ndr_err_code ndr_push_xattr_DosInfoFFFFCompat(struct ndr_push *ndr, int ndr_flags, const struct xattr_DosInfoFFFFCompat *r)
+{
+	if (ndr_flags & NDR_SCALARS) {
+		NDR_CHECK(ndr_push_align(ndr, 4));
+		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->attrib));
+		NDR_CHECK(ndr_push_trailer_align(ndr, 4));
+	}
+	if (ndr_flags & NDR_BUFFERS) {
+	}
+	return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_xattr_DosInfoFFFFCompat(struct ndr_pull *ndr, int ndr_flags, struct xattr_DosInfoFFFFCompat *r)
+{
+	if (ndr_flags & NDR_SCALARS) {
+		NDR_CHECK(ndr_pull_align(ndr, 4));
+		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->attrib));
+		NDR_CHECK(ndr_pull_trailer_align(ndr, 4));
+	}
+	if (ndr_flags & NDR_BUFFERS) {
+	}
+	return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_xattr_DosInfoFFFFCompat(struct ndr_print *ndr, const char *name, const struct xattr_DosInfoFFFFCompat *r)
+{
+	ndr_print_struct(ndr, name, "xattr_DosInfoFFFFCompat");
+	ndr->depth++;
+	ndr_print_uint32(ndr, "attrib", r->attrib);
+	ndr->depth--;
+}
+
 static enum ndr_err_code ndr_push_xattr_DosInfo1(struct ndr_push *ndr, int ndr_flags, const struct xattr_DosInfo1 *r)
 {
 	if (ndr_flags & NDR_SCALARS) {
@@ -117,13 +149,94 @@ _PUBLIC_ void ndr_print_xattr_DosInfo2Old(struct ndr_print *ndr, const char *nam
 	ndr->depth--;
 }
 
-static enum ndr_err_code ndr_push_xattr_DosInfo(struct ndr_push *ndr, int ndr_flags, const union xattr_DosInfo *r)
+static enum ndr_err_code ndr_push_xattr_DosInfoValidFlags(struct ndr_push *ndr, int ndr_flags, uint32_t r)
+{
+	NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r));
+	return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_xattr_DosInfoValidFlags(struct ndr_pull *ndr, int ndr_flags, uint32_t *r)
+{
+	uint32_t v;
+	NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
+	*r = v;
+	return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_xattr_DosInfoValidFlags(struct ndr_print *ndr, const char *name, uint32_t r)
+{
+	ndr_print_uint32(ndr, name, r);
+	ndr->depth++;
+	ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "XATTR_DOSINFO_ATTRIB", XATTR_DOSINFO_ATTRIB, r);
+	ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "XATTR_DOSINFO_EA_SIZE", XATTR_DOSINFO_EA_SIZE, r);
+	ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "XATTR_DOSINFO_SIZE", XATTR_DOSINFO_SIZE, r);
+	ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "XATTR_DOSINFO_ALLOC_SIZE", XATTR_DOSINFO_ALLOC_SIZE, r);
+	ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "XATTR_DOSINFO_CREATE_TIME", XATTR_DOSINFO_CREATE_TIME, r);
+	ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "XATTR_DOSINFO_CHANGE_TIME", XATTR_DOSINFO_CHANGE_TIME, r);
+	ndr->depth--;
+}
+
+static enum ndr_err_code ndr_push_xattr_DosInfo3(struct ndr_push *ndr, int ndr_flags, const struct xattr_DosInfo3 *r)
+{
+	if (ndr_flags & NDR_SCALARS) {
+		NDR_CHECK(ndr_push_align(ndr, 4));
+		NDR_CHECK(ndr_push_xattr_DosInfoValidFlags(ndr, NDR_SCALARS, r->valid_flags));
+		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->attrib));
+		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->ea_size));
+		NDR_CHECK(ndr_push_udlong(ndr, NDR_SCALARS, r->size));
+		NDR_CHECK(ndr_push_udlong(ndr, NDR_SCALARS, r->alloc_size));
+		NDR_CHECK(ndr_push_NTTIME(ndr, NDR_SCALARS, r->create_time));
+		NDR_CHECK(ndr_push_NTTIME(ndr, NDR_SCALARS, r->change_time));
+		NDR_CHECK(ndr_push_trailer_align(ndr, 4));
+	}
+	if (ndr_flags & NDR_BUFFERS) {
+	}
+	return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_xattr_DosInfo3(struct ndr_pull *ndr, int ndr_flags, struct xattr_DosInfo3 *r)
+{
+	if (ndr_flags & NDR_SCALARS) {
+		NDR_CHECK(ndr_pull_align(ndr, 4));
+		NDR_CHECK(ndr_pull_xattr_DosInfoValidFlags(ndr, NDR_SCALARS, &r->valid_flags));
+		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->attrib));
+		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->ea_size));
+		NDR_CHECK(ndr_pull_udlong(ndr, NDR_SCALARS, &r->size));
+		NDR_CHECK(ndr_pull_udlong(ndr, NDR_SCALARS, &r->alloc_size));
+		NDR_CHECK(ndr_pull_NTTIME(ndr, NDR_SCALARS, &r->create_time));
+		NDR_CHECK(ndr_pull_NTTIME(ndr, NDR_SCALARS, &r->change_time));
+		NDR_CHECK(ndr_pull_trailer_align(ndr, 4));
+	}
+	if (ndr_flags & NDR_BUFFERS) {
+	}
+	return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_xattr_DosInfo3(struct ndr_print *ndr, const char *name, const struct xattr_DosInfo3 *r)
+{
+	ndr_print_struct(ndr, name, "xattr_DosInfo3");
+	ndr->depth++;
+	ndr_print_xattr_DosInfoValidFlags(ndr, "valid_flags", r->valid_flags);
+	ndr_print_uint32(ndr, "attrib", r->attrib);
+	ndr_print_uint32(ndr, "ea_size", r->ea_size);
+	ndr_print_udlong(ndr, "size", r->size);
+	ndr_print_udlong(ndr, "alloc_size", r->alloc_size);
+	ndr_print_NTTIME(ndr, "create_time", r->create_time);
+	ndr_print_NTTIME(ndr, "change_time", r->change_time);
+	ndr->depth--;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_push_xattr_DosInfo(struct ndr_push *ndr, int ndr_flags, const union xattr_DosInfo *r)
 {
 	if (ndr_flags & NDR_SCALARS) {
 		int level = ndr_push_get_switch_value(ndr, r);
 		NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, level));
 		NDR_CHECK(ndr_push_union_align(ndr, 4));
 		switch (level) {
+			case 0xFFFF: {
+				NDR_CHECK(ndr_push_xattr_DosInfoFFFFCompat(ndr, NDR_SCALARS, &r->compatinfoFFFF));
+			break; }
+
 			case 1: {
 				NDR_CHECK(ndr_push_xattr_DosInfo1(ndr, NDR_SCALARS, &r->info1));
 			break; }
@@ -132,6 +245,10 @@ static enum ndr_err_code ndr_push_xattr_DosInfo(struct ndr_push *ndr, int ndr_fl
 				NDR_CHECK(ndr_push_xattr_DosInfo2Old(ndr, NDR_SCALARS, &r->oldinfo2));
 			break; }
 
+			case 3: {
+				NDR_CHECK(ndr_push_xattr_DosInfo3(ndr, NDR_SCALARS, &r->info3));
+			break; }
+
 			default:
 				return ndr_push_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u at %s", level, __location__);
 		}
@@ -139,12 +256,18 @@ static enum ndr_err_code ndr_push_xattr_DosInfo(struct ndr_push *ndr, int ndr_fl
 	if (ndr_flags & NDR_BUFFERS) {
 		int level = ndr_push_get_switch_value(ndr, r);
 		switch (level) {
+			case 0xFFFF:
+			break;
+
 			case 1:
 			break;
 
 			case 2:
 			break;
 
+			case 3:
+			break;
+
 			default:
 				return ndr_push_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u at %s", level, __location__);
 		}
@@ -152,7 +275,7 @@ static enum ndr_err_code ndr_push_xattr_DosInfo(struct ndr_push *ndr, int ndr_fl
 	return NDR_ERR_SUCCESS;
 }
 
-static enum ndr_err_code ndr_pull_xattr_DosInfo(struct ndr_pull *ndr, int ndr_flags, union xattr_DosInfo *r)
+_PUBLIC_ enum ndr_err_code ndr_pull_xattr_DosInfo(struct ndr_pull *ndr, int ndr_flags, union xattr_DosInfo *r)
 {
 	int level;
 	uint16_t _level;
@@ -164,6 +287,10 @@ static enum ndr_err_code ndr_pull_xattr_DosInfo(struct ndr_pull *ndr, int ndr_fl
 		}
 		NDR_CHECK(ndr_pull_union_align(ndr, 4));
 		switch (level) {
+			case 0xFFFF: {
+				NDR_CHECK(ndr_pull_xattr_DosInfoFFFFCompat(ndr, NDR_SCALARS, &r->compatinfoFFFF));
+			break; }
+
 			case 1: {
 				NDR_CHECK(ndr_pull_xattr_DosInfo1(ndr, NDR_SCALARS, &r->info1));
 			break; }
@@ -172,18 +299,28 @@ static enum ndr_err_code ndr_pull_xattr_DosInfo(struct ndr_pull *ndr, int ndr_fl
 				NDR_CHECK(ndr_pull_xattr_DosInfo2Old(ndr, NDR_SCALARS, &r->oldinfo2));
 			break; }
 
+			case 3: {
+				NDR_CHECK(ndr_pull_xattr_DosInfo3(ndr, NDR_SCALARS, &r->info3));
+			break; }
+
 			default:
 				return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u at %s", level, __location__);
 		}
 	}
 	if (ndr_flags & NDR_BUFFERS) {
 		switch (level) {
+			case 0xFFFF:
+			break;
+
 			case 1:
 			break;
 
 			case 2:
 			break;
 
+			case 3:
+			break;
+
 			default:
 				return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u at %s", level, __location__);
 		}
@@ -197,6 +334,10 @@ _PUBLIC_ void ndr_print_xattr_DosInfo(struct ndr_print *ndr, const char *name, c
 	level = ndr_print_get_switch_value(ndr, r);
 	ndr_print_union(ndr, name, level, "xattr_DosInfo");
 	switch (level) {
+		case 0xFFFF:
+			ndr_print_xattr_DosInfoFFFFCompat(ndr, "compatinfoFFFF", &r->compatinfoFFFF);
+		break;
+
 		case 1:
 			ndr_print_xattr_DosInfo1(ndr, "info1", &r->info1);
 		break;
@@ -205,6 +346,10 @@ _PUBLIC_ void ndr_print_xattr_DosInfo(struct ndr_print *ndr, const char *name, c
 			ndr_print_xattr_DosInfo2Old(ndr, "oldinfo2", &r->oldinfo2);
 		break;
 
+		case 3:
+			ndr_print_xattr_DosInfo3(ndr, "info3", &r->info3);
+		break;
+
 		default:
 			ndr_print_bad_level(ndr, name, level);
 	}
@@ -893,3 +1038,88 @@ _PUBLIC_ void ndr_print_xattr_NTACL(struct ndr_print *ndr, const char *name, con
 	ndr->depth--;
 }
 
+static enum ndr_err_code ndr_push_xattr_parse_DOSATTRIB(struct ndr_push *ndr, int flags, const struct xattr_parse_DOSATTRIB *r)
+{
+	if (flags & NDR_IN) {
+		NDR_CHECK(ndr_push_xattr_DOSATTRIB(ndr, NDR_SCALARS, &r->in.x));
+	}
+	if (flags & NDR_OUT) {
+	}
+	return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_xattr_parse_DOSATTRIB(struct ndr_pull *ndr, int flags, struct xattr_parse_DOSATTRIB *r)
+{
+	if (flags & NDR_IN) {
+		NDR_CHECK(ndr_pull_xattr_DOSATTRIB(ndr, NDR_SCALARS, &r->in.x));
+	}
+	if (flags & NDR_OUT) {
+	}
+	return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_xattr_parse_DOSATTRIB(struct ndr_print *ndr, const char *name, int flags, const struct xattr_parse_DOSATTRIB *r)
+{
+	ndr_print_struct(ndr, name, "xattr_parse_DOSATTRIB");
+	ndr->depth++;
+	if (flags & NDR_SET_VALUES) {
+		ndr->flags |= LIBNDR_PRINT_SET_VALUES;
+	}
+	if (flags & NDR_IN) {
+		ndr_print_struct(ndr, "in", "xattr_parse_DOSATTRIB");
+		ndr->depth++;
+		ndr_print_xattr_DOSATTRIB(ndr, "x", &r->in.x);
+		ndr->depth--;
+	}
+	if (flags & NDR_OUT) {
+		ndr_print_struct(ndr, "out", "xattr_parse_DOSATTRIB");
+		ndr->depth++;
+		ndr->depth--;
+	}
+	ndr->depth--;
+}
+
+static const struct ndr_interface_call xattr_calls[] = {
+	{
+		"xattr_parse_DOSATTRIB",
+		sizeof(struct xattr_parse_DOSATTRIB),
+		(ndr_push_flags_fn_t) ndr_push_xattr_parse_DOSATTRIB,
+		(ndr_pull_flags_fn_t) ndr_pull_xattr_parse_DOSATTRIB,
+		(ndr_print_function_t) ndr_print_xattr_parse_DOSATTRIB,
+		false,
+	},
+	{ NULL, 0, NULL, NULL, NULL, false }
+};
+
+static const char * const xattr_endpoint_strings[] = {
+	"ncacn_np:[\\pipe\\xattr]", 
+};
+
+static const struct ndr_interface_string_array xattr_endpoints = {
+	.count	= 1,
+	.names	= xattr_endpoint_strings
+};
+
+static const char * const xattr_authservice_strings[] = {
+	"host", 
+};
+
+static const struct ndr_interface_string_array xattr_authservices = {
+	.count	= 1,
+	.names	= xattr_authservice_strings
+};
+
+
+const struct ndr_interface_table ndr_table_xattr = {
+	.name		= "xattr",
+	.syntax_id	= {
+		{0x12345778,0x1234,0xabcd,{0x00,0x01},{0x00,0x00,0x00,0x02}},
+		NDR_XATTR_VERSION
+	},
+	.helpstring	= NDR_XATTR_HELPSTRING,
+	.num_calls	= 1,
+	.calls		= xattr_calls,
+	.endpoints	= &xattr_endpoints,
+	.authservices	= &xattr_authservices
+};
+
diff --git a/librpc/gen_ndr/ndr_xattr.h b/librpc/gen_ndr/ndr_xattr.h
index 9bf49d0..0641eff 100644
--- a/librpc/gen_ndr/ndr_xattr.h
+++ b/librpc/gen_ndr/ndr_xattr.h
@@ -6,13 +6,29 @@
 #ifndef _HEADER_NDR_xattr
 #define _HEADER_NDR_xattr
 
-#define NDR_XATTR_CALL_COUNT (0)
+#include "../librpc/ndr/ndr_xattr.h"
+#define NDR_XATTR_UUID "12345778-1234-abcd-0001-00000002"
+#define NDR_XATTR_VERSION 0.0
+#define NDR_XATTR_NAME "xattr"
+#define NDR_XATTR_HELPSTRING NULL
+extern const struct ndr_interface_table ndr_table_xattr;
+#define NDR_XATTR_PARSE_DOSATTRIB (0x00)
+
+#define NDR_XATTR_CALL_COUNT (1)
+void ndr_print_xattr_DosInfoFFFFCompat(struct ndr_print *ndr, const char *name, const struct xattr_DosInfoFFFFCompat *r);
 void ndr_print_xattr_DosInfo1(struct ndr_print *ndr, const char *name, const struct xattr_DosInfo1 *r);
 void ndr_print_xattr_DosInfo2Old(struct ndr_print *ndr, const char *name, const struct xattr_DosInfo2Old *r);
+void ndr_print_xattr_DosInfoValidFlags(struct ndr_print *ndr, const char *name, uint32_t r);
+void ndr_print_xattr_DosInfo3(struct ndr_print *ndr, const char *name, const struct xattr_DosInfo3 *r);
+enum ndr_err_code ndr_push_xattr_DosInfo(struct ndr_push *ndr, int ndr_flags, const union xattr_DosInfo *r);
+enum ndr_err_code ndr_pull_xattr_DosInfo(struct ndr_pull *ndr, int ndr_flags, union xattr_DosInfo *r);
 void ndr_print_xattr_DosInfo(struct ndr_print *ndr, const char *name, const union xattr_DosInfo *r);
 enum ndr_err_code ndr_push_xattr_DosAttrib(struct ndr_push *ndr, int ndr_flags, const struct xattr_DosAttrib *r);
 enum ndr_err_code ndr_pull_xattr_DosAttrib(struct ndr_pull *ndr, int ndr_flags, struct xattr_DosAttrib *r);
 void ndr_print_xattr_DosAttrib(struct ndr_print *ndr, const char *name, const struct xattr_DosAttrib *r);
+enum ndr_err_code ndr_push_xattr_DOSATTRIB(struct ndr_push *ndr, int ndr_flags, const struct xattr_DOSATTRIB *r);
+enum ndr_err_code ndr_pull_xattr_DOSATTRIB(struct ndr_pull *ndr, int ndr_flags, struct xattr_DOSATTRIB *r);
+void ndr_print_xattr_DOSATTRIB(struct ndr_print *ndr, const char *name, const struct xattr_DOSATTRIB *r);
 void ndr_print_xattr_EA(struct ndr_print *ndr, const char *name, const struct xattr_EA *r);
 enum ndr_err_code ndr_push_xattr_DosEAs(struct ndr_push *ndr, int ndr_flags, const struct xattr_DosEAs *r);
 enum ndr_err_code ndr_pull_xattr_DosEAs(struct ndr_pull *ndr, int ndr_flags, struct xattr_DosEAs *r);
@@ -34,4 +50,5 @@ void ndr_print_xattr_NTACL_Info(struct ndr_print *ndr, const char *name, const u
 enum ndr_err_code ndr_push_xattr_NTACL(struct ndr_push *ndr, int ndr_flags, const struct xattr_NTACL *r);
 enum ndr_err_code ndr_pull_xattr_NTACL(struct ndr_pull *ndr, int ndr_flags, struct xattr_NTACL *r);
 void ndr_print_xattr_NTACL(struct ndr_print *ndr, const char *name, const struct xattr_NTACL *r);
+void ndr_print_xattr_parse_DOSATTRIB(struct ndr_print *ndr, const char *name, int flags, const struct xattr_parse_DOSATTRIB *r);
 #endif /* _HEADER_NDR_xattr */
diff --git a/librpc/gen_ndr/xattr.h b/librpc/gen_ndr/xattr.h
index 3138e6f..d85d21d 100644
--- a/librpc/gen_ndr/xattr.h
+++ b/librpc/gen_ndr/xattr.h
@@ -20,6 +20,10 @@
 #define XATTR_SD_HASH_SIZE	( 64 )
 #define XATTR_SD_HASH_TYPE_NONE	( 0x0 )
 #define XATTR_SD_HASH_TYPE_SHA256	( 0x1 )
+struct xattr_DosInfoFFFFCompat {
+	uint32_t attrib;
+};
+
 struct xattr_DosInfo1 {
 	uint32_t attrib;
 	uint32_t ea_size;
@@ -41,16 +45,42 @@ struct xattr_DosInfo2Old {
 	const char * name;/* [flag(LIBNDR_FLAG_STR_UTF8|LIBNDR_FLAG_STR_NULLTERM)] */
 };
 
+/* bitmap xattr_DosInfoValidFlags */
+#define XATTR_DOSINFO_ATTRIB ( 0x00000001 )
+#define XATTR_DOSINFO_EA_SIZE ( 0x00000002 )
+#define XATTR_DOSINFO_SIZE ( 0x00000004 )
+#define XATTR_DOSINFO_ALLOC_SIZE ( 0x00000008 )
+#define XATTR_DOSINFO_CREATE_TIME ( 0x00000010 )
+#define XATTR_DOSINFO_CHANGE_TIME ( 0x00000020 )
+
+struct xattr_DosInfo3 {
+	uint32_t valid_flags;
+	uint32_t attrib;
+	uint32_t ea_size;
+	uint64_t size;
+	uint64_t alloc_size;
+	NTTIME create_time;
+	NTTIME change_time;
+};
+
 union xattr_DosInfo {
+	struct xattr_DosInfoFFFFCompat compatinfoFFFF;/* [case(0xFFFF)] */
 	struct xattr_DosInfo1 info1;/* [case] */
 	struct xattr_DosInfo2Old oldinfo2;/* [case(2)] */
-}/* [switch_type(uint16)] */;
+	struct xattr_DosInfo3 info3;/* [case(3)] */
+}/* [public,switch_type(uint16)] */;
 
 struct xattr_DosAttrib {
 	uint16_t version;
 	union xattr_DosInfo info;/* [switch_is(version)] */
 }/* [public] */;
 
+struct xattr_DOSATTRIB {
+	const char * attrib_hex;/* [flag(LIBNDR_FLAG_STR_ASCII|LIBNDR_FLAG_STR_NULLTERM)] */
+	uint16_t version;
+	union xattr_DosInfo info;/* [switch_is(version)] */
+}/* [noprint,nopull,public,nopush] */;
+
 struct xattr_EA {
 	const char * name;/* [flag(LIBNDR_FLAG_STR_UTF8|LIBNDR_FLAG_STR_NULLTERM)] */
 	DATA_BLOB value;
@@ -100,4 +130,12 @@ struct xattr_NTACL {
 	union xattr_NTACL_Info info;/* [switch_is(version)] */
 }/* [public] */;
 
+
+struct xattr_parse_DOSATTRIB {
+	struct {
+		struct xattr_DOSATTRIB x;
+	} in;
+
+};
+
 #endif /* _HEADER_xattr */
diff --git a/librpc/idl/xattr.idl b/librpc/idl/xattr.idl
index 4485caa..1dd98a9 100644
--- a/librpc/idl/xattr.idl
+++ b/librpc/idl/xattr.idl
@@ -11,6 +11,9 @@
 import "security.idl";
 
 [
+  uuid("12345778-1234-abcd-0001-00000002"),
+  version(0.0),
+  helper("../librpc/ndr/ndr_xattr.h"),
   pointer_default(unique)
 ]
 interface xattr
@@ -22,6 +25,18 @@ interface xattr
 	   using a union we can cope with new version of this
 	   structure more easily */
 
+	/*
+	 * the FFFF level is never really used,
+	 * it's used to pass the information from
+	 * the old hex string attrib information
+	 * we have a handwritten parser which converts
+	 * the hex string to the xattr_DosInfoFFFFCompat strucure
+	 */
+
+	typedef struct {
+		uint32 attrib;
+	} xattr_DosInfoFFFFCompat;
+
 	typedef struct {
 		uint32 attrib;
 		uint32 ea_size;
@@ -51,16 +66,46 @@ interface xattr
 		utf8string name;
 	} xattr_DosInfo2Old;
 
-	typedef [switch_type(uint16)] union {
-		[case(1)] xattr_DosInfo1 info1;
-		[case(2)] xattr_DosInfo2Old oldinfo2;
-	} xattr_DosInfo;
+	typedef [bitmap32bit] bitmap {
+		XATTR_DOSINFO_ATTRIB            = 0x00000001,
+		XATTR_DOSINFO_EA_SIZE           = 0x00000002,
+		XATTR_DOSINFO_SIZE              = 0x00000004,
+		XATTR_DOSINFO_ALLOC_SIZE        = 0x00000008,
+		XATTR_DOSINFO_CREATE_TIME       = 0x00000010,
+		XATTR_DOSINFO_CHANGE_TIME       = 0x00000020
+	} xattr_DosInfoValidFlags;
+
+	typedef struct {
+		xattr_DosInfoValidFlags valid_flags;
+		uint32 attrib;
+		uint32 ea_size;
+		udlong size;
+		udlong alloc_size;
+		NTTIME create_time;
+		NTTIME change_time;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list