r4203: the bind_info blob isn't a const.
[samba.git] / source4 / rpc_server / drsuapi / dcesrv_drsuapi.c
index 503a54b6b3ddba596690d9ca74b4a2850b941988..5539c9117f36079469414e4b6c2023f112921269 100644 (file)
@@ -21,6 +21,8 @@
 */
 
 #include "includes.h"
+#include "librpc/gen_ndr/ndr_drsuapi.h"
+#include "rpc_server/dcerpc_server.h"
 #include "rpc_server/common/common.h"
 #include "rpc_server/drsuapi/dcesrv_drsuapi.h"
 
@@ -35,48 +37,64 @@ static void drsuapi_handle_destroy(struct dcesrv_connection *conn, struct dcesrv
 /* 
   drsuapi_DsBind 
 */
-static NTSTATUS drsuapi_DsBind(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR drsuapi_DsBind(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct drsuapi_DsBind *r)
 {
        struct drsuapi_bind_state *b_state;
        struct dcesrv_handle *handle;
+       struct drsuapi_DsBindInfoCtr *bind_info;
+       struct GUID site_guid;
 
-       r->out.info = NULL;
+       r->out.bind_info = NULL;
        ZERO_STRUCTP(r->out.bind_handle);
 
        b_state = talloc_p(dce_call->conn, struct drsuapi_bind_state);
-       if (!b_state) {
-               return NT_STATUS_NO_MEMORY;
-       }
+       WERR_TALLOC_CHECK(b_state);
 
-       /* TODO: fill b_state here */
+       b_state->sam_ctx = samdb_connect(b_state);
+       if (!b_state->sam_ctx) {
+               talloc_free(b_state);
+               return WERR_FOOBAR;
+       }
 
        handle = dcesrv_handle_new(dce_call->conn, DRSUAPI_BIND_HANDLE);
        if (!handle) {
                talloc_free(b_state);
-               return NT_STATUS_NO_MEMORY;
+               return WERR_NOMEM;
        }
 
        handle->data = b_state;
        handle->destroy = drsuapi_handle_destroy;
 
+       bind_info = talloc_p(mem_ctx, struct drsuapi_DsBindInfoCtr);
+       WERR_TALLOC_CHECK(bind_info);
+
+       ZERO_STRUCT(site_guid);
+
+       bind_info->length                               = 28;
+       bind_info->info.info28.supported_extensions     = 0;
+       bind_info->info.info28.site_guid                = site_guid;
+       bind_info->info.info28.u1                       = 0;
+       bind_info->info.info28.repl_epoch               = 0;
+
+       r->out.bind_info = bind_info;
        *r->out.bind_handle = handle->wire_handle;
 
-       return NT_STATUS_OK;
+       return WERR_OK;
 }
 
 
 /* 
   drsuapi_DsUnbind 
 */
-static NTSTATUS drsuapi_DsUnbind(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR drsuapi_DsUnbind(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct drsuapi_DsUnbind *r)
 {
        struct dcesrv_handle *h;
 
        *r->out.bind_handle = *r->in.bind_handle;
 
-       DCESRV_PULL_HANDLE(h, r->in.bind_handle, DRSUAPI_BIND_HANDLE);
+       DCESRV_PULL_HANDLE_WERR(h, r->in.bind_handle, DRSUAPI_BIND_HANDLE);
 
        /* this causes the callback drsuapi_handle_destroy() to be called by
           the handle destroy code which destroys the state associated
@@ -85,24 +103,28 @@ static NTSTATUS drsuapi_DsUnbind(struct dcesrv_call_state *dce_call, TALLOC_CTX
 
        ZERO_STRUCTP(r->out.bind_handle);
 
-       return NT_STATUS_OK;
+       return WERR_OK;
 }
 
 
 /* 
-  DRSUAPI_REPLICA_SYNC 
+  drsuapi_DsReplicaSync 
 */
-static NTSTATUS DRSUAPI_REPLICA_SYNC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct DRSUAPI_REPLICA_SYNC *r)
+static WERROR drsuapi_DsReplicaSync(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct drsuapi_DsReplicaSync *r)
 {
-       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+       /* TODO: implement this call correct!
+        *       for now we just say yes,
+        *       because we have no output parameter
+        */
+       return WERR_OK;
 }
 
 
 /* 
   DRSUAPI_GET_NC_CHANGES 
 */
-static NTSTATUS DRSUAPI_GET_NC_CHANGES(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR DRSUAPI_GET_NC_CHANGES(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct DRSUAPI_GET_NC_CHANGES *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -112,7 +134,7 @@ static NTSTATUS DRSUAPI_GET_NC_CHANGES(struct dcesrv_call_state *dce_call, TALLO
 /* 
   DRSUAPI_UPDATE_REFS 
 */
-static NTSTATUS DRSUAPI_UPDATE_REFS(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR DRSUAPI_UPDATE_REFS(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct DRSUAPI_UPDATE_REFS *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -122,7 +144,7 @@ static NTSTATUS DRSUAPI_UPDATE_REFS(struct dcesrv_call_state *dce_call, TALLOC_C
 /* 
   DRSUAPI_REPLICA_ADD 
 */
-static NTSTATUS DRSUAPI_REPLICA_ADD(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR DRSUAPI_REPLICA_ADD(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct DRSUAPI_REPLICA_ADD *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -132,7 +154,7 @@ static NTSTATUS DRSUAPI_REPLICA_ADD(struct dcesrv_call_state *dce_call, TALLOC_C
 /* 
   DRSUAPI_REPLICA_DEL 
 */
-static NTSTATUS DRSUAPI_REPLICA_DEL(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR DRSUAPI_REPLICA_DEL(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct DRSUAPI_REPLICA_DEL *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -142,7 +164,7 @@ static NTSTATUS DRSUAPI_REPLICA_DEL(struct dcesrv_call_state *dce_call, TALLOC_C
 /* 
   DRSUAPI_REPLICA_MODIFY 
 */
-static NTSTATUS DRSUAPI_REPLICA_MODIFY(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR DRSUAPI_REPLICA_MODIFY(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct DRSUAPI_REPLICA_MODIFY *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -152,7 +174,7 @@ static NTSTATUS DRSUAPI_REPLICA_MODIFY(struct dcesrv_call_state *dce_call, TALLO
 /* 
   DRSUAPI_VERIFY_NAMES 
 */
-static NTSTATUS DRSUAPI_VERIFY_NAMES(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR DRSUAPI_VERIFY_NAMES(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct DRSUAPI_VERIFY_NAMES *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -162,7 +184,7 @@ static NTSTATUS DRSUAPI_VERIFY_NAMES(struct dcesrv_call_state *dce_call, TALLOC_
 /* 
   DRSUAPI_GET_MEMBERSHIPS 
 */
-static NTSTATUS DRSUAPI_GET_MEMBERSHIPS(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR DRSUAPI_GET_MEMBERSHIPS(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct DRSUAPI_GET_MEMBERSHIPS *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -172,7 +194,7 @@ static NTSTATUS DRSUAPI_GET_MEMBERSHIPS(struct dcesrv_call_state *dce_call, TALL
 /* 
   DRSUAPI_INTER_DOMAIN_MOVE 
 */
-static NTSTATUS DRSUAPI_INTER_DOMAIN_MOVE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR DRSUAPI_INTER_DOMAIN_MOVE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct DRSUAPI_INTER_DOMAIN_MOVE *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -182,7 +204,7 @@ static NTSTATUS DRSUAPI_INTER_DOMAIN_MOVE(struct dcesrv_call_state *dce_call, TA
 /* 
   DRSUAPI_GET_NT4_CHANGELOG 
 */
-static NTSTATUS DRSUAPI_GET_NT4_CHANGELOG(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR DRSUAPI_GET_NT4_CHANGELOG(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct DRSUAPI_GET_NT4_CHANGELOG *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -192,14 +214,14 @@ static NTSTATUS DRSUAPI_GET_NT4_CHANGELOG(struct dcesrv_call_state *dce_call, TA
 /* 
   drsuapi_DsCrackNames => drsuapip_cracknames.c
 */
-static NTSTATUS (*drsuapi_DsCrackNames)(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR (*drsuapi_DsCrackNames)(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct drsuapi_DsCrackNames *r) = dcesrv_drsuapi_DsCrackNames;
 
 /* 
-  DRSUAPI_WRITE_SPN 
+  drsuapi_DsWriteAccountSpn 
 */
-static NTSTATUS DRSUAPI_WRITE_SPN(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct DRSUAPI_WRITE_SPN *r)
+static WERROR drsuapi_DsWriteAccountSpn(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct drsuapi_DsWriteAccountSpn *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
@@ -208,7 +230,7 @@ static NTSTATUS DRSUAPI_WRITE_SPN(struct dcesrv_call_state *dce_call, TALLOC_CTX
 /* 
   DRSUAPI_REMOVE_DS_SERVER 
 */
-static NTSTATUS DRSUAPI_REMOVE_DS_SERVER(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR DRSUAPI_REMOVE_DS_SERVER(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct DRSUAPI_REMOVE_DS_SERVER *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -218,7 +240,7 @@ static NTSTATUS DRSUAPI_REMOVE_DS_SERVER(struct dcesrv_call_state *dce_call, TAL
 /* 
   DRSUAPI_REMOVE_DS_DOMAIN 
 */
-static NTSTATUS DRSUAPI_REMOVE_DS_DOMAIN(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR DRSUAPI_REMOVE_DS_DOMAIN(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct DRSUAPI_REMOVE_DS_DOMAIN *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -226,10 +248,10 @@ static NTSTATUS DRSUAPI_REMOVE_DS_DOMAIN(struct dcesrv_call_state *dce_call, TAL
 
 
 /* 
-  DRSUAPI_DOMAIN_CONTROLLER_INFO 
+  drsuapi_DsGetDomainControllerInfo 
 */
-static NTSTATUS DRSUAPI_DOMAIN_CONTROLLER_INFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct DRSUAPI_DOMAIN_CONTROLLER_INFO *r)
+static WERROR drsuapi_DsGetDomainControllerInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct drsuapi_DsGetDomainControllerInfo *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
@@ -238,7 +260,7 @@ static NTSTATUS DRSUAPI_DOMAIN_CONTROLLER_INFO(struct dcesrv_call_state *dce_cal
 /* 
   DRSUAPI_ADD_ENTRY 
 */
-static NTSTATUS DRSUAPI_ADD_ENTRY(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR DRSUAPI_ADD_ENTRY(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct DRSUAPI_ADD_ENTRY *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -248,7 +270,7 @@ static NTSTATUS DRSUAPI_ADD_ENTRY(struct dcesrv_call_state *dce_call, TALLOC_CTX
 /* 
   DRSUAPI_EXECUTE_KCC 
 */
-static NTSTATUS DRSUAPI_EXECUTE_KCC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR DRSUAPI_EXECUTE_KCC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct DRSUAPI_EXECUTE_KCC *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -256,10 +278,10 @@ static NTSTATUS DRSUAPI_EXECUTE_KCC(struct dcesrv_call_state *dce_call, TALLOC_C
 
 
 /* 
-  DRSUAPI_GET_REPL_INFO 
+  drsuapi_DsReplicaGetInfo 
 */
-static NTSTATUS DRSUAPI_GET_REPL_INFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct DRSUAPI_GET_REPL_INFO *r)
+static WERROR drsuapi_DsReplicaGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct drsuapi_DsReplicaGetInfo *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
@@ -268,7 +290,7 @@ static NTSTATUS DRSUAPI_GET_REPL_INFO(struct dcesrv_call_state *dce_call, TALLOC
 /* 
   DRSUAPI_ADD_SID_HISTORY 
 */
-static NTSTATUS DRSUAPI_ADD_SID_HISTORY(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR DRSUAPI_ADD_SID_HISTORY(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct DRSUAPI_ADD_SID_HISTORY *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -278,7 +300,7 @@ static NTSTATUS DRSUAPI_ADD_SID_HISTORY(struct dcesrv_call_state *dce_call, TALL
 /* 
   DRSUAPI_GET_MEMBERSHIPS2 
 */
-static NTSTATUS DRSUAPI_GET_MEMBERSHIPS2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR DRSUAPI_GET_MEMBERSHIPS2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct DRSUAPI_GET_MEMBERSHIPS2 *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -288,7 +310,7 @@ static NTSTATUS DRSUAPI_GET_MEMBERSHIPS2(struct dcesrv_call_state *dce_call, TAL
 /* 
   DRSUAPI_REPLICA_VERIFY_OBJECTS 
 */
-static NTSTATUS DRSUAPI_REPLICA_VERIFY_OBJECTS(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR DRSUAPI_REPLICA_VERIFY_OBJECTS(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct DRSUAPI_REPLICA_VERIFY_OBJECTS *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -298,7 +320,7 @@ static NTSTATUS DRSUAPI_REPLICA_VERIFY_OBJECTS(struct dcesrv_call_state *dce_cal
 /* 
   DRSUAPI_GET_OBJECT_EXISTENCE 
 */
-static NTSTATUS DRSUAPI_GET_OBJECT_EXISTENCE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR DRSUAPI_GET_OBJECT_EXISTENCE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct DRSUAPI_GET_OBJECT_EXISTENCE *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -308,7 +330,7 @@ static NTSTATUS DRSUAPI_GET_OBJECT_EXISTENCE(struct dcesrv_call_state *dce_call,
 /* 
   DRSUAPI_QUERY_SITES_BY_COST 
 */
-static NTSTATUS DRSUAPI_QUERY_SITES_BY_COST(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR DRSUAPI_QUERY_SITES_BY_COST(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct DRSUAPI_QUERY_SITES_BY_COST *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);