comparison usr/src/lib/libkmsagent/common/SYSCommon.h @ 12720:3db6e0082404

PSARC 2010/195 PKCS11 KMS Provider 6944296 Solaris needs a PKCS#11 provider to allow access to KMS keystore functionality
author Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
date Mon, 28 Jun 2010 16:04:11 -0700
parents
children
comparison
equal deleted inserted replaced
12719:bd9fb35d09c2 12720:3db6e0082404
1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22 /*
23 * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
24 */
25
26 /*---------------------------------------------------------------------------
27 * Module: System Abstraction Layer
28 *
29 * Description:
30 * The system layer provides an abstract layer for the most commonly
31 * used system calls for multi-platforms including Windows and most
32 * Unix variants.
33 *
34 * All the functions defined in this layer fall into 4 categories:
35 * Threading related functions
36 * Mutexes
37 * Conditional variables
38 * Other Utilities
39 *--------------------------------------------------------------------------*/
40
41 #ifndef SYS_COMMON_H
42 #define SYS_COMMON_H
43 #ifdef __cplusplus
44 extern "C" {
45 #endif
46
47 /*---------------------------------------------------------------------------
48 * ERROR code
49 *--------------------------------------------------------------------------*/
50
51 #define K_SYS_OK 0
52 #define K_SYS_ERR_NO_MEMORY 1
53 #define K_SYS_ERR_CREATE_THREAD 2
54 #define K_SYS_ERR_JOIN_THREAD 3
55 #define K_SYS_ERR_COND 4
56
57 /*---------------------------------------------------------------------------
58 * Header files
59 *--------------------------------------------------------------------------*/
60
61 #ifdef WIN32
62 #include <windows.h>
63 #include <process.h>
64 #else
65 #include <pthread.h>
66
67 /* UNIX : added by STG */
68 #include <stdlib.h>
69 #include <string.h>
70 #ifndef METAWARE
71 #include <wchar.h>
72 #endif
73 #include <sys/types.h>
74 #include <sys/stat.h>
75 #include <stdarg.h>
76
77 /*
78 * These functions are not needed, since the Agent API hides them
79 * enum KeystoneAgent_SortOrder {};
80 * enum KeystoneAgent_FilterOperator {};
81 */
82
83 #endif
84
85 /*---------------------------------------------------------------------------
86 * MACRO definitions
87 *--------------------------------------------------------------------------*/
88
89 #ifdef WIN32
90 #define PATH_SEPARATOR '\\'
91 #define PATH_SEPARATOR_WSTR L"\\"
92 #ifndef PATH_MAX
93 #define PATH_MAX MAX_PATH
94 #endif
95 #else
96 #define PATH_SEPARATOR '/'
97 #define PATH_SEPARATOR_WSTR L"/"
98 #endif
99
100 #ifndef BOOL
101 #define BOOL int
102 #endif
103 #ifndef TRUE
104 #define TRUE 1
105 #define FALSE 0
106 #endif
107
108 #ifdef K_LINUX_PLATFORM
109 #ifndef UNIX
110 #define UNIX
111 #endif
112 #endif
113
114 #ifdef K_AIX_PLATFORM
115 #ifndef UNIX
116 #define UNIX
117 #endif
118 #endif
119
120 #ifdef K_SOLARIS_PLATFORM
121 #ifndef UNIX
122 #define UNIX
123 #endif
124 #endif
125
126 #ifdef K_HPUX_PLATFORM
127 #ifndef UNIX
128 #define UNIX
129 #endif
130 #endif
131
132 /*---------------------------------------------------------------------------
133 * Fatal error definitions
134 *--------------------------------------------------------------------------*/
135
136 #ifndef __FUNCTION__
137 #define __FUNCTION__ "(Unknown)"
138 #endif
139
140 #ifndef FATAL_APPLICATION_STATE
141
142 #ifdef DEBUG
143
144 #ifdef WIN32
145 #include "crtdbg.h"
146 #define DEBUG_BREAK() { _CrtDbgBreak(); }
147 #else /* WIN32 */
148 #ifdef METAWARE
149 #define DEBUG_BREAK() (void *) 0x00000000; /* dummy operation */
150 #else
151 #if !defined(__i386)
152 #define DEBUG_BREAK()
153 #else
154 #ifdef __GNUC__
155 #define DEBUG_BREAK() { __asm__ ( "int3" ); } /* NOTE: This only works for x86 platforms */
156 #else
157 #define DEBUG_BREAK()
158 #endif
159 #endif /* __i386 */
160 #endif /* METAWARE */
161 #endif /* WIN32 */
162
163 #define FATAL_APPLICATION_STATE() \
164 do { \
165 DEBUG_BREAK(); \
166 process_fatal_application_state(__FILE__,__FUNCTION__,__LINE__,0); \
167 } while(0)
168
169 #define FATAL_APPLICATION_STATE1(additional_text) \
170 do { \
171 DEBUG_BREAK(); \
172 process_fatal_application_state(__FILE__,__FUNCTION__,__LINE__,additional_text); \
173 } while(0)
174
175 #else //DEBUG
176
177 #define DEBUG_BREAK()
178
179 #define FATAL_APPLICATION_STATE() \
180 do { \
181 process_fatal_application_state(__FILE__,__FUNCTION__,__LINE__,0); \
182 } while(0)
183
184 #define FATAL_APPLICATION_STATE1(additional_text) \
185 do { \
186 process_fatal_application_state(__FILE__,__FUNCTION__,__LINE__,additional_text); \
187 } while(0)
188
189 #endif //DEBUG
190
191 #define FATAL_ASSERT(expression) do { if(!(expression)) {FATAL_APPLICATION_STATE();} } while(0)
192 #define FATAL_ASSERT1(expression,additional_text) do { if(!(expression)) {FATAL_APPLICATION_STATE1(additional_text);} } while(0)
193
194 /* MS Visual Studio compiler does not support __attribute__() */
195 #ifndef __GNUC__
196 #define __attribute__(x)
197 #endif
198
199 void process_fatal_application_state(const char* sFile, const char* sFunction, int iLine, const char* sAdditionalText) __attribute__((noreturn));
200
201 void generate_stack_trace(const char* i_sFile, const wchar_t* i_wsErrMsg);
202
203 #endif /* FATAL_APPLICATION_STATE */
204
205 /*---------------------------------------------------------------------------
206 * Primitive type definitions
207 *--------------------------------------------------------------------------*/
208
209 #ifdef WIN32
210 typedef __int64 int64;
211 #else
212 #ifndef K_AIX_PLATFORM
213 typedef signed long long int64;
214 #endif
215 #endif
216
217
218 #ifdef K_HPUX_PLATFORM
219 wchar_t* wcsstr (const wchar_t* haystack, const wchar_t* needle);
220 int wprintf (const wchar_t* format, ...);
221 int swprintf (wchar_t* s, size_t maxlen, const wchar_t* format, ...);
222 int vswprintf (wchar_t* s, size_t maxlen, const wchar_t* format, va_list args);
223 int swscanf(const wchar_t *s, const wchar_t *format, ...);
224 int64 atoll(const char *str);
225 #endif
226
227 /*---------------------------------------------------------------------------
228 * Thread type definitions
229 *--------------------------------------------------------------------------*/
230
231 #ifdef WIN32
232 typedef HANDLE K_THREAD_HANDLE;
233 #else
234 typedef pthread_t K_THREAD_HANDLE;
235 #endif
236
237 /*---------------------------------------------------------------------------
238 * Mutex type definitions
239 *--------------------------------------------------------------------------*/
240
241 #ifdef WIN32
242
243 typedef struct {
244 HANDLE m_handle; /* mutex handle */
245
246 CRITICAL_SECTION m_stCriticalSection; /* criticalSection */
247
248 int m_bIsRecursive;
249 } WIN32Mutex;
250
251 typedef WIN32Mutex* K_MUTEX_HANDLE;
252
253 #else
254 typedef pthread_mutex_t* K_MUTEX_HANDLE;
255 #endif
256
257 /*---------------------------------------------------------------------------
258 * Conditional variable type definitions
259 *--------------------------------------------------------------------------*/
260
261 #ifdef WIN32
262 struct K_CondStruct
263 {
264 HANDLE m_hEvent;
265 HANDLE m_hMutex;
266 int m_iSignalAll;
267 int m_iNumWaiting;
268 int m_iSignalled;
269 };
270 typedef struct K_CondStruct K_ConditionalVariable;
271
272 #else
273 typedef pthread_cond_t K_ConditionalVariable;
274 #endif
275
276 /*---------------------------------------------------------------------------
277 * Thread function type definitions
278 *--------------------------------------------------------------------------*/
279
280 /*
281 * Having the function return int breaks compatibility between Windows
282 * and Unix; the function has to return void
283 */
284 /*#ifdef WIN32
285 * typedef int (_stdcall *K_ThreadFunc) (void *vpData);
286 *#else
287 */
288 typedef void (*K_ThreadFunc) (void *vpData);
289 /*
290 *#endif
291 */
292
293
294 /*---------------------------------------------------------------------------
295 * Function: K_CreateThread
296 *
297 * Description:
298 * This thread creation function takes a thread function
299 * and its parameter to create a thread. It also has a Boolean
300 * parameter to indicate if the thread is detached or joinable.
301 * A new thread's handle is returned through the output parameter.
302 *
303 * Input
304 * -----
305 * i_pFunc Function pointer of the thread function
306 * i_pvData The point of the parameter passed to the thread function
307 * i_bIsDetached The thread is detached or not. If detached, then it is
308 * not joinable. (Note: It is not supported on Win32)
309 *
310 * Output
311 * ------
312 * o_pNewThread The Thread handle
313 *
314 * Return value Error code
315 *
316 *--------------------------------------------------------------------------*/
317 int K_CreateThread(K_ThreadFunc i_pFunc,
318 void *i_pvData,
319 int i_bIsDetached,
320 K_THREAD_HANDLE *o_pNewThread);
321
322
323 /*---------------------------------------------------------------------------
324 * Function: K_JoinThread
325 *
326 * Description:
327 * This thread joining function is called when the current thread
328 * waits another thread to terminate.
329 *
330 * Input
331 * -----
332 * i_hThread The thread handle of the to-be-joined thread
333 *
334 * Output
335 * ------
336 * (none)
337 *
338 * Return value Error code
339 *
340 *--------------------------------------------------------------------------*/
341 int K_JoinThread(K_THREAD_HANDLE i_hThread);
342
343
344 /*---------------------------------------------------------------------------
345 * Function: K_GetCurrentThreadId
346 *
347 * Description:
348 * Returns the thread ID of the current thread.
349 *
350 * Input
351 * -----
352 * (none)
353 *
354 * Output
355 * ------
356 * (none)
357 *
358 * Return value The thread ID
359 *
360 *--------------------------------------------------------------------------*/
361
362 int K_GetCurrentThreadId();
363
364
365 /*---------------------------------------------------------------------------
366 * Function: K_CreateMutex
367 *
368 * Description:
369 * The mutex creation function creates a mutex according to the given
370 * mutex type, and returns the mutex handle to the output parameter.
371 *
372 * Input
373 * -----
374 * (none)
375 *
376 * Output
377 * ------
378 * o_phandle the handle pointer to the mutex
379 *
380 * Return value Error Code
381 *
382 *--------------------------------------------------------------------------*/
383
384 int K_CreateMutex( K_MUTEX_HANDLE *o_phandle );
385
386
387 /*---------------------------------------------------------------------------
388 * Function: K_LockMutex
389 *
390 * Description:
391 * K_LockMutex is used to lock the mutex, and K_UnlockMutex is
392 * used to unlock it.
393 *
394 * Input
395 * -----
396 * i_handle the mutex handle
397 *
398 * Output
399 * ------
400 * (none)
401 *
402 * return value Error Code
403 *
404 *--------------------------------------------------------------------------*/
405 int K_LockMutex(K_MUTEX_HANDLE i_handle);
406
407
408 /*---------------------------------------------------------------------------
409 * Function: K_UnlockMutex
410 *
411 * Description:
412 * K_UnlockMutex is used to unlock the lock.
413 *
414 * Input
415 * -----
416 * i_handle the mutex handle
417 *
418 * Output
419 * ------
420 * (none)
421 *
422 * Return value Error Code
423 *
424 *--------------------------------------------------------------------------*/
425 int K_UnlockMutex(K_MUTEX_HANDLE i_handle);
426
427
428 /*---------------------------------------------------------------------------
429 * Function: K_DestroyMutex
430 *
431 * Description:
432 * When a mutex is no longer needed, K_DestroyMutex must be called
433 * to destroy it.
434 *
435 * Input
436 * -----
437 * i_handle the mutex handle
438 *
439 * Output
440 * ------
441 * (none)
442 *
443 * Return value Error Code
444 *
445 *--------------------------------------------------------------------------*/
446
447 int K_DestroyMutex(K_MUTEX_HANDLE i_handle);
448
449
450 /*---------------------------------------------------------------------------
451 *
452 * The following section defines Conditional Variable
453 *
454 * Conditional Variable implements similar functionalities defined
455 * in POSIX thread library. But it only supports conditional variables
456 * inside one process and doesn't support pthread_cond_timedwait().
457 *--------------------------------------------------------------------------*/
458
459
460 /*---------------------------------------------------------------------------
461 * Function: K_InitConditionalVariable
462 *
463 * Description:
464 * This function initializes a conditional variable; Upon successful
465 * completion, the new condition variable is returned via the condition
466 * parameter, and 0 is returned. Otherwise, an error code is returned.
467 *
468 * Input
469 * -----
470 * i_pCond the pointer to the conditional variable which is to be
471 * initialized
472 *
473 * Output
474 * ------
475 * (none)
476 *
477 * Return value Error Code
478 *
479 *--------------------------------------------------------------------------*/
480 int K_InitConditionalVariable (K_ConditionalVariable * i_pCond);
481
482
483
484 /*---------------------------------------------------------------------------
485 * Function: K_DestroyConditionalVariable
486 *
487 * Description:
488 * This function destroys a conditional variable. Upon successful
489 * completion, the condition variable is destroyed, and 0 is returned.
490 * Otherwise, an error code is returned.
491 * After deletion of the condition variable, the condition parameter
492 * is not valid until it is initialized again by a call to the
493 * K_InitConditionalVariable subroutine.
494 *
495 * Input
496 * -----
497 * i_pCond the pointer to the conditional variable which is to be
498 * destroyed
499 *
500 * Output
501 * ------
502 * (none)
503 *
504 * Return value Error Code
505 *
506 *--------------------------------------------------------------------------*/
507
508 int K_DestroyConditionalVariable(K_ConditionalVariable * i_pCond);
509
510
511 /*---------------------------------------------------------------------------
512 * Function: K_WaitConditionalVariable
513 *
514 * Description:
515 * This function is used to block on a condition variable.
516 * They are called with mutex locked by the calling thread or undefined
517 * behaviour will result.
518 *
519 * Input
520 * -----
521 * i_pCond the pointer to the conditional variable
522 * i_handle the companion mutex handle
523 *
524 * Output
525 * ------
526 * (none)
527 *
528 * Return value Error Code
529 *
530 *--------------------------------------------------------------------------*/
531 int K_WaitConditionalVariable(K_ConditionalVariable * i_pCond,
532 K_MUTEX_HANDLE i_handle);
533
534
535 /*---------------------------------------------------------------------------
536 * Function: K_SignalConditionalVariable
537 *
538 * Description:
539 * This function is used to restart one of the threads that are waiting on
540 * the condition variable. If no threads are waiting on it, nothing happens.
541 * If several threads are waiting on it, exactly one is restarted.
542 *
543 * Input
544 * -----
545 * i_pCond the pointer to the conditional variable
546 *
547 * Output
548 * ------
549 * (none)
550 *
551 * Return value Error Code
552 *
553 *--------------------------------------------------------------------------*/
554 int K_SignalConditionalVariable(K_ConditionalVariable * i_pCond);
555
556
557 /*---------------------------------------------------------------------------
558 * Function: K_BroadcastConditionalVariable
559 *
560 * Description:
561 * This function is used to restart all threads that are waiting on
562 * the condition variable.
563 *
564 * Input
565 * -----
566 * i_pCond the pointer to the conditional variable
567 *
568 * Output
569 * ------
570 * (none)
571 *
572 * Return value Error Code
573 *
574 *--------------------------------------------------------------------------*/
575 int K_BroadcastConditionalVariable(K_ConditionalVariable * i_pCond);
576
577
578 /*---------------------------------------------------------------------------
579 * Function: K_Sleep
580 *
581 * Description:
582 * Sleep for a given period in the given milliseconds.
583 *
584 * Input
585 * -----
586 * i_ms milliseconds
587 *
588 * Output
589 * ------
590 * (none)
591 *
592 * Return value (none)
593 *
594 *--------------------------------------------------------------------------*/
595 void K_Sleep(int i_ms);
596
597
598 /*---------------------------------------------------------------------------
599 * Function: K_GetTickCount
600 *
601 * Description:
602 * The K_GetTickCount function retrieves the number of
603 * milliseconds that have elapsed since the system was started.
604 *
605 * Input
606 * -----
607 * (none)
608 *
609 * Output
610 * ------
611 * (none)
612 *
613 * Return value the elasped milliseconds since the system was started
614 *
615 *--------------------------------------------------------------------------*/
616 unsigned int K_GetTickCount();
617
618
619 /*---------------------------------------------------------------------------
620 * Function: K_AdjustClock
621 *
622 * Description:
623 * The K_AdjustClock function immediately adjusts the system clock by
624 * the given number of seconds. A positive number adjusts the system
625 * clock forward; a negative number adjusts the system clock backward.
626 *
627 * Input
628 * -----
629 * i_iAdjustmentInSeconds Number of seconds by which to adjust the
630 * system clock
631 * Output
632 * ------
633 * (none)
634 *
635 * Return value 1 if successful, 0 on error
636 *
637 *--------------------------------------------------------------------------*/
638 int K_AdjustClock( long i_iAdjustmentInSeconds );
639
640
641 /*---------------------------------------------------------------------------
642 * Function: K_IsLittleEndian
643 *
644 * Description:
645 * Checks to see whether this platform uses little endian integer
646 * representation.
647 *
648 * Input
649 * -----
650 * (none)
651 *
652 * Output
653 * ------
654 * (none)
655 *
656 * Return value 1 for little endian
657 *
658 *--------------------------------------------------------------------------*/
659 int K_IsLittleEndian();
660
661
662 /*---------------------------------------------------------------------------
663 * Function: K_FileLength32
664 *
665 * Description:
666 * Gets the size in bytes of the file associated with the given FILE pointer.
667 *
668 * Input
669 * -----
670 * i_fpFile File handle
671 *
672 * Output
673 * ------
674 * (none)
675 *
676 * Return value File size in bytes, or -1L on error
677 *
678 *--------------------------------------------------------------------------*/
679 long K_FileLength32( FILE* i_fpFile );
680
681
682 /*---------------------------------------------------------------------------
683 * Function: K_StringCompareNoCase
684 *
685 * Description:
686 * Compares the two given strings insensitive to case.
687 *
688 * Input
689 * -----
690 * i_sString1 First string
691 * i_sString2 Second string
692 *
693 * Output
694 * ------
695 * (none)
696 *
697 * Return value 0 if identical, -1 if first string is less than second
698 * string, or 1 if first string is greater than second
699 *
700 *--------------------------------------------------------------------------*/
701 int K_StringCompareNoCase( const char* i_sString1, const char* i_sString2 );
702
703
704 /*---------------------------------------------------------------------------
705 * Function: K_StringCompareNoCaseWide
706 *
707 * Description:
708 * Compares the two given wide strings insensitive to case.
709 *
710 * Input
711 * -----
712 * i_wsString1 First wide string
713 * i_wsString2 Second wide string
714 *
715 * Output
716 * ------
717 * (none)
718 *
719 * Return value 0 if identical, -1 if first string is less than second
720 * string, or 1 if first string is greater than second
721 *
722 *--------------------------------------------------------------------------*/
723 int K_StringCompareNoCaseWide( const wchar_t* i_wsString1, const wchar_t* i_wsString2 );
724
725
726 /*---------------------------------------------------------------------------
727 * Function: K_snprintf
728 *
729 * Description:
730 * See the snprintf(3C) man page.
731 *
732 *--------------------------------------------------------------------------*/
733 #ifdef WIN32
734 #define K_snprintf _snprintf
735 #else
736 #define K_snprintf snprintf
737 #endif
738
739
740 /*---------------------------------------------------------------------------
741 * Function: K_snwprintf
742 *
743 * Description:
744 * See the swprintf(3C) man page.
745 *
746 *--------------------------------------------------------------------------*/
747 #ifdef WIN32
748 #define K_snwprintf _snwprintf
749 #else
750 #define K_snwprintf swprintf
751 #endif
752
753 #ifdef WIN32
754 #define K_fseek fseek
755 #define K_ftell ftell
756 #else
757 #define K_fseek fseeko
758 #define K_ftell ftello
759 #endif
760
761
762 /*---------------------------------------------------------------------------
763 * Function: K_CreateDirectory
764 *
765 * Description:
766 * Creates a directory with the given path name.
767 *
768 * Input
769 * -----
770 * i_sDirectoryName Directory name
771 *
772 * Output
773 * ------
774 * (none)
775 *
776 * Return value 0 on success, -1 on failure
777 *
778 *--------------------------------------------------------------------------*/
779 int K_CreateDirectory( const char* i_sDirectoryName );
780
781
782 /*---------------------------------------------------------------------------
783 * Function: K_DeleteFile
784 *
785 * Description:
786 * Deletes the given file.
787 *
788 * Input
789 * -----
790 * i_sFilename Name of file to delete
791 *
792 * Output
793 * ------
794 * (none)
795 *
796 * Return value 0 on success, errno on failure
797 *
798 *--------------------------------------------------------------------------*/
799 int K_DeleteFile( const char* i_sFilename );
800
801
802 /*---------------------------------------------------------------------------
803 * Function: K_ReadFile
804 *
805 * Description:
806 * Reads from the given file and passes the bytes read back to the output
807 * parameter. The caller must deallocate o_ppFileData using free().
808 *
809 * Input
810 * -----
811 * i_sFilename Name of file from which to read
812 *
813 * Output
814 * ------
815 * o_ppFileData Pointer to bytes read
816 *
817 * Return value Number of bytes read on success, -1 on failure
818 *
819 *--------------------------------------------------------------------------*/
820 int K_ReadFile( const char* i_sFilename, unsigned char** o_ppFileData );
821
822
823 /*---------------------------------------------------------------------------
824 * Function: K_ReadFileString
825 *
826 * Description:
827 * Reads from the given file and passes the bytes read back to the output
828 * parameter, appending these bytes with a null terminator. There is no
829 * guarantee that there are no non-text characters in the returned "string".
830 * The caller must deallocate o_ppFileData using free().
831 *
832 * Input
833 * -----
834 * i_sFilename Name of file from which to read
835 *
836 * Output
837 * ------
838 * o_psFileDataString Pointer to bytes read
839 *
840 * Return value Number of bytes read (including null terminator) on
841 * success (0 if file is empty), -1 on failure
842 *
843 *--------------------------------------------------------------------------*/
844 int K_ReadFileString( const char* i_sFilename, char** o_psFileDataString );
845
846
847 /*---------------------------------------------------------------------------
848 * Function: K_WriteFile
849 *
850 * Description:
851 * Writes the given bytes to the given file.
852 *
853 * Input
854 * -----
855 * i_sFilename Name of file to which to write
856 * i_pFileData Bytes to write
857 * i_iFileDataSize Number of bytes to write
858 *
859 * Output
860 * ------
861 * (none)
862 *
863 * Return value 0 on success, errno or -1 (generic error) on failure
864 *
865 *--------------------------------------------------------------------------*/
866 int K_WriteFile( const char* i_sFilename, const unsigned char* i_pFileData, int i_iFileDataSize );
867
868
869 /*---------------------------------------------------------------------------
870 * Function: K_WriteFileString
871 *
872 * Description:
873 * Writes the given null-terminated bytes to the given file. The null
874 * terminator itself is not written to the file.
875 *
876 * Input
877 * -----
878 * i_sFilename Name of file to which to write
879 * i_sFileData Bytes to write
880 *
881 * Output
882 * ------
883 * (none)
884 *
885 * Return value 0 on success, errno or -1 (generic error) on failure
886 *
887 *--------------------------------------------------------------------------*/
888 int K_WriteFileString( const char* i_sFilename, const char* i_sFileData );
889
890
891 /*---------------------------------------------------------------------------
892 * Function: K_FileExists
893 *
894 * Description:
895 * Checks to see whehter the given file exists.
896 *
897 * Input
898 * -----
899 * i_sFilename Name of file to check
900 *
901 * Output
902 * ------
903 * (none)
904 *
905 * Return value 1 if file exists, 0 if not, -1 on failure
906 *
907 *--------------------------------------------------------------------------*/
908 int K_FileExists( const char* i_sFilename );
909
910
911 /*---------------------------------------------------------------------------
912 * Function: K_CopyFile
913 *
914 * Description:
915 * Reads from the given source file and writes these bytes to the given
916 * destination file.
917 *
918 * Input
919 * -----
920 * i_sSrcFilename Name of file from which to read
921 * i_sDestFilename Name of file to which to write
922 *
923 * Output
924 * ------
925 * o_pbFileExists Non-zero if the destination file already exists
926 *
927 * Return value 0 on success, errno or -1 (generic error) on failure
928 *
929 *--------------------------------------------------------------------------*/
930 int K_CopyFile(
931 const char* i_sSrcFilename,
932 const char* i_sDestFilename,
933 int* o_pbFileExists );
934
935
936 /*---------------------------------------------------------------------------
937 * Function: K_GetFilenamesInDirectoryCount
938 *
939 * Description:
940 * Reads the given directory and returns the number of files that it contains.
941 *
942 * Input
943 * -----
944 * i_sDirectoryName Name of directory
945 *
946 * Output
947 * ------
948 * (none)
949 *
950 * Return value Number of files on success, -1 on failure
951 *
952 *--------------------------------------------------------------------------*/
953 int K_GetFilenamesInDirectoryCount( const char* i_sDirectoryName );
954
955
956 /*---------------------------------------------------------------------------
957 * Function: K_GetFilenamesInDirectory
958 *
959 * Description:
960 * Reads the given directory and returns an array of names of files that it
961 * contains. A null pointer appears at the last item in the array. The
962 * caller must deallocate o_pasFilenames by using K_FreeFilenames or by
963 * calling free() for each file name and then calling free() on the array
964 * itself.
965 *
966 * Input
967 * -----
968 * i_sDirectoryName Name of directory
969 *
970 * Output
971 * ------
972 * o_pasFilenames Array of names of files found in this directory
973 *
974 * Return value Number of files on success, -1 on failure
975 *
976 *--------------------------------------------------------------------------*/
977 int K_GetFilenamesInDirectory(
978 const char* i_sDirectoryName,
979 char*** o_pasFilenames );
980
981
982 /*---------------------------------------------------------------------------
983 * Function: K_FreeFilenames
984 *
985 * Description:
986 * Deallocates the memory allocated in a successful call to
987 * K_GetFilenamesInDirectory.
988 *
989 * Input
990 * -----
991 * i_asFilenames Array of names of files
992 *
993 * Output
994 * ------
995 * (none)
996 *
997 * Return value (none)
998 *
999 *--------------------------------------------------------------------------*/
1000 void K_FreeFilenames( char** i_asFilenames );
1001
1002
1003 /*---------------------------------------------------------------------------
1004 * Function: K_AdjustLocalClock
1005 *
1006 * Description:
1007 * The K_AdjustLocalClock function gradually adjusts the system clock by
1008 * the given number of seconds. A positive number adjusts the system
1009 * clock forward; a negative number adjusts the system clock backward.
1010 *
1011 * Input
1012 * -----
1013 * i_iAdjustmentInSeconds Number of seconds by which to adjust the
1014 * system clock
1015 * Output
1016 * ------
1017 * (none)
1018 *
1019 * Return value 1 if successful, 0 on error
1020 *
1021 *--------------------------------------------------------------------------*/
1022 int K_AdjustLocalClock( int i_iNumberOfSeconds );
1023
1024
1025 /*---------------------------------------------------------------------------
1026 * Function: K_SetRootPassword
1027 *
1028 * Description:
1029 * The K_SetRootPassword function sets the password for the root user via
1030 * Pluggable Authentication Module (PAM). This function is interactive.
1031 *
1032 * Input
1033 * -----
1034 * i_sPassword Password to set
1035 *
1036 * Output
1037 * ------
1038 * (none)
1039 *
1040 * Return value 0 if successful, -1 on error
1041 *
1042 *--------------------------------------------------------------------------*/
1043 int K_SetRootPassword( const char* i_sPassword );
1044
1045
1046 /*---------------------------------------------------------------------------
1047 * Function: K_Alarm
1048 *
1049 * Description:
1050 * Calls alarm(2) on Unix in order to cause the operating system to generate
1051 * a SIGALRM signal for this process after the given number of real-time
1052 * seconds. Does nothing on Windows.
1053 *
1054 * Input
1055 * -----
1056 * i_iSeconds Number of seconds after which to generate a SIGALRM
1057 * signal
1058 *
1059 * Output
1060 * ------
1061 * (none)
1062 *
1063 * Return value If a previous alarm request is pending, then it returns
1064 * the number of seconds until this previous request would
1065 * have generated a SIGALRM signal. Otherwise, returns 0.
1066 *
1067 *--------------------------------------------------------------------------*/
1068 unsigned int K_Alarm( unsigned int i_iSeconds );
1069
1070
1071 /*---------------------------------------------------------------------------
1072 * Function: K_GetExtendedVersionFromBase
1073 *
1074 * Description:
1075 * This KMS-specific function prepends the timestamp value to the specified
1076 * base replication schema version and returns this value as an extended
1077 * replication schema version.
1078 *
1079 * Input
1080 * -----
1081 * i_iBaseSchemaVersion Base replication schema version
1082 *
1083 * Output
1084 * ------
1085 * (none)
1086 *
1087 * Return value Extended replication schema version
1088 *
1089 *--------------------------------------------------------------------------*/
1090 unsigned int K_GetExtendedVersionFromBase( unsigned int i_iBaseSchemaVersion );
1091
1092
1093 /*---------------------------------------------------------------------------
1094 * Function: K_ParseTimestampFromExtendedVersion
1095 *
1096 * Description:
1097 * This KMS-specific function parses the timestamp value from the given
1098 * extended replication schema version and returns this timestamp value.
1099 *
1100 * Input
1101 * -----
1102 * i_iExtendedSchemaVersion Extended replication schema version
1103 *
1104 * Output
1105 * ------
1106 * (none)
1107 *
1108 * Return value Timestamp value
1109 *
1110 *--------------------------------------------------------------------------*/
1111 unsigned int K_ParseTimestampFromExtendedVersion(
1112 unsigned int i_iExtendedSchemaVersion );
1113
1114
1115 /*---------------------------------------------------------------------------
1116 * Function: K_ParseBaseFromExtendedVersion
1117 *
1118 * Description:
1119 * This KMS-specific function parses the base replication schema value from
1120 * the given extended replication schema version and returns this base value.
1121 *
1122 * Input
1123 * -----
1124 * i_iExtendedSchemaVersion Extended replication schema version
1125 *
1126 * Output
1127 * ------
1128 * (none)
1129 *
1130 * Return value Base replication schema value
1131 *
1132 *--------------------------------------------------------------------------*/
1133
1134 unsigned int K_ParseBaseFromExtendedVersion(
1135 unsigned int i_iExtendedSchemaVersion );
1136
1137
1138 /*---------------------------------------------------------------------------
1139 * Function: K_System
1140 *
1141 * Description:
1142 * This function is a thread-safe replacement for the unsafe system(3C) call.
1143 * See the popen(3C) man page for more information.
1144 *
1145 * Input
1146 * -----
1147 * i_sCmd Command to execute
1148 *
1149 * Output
1150 * ------
1151 * (none)
1152 *
1153 * Return value Termination status of the command language interpreter
1154 * if successful, -1 on failure
1155 *
1156 *--------------------------------------------------------------------------*/
1157
1158 int K_System( const char *i_sCmd );
1159
1160 #define K_system K_System
1161
1162 #ifdef __cplusplus
1163 }
1164 #endif
1165
1166 #endif
1167
1168