summaryrefslogtreecommitdiff
path: root/usr/src/lib/libkmsagent/common/SYSCommon.h
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libkmsagent/common/SYSCommon.h')
-rw-r--r--usr/src/lib/libkmsagent/common/SYSCommon.h1168
1 files changed, 1168 insertions, 0 deletions
diff --git a/usr/src/lib/libkmsagent/common/SYSCommon.h b/usr/src/lib/libkmsagent/common/SYSCommon.h
new file mode 100644
index 0000000000..2fd114c4c1
--- /dev/null
+++ b/usr/src/lib/libkmsagent/common/SYSCommon.h
@@ -0,0 +1,1168 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
+ */
+
+/*---------------------------------------------------------------------------
+ * Module: System Abstraction Layer
+ *
+ * Description:
+ * The system layer provides an abstract layer for the most commonly
+ * used system calls for multi-platforms including Windows and most
+ * Unix variants.
+ *
+ * All the functions defined in this layer fall into 4 categories:
+ * Threading related functions
+ * Mutexes
+ * Conditional variables
+ * Other Utilities
+ *--------------------------------------------------------------------------*/
+
+#ifndef SYS_COMMON_H
+#define SYS_COMMON_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*---------------------------------------------------------------------------
+ * ERROR code
+ *--------------------------------------------------------------------------*/
+
+#define K_SYS_OK 0
+#define K_SYS_ERR_NO_MEMORY 1
+#define K_SYS_ERR_CREATE_THREAD 2
+#define K_SYS_ERR_JOIN_THREAD 3
+#define K_SYS_ERR_COND 4
+
+/*---------------------------------------------------------------------------
+ * Header files
+ *--------------------------------------------------------------------------*/
+
+#ifdef WIN32
+ #include <windows.h>
+ #include <process.h>
+#else
+ #include <pthread.h>
+
+ /* UNIX : added by STG */
+ #include <stdlib.h>
+ #include <string.h>
+#ifndef METAWARE
+ #include <wchar.h>
+#endif
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ #include <stdarg.h>
+
+ /*
+ * These functions are not needed, since the Agent API hides them
+ * enum KeystoneAgent_SortOrder {};
+ * enum KeystoneAgent_FilterOperator {};
+ */
+
+#endif
+
+/*---------------------------------------------------------------------------
+ * MACRO definitions
+ *--------------------------------------------------------------------------*/
+
+#ifdef WIN32
+#define PATH_SEPARATOR '\\'
+#define PATH_SEPARATOR_WSTR L"\\"
+#ifndef PATH_MAX
+#define PATH_MAX MAX_PATH
+#endif
+#else
+#define PATH_SEPARATOR '/'
+#define PATH_SEPARATOR_WSTR L"/"
+#endif
+
+#ifndef BOOL
+#define BOOL int
+#endif
+#ifndef TRUE
+#define TRUE 1
+#define FALSE 0
+#endif
+
+#ifdef K_LINUX_PLATFORM
+ #ifndef UNIX
+ #define UNIX
+ #endif
+#endif
+
+#ifdef K_AIX_PLATFORM
+ #ifndef UNIX
+ #define UNIX
+ #endif
+#endif
+
+#ifdef K_SOLARIS_PLATFORM
+ #ifndef UNIX
+ #define UNIX
+ #endif
+#endif
+
+#ifdef K_HPUX_PLATFORM
+ #ifndef UNIX
+ #define UNIX
+ #endif
+#endif
+
+/*---------------------------------------------------------------------------
+ * Fatal error definitions
+ *--------------------------------------------------------------------------*/
+
+#ifndef __FUNCTION__
+#define __FUNCTION__ "(Unknown)"
+#endif
+
+#ifndef FATAL_APPLICATION_STATE
+
+#ifdef DEBUG
+
+#ifdef WIN32
+#include "crtdbg.h"
+#define DEBUG_BREAK() { _CrtDbgBreak(); }
+#else /* WIN32 */
+#ifdef METAWARE
+#define DEBUG_BREAK() (void *) 0x00000000; /* dummy operation */
+#else
+#if !defined(__i386)
+#define DEBUG_BREAK()
+#else
+#ifdef __GNUC__
+#define DEBUG_BREAK() { __asm__ ( "int3" ); } /* NOTE: This only works for x86 platforms */
+#else
+#define DEBUG_BREAK()
+#endif
+#endif /* __i386 */
+#endif /* METAWARE */
+#endif /* WIN32 */
+
+#define FATAL_APPLICATION_STATE() \
+do { \
+ DEBUG_BREAK(); \
+ process_fatal_application_state(__FILE__,__FUNCTION__,__LINE__,0); \
+} while(0)
+
+#define FATAL_APPLICATION_STATE1(additional_text) \
+do { \
+ DEBUG_BREAK(); \
+ process_fatal_application_state(__FILE__,__FUNCTION__,__LINE__,additional_text); \
+} while(0)
+
+#else //DEBUG
+
+#define DEBUG_BREAK()
+
+#define FATAL_APPLICATION_STATE() \
+do { \
+ process_fatal_application_state(__FILE__,__FUNCTION__,__LINE__,0); \
+} while(0)
+
+#define FATAL_APPLICATION_STATE1(additional_text) \
+do { \
+ process_fatal_application_state(__FILE__,__FUNCTION__,__LINE__,additional_text); \
+} while(0)
+
+#endif //DEBUG
+
+#define FATAL_ASSERT(expression) do { if(!(expression)) {FATAL_APPLICATION_STATE();} } while(0)
+#define FATAL_ASSERT1(expression,additional_text) do { if(!(expression)) {FATAL_APPLICATION_STATE1(additional_text);} } while(0)
+
+/* MS Visual Studio compiler does not support __attribute__() */
+#ifndef __GNUC__
+#define __attribute__(x)
+#endif
+
+void process_fatal_application_state(const char* sFile, const char* sFunction, int iLine, const char* sAdditionalText) __attribute__((noreturn));
+
+void generate_stack_trace(const char* i_sFile, const wchar_t* i_wsErrMsg);
+
+#endif /* FATAL_APPLICATION_STATE */
+
+/*---------------------------------------------------------------------------
+ * Primitive type definitions
+ *--------------------------------------------------------------------------*/
+
+#ifdef WIN32
+typedef __int64 int64;
+#else
+#ifndef K_AIX_PLATFORM
+typedef signed long long int64;
+#endif
+#endif
+
+
+#ifdef K_HPUX_PLATFORM
+wchar_t* wcsstr (const wchar_t* haystack, const wchar_t* needle);
+int wprintf (const wchar_t* format, ...);
+int swprintf (wchar_t* s, size_t maxlen, const wchar_t* format, ...);
+int vswprintf (wchar_t* s, size_t maxlen, const wchar_t* format, va_list args);
+int swscanf(const wchar_t *s, const wchar_t *format, ...);
+int64 atoll(const char *str);
+#endif
+
+/*---------------------------------------------------------------------------
+ * Thread type definitions
+ *--------------------------------------------------------------------------*/
+
+#ifdef WIN32
+typedef HANDLE K_THREAD_HANDLE;
+#else
+typedef pthread_t K_THREAD_HANDLE;
+#endif
+
+/*---------------------------------------------------------------------------
+ * Mutex type definitions
+ *--------------------------------------------------------------------------*/
+
+#ifdef WIN32
+
+typedef struct {
+ HANDLE m_handle; /* mutex handle */
+
+ CRITICAL_SECTION m_stCriticalSection; /* criticalSection */
+
+ int m_bIsRecursive;
+} WIN32Mutex;
+
+typedef WIN32Mutex* K_MUTEX_HANDLE;
+
+#else
+typedef pthread_mutex_t* K_MUTEX_HANDLE;
+#endif
+
+/*---------------------------------------------------------------------------
+ * Conditional variable type definitions
+ *--------------------------------------------------------------------------*/
+
+#ifdef WIN32
+ struct K_CondStruct
+ {
+ HANDLE m_hEvent;
+ HANDLE m_hMutex;
+ int m_iSignalAll;
+ int m_iNumWaiting;
+ int m_iSignalled;
+ };
+ typedef struct K_CondStruct K_ConditionalVariable;
+
+#else
+ typedef pthread_cond_t K_ConditionalVariable;
+#endif
+
+/*---------------------------------------------------------------------------
+ * Thread function type definitions
+ *--------------------------------------------------------------------------*/
+
+ /*
+ * Having the function return int breaks compatibility between Windows
+ * and Unix; the function has to return void
+ */
+/*#ifdef WIN32
+ * typedef int (_stdcall *K_ThreadFunc) (void *vpData);
+ *#else
+ */
+ typedef void (*K_ThreadFunc) (void *vpData);
+/*
+ *#endif
+ */
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_CreateThread
+ *
+ * Description:
+ * This thread creation function takes a thread function
+ * and its parameter to create a thread. It also has a Boolean
+ * parameter to indicate if the thread is detached or joinable.
+ * A new thread's handle is returned through the output parameter.
+ *
+ * Input
+ * -----
+ * i_pFunc Function pointer of the thread function
+ * i_pvData The point of the parameter passed to the thread function
+ * i_bIsDetached The thread is detached or not. If detached, then it is
+ * not joinable. (Note: It is not supported on Win32)
+ *
+ * Output
+ * ------
+ * o_pNewThread The Thread handle
+ *
+ * Return value Error code
+ *
+ *--------------------------------------------------------------------------*/
+int K_CreateThread(K_ThreadFunc i_pFunc,
+ void *i_pvData,
+ int i_bIsDetached,
+ K_THREAD_HANDLE *o_pNewThread);
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_JoinThread
+ *
+ * Description:
+ * This thread joining function is called when the current thread
+ * waits another thread to terminate.
+ *
+ * Input
+ * -----
+ * i_hThread The thread handle of the to-be-joined thread
+ *
+ * Output
+ * ------
+ * (none)
+ *
+ * Return value Error code
+ *
+ *--------------------------------------------------------------------------*/
+int K_JoinThread(K_THREAD_HANDLE i_hThread);
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_GetCurrentThreadId
+ *
+ * Description:
+ * Returns the thread ID of the current thread.
+ *
+ * Input
+ * -----
+ * (none)
+ *
+ * Output
+ * ------
+ * (none)
+ *
+ * Return value The thread ID
+ *
+ *--------------------------------------------------------------------------*/
+
+int K_GetCurrentThreadId();
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_CreateMutex
+ *
+ * Description:
+ * The mutex creation function creates a mutex according to the given
+ * mutex type, and returns the mutex handle to the output parameter.
+ *
+ * Input
+ * -----
+ * (none)
+ *
+ * Output
+ * ------
+ * o_phandle the handle pointer to the mutex
+ *
+ * Return value Error Code
+ *
+ *--------------------------------------------------------------------------*/
+
+int K_CreateMutex( K_MUTEX_HANDLE *o_phandle );
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_LockMutex
+ *
+ * Description:
+ * K_LockMutex is used to lock the mutex, and K_UnlockMutex is
+ * used to unlock it.
+ *
+ * Input
+ * -----
+ * i_handle the mutex handle
+ *
+ * Output
+ * ------
+ * (none)
+ *
+ * return value Error Code
+ *
+ *--------------------------------------------------------------------------*/
+int K_LockMutex(K_MUTEX_HANDLE i_handle);
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_UnlockMutex
+ *
+ * Description:
+ * K_UnlockMutex is used to unlock the lock.
+ *
+ * Input
+ * -----
+ * i_handle the mutex handle
+ *
+ * Output
+ * ------
+ * (none)
+ *
+ * Return value Error Code
+ *
+ *--------------------------------------------------------------------------*/
+int K_UnlockMutex(K_MUTEX_HANDLE i_handle);
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_DestroyMutex
+ *
+ * Description:
+ * When a mutex is no longer needed, K_DestroyMutex must be called
+ * to destroy it.
+ *
+ * Input
+ * -----
+ * i_handle the mutex handle
+ *
+ * Output
+ * ------
+ * (none)
+ *
+ * Return value Error Code
+ *
+ *--------------------------------------------------------------------------*/
+
+int K_DestroyMutex(K_MUTEX_HANDLE i_handle);
+
+
+/*---------------------------------------------------------------------------
+ *
+ * The following section defines Conditional Variable
+ *
+ * Conditional Variable implements similar functionalities defined
+ * in POSIX thread library. But it only supports conditional variables
+ * inside one process and doesn't support pthread_cond_timedwait().
+*--------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_InitConditionalVariable
+ *
+ * Description:
+ * This function initializes a conditional variable; Upon successful
+ * completion, the new condition variable is returned via the condition
+ * parameter, and 0 is returned. Otherwise, an error code is returned.
+ *
+ * Input
+ * -----
+ * i_pCond the pointer to the conditional variable which is to be
+ * initialized
+ *
+ * Output
+ * ------
+ * (none)
+ *
+ * Return value Error Code
+ *
+ *--------------------------------------------------------------------------*/
+int K_InitConditionalVariable (K_ConditionalVariable * i_pCond);
+
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_DestroyConditionalVariable
+ *
+ * Description:
+ * This function destroys a conditional variable. Upon successful
+ * completion, the condition variable is destroyed, and 0 is returned.
+ * Otherwise, an error code is returned.
+ * After deletion of the condition variable, the condition parameter
+ * is not valid until it is initialized again by a call to the
+ * K_InitConditionalVariable subroutine.
+ *
+ * Input
+ * -----
+ * i_pCond the pointer to the conditional variable which is to be
+ * destroyed
+ *
+ * Output
+ * ------
+ * (none)
+ *
+ * Return value Error Code
+ *
+ *--------------------------------------------------------------------------*/
+
+int K_DestroyConditionalVariable(K_ConditionalVariable * i_pCond);
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_WaitConditionalVariable
+ *
+ * Description:
+ * This function is used to block on a condition variable.
+ * They are called with mutex locked by the calling thread or undefined
+ * behaviour will result.
+ *
+ * Input
+ * -----
+ * i_pCond the pointer to the conditional variable
+ * i_handle the companion mutex handle
+ *
+ * Output
+ * ------
+ * (none)
+ *
+ * Return value Error Code
+ *
+ *--------------------------------------------------------------------------*/
+int K_WaitConditionalVariable(K_ConditionalVariable * i_pCond,
+ K_MUTEX_HANDLE i_handle);
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_SignalConditionalVariable
+ *
+ * Description:
+ * This function is used to restart one of the threads that are waiting on
+ * the condition variable. If no threads are waiting on it, nothing happens.
+ * If several threads are waiting on it, exactly one is restarted.
+ *
+ * Input
+ * -----
+ * i_pCond the pointer to the conditional variable
+ *
+ * Output
+ * ------
+ * (none)
+ *
+ * Return value Error Code
+ *
+ *--------------------------------------------------------------------------*/
+int K_SignalConditionalVariable(K_ConditionalVariable * i_pCond);
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_BroadcastConditionalVariable
+ *
+ * Description:
+ * This function is used to restart all threads that are waiting on
+ * the condition variable.
+ *
+ * Input
+ * -----
+ * i_pCond the pointer to the conditional variable
+ *
+ * Output
+ * ------
+ * (none)
+ *
+ * Return value Error Code
+ *
+ *--------------------------------------------------------------------------*/
+int K_BroadcastConditionalVariable(K_ConditionalVariable * i_pCond);
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_Sleep
+ *
+ * Description:
+ * Sleep for a given period in the given milliseconds.
+ *
+ * Input
+ * -----
+ * i_ms milliseconds
+ *
+ * Output
+ * ------
+ * (none)
+ *
+ * Return value (none)
+ *
+ *--------------------------------------------------------------------------*/
+void K_Sleep(int i_ms);
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_GetTickCount
+ *
+ * Description:
+ * The K_GetTickCount function retrieves the number of
+ * milliseconds that have elapsed since the system was started.
+ *
+ * Input
+ * -----
+ * (none)
+ *
+ * Output
+ * ------
+ * (none)
+ *
+ * Return value the elasped milliseconds since the system was started
+ *
+ *--------------------------------------------------------------------------*/
+unsigned int K_GetTickCount();
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_AdjustClock
+ *
+ * Description:
+ * The K_AdjustClock function immediately adjusts the system clock by
+ * the given number of seconds. A positive number adjusts the system
+ * clock forward; a negative number adjusts the system clock backward.
+ *
+ * Input
+ * -----
+ * i_iAdjustmentInSeconds Number of seconds by which to adjust the
+ * system clock
+ * Output
+ * ------
+ * (none)
+ *
+ * Return value 1 if successful, 0 on error
+ *
+ *--------------------------------------------------------------------------*/
+int K_AdjustClock( long i_iAdjustmentInSeconds );
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_IsLittleEndian
+ *
+ * Description:
+ * Checks to see whether this platform uses little endian integer
+ * representation.
+ *
+ * Input
+ * -----
+ * (none)
+ *
+ * Output
+ * ------
+ * (none)
+ *
+ * Return value 1 for little endian
+ *
+ *--------------------------------------------------------------------------*/
+int K_IsLittleEndian();
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_FileLength32
+ *
+ * Description:
+ * Gets the size in bytes of the file associated with the given FILE pointer.
+ *
+ * Input
+ * -----
+ * i_fpFile File handle
+ *
+ * Output
+ * ------
+ * (none)
+ *
+ * Return value File size in bytes, or -1L on error
+ *
+ *--------------------------------------------------------------------------*/
+long K_FileLength32( FILE* i_fpFile );
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_StringCompareNoCase
+ *
+ * Description:
+ * Compares the two given strings insensitive to case.
+ *
+ * Input
+ * -----
+ * i_sString1 First string
+ * i_sString2 Second string
+ *
+ * Output
+ * ------
+ * (none)
+ *
+ * Return value 0 if identical, -1 if first string is less than second
+ * string, or 1 if first string is greater than second
+ *
+ *--------------------------------------------------------------------------*/
+int K_StringCompareNoCase( const char* i_sString1, const char* i_sString2 );
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_StringCompareNoCaseWide
+ *
+ * Description:
+ * Compares the two given wide strings insensitive to case.
+ *
+ * Input
+ * -----
+ * i_wsString1 First wide string
+ * i_wsString2 Second wide string
+ *
+ * Output
+ * ------
+ * (none)
+ *
+ * Return value 0 if identical, -1 if first string is less than second
+ * string, or 1 if first string is greater than second
+ *
+ *--------------------------------------------------------------------------*/
+int K_StringCompareNoCaseWide( const wchar_t* i_wsString1, const wchar_t* i_wsString2 );
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_snprintf
+ *
+ * Description:
+ * See the snprintf(3C) man page.
+ *
+ *--------------------------------------------------------------------------*/
+#ifdef WIN32
+#define K_snprintf _snprintf
+#else
+#define K_snprintf snprintf
+#endif
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_snwprintf
+ *
+ * Description:
+ * See the swprintf(3C) man page.
+ *
+ *--------------------------------------------------------------------------*/
+#ifdef WIN32
+#define K_snwprintf _snwprintf
+#else
+#define K_snwprintf swprintf
+#endif
+
+#ifdef WIN32
+#define K_fseek fseek
+#define K_ftell ftell
+#else
+#define K_fseek fseeko
+#define K_ftell ftello
+#endif
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_CreateDirectory
+ *
+ * Description:
+ * Creates a directory with the given path name.
+ *
+ * Input
+ * -----
+ * i_sDirectoryName Directory name
+ *
+ * Output
+ * ------
+ * (none)
+ *
+ * Return value 0 on success, -1 on failure
+ *
+ *--------------------------------------------------------------------------*/
+int K_CreateDirectory( const char* i_sDirectoryName );
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_DeleteFile
+ *
+ * Description:
+ * Deletes the given file.
+ *
+ * Input
+ * -----
+ * i_sFilename Name of file to delete
+ *
+ * Output
+ * ------
+ * (none)
+ *
+ * Return value 0 on success, errno on failure
+ *
+ *--------------------------------------------------------------------------*/
+int K_DeleteFile( const char* i_sFilename );
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_ReadFile
+ *
+ * Description:
+ * Reads from the given file and passes the bytes read back to the output
+ * parameter. The caller must deallocate o_ppFileData using free().
+ *
+ * Input
+ * -----
+ * i_sFilename Name of file from which to read
+ *
+ * Output
+ * ------
+ * o_ppFileData Pointer to bytes read
+ *
+ * Return value Number of bytes read on success, -1 on failure
+ *
+ *--------------------------------------------------------------------------*/
+int K_ReadFile( const char* i_sFilename, unsigned char** o_ppFileData );
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_ReadFileString
+ *
+ * Description:
+ * Reads from the given file and passes the bytes read back to the output
+ * parameter, appending these bytes with a null terminator. There is no
+ * guarantee that there are no non-text characters in the returned "string".
+ * The caller must deallocate o_ppFileData using free().
+ *
+ * Input
+ * -----
+ * i_sFilename Name of file from which to read
+ *
+ * Output
+ * ------
+ * o_psFileDataString Pointer to bytes read
+ *
+ * Return value Number of bytes read (including null terminator) on
+ * success (0 if file is empty), -1 on failure
+ *
+ *--------------------------------------------------------------------------*/
+int K_ReadFileString( const char* i_sFilename, char** o_psFileDataString );
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_WriteFile
+ *
+ * Description:
+ * Writes the given bytes to the given file.
+ *
+ * Input
+ * -----
+ * i_sFilename Name of file to which to write
+ * i_pFileData Bytes to write
+ * i_iFileDataSize Number of bytes to write
+ *
+ * Output
+ * ------
+ * (none)
+ *
+ * Return value 0 on success, errno or -1 (generic error) on failure
+ *
+ *--------------------------------------------------------------------------*/
+int K_WriteFile( const char* i_sFilename, const unsigned char* i_pFileData, int i_iFileDataSize );
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_WriteFileString
+ *
+ * Description:
+ * Writes the given null-terminated bytes to the given file. The null
+ * terminator itself is not written to the file.
+ *
+ * Input
+ * -----
+ * i_sFilename Name of file to which to write
+ * i_sFileData Bytes to write
+ *
+ * Output
+ * ------
+ * (none)
+ *
+ * Return value 0 on success, errno or -1 (generic error) on failure
+ *
+ *--------------------------------------------------------------------------*/
+int K_WriteFileString( const char* i_sFilename, const char* i_sFileData );
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_FileExists
+ *
+ * Description:
+ * Checks to see whehter the given file exists.
+ *
+ * Input
+ * -----
+ * i_sFilename Name of file to check
+ *
+ * Output
+ * ------
+ * (none)
+ *
+ * Return value 1 if file exists, 0 if not, -1 on failure
+ *
+ *--------------------------------------------------------------------------*/
+int K_FileExists( const char* i_sFilename );
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_CopyFile
+ *
+ * Description:
+ * Reads from the given source file and writes these bytes to the given
+ * destination file.
+ *
+ * Input
+ * -----
+ * i_sSrcFilename Name of file from which to read
+ * i_sDestFilename Name of file to which to write
+ *
+ * Output
+ * ------
+ * o_pbFileExists Non-zero if the destination file already exists
+ *
+ * Return value 0 on success, errno or -1 (generic error) on failure
+ *
+ *--------------------------------------------------------------------------*/
+int K_CopyFile(
+ const char* i_sSrcFilename,
+ const char* i_sDestFilename,
+ int* o_pbFileExists );
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_GetFilenamesInDirectoryCount
+ *
+ * Description:
+ * Reads the given directory and returns the number of files that it contains.
+ *
+ * Input
+ * -----
+ * i_sDirectoryName Name of directory
+ *
+ * Output
+ * ------
+ * (none)
+ *
+ * Return value Number of files on success, -1 on failure
+ *
+ *--------------------------------------------------------------------------*/
+int K_GetFilenamesInDirectoryCount( const char* i_sDirectoryName );
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_GetFilenamesInDirectory
+ *
+ * Description:
+ * Reads the given directory and returns an array of names of files that it
+ * contains. A null pointer appears at the last item in the array. The
+ * caller must deallocate o_pasFilenames by using K_FreeFilenames or by
+ * calling free() for each file name and then calling free() on the array
+ * itself.
+ *
+ * Input
+ * -----
+ * i_sDirectoryName Name of directory
+ *
+ * Output
+ * ------
+ * o_pasFilenames Array of names of files found in this directory
+ *
+ * Return value Number of files on success, -1 on failure
+ *
+ *--------------------------------------------------------------------------*/
+int K_GetFilenamesInDirectory(
+ const char* i_sDirectoryName,
+ char*** o_pasFilenames );
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_FreeFilenames
+ *
+ * Description:
+ * Deallocates the memory allocated in a successful call to
+ * K_GetFilenamesInDirectory.
+ *
+ * Input
+ * -----
+ * i_asFilenames Array of names of files
+ *
+ * Output
+ * ------
+ * (none)
+ *
+ * Return value (none)
+ *
+ *--------------------------------------------------------------------------*/
+void K_FreeFilenames( char** i_asFilenames );
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_AdjustLocalClock
+ *
+ * Description:
+ * The K_AdjustLocalClock function gradually adjusts the system clock by
+ * the given number of seconds. A positive number adjusts the system
+ * clock forward; a negative number adjusts the system clock backward.
+ *
+ * Input
+ * -----
+ * i_iAdjustmentInSeconds Number of seconds by which to adjust the
+ * system clock
+ * Output
+ * ------
+ * (none)
+ *
+ * Return value 1 if successful, 0 on error
+ *
+ *--------------------------------------------------------------------------*/
+int K_AdjustLocalClock( int i_iNumberOfSeconds );
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_SetRootPassword
+ *
+ * Description:
+ * The K_SetRootPassword function sets the password for the root user via
+ * Pluggable Authentication Module (PAM). This function is interactive.
+ *
+ * Input
+ * -----
+ * i_sPassword Password to set
+ *
+ * Output
+ * ------
+ * (none)
+ *
+ * Return value 0 if successful, -1 on error
+ *
+ *--------------------------------------------------------------------------*/
+int K_SetRootPassword( const char* i_sPassword );
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_Alarm
+ *
+ * Description:
+ * Calls alarm(2) on Unix in order to cause the operating system to generate
+ * a SIGALRM signal for this process after the given number of real-time
+ * seconds. Does nothing on Windows.
+ *
+ * Input
+ * -----
+ * i_iSeconds Number of seconds after which to generate a SIGALRM
+ * signal
+ *
+ * Output
+ * ------
+ * (none)
+ *
+ * Return value If a previous alarm request is pending, then it returns
+ * the number of seconds until this previous request would
+ * have generated a SIGALRM signal. Otherwise, returns 0.
+ *
+ *--------------------------------------------------------------------------*/
+unsigned int K_Alarm( unsigned int i_iSeconds );
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_GetExtendedVersionFromBase
+ *
+ * Description:
+ * This KMS-specific function prepends the timestamp value to the specified
+ * base replication schema version and returns this value as an extended
+ * replication schema version.
+ *
+ * Input
+ * -----
+ * i_iBaseSchemaVersion Base replication schema version
+ *
+ * Output
+ * ------
+ * (none)
+ *
+ * Return value Extended replication schema version
+ *
+ *--------------------------------------------------------------------------*/
+unsigned int K_GetExtendedVersionFromBase( unsigned int i_iBaseSchemaVersion );
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_ParseTimestampFromExtendedVersion
+ *
+ * Description:
+ * This KMS-specific function parses the timestamp value from the given
+ * extended replication schema version and returns this timestamp value.
+ *
+ * Input
+ * -----
+ * i_iExtendedSchemaVersion Extended replication schema version
+ *
+ * Output
+ * ------
+ * (none)
+ *
+ * Return value Timestamp value
+ *
+ *--------------------------------------------------------------------------*/
+unsigned int K_ParseTimestampFromExtendedVersion(
+ unsigned int i_iExtendedSchemaVersion );
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_ParseBaseFromExtendedVersion
+ *
+ * Description:
+ * This KMS-specific function parses the base replication schema value from
+ * the given extended replication schema version and returns this base value.
+ *
+ * Input
+ * -----
+ * i_iExtendedSchemaVersion Extended replication schema version
+ *
+ * Output
+ * ------
+ * (none)
+ *
+ * Return value Base replication schema value
+ *
+ *--------------------------------------------------------------------------*/
+
+unsigned int K_ParseBaseFromExtendedVersion(
+ unsigned int i_iExtendedSchemaVersion );
+
+
+/*---------------------------------------------------------------------------
+ * Function: K_System
+ *
+ * Description:
+ * This function is a thread-safe replacement for the unsafe system(3C) call.
+ * See the popen(3C) man page for more information.
+ *
+ * Input
+ * -----
+ * i_sCmd Command to execute
+ *
+ * Output
+ * ------
+ * (none)
+ *
+ * Return value Termination status of the command language interpreter
+ * if successful, -1 on failure
+ *
+ *--------------------------------------------------------------------------*/
+
+int K_System( const char *i_sCmd );
+
+#define K_system K_System
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+