/* Editor Settings: expandtabs and use 4 spaces for indentation
* ex: set softtabstop=4 tabstop=8 expandtab shiftwidth=4: *
* -*- mode: c, c-basic-offset: 4 -*- */
/*
* Copyright Likewise Software
* All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the license, or (at
* your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
* General Public License for more details. You should have received a copy
* of the GNU Lesser General Public License along with this program. If
* not, see .
*
* LIKEWISE SOFTWARE MAKES THIS SOFTWARE AVAILABLE UNDER OTHER LICENSING
* TERMS AS WELL. IF YOU HAVE ENTERED INTO A SEPARATE LICENSE AGREEMENT
* WITH LIKEWISE SOFTWARE, THEN YOU MAY ELECT TO USE THE SOFTWARE UNDER THE
* TERMS OF THAT SOFTWARE LICENSE AGREEMENT INSTEAD OF THE TERMS OF THE GNU
* LESSER GENERAL PUBLIC LICENSE, NOTWITHSTANDING THE ABOVE NOTICE. IF YOU
* HAVE QUESTIONS, OR WISH TO REQUEST A COPY OF THE ALTERNATE LICENSING
* TERMS OFFERED BY LIKEWISE SOFTWARE, PLEASE CONTACT LIKEWISE SOFTWARE AT
* license@likewisesoftware.com
*/
/*
* Copyright (C) Likewise Software. All rights reserved.
*
* Module Name:
*
* smbutils.h
*
* Abstract:
*
* Likewise IO (LWIO)
*
* Utilities
*
* Authors: Krishna Ganugapati (krishnag@likewisesoftware.com)
* Sriram Nambakam (snambakam@likewisesoftware.com)
*/
#ifndef __SMBUTILS_H__
#define __SMBUTILS_H__
#include
#ifndef _SMB_ENDIAN_SWAP16
#define _SMB_ENDIAN_SWAP16(wX) \
((((uint16_t)(wX) & 0xFF00) >> 8) | \
(((uint16_t)(wX) & 0x00FF) << 8))
#endif
#ifndef _SMB_ENDIAN_SWAP32
#define _SMB_ENDIAN_SWAP32(dwX) \
((((uint32_t)(dwX) & 0xFF000000L) >> 24) | \
(((uint32_t)(dwX) & 0x00FF0000L) >> 8) | \
(((uint32_t)(dwX) & 0x0000FF00L) << 8) | \
(((uint32_t)(dwX) & 0x000000FFL) << 24))
#endif
#ifndef _SMB_ENDIAN_SWAP64
#define _SMB_ENDIAN_SWAP64(llX) \
(((uint64_t)(_SMB_ENDIAN_SWAP32(((uint64_t)(llX) & 0xFFFFFFFF00000000LL) >> 32))) | \
(((uint64_t)_SMB_ENDIAN_SWAP32(((uint64_t)(llX) & 0x00000000FFFFFFFFLL))) << 32))
#endif
#if defined(WORDS_BIGENDIAN)
#define SMB_HTOL16(x) _SMB_ENDIAN_SWAP16(x)
#define SMB_HTOL32(x) _SMB_ENDIAN_SWAP32(x)
#define SMB_HTOL64(x) _SMB_ENDIAN_SWAP64(x)
#define SMB_HTOLWSTR(dst, src, len) \
do \
{ \
PCWSTR __src = (PCWSTR) (src); \
PWSTR __dst = (PWSTR) (dst); \
ssize_t __len = (ssize_t) (len); \
swab(__src, __dst, __len * sizeof(WCHAR)); \
__dst[__len] = '\0'; \
} while (0)
#define SMB_LTOH16(x) _SMB_ENDIAN_SWAP16(x)
#define SMB_LTOH32(x) _SMB_ENDIAN_SWAP32(x)
#define SMB_LTOH64(x) _SMB_ENDIAN_SWAP64(x)
#define SMB_LTOHWSTR(dst, src, len) SMB_HTOLWSTR((dst), (src), (len))
#else
#define SMB_HTOL16(x) (x)
#define SMB_HTOL32(x) (x)
#define SMB_HTOL64(x) (x)
#define SMB_HTOLWSTR(dst, src, len) \
do \
{ \
PCWSTR __src = (PCWSTR) (src); \
PWSTR __dst = (PWSTR) (dst); \
ssize_t __len = (ssize_t) (len); \
memcpy(__dst, __src, __len * sizeof(WCHAR)); \
__dst[__len] = '\0'; \
} while (0)
#define SMB_LTOH16(x) (x)
#define SMB_LTOH32(x) (x)
#define SMB_LTOH64(x) (x)
#define SMB_LTOHWSTR(dst, src, len) SMB_HTOLWSTR((dst), (src), (len))
#endif
// No-ops, but for readability.
#define SMB_HTOL8(x) (x)
#define SMB_LTOH8(x) (x)
#define SMB_HTOL8_INPLACE(x) ((x) = SMB_HTOL8(x))
#define SMB_HTOL16_INPLACE(x) ((x) = SMB_HTOL16(x))
#define SMB_HTOL32_INPLACE(x) ((x) = SMB_HTOL32(x))
#define SMB_HTOL64_INPLACE(x) ((x) = SMB_HTOL64(x))
#define SMB_LTOH8_INPLACE(x) ((x) = SMB_LTOH8(x))
#define SMB_LTOH16_INPLACE(x) ((x) = SMB_LTOH16(x))
#define SMB_LTOH32_INPLACE(x) ((x) = SMB_LTOH32(x))
#define SMB_LTOH64_INPLACE(x) ((x) = SMB_LTOH64(x))
#define BAIL_ON_LWIO_ERROR(dwError) \
if ((dwError)) { \
LWIO_LOG_DEBUG("Error at %s:%d [code: %d]", \
__FILE__, \
__LINE__, \
dwError); \
goto error; \
}
#define BAIL_ON_NT_STATUS(ntStatus) \
if ((ntStatus)) { \
LWIO_LOG_DEBUG("Error at %s:%d [status: %s = 0x%08X (%d)]", \
__FILE__, \
__LINE__, \
LwNtStatusToName(ntStatus), \
ntStatus, ntStatus); \
goto error; \
}
#define BAIL_ON_NULL_PTR(x, err) \
do { \
if ((x) == NULL) { \
err = STATUS_INSUFFICIENT_RESOURCES; \
goto error; \
} \
} while(0) \
#define BAIL_ON_INVALID_PTR(ptr, err) \
do { \
if ((ptr) == NULL) { \
err = STATUS_INVALID_PARAMETER; \
goto error; \
} \
} while (0)
#define BAIL_ON_ZERO_LENGTH(len, err) \
do { \
if ((len) == 0) { \
err = STATUS_INVALID_PARAMETER; \
goto error; \
} \
} while (0)
#define GOTO_CLEANUP_ON_SMB_ERROR(error) \
_GOTO_CLEANUP_ON_NONZERO(error)
#define GOTO_CLEANUP_ON_LWIO_ERROR_EE(error, EE) \
_GOTO_CLEANUP_ON_NONZERO_EE(error, EE)
#define LWIO_SAFE_FREE_STRING(str) \
do { \
if (str) { \
SMBFreeString(str); \
(str) = NULL; \
} \
} while(0);
#define SMB_SAFE_CLEAR_FREE_STRING(str) \
do { \
if (str) { \
if (*str) { \
memset(str, 0, strlen(str)); \
} \
SMBFreeString(str); \
(str) = NULL; \
} \
} while(0);
#define LWIO_SAFE_FREE_MEMORY(mem) \
do { \
if (mem) { \
SMBFreeMemory(mem); \
(mem) = NULL; \
} \
} while(0);
#define LWIO_SAFE_FREE_STRING_ARRAY(ppszArray) \
do { \
if (ppszArray) { \
SMBFreeNullTerminatedStringArray(ppszArray); \
(ppszArray) = NULL; \
} \
} while (0);
#define IsNullOrEmptyString(str) (!(str) || !(*(str)))
#define LWIO_LOCK_MUTEX(bInLock, mutex) \
if (!bInLock) { \
int thr_err = pthread_mutex_lock(mutex); \
if (thr_err) { \
LWIO_LOG_ERROR("Failed to lock mutex: %d. Aborting program", \
thr_err); \
abort(); \
} \
bInLock = TRUE; \
}
#define LWIO_UNLOCK_MUTEX(bInLock, mutex) \
if (bInLock) { \
int thr_err = pthread_mutex_unlock(mutex); \
if (thr_err) { \
LWIO_LOG_ERROR("Failed to unlock mutex: %d. Aborting program", \
thr_err); \
abort(); \
} \
bInLock = FALSE; \
}
#define LWIO_LOCK_RWMUTEX_SHARED(bInLock, mutex) \
if (!bInLock) { \
int thr_err = pthread_rwlock_rdlock(mutex); \
if (thr_err) { \
LWIO_LOG_ERROR("Failed to acquire shared lock on rw mutex. Aborting program"); \
abort(); \
} \
bInLock = TRUE; \
}
#define LWIO_LOCK_RWMUTEX_EXCLUSIVE(bInLock, mutex) \
if (!bInLock) { \
int thr_err = pthread_rwlock_wrlock(mutex); \
if (thr_err) { \
LWIO_LOG_ERROR("Failed to acquire exclusive lock on rw mutex. Aborting program"); \
abort(); \
} \
bInLock = TRUE; \
}
#define LWIO_UNLOCK_RWMUTEX(bInLock, mutex) \
if (bInLock) { \
int thr_err = pthread_rwlock_unlock(mutex); \
if (thr_err) { \
LWIO_LOG_ERROR("Failed to unlock rw mutex. Aborting program"); \
abort(); \
} \
bInLock = FALSE; \
}
/*
* Logging
*/
#if defined(LW_ENABLE_THREADS)
extern pthread_mutex_t gSMBLogLock;
#define LWIO_LOCK_LOGGER pthread_mutex_lock(&gSMBLogLock)
#define LWIO_UNLOCK_LOGGER pthread_mutex_unlock(&gSMBLogLock)
#define _LWIO_LOG_PREFIX_THREAD(Format) \
"0x%lx:" Format, ((unsigned long)pthread_self())
#else
#define LWIO_LOCK_LOGGER
#define LWIO_UNLOCK_LOGGER
#define _LWIO_LOG_PREFIX_THREAD(Format) \
Format
#endif
#define _LWIO_LOG_PREFIX_LOCATION(Format, Function, File, Line) \
_LWIO_LOG_PREFIX_THREAD("[%s() %s:%d] " Format), \
(Function), \
(File), \
(Line)
#define _LWIO_LOG_WITH_THREAD(Level, Format, ...) \
_LWIO_LOG_MESSAGE(Level, \
_LWIO_LOG_PREFIX_THREAD(Format), \
## __VA_ARGS__)
#define _LWIO_LOG_WITH_LOCATION(Level, Format, Function, File, Line, ...) \
_LWIO_LOG_MESSAGE(Level, \
_LWIO_LOG_PREFIX_LOCATION(Format, Function, File, Line), \
## __VA_ARGS__)
#define _LWIO_LOG_WITH_DEBUG(Level, Format, ...) \
_LWIO_LOG_WITH_LOCATION(Level, Format, \
__FUNCTION__, __FILE__, __LINE__, \
## __VA_ARGS__)
extern HANDLE ghSMBLog;
extern LWIO_LOG_LEVEL gSMBMaxLogLevel;
extern PFN_LWIO_LOG_MESSAGE gpfnSMBLogger;
#define _LWIO_LOG_MESSAGE(Level, Format, ...) \
SMBLogMessage(gpfnSMBLogger, ghSMBLog, Level, Format, ## __VA_ARGS__)
#define _LWIO_LOG_IF(Level, Format, ...) \
do { \
LWIO_LOCK_LOGGER; \
if (gpfnSMBLogger && (gSMBMaxLogLevel >= (Level))) \
{ \
if (gSMBMaxLogLevel >= LWIO_LOG_LEVEL_DEBUG) \
{ \
_LWIO_LOG_WITH_DEBUG(Level, Format, ## __VA_ARGS__); \
} \
else \
{ \
_LWIO_LOG_WITH_THREAD(Level, Format, ## __VA_ARGS__); \
} \
} \
LWIO_UNLOCK_LOGGER; \
} while (0)
#define SMB_SAFE_LOG_STRING(x) \
( (x) ? (x) : "" )
#define LWIO_LOG_ALWAYS(szFmt, ...) \
_LWIO_LOG_IF(LWIO_LOG_LEVEL_ALWAYS, szFmt, ## __VA_ARGS__)
#define LWIO_LOG_ERROR(szFmt, ...) \
_LWIO_LOG_IF(LWIO_LOG_LEVEL_ERROR, szFmt, ## __VA_ARGS__)
#define LWIO_LOG_WARNING(szFmt, ...) \
_LWIO_LOG_IF(LWIO_LOG_LEVEL_WARNING, szFmt, ## __VA_ARGS__)
#define LWIO_LOG_INFO(szFmt, ...) \
_LWIO_LOG_IF(LWIO_LOG_LEVEL_INFO, szFmt, ## __VA_ARGS__)
#define LWIO_LOG_VERBOSE(szFmt, ...) \
_LWIO_LOG_IF(LWIO_LOG_LEVEL_VERBOSE, szFmt, ## __VA_ARGS__)
#define LWIO_LOG_DEBUG(szFmt, ...) \
_LWIO_LOG_IF(LWIO_LOG_LEVEL_DEBUG, szFmt, ## __VA_ARGS__)
#define LWIO_LOG_TRACE(szFmt, ...) \
_LWIO_LOG_IF(LWIO_LOG_LEVEL_TRACE, szFmt, ## __VA_ARGS__)
VOID
LwIoAssertionFailed(
IN PCSTR Expression,
IN OPTIONAL PCSTR Message,
IN PCSTR Function,
IN PCSTR File,
IN ULONG Line
);
VOID
LwIoAssertionFailedFormat(
IN PCSTR Expression,
IN PCSTR Format,
IN PCSTR Function,
IN PCSTR File,
IN ULONG Line,
...
);
#define LWIO_ASSERT_MSG(Expression, Message) \
((Expression) ? \
TRUE : \
LwIoAssertionFailed(#Expression, Message, __FUNCTION__, __FILE__, __LINE__), FALSE)
#define LWIO_ASSERT_FORMAT(Expression, Format, ...) \
((Expression) ? \
TRUE : \
LwIoAssertionFailedFormat(#Expression, Format, __FUNCTION__, __FILE__, __LINE__, ## __VA_ARGS__), FALSE)
#define LWIO_ASSERT(Expression) \
LWIO_ASSERT_MSG(Expression, NULL)
//defined flags in dwOptions
#define SMB_CFG_OPTION_STRIP_SECTION 0x00000001
#define SMB_CFG_OPTION_STRIP_NAME_VALUE_PAIR 0x00000002
#define SMB_CFG_OPTION_STRIP_ALL \
(SMB_CFG_OPTION_STRIP_SECTION | SMB_CFG_OPTION_STRIP_NAME_VALUE_PAIR)
#define BAIL_ON_INVALID_STRING(pszParam) \
if (IsNullOrEmptyString(pszParam)) { \
dwError = LWIO_ERROR_INVALID_PARAMETER; \
BAIL_ON_LWIO_ERROR(dwError); \
}
#define BAIL_ON_INVALID_HANDLE(hParam) \
if (hParam == (HANDLE)NULL) { \
dwError = LWIO_ERROR_INVALID_PARAMETER; \
BAIL_ON_LWIO_ERROR(dwError); \
}
#define BAIL_ON_INVALID_SMBHANDLE(hParam) \
if (hParam == (SMBHANDLE) 0) { \
dwError = LWIO_ERROR_INVALID_HANDLE; \
BAIL_ON_LWIO_ERROR(dwError); \
}
#define BAIL_ON_INVALID_POINTER(p) \
if (NULL == p) { \
dwError = LWIO_ERROR_INVALID_PARAMETER; \
BAIL_ON_LWIO_ERROR(dwError); \
}
typedef struct __SMB_BIT_VECTOR
{
DWORD dwNumBits;
PDWORD pVector;
} SMB_BIT_VECTOR, *PSMB_BIT_VECTOR;
typedef struct __SMB_HASH_ENTRY SMB_HASH_ENTRY, *PSMB_HASH_ENTRY;
typedef int (*SMB_HASH_KEY_COMPARE)(PCVOID, PCVOID);
typedef size_t (*SMB_HASH_KEY)(PCVOID);
typedef void (*SMB_HASH_FREE_ENTRY)(const SMB_HASH_ENTRY *);
struct __SMB_HASH_ENTRY
{
PVOID pKey;
PVOID pValue;
//Next value in chain
struct __SMB_HASH_ENTRY *pNext;
};
typedef struct __SMB_HASH_TABLE
{
size_t sTableSize;
size_t sCount;
SMB_HASH_ENTRY **ppEntries;
SMB_HASH_KEY_COMPARE fnComparator;
SMB_HASH_KEY fnHash;
SMB_HASH_FREE_ENTRY fnFree;
} SMB_HASH_TABLE, *PSMB_HASH_TABLE;
typedef struct __SMB_HASH_ITERATOR
{
SMB_HASH_TABLE *pTable;
size_t sEntryIndex;
SMB_HASH_ENTRY *pEntryPos;
} SMB_HASH_ITERATOR;
typedef struct __SMB_DLINKEDLIST
{
PVOID pItem;
struct __SMB_DLINKEDLIST * pNext;
struct __SMB_DLINKEDLIST * pPrev;
} SMBDLINKEDLIST, *PSMBDLINKEDLIST;
typedef VOID (*PFNSMB_DLINKEDLIST_FUNC)(PVOID pData, PVOID pUserData);
typedef DWORD (*PFNSMB_FOREACH_STACK_ITEM)(PVOID pItem, PVOID pUserData);
typedef struct __SMB_STACK
{
PVOID pItem;
struct __SMB_STACK * pNext;
} SMB_STACK, *PSMB_STACK;
typedef VOID (*PFNLWIO_QUEUE_FUNC)(PVOID pData, PVOID pUserData);
typedef DWORD (*PFNLWIO_FOREACH_QUEUE_ITEM)(PVOID pItem, PVOID pUserData);
typedef struct __LWIO_QUEUE_ITEM
{
PVOID pItem;
struct __LWIO_QUEUE_ITEM * pNext;
} LWIO_QUEUE_ITEM, *PLWIO_QUEUE_ITEM;
typedef struct __LWIO_QUEUE
{
PLWIO_QUEUE_ITEM pHead;
PLWIO_QUEUE_ITEM pTail;
} LWIO_QUEUE, *PLWIO_QUEUE;
typedef DWORD SMBHANDLE, *PSMBHANDLE;
typedef enum
{
SMB_HANDLE_TYPE_UNKNOWN = 0,
SMB_HANDLE_TYPE_FILE,
SMB_HANDLE_TYPE_NAMED_PIPE,
SMB_HANDLE_TYPE_SOCKET
} SMBHandleType;
typedef struct __SMB_HANDLE_MANAGER
{
SMBHANDLE dwHandleMax;
PSMB_HASH_TABLE pHandleTable;
PSMB_BIT_VECTOR pFreeHandleIndex;
} SMB_HANDLE_MANAGER, *PSMB_HANDLE_MANAGER;
#if !defined(HAVE_STRTOLL)
long long int
strtoll(
const char* nptr,
char** endptr,
int base
);
#endif /* defined(HAVE_STRTOLL) */
#if !defined(HAVE_STRTOULL)
unsigned long long int
strtoull(
const char* nptr,
char** endptr,
int base
);
#endif /* defined(HAVE_STRTOULL) */
char*
lsmb_stpncpy(
char *dest,
const char* src,
size_t n
);
#if !defined(HAVE_STRNLEN)
size_t
strnlen(
const char *s,
size_t maxlen
);
#endif /* !defined(HAVE_STRNLEN) */
LW_NTSTATUS
LwIoAllocateMemory(
size_t Size,
LW_PVOID * ppMemory
);
LW_NTSTATUS
LwIoReallocMemory(
LW_PVOID pMemory,
size_t Size,
LW_PVOID * ppNewMemory
);
VOID
LwIoFreeMemory(
PVOID pMemory
);
#define IO_SAFE_FREE_MEMORY(pMem) \
do \
{ \
if ((pMem)) \
{ \
LwIoFreeMemory((pMem)); \
(pMem) = NULL; \
} \
} while (0)
DWORD
SMBAllocateMemory(
DWORD dwSize,
PVOID * ppMemory
);
DWORD
SMBReallocMemory(
PVOID pMemory,
PVOID * ppNewMemory,
DWORD dwSize
);
void
SMBFreeMemory(
PVOID pMemory
);
DWORD
SMBAllocateString(
PCSTR pszInputString,
PSTR *ppszOutputString
);
void
SMBFreeString(
PSTR pszString
);
void
SMBStripWhitespace(
PSTR pszString,
BOOLEAN bLeading,
BOOLEAN bTrailing
);
DWORD
SMBStrIsAllSpace(
PCSTR pszString,
PBOOLEAN pbIsAllSpace
);
void
SMBStrToUpper(
PSTR pszString
);
void
SMBStrnToUpper(
PSTR pszString,
DWORD dwLen
);
void
SMBStrToLower(
PSTR pszString
);
void
SMBStrnToLower(
PSTR pszString,
DWORD dwLen
);
DWORD
SMBEscapeString(
PSTR pszOrig,
PSTR * ppszEscapedString
);
DWORD
SMBStrndup(
PCSTR pszInputString,
size_t size,
PSTR * ppszOutputString
);
DWORD
SMBAllocateStringPrintf(
PSTR* ppszOutputString,
PCSTR pszFormat,
...
);
DWORD
SMBAllocateStringPrintfV(
PSTR* ppszOutputString,
PCSTR pszFormat,
va_list args
);
VOID
SMBStrCharReplace(
PSTR pszStr,
CHAR oldCh,
CHAR newCh);
// If pszInputString == NULL, then *ppszOutputString = NULL
DWORD
SMBStrDupOrNull(
PCSTR pszInputString,
PSTR *ppszOutputString
);
// If pszInputString == NULL, return "", else return pszInputString
// The return value does not need to be freed.
PCSTR
SMBEmptyStrForNull(
PCSTR pszInputString
);
void
SMBStrChr(
PCSTR pszInputString,
CHAR c,
PSTR *pszOutputString
);
void
SMBFreeStringArray(
PSTR * ppStringArray,
DWORD dwCount
);
void
SMBFreeNullTerminatedStringArray(
PSTR * ppStringArray
);
#if defined(UNICODE)
DWORD
SMBAllocateStringW(
PWSTR pwszInputString,
PWSTR* ppwszOutputString
);
DWORD
SMBMbsToWc16s(
PCSTR pszInput,
PWSTR* ppwszOutput
);
DWORD
SMBWc16snToMbs(
PCWSTR pwszInput,
size_t sMaxChars,
PSTR* ppszOutput
);
DWORD
SMBWc16sToMbs(
PCWSTR pwszInput,
PSTR* ppszOutput
);
DWORD
SMBWc16sLen(
PCWSTR pwszInput,
size_t* psLen
);
DWORD
SMBWc16sCmp(
PCWSTR pwszFirst,
PCWSTR pwszSecond
);
DWORD
SMBWc16sCaseCmp(
PCWSTR pwszFirst,
PCWSTR pwszSecond
);
DWORD
SMBWc16sDup(
PCWSTR pwszInput,
PWSTR* pwszOutput
);
#endif /* defined(UNICODE) */
DWORD
SMBDLinkedListPrepend(
PSMBDLINKEDLIST* ppList,
PVOID pItem
);
DWORD
SMBDLinkedListAppend(
PSMBDLINKEDLIST* ppList,
PVOID pItem
);
BOOLEAN
SMBDLinkedListDelete(
PSMBDLINKEDLIST* ppList,
PVOID pItem
);
VOID
SMBDLinkedListForEach(
PSMBDLINKEDLIST pList,
PFNSMB_DLINKEDLIST_FUNC pFunc,
PVOID pUserData
);
VOID
SMBDLinkedListFree(
PSMBDLINKEDLIST pList
);
DWORD
SMBStackPush(
PVOID pItem,
PSMB_STACK* ppStack
);
VOID
SMBStackPushNoAlloc(
PSMB_STACK* ppStack,
PSMB_STACK pStack
);
PVOID
SMBStackPop(
PSMB_STACK* ppStack
);
VOID
SMBStackPopNoFree(
PSMB_STACK* ppStack
);
PVOID
SMBStackPeek(
PSMB_STACK pStack
);
DWORD
SMBStackForeach(
PSMB_STACK pStack,
PFNSMB_FOREACH_STACK_ITEM pfnAction,
PVOID pUserData
);
PSMB_STACK
SMBStackReverse(
PSMB_STACK pStack
);
VOID
SMBStackFree(
PSMB_STACK pStack
);
DWORD
LWIOQueueCreate(
PLWIO_QUEUE* ppQueue
);
DWORD
SMBEnqueue(
PLWIO_QUEUE pQueue,
PVOID pItem
);
PVOID
SMBDequeue(
PLWIO_QUEUE pQueue
);
BOOLEAN
LWIOQueueIsEmpty(
PLWIO_QUEUE pQueue
);
DWORD
LWIOQueueForeach(
PLWIO_QUEUE pQueue,
PFNLWIO_FOREACH_QUEUE_ITEM pfnAction,
PVOID pUserData
);
VOID
LWIOQueueFree(
PLWIO_QUEUE pQueue
);
DWORD
SMBBitVectorCreate(
DWORD dwNumBits,
PSMB_BIT_VECTOR* ppBitVector
);
BOOLEAN
SMBBitVectorIsSet(
PSMB_BIT_VECTOR pBitVector,
DWORD iBit
);
DWORD
SMBBitVectorSetBit(
PSMB_BIT_VECTOR pBitVector,
DWORD iBit
);
DWORD
SMBBitVectorUnsetBit(
PSMB_BIT_VECTOR pBitVector,
DWORD iBit
);
DWORD
SMBBitVectorFirstUnsetBit(
PSMB_BIT_VECTOR pBitVector,
PDWORD pdwUnsetBit
);
VOID
SMBBitVectorReset(
PSMB_BIT_VECTOR pBitVector
);
VOID
SMBBitVectorFree(
PSMB_BIT_VECTOR pBitVector
);
DWORD
SMBHashCreate(
size_t sTableSize,
SMB_HASH_KEY_COMPARE fnComparator,
SMB_HASH_KEY fnHash,
SMB_HASH_FREE_ENTRY fnFree, //optional
SMB_HASH_TABLE** ppResult);
void
SMBHashSafeFree(
SMB_HASH_TABLE** ppResult);
DWORD
SMBHashSetValue(
SMB_HASH_TABLE *pTable,
PVOID pKey,
PVOID pValue);
//Returns ENOENT if pKey is not in the table
DWORD
SMBHashGetValue(
SMB_HASH_TABLE *pTable,
PCVOID pKey,
PVOID* ppValue);
BOOLEAN
SMBHashExists(
PSMB_HASH_TABLE pTable,
PCVOID pKey
);
//Invalidates all iterators
DWORD
SMBHashResize(
SMB_HASH_TABLE *pTable,
size_t sTableSize);
DWORD
SMBHashGetIterator(
SMB_HASH_TABLE *pTable,
SMB_HASH_ITERATOR *pIterator);
// returns NULL after passing the last entry
SMB_HASH_ENTRY *
SMBHashNext(
SMB_HASH_ITERATOR *pIterator
);
DWORD
SMBHashRemoveKey(
SMB_HASH_TABLE *pTable,
PCVOID pKey);
int
SMBHashCaselessStringCompare(
PCVOID str1,
PCVOID str2);
int
SMBHashCaselessWc16StringCompare(
PCVOID str1,
PCVOID str2);
int
SMBHashCompareUINT32(
PCVOID key1,
PCVOID key2
);
size_t
SMBHashCaselessString(
PCVOID str);
size_t
SMBHashCaselessWc16String(
PCVOID str);
DWORD
SMBHandleManagerCreate(
SMBHANDLE dwHandleMax,
PSMB_HANDLE_MANAGER* ppHandleManager
);
DWORD
SMBHandleManagerAddItem(
PSMB_HANDLE_MANAGER pHandleMgr,
SMBHandleType hType,
PVOID pItem,
PSMBHANDLE phItem
);
DWORD
SMBHandleManagerGetItem(
PSMB_HANDLE_MANAGER pHandleMgr,
SMBHANDLE handleId,
SMBHandleType* phType,
PVOID* ppItem
);
DWORD
SMBHandleManagerDeleteItem(
PSMB_HANDLE_MANAGER pHandleMgr,
SMBHANDLE hItem,
SMBHandleType* phType,
PVOID* ppItem
);
VOID
SMBHandleManagerFree(
PSMB_HANDLE_MANAGER pHandleManager
);
DWORD
SMBRemoveFile(
PCSTR pszPath
);
DWORD
SMBCheckFileExists(
PCSTR pszPath,
PBOOLEAN pbFileExists
);
DWORD
SMBCheckSockExists(
PSTR pszPath,
PBOOLEAN pbFileExists
);
DWORD
SMBMoveFile(
PCSTR pszSrcPath,
PCSTR pszDstPath
);
DWORD
SMBChangePermissions(
PCSTR pszPath,
mode_t dwFileMode
);
DWORD
SMBChangeOwner(
PCSTR pszPath,
uid_t uid,
gid_t gid
);
DWORD
SMBChangeOwnerAndPermissions(
PCSTR pszPath,
uid_t uid,
gid_t gid,
mode_t dwFileMode
);
DWORD
SMBGetCurrentDirectoryPath(
PSTR* ppszPath
);
DWORD
SMBChangeDirectory(
PSTR pszPath
);
DWORD
SMBRemoveDirectory(
PSTR pszPath
);
DWORD
SMBCopyDirectory(
PCSTR pszSourceDirPath,
uid_t ownerUid,
gid_t ownerGid,
PCSTR pszDestDirPath
);
DWORD
SMBCheckDirectoryExists(
PCSTR pszPath,
PBOOLEAN pbDirExists
);
DWORD
SMBCreateDirectory(
PCSTR pszPath,
mode_t dwFileMode
);
DWORD
SMBCopyFileWithPerms(
PCSTR pszSrcPath,
PCSTR pszDstPath,
mode_t dwPerms
);
DWORD
SMBGetOwnerAndPermissions(
PCSTR pszSrcPath,
uid_t * uid,
gid_t * gid,
mode_t * mode
);
DWORD
SMBCopyFileWithOriginalPerms(
PCSTR pszSrcPath,
PCSTR pszDstPath
);
DWORD
SMBBackupFile(
PCSTR pszPath
);
DWORD
SMBGetSymlinkTarget(
PCSTR pszPath,
PSTR* ppszTargetPath
);
DWORD
SMBCreateSymlink(
PCSTR pszOldPath,
PCSTR pszNewPath
);
DWORD
SMBGetMatchingFilePathsInFolder(
PCSTR pszDirPath,
PCSTR pszFileNameRegExp,
PSTR** pppszHostFilePaths,
PDWORD pdwNPaths
);
DWORD
SMBGetPrefixDirPath(
PSTR* ppszPath
);
DWORD
SMBGetLibDirPath(
PSTR* ppszPath
);
DWORD
LwioGetHostInfo(
PSTR* ppszHostname
);
DWORD
SMBInitLogging(
PCSTR pszProgramName,
LWIO_LOG_TARGET logTarget,
LWIO_LOG_LEVEL maxAllowedLogLevel,
PCSTR pszPath
);
DWORD
SMBLogGetInfo(
PLWIO_LOG_INFO* ppLogInfo
);
DWORD
SMBLogSetInfo(
PLWIO_LOG_INFO pLogInfo
);
VOID
SMBLogMessage(
PFN_LWIO_LOG_MESSAGE pfnLogger,
HANDLE hLog,
LWIO_LOG_LEVEL logLevel,
PCSTR pszFormat,
...
);
void
lsmb_vsyslog(
int priority,
const char *format,
va_list ap
);
DWORD
SMBShutdownLogging(
VOID
);
DWORD
SMBValidateLogLevel(
DWORD dwLogLevel
);
#endif /* __SMBUTILS_H__ */
/*
local variables:
mode: c
c-basic-offset: 4
indent-tabs-mode: nil
tab-width: 4
end:
*/