/*++ 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 // needed for smb.h #include // Server Message Block definitions #include // 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); } }