summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/librpc/idl/dssetup.idl51
-rw-r--r--source4/rpc_server/dssetup/dcesrv_dssetup.c58
-rw-r--r--source4/torture/rpc/dssetup.c17
3 files changed, 98 insertions, 28 deletions
diff --git a/source4/librpc/idl/dssetup.idl b/source4/librpc/idl/dssetup.idl
index dc57e86a11..25045c5879 100644
--- a/source4/librpc/idl/dssetup.idl
+++ b/source4/librpc/idl/dssetup.idl
@@ -15,6 +15,15 @@
/**********************************************/
/* Function 0x00 */
+ typedef enum {
+ DS_ROLE_STANDALONE_WORKSTATION = 0,
+ DS_ROLE_MEMBER_WORKSTATION = 1,
+ DS_ROLE_STANDALONE_SERVER = 2,
+ DS_ROLE_MEMBER_SERVER = 3,
+ DS_ROLE_BACKUP_DC = 4,
+ DS_ROLE_PRIMARY_DC = 5
+ } ds_Role;
+
typedef struct {
uint16 role;
uint32 flags;
@@ -23,9 +32,43 @@
unistr *forest;
GUID domain_guid;
} ds_DomainBasicInformation;
+
+ typedef enum {
+ DS_NOT_UPGRADING = 0,
+ DS_UPGRADING = 1
+ } ds_UpgradeStatus;
+
+ typedef enum {
+ DS_PREVIOUS_UNKNOWN = 0,
+ DS_PREVIOUS_PRIMARY = 1,
+ DS_PREVIOUS_BACKUP = 2
+ } ds_PreviousStatus;
+
+ typedef struct {
+ uint32 upgrading;
+ uint16 previous_role;
+ } ds_DomainUpgradeStatus;
+
+ typedef enum {
+ DS_STATUS_IDLE = 0,
+ DS_STATUS_ACTIVE = 1,
+ DS_STATUS_NEEDS_REBOOT = 2
+ } ds_Status;
+
+ typedef struct {
+ uint16 status;
+ } ds_RoleOpStatus;
+ typedef enum {
+ DS_BASIC_INFORMATION = 1,
+ DS_UPGRADE_STATUS = 2,
+ DS_ROLE_OP_STATUS = 3
+ } ds_InformationLevel;
+
typedef union {
- [case(1)] ds_DomainBasicInformation basic;
+ [case(DS_BASIC_INFORMATION)] ds_DomainBasicInformation basic;
+ [case(DS_UPGRADE_STATUS)] ds_DomainUpgradeStatus upgrade;
+ [case(DS_ROLE_OP_STATUS)] ds_RoleOpStatus status;
} ds_DomainInformation;
WERROR ds_RolerGetPrimaryDomainInformation(
@@ -33,7 +76,11 @@
[out,switch_is(level)] ds_DomainInformation *info
);
-
+ /*
+ w2k3 has removed all the calls below from their implementation.
+ These stubs are left here only as a way of documenting the names
+ of the calls in case they ever turn up on the wire.
+ */
WERROR ds_RolerDnsNameToFlatName();
WERROR ds_RolerDcAsDc();
WERROR ds_RolerDcAsReplica();
diff --git a/source4/rpc_server/dssetup/dcesrv_dssetup.c b/source4/rpc_server/dssetup/dcesrv_dssetup.c
index bdf1c5af90..cde2b4d69a 100644
--- a/source4/rpc_server/dssetup/dcesrv_dssetup.c
+++ b/source4/rpc_server/dssetup/dcesrv_dssetup.c
@@ -50,20 +50,31 @@ static WERROR ds_RolerGetPrimaryDomainInformation(struct dcesrv_call_state *dce_
return WERR_SERVER_UNAVAILABLE;
}
+ r->out.info = talloc_p(mem_ctx, union ds_DomainInformation);
+ if (r->out.info == NULL) {
+ return WERR_NOMEM;
+ }
+
switch (r->in.level) {
- case 1:
- r->out.info = talloc_p(mem_ctx, union ds_DomainInformation);
- if (r->out.info == NULL) {
- return WERR_NOMEM;
- }
- r->out.info->basic.role = lp_server_role();
- r->out.info->basic.flags = 0x01000003;
- r->out.info->basic.domain = samdb_result_string(res[0], "name", NULL);
- r->out.info->basic.dns_domain = samdb_result_string(res[0], "dnsDomain", NULL);
- r->out.info->basic.forest = samdb_result_string(res[0], "dnsDomain", NULL);
+ case DS_BASIC_INFORMATION:
+ /* incorrect, but needed for the moment */
+ r->out.info->basic.role = DS_ROLE_MEMBER_SERVER;
+ r->out.info->basic.flags = 0x01000003;
+ r->out.info->basic.domain = samdb_result_string(res[0], "name", NULL);
+ r->out.info->basic.dns_domain = samdb_result_string(res[0], "dnsDomain", NULL);
+ r->out.info->basic.forest = samdb_result_string(res[0], "dnsDomain", NULL);
r->out.info->basic.domain_guid = samdb_result_guid(res[0], "objectGUID");
break;
+ case DS_UPGRADE_STATUS:
+ r->out.info->upgrade.upgrading = DS_NOT_UPGRADING;
+ r->out.info->upgrade.previous_role = DS_PREVIOUS_UNKNOWN;
+ break;
+
+ case DS_ROLE_OP_STATUS:
+ r->out.info->status.status = DS_STATUS_IDLE;
+ break;
+
default:
err = WERR_INVALID_PARAM;
break;
@@ -73,11 +84,18 @@ static WERROR ds_RolerGetPrimaryDomainInformation(struct dcesrv_call_state *dce_
}
+/*****************************************
+NOTE! The remaining calls below were
+removed in w2k3, so the DCESRV_FAULT()
+replies are the correct implementation. Do
+not try and fill these in with anything else
+******************************************/
+
/*
ds_RolerDnsNameToFlatName
*/
static WERROR ds_RolerDnsNameToFlatName(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct ds_RolerDnsNameToFlatName *r)
+ struct ds_RolerDnsNameToFlatName *r)
{
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
@@ -87,7 +105,7 @@ static WERROR ds_RolerDnsNameToFlatName(struct dcesrv_call_state *dce_call, TALL
ds_RolerDcAsDc
*/
static WERROR ds_RolerDcAsDc(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct ds_RolerDcAsDc *r)
+ struct ds_RolerDcAsDc *r)
{
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
@@ -97,7 +115,7 @@ static WERROR ds_RolerDcAsDc(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem
ds_RolerDcAsReplica
*/
static WERROR ds_RolerDcAsReplica(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct ds_RolerDcAsReplica *r)
+ struct ds_RolerDcAsReplica *r)
{
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
@@ -107,7 +125,7 @@ static WERROR ds_RolerDcAsReplica(struct dcesrv_call_state *dce_call, TALLOC_CTX
ds_RolerDemoteDc
*/
static WERROR ds_RolerDemoteDc(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct ds_RolerDemoteDc *r)
+ struct ds_RolerDemoteDc *r)
{
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
@@ -117,7 +135,7 @@ static WERROR ds_RolerDemoteDc(struct dcesrv_call_state *dce_call, TALLOC_CTX *m
ds_RolerGetDcOperationProgress
*/
static WERROR ds_RolerGetDcOperationProgress(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct ds_RolerGetDcOperationProgress *r)
+ struct ds_RolerGetDcOperationProgress *r)
{
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
@@ -127,7 +145,7 @@ static WERROR ds_RolerGetDcOperationProgress(struct dcesrv_call_state *dce_call,
ds_RolerGetDcOperationResults
*/
static WERROR ds_RolerGetDcOperationResults(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct ds_RolerGetDcOperationResults *r)
+ struct ds_RolerGetDcOperationResults *r)
{
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
@@ -137,7 +155,7 @@ static WERROR ds_RolerGetDcOperationResults(struct dcesrv_call_state *dce_call,
ds_RolerCancel
*/
static WERROR ds_RolerCancel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct ds_RolerCancel *r)
+ struct ds_RolerCancel *r)
{
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
@@ -147,7 +165,7 @@ static WERROR ds_RolerCancel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem
ds_RolerServerSaveStateForUpgrade
*/
static WERROR ds_RolerServerSaveStateForUpgrade(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct ds_RolerServerSaveStateForUpgrade *r)
+ struct ds_RolerServerSaveStateForUpgrade *r)
{
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
@@ -157,7 +175,7 @@ static WERROR ds_RolerServerSaveStateForUpgrade(struct dcesrv_call_state *dce_ca
ds_RolerUpgradeDownlevelServer
*/
static WERROR ds_RolerUpgradeDownlevelServer(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct ds_RolerUpgradeDownlevelServer *r)
+ struct ds_RolerUpgradeDownlevelServer *r)
{
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
@@ -167,7 +185,7 @@ static WERROR ds_RolerUpgradeDownlevelServer(struct dcesrv_call_state *dce_call,
ds_RolerAbortDownlevelServerUpgrade
*/
static WERROR ds_RolerAbortDownlevelServerUpgrade(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct ds_RolerAbortDownlevelServerUpgrade *r)
+ struct ds_RolerAbortDownlevelServerUpgrade *r)
{
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
diff --git a/source4/torture/rpc/dssetup.c b/source4/torture/rpc/dssetup.c
index 1819c523a5..7e63243e8a 100644
--- a/source4/torture/rpc/dssetup.c
+++ b/source4/torture/rpc/dssetup.c
@@ -28,18 +28,23 @@ static BOOL test_RolerGetPrimaryDomainInformation(struct dcerpc_pipe *p, TALLOC_
{
struct ds_RolerGetPrimaryDomainInformation r;
NTSTATUS status;
+ BOOL ret = True;
+ int i;
printf("\ntesting RolerGetPrimaryDomainInformation\n");
- r.in.level = 1;
+ for (i=DS_BASIC_INFORMATION;i<=DS_ROLE_OP_STATUS;i++) {
+ r.in.level = i;
- status = dcerpc_ds_RolerGetPrimaryDomainInformation(p, mem_ctx, &r);
- if (!NT_STATUS_IS_OK(status)) {
- printf("RolerGetPrimaryDomainInformation failed - %s\n", nt_errstr(status));
- return False;
+ status = dcerpc_ds_RolerGetPrimaryDomainInformation(p, mem_ctx, &r);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("RolerGetPrimaryDomainInformation level %d failed - %s\n",
+ i, nt_errstr(status));
+ ret = False;
+ }
}
- return True;
+ return ret;
}
BOOL torture_rpc_dssetup(void)