#import <sys/types.h>
#import "Listener.h"
struct HashTable;
struct UserGroup;
typedef struct UserGroup
{
u_int32_t fExpiration;
guid_t fGUID;
ntsid_t* fSID;
uid_t fID;
gid_t fPrimaryGroup;
char* fName;
struct HashTable* fGUIDMembershipHash;
struct HashTable* fSIDMembershipHash;
struct HashTable* fGIDMembershipHash;
u_int16_t fRefCount;
u_int16_t fCheckVal;
struct UserGroup* fLink;
struct UserGroup* fBackLink;
char fIsUser;
char fNotFound;
} UserGroup;
void InitializeUserGroup(int numToCache, int defaultExpiration, int defaultNegativeExpiration, int logSize);
void ResetCache();
void DumpState(bool dumpLogOnly);
UserGroup* GetItemWithGUID(guid_t* guid);
UserGroup* GetItemWithSID(ntsid_t* sid);
UserGroup* GetUserWithUID(int uid);
UserGroup* GetGroupWithGID(int gid);
UserGroup* GetUserWithName(char* name);
UserGroup* GetGroupWithName(char* name);
int IsUserMemberOfGroupByGUID(UserGroup* user, guid_t* groupGUID);
int IsUserMemberOfGroupBySID(UserGroup* user, ntsid_t* groupSID);
int IsUserMemberOfGroupByGID(UserGroup* user, int gid);
int Get16Groups(UserGroup* user, gid_t* gidArray);
void ConvertGUIDToString(guid_t* data, char* string);
void TouchItem(UserGroup* item);