/* 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 2004-2008
* 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:
*
* lwnet-utils.h
*
* Abstract:
*
* Likewise Site Manager
*
* System utilities
*
* Authors: Krishna Ganugapati (krishnag@likewisesoftware.com)
*
*/
#ifndef __LWNET_UTILS_H__
#define __LWNET_UTILS_H__
#include
typedef struct __DLINKEDLIST
{
PVOID pItem;
struct __DLINKEDLIST * pNext;
struct __DLINKEDLIST * pPrev;
} DLINKEDLIST, *PDLINKEDLIST;
typedef VOID (*PFN_DLINKEDLIST_FUNC)(PVOID pData, PVOID pUserData);
typedef DWORD (*PFN_LWNET_FOREACH_STACK_ITEM)(PVOID pItem, PVOID pUserData);
typedef struct __LWNET_STACK
{
PVOID pItem;
struct __LWNET_STACK * pNext;
} LWNET_STACK, *PLWNET_STACK;
//defined flags in dwOptions
#define LWNET_CFG_OPTION_STRIP_SECTION 0x00000001
#define LWNET_CFG_OPTION_STRIP_NAME_VALUE_PAIR 0x00000002
#define LWNET_CFG_OPTION_STRIP_ALL (LWNET_CFG_OPTION_STRIP_SECTION | \
LWNET_CFG_OPTION_STRIP_NAME_VALUE_PAIR)
// This standardizes the width to 64 bits. This is useful for
/// writing to files and such.
// This is in seconds (or milliseconds, microseconds, nanoseconds) since
// Jan 1, 1970.
#ifndef LWNET_UNIX_TIME_T_DEFINED
typedef int64_t LWNET_UNIX_TIME_T, *PLWNET_UNIX_TIME_T;
#define LWNET_UNIX_TIME_T_DEFINED
#endif
typedef int64_t LWNET_UNIX_MS_TIME_T, *PLWNET_UNIX_MS_TIME_T;
typedef int64_t LWNET_UNIX_US_TIME_T, *PLWNET_UNIX_US_TIME_T;
typedef int64_t LWNET_UNIX_NS_TIME_T, *PLWNET_UNIX_NS_TIME_T;
// This is in 100ns units from Jan 1, 1601:
typedef int64_t LWNET_WINDOWS_TIME_T, *PLWNET_WINDOWS_TIME_T;
/*
* Configuration
*/
#define BAIL_ON_NON_LWREG_ERROR(dwError) \
if (!(40700 <= dwError && dwError <= 41200)) {\
BAIL_ON_LWNET_ERROR(dwError); \
}
typedef struct __LWNET_CONFIG_REG
{
HANDLE hConnection;
HKEY hKey;
PSTR pszConfigKey;
PSTR pszPolicyKey;
} LWNET_CONFIG_REG, *PLWNET_CONFIG_REG;
typedef enum
{
LWNetTypeString,
LWNetTypeDword,
LWNetTypeBoolean,
LWNetTypeEnum
} LWNET_CONFIG_TYPE;
typedef struct __LWNET_CONFIG
{
PCSTR pszName;
BOOLEAN bUsePolicy;
LWNET_CONFIG_TYPE Type;
DWORD dwMin;
DWORD dwMax;
const PCSTR *ppszEnumNames;
PVOID pValue;
} LWNET_CONFIG, *PLWNET_CONFIG;
typedef struct _DNS_SERVER_INFO
{
PSTR pszName;
PSTR pszAddress;
} DNS_SERVER_INFO, *PDNS_SERVER_INFO;
//
// Logging
//
typedef struct _LOGFILEINFO {
CHAR szLogPath[PATH_MAX+1];
FILE* logHandle;
} LOGFILEINFO, *PLOGFILEINFO;
typedef struct _SYSLOGINFO {
CHAR szIdentifier[PATH_MAX+1];
DWORD dwOption;
DWORD dwFacility;
} SYSLOGINFO, *PSYSLOGINFO;
typedef struct _LOGINFO {
pthread_mutex_t lock;
DWORD dwLogLevel;
DWORD logTarget;
LOGFILEINFO logfile;
SYSLOGINFO syslog;
BOOLEAN bDebug;
BOOLEAN bLogToConsole;
BOOLEAN bLoggingInitiated;
} LOGINFO, *PLOGINFO;
extern LOGINFO gLwnetLogInfo;
#define _LWNET_LOG_ALWAYS(Level, Format, ...) \
lwnet_log_message((Level), "[%s() %s:%d] " Format, __FUNCTION__, __FILE__, __LINE__, ## __VA_ARGS__)
#define _LWNET_LOG_IF(Level, Format, ...) \
do { \
if (gLwnetLogInfo.dwLogLevel >= (Level)) \
{ \
_LWNET_LOG_ALWAYS(Level, Format, ## __VA_ARGS__); \
} \
} while (0)
#define LWNET_SAFE_LOG_STRING(x) \
( (x) ? (x) : "" )
#define LWNET_LOG_ALWAYS(szFmt, ...) \
_LWNET_LOG_ALWAYS(LWNET_LOG_LEVEL_ALWAYS, szFmt, ## __VA_ARGS__)
#define LWNET_LOG_ERROR(szFmt, ...) \
_LWNET_LOG_IF(LWNET_LOG_LEVEL_ERROR, szFmt, ## __VA_ARGS__)
#define LWNET_LOG_WARNING(szFmt, ...) \
_LWNET_LOG_IF(LWNET_LOG_LEVEL_WARNING, szFmt, ## __VA_ARGS__)
#define LWNET_LOG_INFO(szFmt, ...) \
_LWNET_LOG_IF(LWNET_LOG_LEVEL_INFO, szFmt, ## __VA_ARGS__)
#define LWNET_LOG_VERBOSE(szFmt, ...) \
_LWNET_LOG_IF(LWNET_LOG_LEVEL_VERBOSE, szFmt, ## __VA_ARGS__)
#define LWNET_LOG_DEBUG(szFmt, ...) \
_LWNET_LOG_IF(LWNET_LOG_LEVEL_DEBUG, szFmt, ## __VA_ARGS__)
//
// DNS resolver library utils
//
extern pthread_mutex_t gLwnetResolverLock;
DWORD
LWNetAllocateMemory(
DWORD dwSize,
PVOID * ppMemory
);
DWORD
LWNetReallocMemory(
PVOID pMemory,
PVOID * ppNewMemory,
DWORD dwSize
);
void
LWNetFreeMemory(
PVOID pMemory
);
DWORD
LWNetAllocateString(
PCSTR pszInputString,
PSTR *ppszOutputString
);
void
LWNetFreeString(
PSTR pszString
);
void
LWNetFreeStringArray(
PSTR * ppStringArray,
DWORD dwCount
);
void
LWNetFreeNullTerminatedStringArray(
PSTR * ppStringArray
);
DWORD
LWNetProcessConfig(
PCSTR pszConfigKey,
PCSTR pszPolicyKey,
PLWNET_CONFIG pConfig,
DWORD dwConfigEntries
);
DWORD
LWNetOpenConfig(
PCSTR pszConfigKey,
PCSTR pszPolicyKey,
PLWNET_CONFIG_REG *ppReg
);
DWORD
LWNetReadConfigString(
PLWNET_CONFIG_REG pReg,
PCSTR pszName,
BOOLEAN bUsePolicy,
PSTR *ppszValue
);
DWORD
LWNetReadConfigDword(
PLWNET_CONFIG_REG pReg,
PCSTR pszName,
BOOLEAN bUsePolicy,
DWORD dwMax,
DWORD dwMin,
PDWORD pdwValue
);
DWORD
LWNetReadConfigBoolean(
PLWNET_CONFIG_REG pReg,
PCSTR pszName,
BOOLEAN bUsePolicy,
PBOOLEAN pbValue
);
DWORD
LWNetReadConfigEnum(
PLWNET_CONFIG_REG pReg,
PCSTR pszName,
BOOLEAN bUsePolicy,
DWORD dwMin,
DWORD dwMax,
const PCSTR *ppszEnumNames,
PDWORD pdwValue
);
VOID
LWNetCloseConfig(
PLWNET_CONFIG_REG pReg
);
DWORD
LWNetDLinkedList(
PDLINKEDLIST* ppList,
PVOID pItem
);
DWORD
LWNetDLinkedListAppend(
PDLINKEDLIST* ppList,
PVOID pItem
);
BOOLEAN
LWNetDLinkedListDelete(
PDLINKEDLIST* ppList,
PVOID pItem
);
VOID
LWNetDLinkedListForEach(
PDLINKEDLIST pList,
PFN_DLINKEDLIST_FUNC pFunc,
PVOID pUserData
);
VOID
LWNetDLinkedListFree(
PDLINKEDLIST pList
);
DWORD
LWNetStackPush(
PVOID pItem,
PLWNET_STACK* ppStack
);
PVOID
LWNetStackPop(
PLWNET_STACK* ppStack
);
PVOID
LWNetStackPeek(
PLWNET_STACK pStack
);
DWORD
LWNetStackForeach(
PLWNET_STACK pStack,
PFN_LWNET_FOREACH_STACK_ITEM pfnAction,
PVOID pUserData
);
PLWNET_STACK
LWNetStackReverse(
PLWNET_STACK pStack
);
VOID
LWNetStackFree(
PLWNET_STACK pStack
);
DWORD
LWNetDnsGetHostInfo(
OUT OPTIONAL PSTR* ppszHostname,
OUT OPTIONAL PSTR* ppszDomain
);
// TODO: Add corresponding free call for this!!!
DWORD
LWNetDnsGetNameServerList(
OUT PSTR** pppszNameServerList,
OUT PDWORD pdwNumServers
);
DWORD
LWNetDnsSrvQuery(
IN PCSTR pszDnsDomainName,
IN OPTIONAL PCSTR pszSiteName,
IN DWORD dwFlags,
OUT PDNS_SERVER_INFO* ppServerArray,
OUT PDWORD pdwServerCount
);
DWORD
LWNetReadNextLine(
FILE* fp,
PSTR *output,
PBOOLEAN pbEndOfFile
);
DWORD
LWNetGetPrefixDirPath(
PSTR* ppszPath
);
DWORD
LWNetGetLibDirPath(
PSTR* ppszPath
);
#if !HAVE_DECL_ISBLANK && !defined(isblank)
#define isblank(c) ((c) == '\t' || (c) == ' ')
#endif
int
LWNetStrError(
int errnum,
char *pszBuf,
size_t buflen
);
//Convert to seconds string of form ##s, ##m, ##h, or ##d
//where s,m,h,d = seconds, minutes, hours, days.
DWORD
LWNetParseDateString(
PCSTR pszTimeInterval,
PDWORD pdwTimeInterval
);
DWORD
LWNetSetSystemTime(
IN LWNET_UNIX_TIME_T Time
);
DWORD
LWNetGetSystemTime(
OUT PLWNET_UNIX_TIME_T pTime
);
DWORD
LWNetGetSystemTimeInMs(
OUT PLWNET_UNIX_MS_TIME_T pTime
);
DWORD
LWNetGetSystemTimeInUs(
OUT PLWNET_UNIX_US_TIME_T pTime
);
DWORD
LWNetGetSystemTimeInNs(
OUT PLWNET_UNIX_NS_TIME_T pTime
);
DWORD
LWNetTimeInMsToTimespec(
IN LWNET_UNIX_MS_TIME_T Time,
OUT struct timespec* Timespec
);
DWORD
LWNetSleepInMs(
IN LWNET_UNIX_MS_TIME_T Time
);
DWORD
LWNetCrackLdapTime(
IN PCSTR pszStrTime,
OUT struct tm* pTm
);
DWORD
lwnet_init_logging_to_syslog(
DWORD dwLogLevel,
BOOLEAN bEnableDebug,
PCSTR pszIdentifier,
DWORD dwOption,
DWORD dwFacility
);
DWORD
lwnet_set_log_level(
DWORD dwLogLevel
);
DWORD
lwnet_get_log_info(
OUT PDWORD pdwLogLevel,
OUT PDWORD pdwLogTarget,
OUT PSTR* ppszLogPath
);
DWORD
lwnet_init_logging_to_file(
DWORD dwLogLevel,
BOOLEAN bEnableDebug,
PSTR pszLogFilePath
);
void
lwnet_log_message(
DWORD dwLogLevel,
PSTR pszFormat,
...
);
void
lwnet_close_log(
void
);
#endif /* __LWNET_UTILS_H__ */