TODO: xattr.idl: add compat code for s3 DOSATTRIB master4-xattr-01
authorStefan Metzmacher <metze@samba.org>
Wed, 19 Aug 2009 08:05:28 +0000 (10:05 +0200)
committerStefan Metzmacher <metze@samba.org>
Thu, 20 Aug 2009 08:50:44 +0000 (10:50 +0200)
metze

librpc/gen_ndr/ndr_xattr.c
librpc/gen_ndr/ndr_xattr.h
librpc/gen_ndr/xattr.h
librpc/idl/xattr.idl
librpc/ndr/ndr_xattr.c [new file with mode: 0644]
librpc/ndr/ndr_xattr.h [new file with mode: 0644]
source3/Makefile.in
source4/librpc/config.mk

index 204301ca454651fafc0a4d75816c53f042aa7bfa..4462e3144a60b29325d90f01c1428f24ce35879a 100644 (file)
@@ -4,6 +4,36 @@
 #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));
+       }
+       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));
+       }
+       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) {
@@ -113,12 +143,91 @@ _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));
+       }
+       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));
+       }
+       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));
                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; }
@@ -127,6 +236,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__);
                }
@@ -134,12 +247,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__);
                }
@@ -147,7 +266,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;
@@ -158,6 +277,10 @@ static enum ndr_err_code ndr_pull_xattr_DosInfo(struct ndr_pull *ndr, int ndr_fl
                        return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u for r at %s", _level, __location__);
                }
                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; }
@@ -166,18 +289,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__);
                }
@@ -191,6 +324,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;
@@ -199,6 +336,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);
        }
@@ -867,3 +1008,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
+};
+
index 9bf49d00efa1a3d5adf338102a046a14302a0b96..0641eff54d2a8897c5180ff9095db20c18ecca2e 100644 (file)
@@ -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 */
index 3138e6fa247282c7de7654da5a42141ec702ef87..d85d21d0ba81c1977aef6ac06ec81beef88e2cda 100644 (file)
 #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 */
index 4485caa48f4dbcdaf0a9bdac25cf2c2d05a1f60a..be29d38e6da6b38d33bd8f54c19efab4cc094bec 100644 (file)
@@ -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,17 @@ 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,9 +65,30 @@ interface xattr
                utf8string name;
        } xattr_DosInfo2Old;
 
-       typedef [switch_type(uint16)] union {
+       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;
+       } xattr_DosInfo3;
+
+       typedef [public,switch_type(uint16)] union {
+               [case(0xFFFF)] xattr_DosInfoFFFFCompat compatinfoFFFF;
                [case(1)] xattr_DosInfo1 info1;
                [case(2)] xattr_DosInfo2Old oldinfo2;
+               [case(3)] xattr_DosInfo3 info3;
        } xattr_DosInfo;
 
        typedef [public] struct {
@@ -61,6 +96,15 @@ interface xattr
                [switch_is(version)] xattr_DosInfo info;
        } xattr_DosAttrib;
 
+       typedef [public,nopush,nopull,noprint] struct {
+               astring attrib_hex;
+               uint16 version;
+               [switch_is(version)] xattr_DosInfo info;
+       } xattr_DOSATTRIB;
+
+       void xattr_parse_DOSATTRIB(
+               [in] xattr_DOSATTRIB x
+       );
 
        /* we store DOS style extended attributes in a DosEAs xattr */
        const char *XATTR_DOSEAS_NAME = "user.DosEAs";
diff --git a/librpc/ndr/ndr_xattr.c b/librpc/ndr/ndr_xattr.c
new file mode 100644 (file)
index 0000000..fbda7c5
--- /dev/null
@@ -0,0 +1,149 @@
+/*
+   Unix SMB/CIFS implementation.
+
+   helper routines for XATTR marshalling
+
+   Copyright (C) Stefan (metze) Metzmacher 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
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "includes.h"
+#include "librpc/gen_ndr/ndr_xattr.h"
+
+static char *ndr_compat_xattr_attrib_hex(TALLOC_CTX *mem_ctx,
+                                        const struct xattr_DOSATTRIB *r)
+{
+       char *attrib_hex = NULL;
+
+       switch (r->version) {
+       case 0xFFFF:
+               attrib_hex = talloc_asprintf(mem_ctx, "0x%x",
+                                            r->info.compatinfoFFFF.attrib);
+               break;
+       case 1:
+               attrib_hex = talloc_asprintf(mem_ctx, "0x%x",
+                                            r->info.info1.attrib);
+               break;
+       case 2:
+               attrib_hex = talloc_asprintf(mem_ctx, "0x%x",
+                                            r->info.oldinfo2.attrib);
+               break;
+       case 3:
+               if (!(r->info.info3.valid_flags & XATTR_DOSINFO_ATTRIB)) {
+                       attrib_hex = talloc_strdup(mem_ctx, "");
+                       break;
+               }
+               attrib_hex = talloc_asprintf(mem_ctx, "0x%x",
+                                            r->info.info3.attrib);
+               break;
+       default:
+               attrib_hex = talloc_strdup(mem_ctx, "");
+               break;
+       }
+
+       return attrib_hex;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_push_xattr_DOSATTRIB(struct ndr_push *ndr,
+                                               int ndr_flags,
+                                               const struct xattr_DOSATTRIB *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               char *attrib_hex = NULL;
+
+               attrib_hex = ndr_compat_xattr_attrib_hex(ndr, r);
+               NDR_ERR_HAVE_NO_MEMORY(attrib_hex);
+
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_ASCII|LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, attrib_hex));
+                       ndr->flags = _flags_save_string;
+               }
+               if (r->version == 0xFFFF) {
+                       return NDR_ERR_SUCCESS;
+               }
+               NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->version));
+               NDR_CHECK(ndr_push_set_switch_value(ndr, &r->info, r->version));
+               NDR_CHECK(ndr_push_xattr_DosInfo(ndr, NDR_SCALARS, &r->info));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_pull_xattr_DOSATTRIB(struct ndr_pull *ndr, int ndr_flags, struct xattr_DOSATTRIB *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 4));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_ASCII|LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->attrib_hex));
+                       ndr->flags = _flags_save_string;
+               }
+               if (ndr->offset >= ndr->data_size) {
+                       unsigned int dosattr;
+                       int ret;
+
+                       if (r->attrib_hex[0] != '0') {
+
+                       }
+                       if (r->attrib_hex[1] != 'x') {
+
+                       }
+                       ret = sscanf(r->attrib_hex, "%x", &dosattr);
+                       if (ret != 1) {
+                       }
+                       r->version = 0xFFFF;
+                       r->info.compatinfoFFFF.attrib = dosattr;
+                       return NDR_ERR_SUCCESS;
+               }
+               NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->version));
+               if (r->version == 0xFFFF) {
+                       return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH,
+                                             "ndr_pull_xattr_DOSATTRIB: "
+                                             "invalid level 0x%02X",
+                                             r->version);
+               }
+               NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->info, r->version));
+               NDR_CHECK(ndr_pull_xattr_DosInfo(ndr, NDR_SCALARS, &r->info));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_xattr_DOSATTRIB(struct ndr_print *ndr, const char *name, const struct xattr_DOSATTRIB *r)
+{
+       char *attrib_hex;
+
+       ndr_print_struct(ndr, name, "xattr_DOSATTRIB");
+       ndr->depth++;
+
+       if (ndr->flags & LIBNDR_PRINT_SET_VALUES) {
+               attrib_hex = ndr_compat_xattr_attrib_hex(ndr, r);
+       } else {
+               attrib_hex = talloc_strdup(ndr, r->attrib_hex);
+       }
+       ndr_print_string(ndr, "attrib_hex", attrib_hex);
+
+       ndr_print_uint16(ndr, "version", r->version);
+       ndr_print_set_switch_value(ndr, &r->info, r->version);
+       ndr_print_xattr_DosInfo(ndr, "info", &r->info);
+       ndr->depth--;
+}
+
diff --git a/librpc/ndr/ndr_xattr.h b/librpc/ndr/ndr_xattr.h
new file mode 100644 (file)
index 0000000..bdc530a
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+   Unix SMB/CIFS implementation.
+
+   helper routines for XATTR marshalling
+
+   Copyright (C) Stefan (metze) Metzmacher 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
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef _LIBRPC_NDR_NDR_XATTR_H
+#define _LIBRPC_NDR_NDR_XATTR_H
+
+_PUBLIC_ enum ndr_err_code ndr_push_xattr_DOSATTRIB(struct ndr_push *ndr,
+                                               int ndr_flags,
+                                               const struct xattr_DOSATTRIB *r);
+
+_PUBLIC_ enum ndr_err_code ndr_pull_xattr_DOSATTRIB(struct ndr_pull *ndr,
+                                               int ndr_flags,
+                                               struct xattr_DOSATTRIB *r);
+
+_PUBLIC_ void ndr_print_xattr_DOSATTRIB(struct ndr_print *ndr,
+                                       const char *name,
+                                       const struct xattr_DOSATTRIB *r);
+
+#endif /* _LIBRPC_NDR_NDR_XATTR_H */
index f1fac93d5b7778015a8467c9e458b0da68ba619e..1acd323834415071909edfacb2df6b246edb2762 100644 (file)
@@ -330,6 +330,7 @@ LIBNDR_GEN_OBJ = ../librpc/gen_ndr/ndr_wkssvc.o \
                 ../librpc/gen_ndr/ndr_dssetup.o \
                 librpc/gen_ndr/ndr_notify.o \
                 ../librpc/gen_ndr/ndr_xattr.o \
+                ../librpc/ndr/ndr_xattr.o \
                 ../librpc/gen_ndr/ndr_epmapper.o \
                 ../librpc/gen_ndr/ndr_named_pipe_auth.o \
                 ../librpc/gen_ndr/ndr_ntsvcs.o \
index 2aeea6d619ed1189d6ea355fa314519dd9b715c0..6335585f7d67ba35a4f0038082c1928acf2aa54a 100644 (file)
@@ -251,7 +251,7 @@ NDR_KRB5PAC_OBJ_FILES = ../librpc/gen_ndr/ndr_krb5pac.o ../librpc/ndr/ndr_krb5pa
 [SUBSYSTEM::NDR_XATTR]
 PUBLIC_DEPENDENCIES = LIBNDR NDR_SECURITY
 
-NDR_XATTR_OBJ_FILES = ../librpc/gen_ndr/ndr_xattr.o
+NDR_XATTR_OBJ_FILES = ../librpc/gen_ndr/ndr_xattr.o ../librpc/ndr/ndr_xattr.o
 
 [SUBSYSTEM::NDR_OPENDB]
 PUBLIC_DEPENDENCIES = LIBNDR