mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
195 lines
5.9 KiB
195 lines
5.9 KiB
/*++
|
|
|
|
Copyright (c) 1991-1993 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
ExpSet.c
|
|
|
|
Abstract:
|
|
|
|
ExportDirSetInfo().
|
|
|
|
Author:
|
|
|
|
John Rogers (JohnRo) 29-Sep-1992
|
|
|
|
Environment:
|
|
|
|
User Mode - Win32
|
|
|
|
Revision History:
|
|
|
|
29-Sep-1992 JohnRo
|
|
RAID 7962: Repl APIs in wrong role kill svc. (Extracted code from DLL
|
|
stubs.)
|
|
30-Dec-1992 JohnRo
|
|
Corrected debug bit usage.
|
|
30-Apr-1993 JohnRo
|
|
Use NetpKdPrint() where possible.
|
|
|
|
--*/
|
|
|
|
|
|
// These must be included first:
|
|
|
|
#include <windows.h>
|
|
#include <lmcons.h> // NET_API_STATUS, etc.
|
|
#include <repldefs.h> // IF_DEBUG().
|
|
|
|
// These may be included in any order:
|
|
|
|
#include <dirname.h> // ReplIsDirNameValid().
|
|
#include <expdir.h> // My prototype, ExportDirIsApiRecordValid(), etc.
|
|
#include <lmrepl.h> // LPREPL_EDIR_INFO_1, etc.
|
|
#include <netdebug.h> // NetpKdPrint(), etc.
|
|
#include <prefix.h> // PREFIX_ equates.
|
|
|
|
|
|
NET_API_STATUS
|
|
ExportDirConfigSetInfo (
|
|
IN LPTSTR UncServerName OPTIONAL,
|
|
IN LPTSTR DirName,
|
|
IN DWORD Level,
|
|
IN LPVOID Buffer,
|
|
OUT LPDWORD ParmError OPTIONAL
|
|
)
|
|
{
|
|
NET_API_STATUS ApiStatus;
|
|
|
|
DWORD Integrity, Extent, LockCount;
|
|
DWORD TimeOfFirstLock; // Seconds since 1970.
|
|
|
|
ApiStatus = NO_ERROR; // Innocent until proven guilty.
|
|
|
|
NetpSetParmError( PARM_ERROR_UNKNOWN ); // Assume error until proven...
|
|
if (! ReplIsDirNameValid(DirName)) {
|
|
ApiStatus = ERROR_INVALID_PARAMETER;
|
|
|
|
IF_DEBUG( EXPAPI ) {
|
|
NetpKdPrint(( PREFIX_REPL
|
|
"NetReplExportDirSetInfo: Invalid dir name parm.\n" ));
|
|
}
|
|
}
|
|
if (Buffer == NULL) {
|
|
|
|
IF_DEBUG( EXPAPI ) {
|
|
NetpKdPrint(( PREFIX_REPL
|
|
"NetReplExportDirSetInfo: null buffer pointer.\n" ));
|
|
}
|
|
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
// BUGBUG: ParmError is not set in many paths through here!
|
|
|
|
if (ApiStatus == NO_ERROR) {
|
|
|
|
// Read config data for a single export directory.
|
|
// We have to do this 'cos the set info struct (level 1) is
|
|
// a subset of the info we need to do a write.
|
|
ApiStatus = ExportDirReadConfigData (
|
|
UncServerName,
|
|
DirName,
|
|
& Integrity,
|
|
& Extent,
|
|
& LockCount,
|
|
& TimeOfFirstLock ); // Seconds since 1970.
|
|
}
|
|
|
|
if (ApiStatus == NO_ERROR) {
|
|
|
|
if (Level == 1) {
|
|
LPREPL_EDIR_INFO_1 ApiRecord = Buffer;
|
|
|
|
if ( !ExportDirIsApiRecordValid(
|
|
Level, ApiRecord, ParmError ) ) {
|
|
|
|
IF_DEBUG( EXPAPI ) {
|
|
NetpKdPrint(( PREFIX_REPL
|
|
"NetReplExportDirSetInfo: Invalid level 1 record, "
|
|
"ParmError is " FORMAT_DWORD "\n",
|
|
(ParmError!=NULL)
|
|
? (*ParmError)
|
|
: PARM_ERROR_UNKNOWN ));
|
|
}
|
|
|
|
ApiStatus = ERROR_INVALID_PARAMETER;
|
|
|
|
} else {
|
|
|
|
// BUGBUG: Match DirName and ApiRecord->rped1_dirname.
|
|
|
|
// Write config data for this export directory.
|
|
ApiStatus = ExportDirWriteConfigData (
|
|
UncServerName,
|
|
DirName, // new dir name (same)
|
|
ApiRecord->rped1_integrity, // new integrity
|
|
ApiRecord->rped1_extent, // new extent
|
|
LockCount, // old lock count
|
|
TimeOfFirstLock ); // old lock time
|
|
}
|
|
|
|
} else if ( (Level==1000) || (Level==1001) ) {
|
|
|
|
if (ApiStatus == NO_ERROR) {
|
|
if (Level==1000) {
|
|
LPREPL_EDIR_INFO_1000 ApiRecord = Buffer;
|
|
Integrity = ApiRecord->rped1000_integrity;
|
|
|
|
if ( !ReplIsIntegrityValid( Integrity ) ) {
|
|
NetpSetParmError( 1 ); // error in first field.
|
|
ApiStatus = ERROR_INVALID_PARAMETER;
|
|
|
|
IF_DEBUG( EXPAPI ) {
|
|
NetpKdPrint(( PREFIX_REPL
|
|
"NetReplExportDirSetInfo: "
|
|
"Bad integrity value.\n" ));
|
|
}
|
|
|
|
} else {
|
|
// Write the revised value below.
|
|
|
|
NetpSetParmError( PARM_ERROR_NONE );
|
|
}
|
|
} else {
|
|
LPREPL_EDIR_INFO_1001 ApiRecord = Buffer;
|
|
NetpAssert( Level == 1001 );
|
|
Extent = ApiRecord->rped1001_extent;
|
|
|
|
if ( !ReplIsExtentValid( Extent ) ) {
|
|
NetpSetParmError( 1 ); // error in first field.
|
|
ApiStatus = ERROR_INVALID_PARAMETER;
|
|
|
|
IF_DEBUG( EXPAPI ) {
|
|
NetpKdPrint(( PREFIX_REPL
|
|
"NetReplExportDirSetInfo: "
|
|
"Bad extent value.\n" ));
|
|
}
|
|
|
|
} else {
|
|
// Write the revised value below.
|
|
NetpSetParmError( PARM_ERROR_NONE );
|
|
ApiStatus = NO_ERROR;
|
|
}
|
|
}
|
|
|
|
if (ApiStatus == NO_ERROR) {
|
|
// Write config data for this export directory.
|
|
ApiStatus = ExportDirWriteConfigData (
|
|
UncServerName,
|
|
DirName,
|
|
Integrity,
|
|
Extent,
|
|
LockCount,
|
|
TimeOfFirstLock );
|
|
NetpSetParmError( PARM_ERROR_NONE );
|
|
}
|
|
}
|
|
} else {
|
|
ApiStatus = ERROR_INVALID_LEVEL;
|
|
}
|
|
}
|
|
|
|
return ApiStatus;
|
|
}
|