windows-nt/Source/XPSP1/NT/net/dhcp/server/mm/subnet2.c

164 lines
4.9 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
//================================================================================
// Copyright (C) 1997 Microsoft Corporation
// Author: RameshV
// Description: implements an additional subnet function that requires a server typedef..
// ThreadSafe: no
// Locks: none
// Please read stdinfo.txt for programming style.
//================================================================================
#include <mm.h>
#include <array.h>
#include <opt.h>
#include <optl.h>
#include <optclass.h>
#include <bitmask.h>
#include <range.h>
#include <reserve.h>
#include <subnet.h>
#include <optdefl.h>
#include <classdefl.h>
#include <oclassdl.h>
#include <sscope.h>
#include <server.h>
//BeginExport(function)
DWORD
MemSubnetModify(
IN PM_SUBNET Subnet,
IN DWORD Address,
IN DWORD Mask,
IN DWORD State,
IN DWORD SuperScopeId,
IN LPWSTR Name,
IN LPWSTR Description
) //EndExport(function)
{
DWORD Error;
PM_SUBNET NewSubnet, ThisSubnet;
PARRAY pArray;
ARRAY_LOCATION Loc;
AssertRet(Address == Subnet->Address, ERROR_INVALID_PARAMETER);
Error = MemSubnetInit(
&NewSubnet,
Address,
Mask,
State,
SuperScopeId,
Name,
Description
);
if( ERROR_SUCCESS != Error) return Error;
Require(NULL != NewSubnet && Subnet->ServerPtr );
if( Subnet->fSubnet ) {
pArray = &(((PM_SERVER)(Subnet->ServerPtr))->Subnets);
} else {
pArray = &(((PM_SERVER)(Subnet->ServerPtr))->MScopes);
}
Error = MemArrayInitLoc(pArray, &Loc);
while(ERROR_FILE_NOT_FOUND != Error) {
Require(ERROR_SUCCESS == Error );
Error = MemArrayGetElement(pArray, &Loc, &ThisSubnet);
Require(ERROR_SUCCESS == Error && NULL != ThisSubnet );
if( Subnet->Address != ThisSubnet->Address ) {
Error = MemArrayNextLoc(pArray, &Loc);
continue;
}
Require(Subnet == ThisSubnet);
Error = MemArraySetElement(pArray, &Loc, NewSubnet);
Require(ERROR_SUCCESS == Error);
NewSubnet -> ServerPtr = Subnet->ServerPtr;
NewSubnet -> Policy = Subnet->Policy;
NewSubnet -> fSubnet = Subnet->fSubnet;
NewSubnet -> Options = Subnet->Options;
NewSubnet -> Ranges = Subnet->Ranges;
NewSubnet -> Exclusions = Subnet->Exclusions;
NewSubnet -> Reservations = Subnet->Reservations;
NewSubnet -> Servers = Subnet->Servers;
(void) MemFree(Subnet);
return Error;
}
MemFree(NewSubnet);
return ERROR_FILE_NOT_FOUND;
}
//BeginExport(function)
DWORD
MemMScopeModify(
IN PM_SUBNET MScope,
IN DWORD ScopeId,
IN DWORD State,
IN DWORD Policy,
IN BYTE TTL,
IN LPWSTR Name,
IN LPWSTR Description,
IN LPWSTR LangTag,
IN DATE_TIME ExpiryTime
) //EndExport(function)
{
DWORD Error;
PM_SUBNET NewMScope, ThisMScope;
PARRAY pArray;
ARRAY_LOCATION Loc;
AssertRet(ScopeId == MScope->MScopeId, ERROR_INVALID_PARAMETER);
Error = MemMScopeInit(
&NewMScope,
ScopeId,
State,
Policy,
TTL,
Name,
Description,
LangTag,
ExpiryTime
);
if( ERROR_SUCCESS != Error) return Error;
Require(NULL != NewMScope && MScope->ServerPtr );
pArray = &(((PM_SERVER)(MScope->ServerPtr))->MScopes);
Error = MemArrayInitLoc(pArray, &Loc);
while(ERROR_FILE_NOT_FOUND != Error) {
Require(ERROR_SUCCESS == Error );
Error = MemArrayGetElement(pArray, &Loc, &ThisMScope);
Require(ERROR_SUCCESS == Error && NULL != ThisMScope );
if( MScope->MScopeId != ThisMScope->MScopeId ) {
Error = MemArrayNextLoc(pArray, &Loc);
continue;
}
Require(MScope == ThisMScope);
Error = MemArraySetElement(pArray, &Loc, NewMScope);
Require(ERROR_SUCCESS == Error);
NewMScope -> ServerPtr = MScope->ServerPtr;
NewMScope -> Options = MScope->Options;
NewMScope -> Ranges = MScope->Ranges;
NewMScope -> Exclusions = MScope->Exclusions;
NewMScope -> Reservations = MScope->Reservations;
NewMScope -> Servers = MScope->Servers;
(void) MemFree(MScope);
return Error;
}
MemFree(NewMScope);
return ERROR_FILE_NOT_FOUND;
}
//================================================================================
// end of file
//================================================================================