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