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  * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.
23  */
24 
25 /*
26  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
27  * Use is subject to license terms.
28  */
29 
30 /*
31  *
32  * HEADER: dat_osd.h
33  *
34  * PURPOSE: Operating System Dependent layer
35  * Description:
36  *	Provide OS dependent data structures & functions with
37  *	a canonical DAT interface. Designed to be portable
38  *	and hide OS specific quirks of common functions.
39  *
40  * $Id: dat_osd.h,v 1.14 2003/07/31 14:04:19 jlentini Exp $
41  */
42 
43 #ifndef _DAT_OSD_H_
44 #define	_DAT_OSD_H_
45 
46 #include <dat/udat.h>
47 
48 #include <assert.h>
49 #include <ctype.h>
50 #include <dlfcn.h>
51 #include <errno.h>
52 #include <pthread.h>
53 #include <stdarg.h>
54 #include <stdio.h>
55 #include <stdlib.h>
56 #include <string.h>
57 #include <syslog.h>
58 #include <unistd.h>
59 #include <sys/time.h>
60 
61 #ifdef	__cplusplus
62 extern "C" {
63 #endif
64 
65 /*
66  *
67  * Debugging
68  *
69  */
70 
71 #define	dat_os_assert(expr)	assert(expr)
72 
73 typedef int 			DAT_OS_DBG_TYPE_VAL;
74 
75 typedef enum
76 {
77     DAT_OS_DBG_TYPE_ERROR 		= 0x1,
78     DAT_OS_DBG_TYPE_GENERIC 		= 0x2,
79     DAT_OS_DBG_TYPE_SR  		= 0x4,
80     DAT_OS_DBG_TYPE_DR  		= 0x8,
81     DAT_OS_DBG_TYPE_PROVIDER_API 	= 0x10,
82     DAT_OS_DBG_TYPE_CONSUMER_API 	= 0x20,
83     DAT_OS_DBG_TYPE_ALL 		= 0xff
84 } DAT_OS_DBG_TYPE;
85 
86 extern void
87 dat_os_dbg_init(void);
88 
89 extern void
90 dat_os_dbg_print(
91 	DAT_OS_DBG_TYPE_VAL		type,
92 	const char			*fmt,
93 	...);
94 
95 
96 /*
97  *
98  * Utility Functions
99  *
100  */
101 
102 #define	DAT_ERROR(Type, SubType) ((DAT_RETURN)(DAT_CLASS_ERROR | Type | \
103 					SubType))
104 
105 typedef size_t 			DAT_OS_SIZE;
106 typedef void * 			DAT_OS_LIBRARY_HANDLE;
107 
108 extern DAT_RETURN
109 dat_os_library_load(
110     const char 			*library_path,
111     DAT_OS_LIBRARY_HANDLE 	*library_handle_ptr);
112 
113 extern DAT_RETURN
114 dat_os_library_unload(
115     const DAT_OS_LIBRARY_HANDLE library_handle);
116 
117 /*
118  * void *dat_os_library_sym(DAT_OS_LIBRARY_HANDLE library_handle, char *sym)
119  */
120 #define	dat_os_library_sym(libhndl, sym)	dlsym((libhndl), (sym))
121 
122 /* char *dat_os_getenv(const char *name) */
123 #define	dat_os_getenv(name)	getenv((name))
124 
125 /* long int dat_os_strtol(const char *nptr, char **endptr, int base) */
126 #define	dat_os_strtol(nptr, endptr, base)	strtol((nptr), (endptr), (base))
127 
128 /* DAT_OS_SIZE dat_os_strlen(const char *s) */
129 #define	dat_os_strlen(s)	strlen((s))
130 
131 /* int dat_os_strncmp(const char *s1, const char *s2, DAT_OS_SIZE n) */
132 #define	dat_os_strncmp(s1, s2, n)	strncmp((s1), (s2), (n))
133 
134 /* void * dat_os_strncpy(char *dest, const char *src, DAT_OS_SIZE len) */
135 #define	dat_os_strncpy(dest, src, len)	strncpy((dest), (src), (len))
136 
137 /* DAT_BOOLEAN dat_os_isblank(int c) */
138 #define	dat_os_isblank(c)	((DAT_BOOLEAN)((' ' == (c)) || ('\t' == (c))) \
139 					? DAT_TRUE : DAT_FALSE)
140 
141 
142 /* DAT_BOOLEAN dat_os_isdigit(int c) */
143 #define	dat_os_isdigit(c)	((DAT_BOOLEAN)(isdigit((c)) ? DAT_TRUE : \
144 					DAT_FALSE))
145 
146 /* void dat_os_usleep(unsigned long usec) */
147 #define	dat_os_usleep(usec)	usleep((usec))
148 
149 /*
150  *
151  * Memory Functions
152  *
153  */
154 
155 /* void *dat_os_alloc(int size) */
156 #define	dat_os_alloc(size)	malloc((size))
157 
158 /* void dat_os_free(void *ptr, int size) */
159 #define	dat_os_free(ptr, size)	free((ptr))
160 
161 /* void *dat_os_memset(void *loc, int c, DAT_OS_SIZE size) */
162 #define	dat_os_memset(loc, c, size)	memset((loc), (c), (size))
163 
164 /*
165  *
166  * File I/O
167  *
168  */
169 
170 typedef FILE 			DAT_OS_FILE;
171 typedef fpos_t			DAT_OS_FILE_POS;
172 
173 /*
174  * DAT_OS_FILE *dat_os_fopen(const char	*path)
175  * always open files in read only mode
176  */
177 #define	dat_os_fopen(path)	((DAT_OS_FILE *)fopen((path), "rF"))
178 
179 
180 /* DAT_RETURN dat_os_fgetpos(DAT_OS_FILE *file, DAT_OS_FILE_POS *pos) */
181 #define	dat_os_fgetpos(file, pos)	((DAT_RETURN)(			\
182 			(0 == fgetpos((file), (pos))) ? DAT_SUCCESS :	\
183 			DAT_INTERNAL_ERROR))
184 
185 /* DAT_RETURN dat_os_fsetpos(DAT_OS_FILE *file, DAT_OS_FILE_POS *pos) */
186 #define	dat_os_fsetpos(file, pos)	((DAT_RETURN)(			\
187 			(0 == fsetpos((file), (pos))) ? DAT_SUCCESS :	\
188 			DAT_INTERNAL_ERROR))
189 
190 /*
191  * dat_os_fgetc() returns EOF on error or end of file.
192  * int dat_os_fgetc(DAT_OS_FILE *file)
193  */
194 #define	dat_os_fgetc(file)	fgetc((file))
195 
196 
197 /* int dat_os_fputc(DAT_OS_FILE *file, int c) */
198 #define	dat_os_fputc(file, c)	fputc((c), (file))
199 
200 /* int dat_os_fungetc(DAT_OS_FILE *file) */
201 #define	dat_os_fungetc(file)	fseek((file), -1, SEEK_CUR)
202 
203 /*
204  * dat_os_fread returns the number of bytes read from the file.
205  * DAT_OS_SIZE dat_os_fread(DAT_OS_FILE *file, char *buf, DAT_OS_SIZE len)
206  */
207 #define	dat_os_fread(file, buf, len)	fread((buf), sizeof (char),	\
208 						(len), (file))
209 
210 /* DAT_RETURN dat_os_fclose(DAT_OS_FILE *file) */
211 #define	dat_os_fclose(file)	((0 == fclose(file)) ? DAT_SUCCESS :	\
212 					DAT_INTERNAL_ERROR)
213 
214 /*
215  *
216  * Locks
217  *
218  */
219 
220 typedef pthread_mutex_t 	DAT_OS_LOCK;
221 
222 
223 /* lock functions */
224 /*
225  * DAT_RETURN dat_os_lock_init(IN DAT_OS_LOCK *m)
226  */
227 #define	dat_os_lock_init(m)	((0 == pthread_mutex_init((m), NULL)) ?	\
228 					DAT_SUCCESS : DAT_INTERNAL_ERROR)
229 
230 /* DAT_RETURN dat_os_lock(IN DAT_OS_LOCK *m) */
231 #define	dat_os_lock(m)		((DAT_RETURN)(				\
232 				(0 == pthread_mutex_lock((m))) ?	\
233 					DAT_SUCCESS : DAT_INTERNAL_ERROR))
234 
235 /* DAT_RETURN dat_os_unlock(IN DAT_OS_LOCK *m) */
236 #define	dat_os_unlock(m)	((DAT_RETURN)(				\
237 				(0 == pthread_mutex_unlock((m))) ?	\
238 					DAT_SUCCESS : DAT_INTERNAL_ERROR))
239 
240 /* DAT_RETURN dat_os_lock_destroy(IN DAT_OS_LOCK *m) */
241 #define	dat_os_lock_destroy(m)	((DAT_RETURN)(				\
242 				(0 == pthread_mutex_destroy((m))) ?	\
243 					DAT_SUCCESS : DAT_INTERNAL_ERROR))
244 
245 /*
246  * Simple macro to verify a handle is bad. Conditions:
247  * - pointer is NULL
248  * - pointer is not word aligned
249  */
250 #define	DAT_BAD_HANDLE(h) (((h) == NULL) || ((unsigned long)(h) & 3))
251 
252 #ifdef	__cplusplus
253 }
254 #endif
255 
256 #endif	/* _DAT_OSD_H_ */
257