#ifndef _NISNODE_H
#define _NISNODE_H
#include "FlatFileNode.h"
#include <SystemConfiguration/SystemConfiguration.h>
#include <DirectoryServiceCore/DSMutexSemaphore.h>
struct sNISReachabilityList;
typedef struct sNISRecordMapping;
typedef map<string, sNISRecordMapping *> NISRecordConfigDataMap;
typedef NISRecordConfigDataMap::iterator NISRecordConfigDataMapI;
class NISNode : public FlatFileNode
{
public:
NISNode( CFStringRef inNode, const char *inNISDomain, uid_t inUID, uid_t inEffectiveUID );
virtual ~NISNode( void );
virtual CFMutableDictionaryRef CopyNodeInfo( CFArrayRef cfAttributes );
virtual tDirStatus VerifyCredentials( CFStringRef inRecordType, CFStringRef inRecordName, CFStringRef inPassword );
virtual tDirStatus SearchRecords( sBDPISearchRecordsContext *inContext, BDPIOpaqueBuffer inBuffer, UInt32 *outCount);
static char *CopyDomainName( void );
static char *CopyNISServers( char *inNISDomain );
static void SetDomainAndServers( const char *inNISDomain, const char *inNISServers );
static bool IsNISAvailable( void );
static void InitializeGlobals( void );
private:
static char *fNISDomainConfigured;
static DSMutexSemaphore fStaticMutex;
static bool fNISAvailable;
static sNISReachabilityList *fServerReachability;
static NISRecordConfigDataMap fNISRecordMapTable;
static CFAbsoluteTime fLastYPBindLaunchAttempt;
char *fNISDomain;
private:
static void SetNISServers( const char* inNISDomain, const char *inNISServers );
static void NISReachabilityCallback( SCNetworkReachabilityRef target, SCNetworkConnectionFlags flags, void *info );
static sNISReachabilityList *CreateReachability( char *inName );
static void BuildYPMapTable( void );
static void FreeSearchState( void *inState );
static int ForEachEntry( unsigned long inStatus, char *inKey, int inKeyLen, char *inVal, int inValLen, void *inData );
static bool RecordMatchesCriteria( sBDPISearchRecordsContext *inContext, CFDictionaryRef inRecord );
bool DomainNameChanged( void );
SInt32 InternalSearchRecords( sBDPISearchRecordsContext *inContext, BDPIOpaqueBuffer inBuffer, UInt32 *outCount );
SInt32 FetchAllRecords( sBDPISearchRecordsContext *inContext, BDPIOpaqueBuffer inBuffer, UInt32 *outCount );
SInt32 FetchMatchingRecords( sBDPISearchRecordsContext *inContext, BDPIOpaqueBuffer inBuffer, UInt32 *outCount );
SInt32 FetchAutomountRecords( sBDPISearchRecordsContext *inContext, BDPIOpaqueBuffer inBuffer, UInt32 *outCount );
SInt32 MapNISError( int error );
};
#endif