229 lines
4.5 KiB
C
229 lines
4.5 KiB
C
/*++
|
||
|
||
Copyright (c) 1991 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
servenam.c
|
||
|
||
Abstract:
|
||
|
||
Routines to service name requests. This file contains the following
|
||
functions:
|
||
FindNewName
|
||
NewName
|
||
ServeNameReqs
|
||
|
||
Author:
|
||
|
||
Dan Lafferty (danl) 26-Jul-1991
|
||
|
||
Environment:
|
||
|
||
User Mode -Win32
|
||
|
||
Revision History:
|
||
|
||
26-Jul-1991 danl
|
||
ported from LM2.0
|
||
17-Oct-1991 JohnRo
|
||
Got rid of a MIPS compiler warning.
|
||
|
||
--*/
|
||
#include "msrv.h"
|
||
|
||
#include <smbtypes.h> // needed for smb.h
|
||
#include <smb.h> // Server Message Block definitions
|
||
#include <string.h> // memcpy
|
||
|
||
#include "msgdata.h"
|
||
#include "msgdbg.h" // MSG_LOG
|
||
|
||
|
||
//
|
||
// Local Functions
|
||
//
|
||
|
||
DWORD
|
||
MsgFindNewName(
|
||
IN DWORD net
|
||
);
|
||
|
||
|
||
/*
|
||
* MsgFindNewName - find a new name
|
||
*
|
||
* This function scans the name table for a new entry and returns its index.
|
||
*
|
||
* FindNewName (net)
|
||
*
|
||
* ENTRY
|
||
* net - the network index to use
|
||
*
|
||
* RETURN
|
||
* int - index of new name if found, -1 if none found
|
||
*
|
||
* This function assumes the shared data segment is accessible.
|
||
*/
|
||
|
||
DWORD
|
||
MsgFindNewName(
|
||
IN DWORD net
|
||
)
|
||
|
||
{
|
||
ULONG i;
|
||
|
||
//
|
||
// Loop to find new name
|
||
//
|
||
|
||
for(i = 0; i < NCBMAX(net); ++i) {
|
||
if(SD_NAMEFLAGS(net,i) & NFNEW)
|
||
|
||
//
|
||
// Return index if new name found
|
||
//
|
||
return(i);
|
||
|
||
}
|
||
|
||
return(0xffffffff); // No new names
|
||
|
||
}
|
||
|
||
/*
|
||
* MsgNewName - process a new name
|
||
*
|
||
* This function initializes the Network Control Block for a new name
|
||
* and calls the appropriate function to issue the first net bios call
|
||
* for that name.
|
||
*
|
||
* MsgNewName (neti,ncbi)
|
||
*
|
||
* ENTRY
|
||
* neti - Network index
|
||
* ncbi - Network Control Block index
|
||
*
|
||
* RETURN
|
||
* This function returns the status from calls to MsgStartListen().
|
||
* In NT when we add a name, we also need to make sure that we can
|
||
* get a session for that name before telling the user that the
|
||
* name was added successfully. If a failure occurs in StartListen,
|
||
* that will be returned thru here.
|
||
*
|
||
*
|
||
* This function assumes the shared data area is accessible.
|
||
*/
|
||
|
||
NET_API_STATUS
|
||
MsgNewName(
|
||
IN DWORD neti, // Network index
|
||
IN DWORD ncbi // Name index
|
||
)
|
||
|
||
{
|
||
unsigned char flags;
|
||
NET_API_STATUS status = NERR_Success;
|
||
PNCB_DATA pNcbData;
|
||
PNCB pNcb;
|
||
PNET_DATA pNetData;
|
||
|
||
//
|
||
// Block until shared data area is free
|
||
//
|
||
MsgDatabaseLock(MSG_GET_EXCLUSIVE,"NetName");
|
||
|
||
pNetData = GETNETDATA(neti);
|
||
pNcbData = GETNCBDATA(neti,ncbi);
|
||
pNcb = &pNcbData->Ncb;
|
||
|
||
//
|
||
// If name still marked as new
|
||
//
|
||
if (SD_NAMEFLAGS(neti,ncbi) & NFNEW) {
|
||
|
||
//
|
||
// Turn off the new name bit
|
||
//
|
||
pNcbData->NameFlags &= ~NFNEW;
|
||
|
||
//
|
||
// copy the name into the NCB
|
||
//
|
||
memcpy(pNcb->ncb_name, pNcbData->Name,NCBNAMSZ);
|
||
|
||
//
|
||
// Set the buffer address
|
||
//
|
||
pNcb->ncb_buffer = pNcbData->Buffer;
|
||
|
||
//
|
||
// Wake up semaphore address
|
||
//
|
||
pNcb->ncb_event = (HANDLE) wakeupSem[neti];
|
||
|
||
//
|
||
// Use the LANMAN adapter
|
||
//
|
||
pNcb->ncb_lana_num = pNetData->net_lana_num;
|
||
|
||
//
|
||
// Set the name number
|
||
//
|
||
pNcb->ncb_num = pNcbData->NameNum;
|
||
|
||
flags = pNcbData->NameFlags;
|
||
|
||
//
|
||
// Unlock the share table
|
||
//
|
||
|
||
MsgDatabaseLock(MSG_RELEASE, "NewName");
|
||
|
||
|
||
status = MsgStartListen(neti,ncbi); // Start listening for messages
|
||
MSG_LOG(TRACE,"MsgNewName: MsgStartListen Status = %ld\n",status);
|
||
}
|
||
else {
|
||
//
|
||
// Unlock the share table
|
||
//
|
||
MsgDatabaseLock(MSG_RELEASE, "NewName");
|
||
}
|
||
return(status);
|
||
}
|
||
|
||
/*
|
||
* MsgServeNameReqs - service new names
|
||
*
|
||
* This function scans the name table for new names to process. It scans
|
||
* and processes names until no more new names can be found.
|
||
*
|
||
* MsgServeNameReqs ()
|
||
*
|
||
* RETURN
|
||
* nothing
|
||
*
|
||
* This function gains access to the shared data area, finds and processes
|
||
* new names until no more can be found, and then releases the shared data
|
||
* area.
|
||
*/
|
||
|
||
VOID
|
||
MsgServeNameReqs(
|
||
IN DWORD net // Net Index
|
||
)
|
||
{
|
||
DWORD i; // Name index
|
||
|
||
//
|
||
// While new names are found, add them.
|
||
//
|
||
|
||
while( (i = MsgFindNewName(net)) != -1) {
|
||
MsgNewName(net,i);
|
||
}
|
||
}
|
||
|