librpc/ndr: add marshalling code for struct unixid and struct id_map
authorStefan Metzmacher <metze@sernet.de>
Mon, 10 Dec 2007 16:01:38 +0000 (17:01 +0100)
committerStefan Metzmacher <metze@sernet.de>
Fri, 2 May 2008 14:12:42 +0000 (16:12 +0200)
metze

source/librpc/ndr/ndr_sec.h
source/librpc/ndr/ndr_sec_helper.c

index 8034367223bb05f6aa1b9e1a67473d4d47ca9284..d1fff7d44b2c674a7d40b68db29907deb9dab902 100644 (file)
@@ -22,6 +22,19 @@ void ndr_print_dom_sid2(struct ndr_print *ndr, const char *name, const struct do
 void ndr_print_dom_sid28(struct ndr_print *ndr, const char *name, const struct dom_sid *sid);
 char *dom_sid_string(TALLOC_CTX *mem_ctx, const struct dom_sid *sid);
 
+enum ndr_err_code ndr_push_id_mapping(struct ndr_push *ndr, int ndr_flags, enum id_mapping r);
+enum ndr_err_code ndr_pull_id_mapping(struct ndr_pull *ndr, int ndr_flags, enum id_mapping *r);
+void ndr_print_id_mapping(struct ndr_print *ndr, const char *name, enum id_mapping r);
+enum ndr_err_code ndr_push_id_type(struct ndr_push *ndr, int ndr_flags, enum id_type r);
+enum ndr_err_code ndr_pull_id_type(struct ndr_pull *ndr, int ndr_flags, enum id_type *r);
+void ndr_print_id_type(struct ndr_print *ndr, const char *name, enum id_type r);
+enum ndr_err_code ndr_push_unixid(struct ndr_push *ndr, int ndr_flags, const struct unixid *r);
+enum ndr_err_code ndr_pull_unixid(struct ndr_pull *ndr, int ndr_flags, struct unixid *r);
+void ndr_print_unixid(struct ndr_print *ndr, const char *name, const struct unixid *r);
+enum ndr_err_code ndr_push_id_map(struct ndr_push *ndr, int ndr_flags, const struct id_map *r);
+enum ndr_err_code ndr_pull_id_map(struct ndr_pull *ndr, int ndr_flags, struct id_map *r);
+void ndr_print_id_map(struct ndr_print *ndr, const char *name, const struct id_map *r);
+
 /* The following definitions come from librpc/ndr/ndr_sec.c  */
 
 enum ndr_err_code ndr_pull_dom_sid2(struct ndr_pull *ndr, int ndr_flags, struct dom_sid *sid);
index 18d343799e56b3b6f76071e1b526f3d0b8e55b27..a9f44220f1c06edc536a6eb34d82163275e98026 100644 (file)
@@ -115,3 +115,145 @@ void ndr_print_dom_sid0(struct ndr_print *ndr, const char *name, const struct do
        ndr_print_dom_sid(ndr, name, sid);
 }
 
+enum ndr_err_code ndr_push_id_mapping(struct ndr_push *ndr, int ndr_flags, enum id_mapping r)
+{
+       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r));
+       return NDR_ERR_SUCCESS;
+}
+
+enum ndr_err_code ndr_pull_id_mapping(struct ndr_pull *ndr, int ndr_flags, enum id_mapping *r)
+{
+       uint32_t v;
+       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
+       *r = v;
+       return NDR_ERR_SUCCESS;
+}
+
+void ndr_print_id_mapping(struct ndr_print *ndr, const char *name, enum id_mapping r)
+{
+       const char *val = NULL;
+
+       switch (r) {
+               case ID_UNKNOWN: val = "ID_UNKNOWN"; break;
+               case ID_MAPPED: val = "ID_MAPPED"; break;
+               case ID_UNMAPPED: val = "ID_UNMAPPED"; break;
+               case ID_EXPIRED: val = "ID_EXPIRED"; break;
+       }
+       ndr_print_enum(ndr, name, "ENUM", val, r);
+}
+
+enum ndr_err_code ndr_push_id_type(struct ndr_push *ndr, int ndr_flags, enum id_type r)
+{
+       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r));
+       return NDR_ERR_SUCCESS;
+}
+
+enum ndr_err_code ndr_pull_id_type(struct ndr_pull *ndr, int ndr_flags, enum id_type *r)
+{
+       uint32_t v;
+       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
+       *r = v;
+       return NDR_ERR_SUCCESS;
+}
+
+void ndr_print_id_type(struct ndr_print *ndr, const char *name, enum id_type r)
+{
+       const char *val = NULL;
+
+       switch (r) {
+               case ID_TYPE_NOT_SPECIFIED: val = "ID_TYPE_NOT_SPECIFIED"; break;
+               case ID_TYPE_UID: val = "ID_TYPE_UID"; break;
+               case ID_TYPE_GID: val = "ID_TYPE_GID"; break;
+       }
+       ndr_print_enum(ndr, name, "ENUM", val, r);
+}
+
+enum ndr_err_code ndr_push_unixid(struct ndr_push *ndr, int ndr_flags, const struct unixid *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 8));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->id));
+               NDR_CHECK(ndr_push_id_type(ndr, NDR_SCALARS, r->type));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+enum ndr_err_code ndr_pull_unixid(struct ndr_pull *ndr, int ndr_flags, struct unixid *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 8));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->id));
+               NDR_CHECK(ndr_pull_id_type(ndr, NDR_SCALARS, &r->type));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+void ndr_print_unixid(struct ndr_print *ndr, const char *name, const struct unixid *r)
+{
+       ndr_print_struct(ndr, name, "unixid");
+       ndr->depth++;
+       ndr_print_uint32(ndr, "id", r->id);
+       ndr_print_id_type(ndr, "type", r->type);
+       ndr->depth--;
+}
+
+enum ndr_err_code ndr_push_id_map(struct ndr_push *ndr, int ndr_flags, const struct id_map *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 8));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->sid));
+               NDR_CHECK(ndr_push_unixid(ndr, NDR_SCALARS, &r->xid));
+               NDR_CHECK(ndr_push_id_mapping(ndr, NDR_SCALARS, r->status));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               if (r->sid) {
+                       NDR_CHECK(ndr_push_dom_sid(ndr, NDR_SCALARS|NDR_BUFFERS, r->sid));
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+enum ndr_err_code ndr_pull_id_map(struct ndr_pull *ndr, int ndr_flags, struct id_map *r)
+{
+       uint32_t _ptr_sid;
+       TALLOC_CTX *_mem_save_sid_0;
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 8));
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_sid));
+               if (_ptr_sid) {
+                       NDR_PULL_ALLOC(ndr, r->sid);
+               } else {
+                       r->sid = NULL;
+               }
+               NDR_CHECK(ndr_pull_unixid(ndr, NDR_SCALARS, &r->xid));
+               NDR_CHECK(ndr_pull_id_mapping(ndr, NDR_SCALARS, &r->status));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               if (r->sid) {
+                       _mem_save_sid_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->sid, 0);
+                       NDR_CHECK(ndr_pull_dom_sid(ndr, NDR_SCALARS|NDR_BUFFERS, r->sid));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_sid_0, 0);
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+void ndr_print_id_map(struct ndr_print *ndr, const char *name, const struct id_map *r)
+{
+       ndr_print_struct(ndr, name, "id_map");
+       ndr->depth++;
+       ndr_print_ptr(ndr, "sid", r->sid);
+       ndr->depth++;
+       if (r->sid) {
+               ndr_print_dom_sid(ndr, "sid", r->sid);
+       }
+       ndr->depth--;
+       ndr_print_unixid(ndr, "xid", &r->xid);
+       ndr_print_id_mapping(ndr, "status", r->status);
+       ndr->depth--;
+}