1*9517SBill.Taylor@Sun.COM /* 2*9517SBill.Taylor@Sun.COM * CDDL HEADER START 3*9517SBill.Taylor@Sun.COM * 4*9517SBill.Taylor@Sun.COM * The contents of this file are subject to the terms of the 5*9517SBill.Taylor@Sun.COM * Common Development and Distribution License (the "License"). 6*9517SBill.Taylor@Sun.COM * You may not use this file except in compliance with the License. 7*9517SBill.Taylor@Sun.COM * 8*9517SBill.Taylor@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*9517SBill.Taylor@Sun.COM * or http://www.opensolaris.org/os/licensing. 10*9517SBill.Taylor@Sun.COM * See the License for the specific language governing permissions 11*9517SBill.Taylor@Sun.COM * and limitations under the License. 12*9517SBill.Taylor@Sun.COM * 13*9517SBill.Taylor@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each 14*9517SBill.Taylor@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*9517SBill.Taylor@Sun.COM * If applicable, add the following below this CDDL HEADER, with the 16*9517SBill.Taylor@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying 17*9517SBill.Taylor@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner] 18*9517SBill.Taylor@Sun.COM * 19*9517SBill.Taylor@Sun.COM * CDDL HEADER END 20*9517SBill.Taylor@Sun.COM */ 21*9517SBill.Taylor@Sun.COM 22*9517SBill.Taylor@Sun.COM /* 23*9517SBill.Taylor@Sun.COM * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. 24*9517SBill.Taylor@Sun.COM */ 25*9517SBill.Taylor@Sun.COM 26*9517SBill.Taylor@Sun.COM /* 27*9517SBill.Taylor@Sun.COM * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 28*9517SBill.Taylor@Sun.COM * Use is subject to license terms. 29*9517SBill.Taylor@Sun.COM */ 30*9517SBill.Taylor@Sun.COM 31*9517SBill.Taylor@Sun.COM /* 32*9517SBill.Taylor@Sun.COM * 33*9517SBill.Taylor@Sun.COM * HEADER: dapl_osd.h 34*9517SBill.Taylor@Sun.COM * 35*9517SBill.Taylor@Sun.COM * PURPOSE: Operating System Dependent layer 36*9517SBill.Taylor@Sun.COM * Description: 37*9517SBill.Taylor@Sun.COM * Provide OS dependent data structures & functions with 38*9517SBill.Taylor@Sun.COM * a canonical DAPL interface. Designed to be portable 39*9517SBill.Taylor@Sun.COM * and hide OS specific quirks of common functions. 40*9517SBill.Taylor@Sun.COM * 41*9517SBill.Taylor@Sun.COM * $Id: dapl_osd.h,v 1.38 2003/08/20 14:08:57 sjs2 Exp $ 42*9517SBill.Taylor@Sun.COM */ 43*9517SBill.Taylor@Sun.COM 44*9517SBill.Taylor@Sun.COM #ifndef _DAPL_OSD_H_ 45*9517SBill.Taylor@Sun.COM #define _DAPL_OSD_H_ 46*9517SBill.Taylor@Sun.COM 47*9517SBill.Taylor@Sun.COM #ifdef __cplusplus 48*9517SBill.Taylor@Sun.COM extern "C" { 49*9517SBill.Taylor@Sun.COM #endif 50*9517SBill.Taylor@Sun.COM 51*9517SBill.Taylor@Sun.COM /* 52*9517SBill.Taylor@Sun.COM * <assert.h> keys off of NDEBUG 53*9517SBill.Taylor@Sun.COM */ 54*9517SBill.Taylor@Sun.COM #ifdef DAPL_DBG 55*9517SBill.Taylor@Sun.COM #undef NDEBUG 56*9517SBill.Taylor@Sun.COM #else 57*9517SBill.Taylor@Sun.COM #define NDEBUG 58*9517SBill.Taylor@Sun.COM #endif 59*9517SBill.Taylor@Sun.COM 60*9517SBill.Taylor@Sun.COM #include <dat/udat.h> 61*9517SBill.Taylor@Sun.COM #include <assert.h> 62*9517SBill.Taylor@Sun.COM #include <errno.h> 63*9517SBill.Taylor@Sun.COM #include <pthread.h> 64*9517SBill.Taylor@Sun.COM #include <semaphore.h> 65*9517SBill.Taylor@Sun.COM #include <stdio.h> 66*9517SBill.Taylor@Sun.COM #include <stdlib.h> 67*9517SBill.Taylor@Sun.COM #include <string.h> 68*9517SBill.Taylor@Sun.COM #include <stdarg.h> 69*9517SBill.Taylor@Sun.COM #include <time.h> 70*9517SBill.Taylor@Sun.COM #include <syslog.h> 71*9517SBill.Taylor@Sun.COM #include <netdb.h> 72*9517SBill.Taylor@Sun.COM #include <atomic.h> 73*9517SBill.Taylor@Sun.COM #include "dapl_debug.h" 74*9517SBill.Taylor@Sun.COM 75*9517SBill.Taylor@Sun.COM /* 76*9517SBill.Taylor@Sun.COM * networking related headers 77*9517SBill.Taylor@Sun.COM */ 78*9517SBill.Taylor@Sun.COM #include <unistd.h> 79*9517SBill.Taylor@Sun.COM #include <fcntl.h> 80*9517SBill.Taylor@Sun.COM #include <sys/types.h> 81*9517SBill.Taylor@Sun.COM #include <sys/socket.h> 82*9517SBill.Taylor@Sun.COM #include <ctype.h> 83*9517SBill.Taylor@Sun.COM #include <arpa/inet.h> 84*9517SBill.Taylor@Sun.COM 85*9517SBill.Taylor@Sun.COM #ifndef _INLINE_ 86*9517SBill.Taylor@Sun.COM #define _INLINE_ 87*9517SBill.Taylor@Sun.COM #endif /* _INLINE_ */ 88*9517SBill.Taylor@Sun.COM 89*9517SBill.Taylor@Sun.COM /* 90*9517SBill.Taylor@Sun.COM * initialization function 91*9517SBill.Taylor@Sun.COM */ 92*9517SBill.Taylor@Sun.COM void dapl_os_init(void); 93*9517SBill.Taylor@Sun.COM 94*9517SBill.Taylor@Sun.COM #define dapl_os_panic(args) \ 95*9517SBill.Taylor@Sun.COM { \ 96*9517SBill.Taylor@Sun.COM fprintf(stderr, "PANIC in %s:%i:\n", __FILE__, __LINE__); \ 97*9517SBill.Taylor@Sun.COM fprintf(stderr, args); \ 98*9517SBill.Taylor@Sun.COM exit(1); \ 99*9517SBill.Taylor@Sun.COM } 100*9517SBill.Taylor@Sun.COM 101*9517SBill.Taylor@Sun.COM int dapl_os_get_env_bool( 102*9517SBill.Taylor@Sun.COM char *env_str); 103*9517SBill.Taylor@Sun.COM 104*9517SBill.Taylor@Sun.COM int dapl_os_get_env_val( 105*9517SBill.Taylor@Sun.COM char *env_str, 106*9517SBill.Taylor@Sun.COM int def_val); 107*9517SBill.Taylor@Sun.COM 108*9517SBill.Taylor@Sun.COM /* 109*9517SBill.Taylor@Sun.COM * Atomic operations 110*9517SBill.Taylor@Sun.COM */ 111*9517SBill.Taylor@Sun.COM typedef volatile DAT_COUNT DAPL_ATOMIC; 112*9517SBill.Taylor@Sun.COM 113*9517SBill.Taylor@Sun.COM /* 114*9517SBill.Taylor@Sun.COM * dapl_os_atomic_inc 115*9517SBill.Taylor@Sun.COM * 116*9517SBill.Taylor@Sun.COM * get the current value of '*v', and then increment it. 117*9517SBill.Taylor@Sun.COM * 118*9517SBill.Taylor@Sun.COM * This is equivalent to an IB atomic fetch and add of 1, 119*9517SBill.Taylor@Sun.COM * except that a DAT_COUNT might be 32 bits, rather than 64 120*9517SBill.Taylor@Sun.COM * and it occurs in local memory. 121*9517SBill.Taylor@Sun.COM * 122*9517SBill.Taylor@Sun.COM * DAT_COUNT dapl_os_atomic_inc(INOUT DAPL_ATOMIC *v) 123*9517SBill.Taylor@Sun.COM */ 124*9517SBill.Taylor@Sun.COM #define dapl_os_atomic_inc(v) ((DAT_COUNT) \ 125*9517SBill.Taylor@Sun.COM (atomic_add_32_nv((uint32_t *)(v), 1) - 1)) 126*9517SBill.Taylor@Sun.COM 127*9517SBill.Taylor@Sun.COM /* 128*9517SBill.Taylor@Sun.COM * dapl_os_atomic_dec 129*9517SBill.Taylor@Sun.COM * 130*9517SBill.Taylor@Sun.COM * decrement the current value of '*v'. No return value is required. 131*9517SBill.Taylor@Sun.COM * 132*9517SBill.Taylor@Sun.COM * DAT_COUNT dapl_os_atomic_dec(INOUT DAPL_ATOMIC *v) 133*9517SBill.Taylor@Sun.COM */ 134*9517SBill.Taylor@Sun.COM #define dapl_os_atomic_dec(v) assert(*v != 0); \ 135*9517SBill.Taylor@Sun.COM ((DAT_COUNT) \ 136*9517SBill.Taylor@Sun.COM (atomic_add_32_nv((uint32_t *)(v), -1) + 1)) 137*9517SBill.Taylor@Sun.COM 138*9517SBill.Taylor@Sun.COM /* 139*9517SBill.Taylor@Sun.COM * dapl_os_atomic_assign 140*9517SBill.Taylor@Sun.COM * 141*9517SBill.Taylor@Sun.COM * assign 'new_value' to '*v' if the current value 142*9517SBill.Taylor@Sun.COM * matches the provided 'match_value'. 143*9517SBill.Taylor@Sun.COM * 144*9517SBill.Taylor@Sun.COM * Make no assignment if there is no match. 145*9517SBill.Taylor@Sun.COM * 146*9517SBill.Taylor@Sun.COM * Return the current value in any case. 147*9517SBill.Taylor@Sun.COM * 148*9517SBill.Taylor@Sun.COM * This matches the IBTA atomic operation compare & swap 149*9517SBill.Taylor@Sun.COM * except that it is for local memory and a DAT_COUNT may 150*9517SBill.Taylor@Sun.COM * be only 32 bits, rather than 64. 151*9517SBill.Taylor@Sun.COM * 152*9517SBill.Taylor@Sun.COM * DAT_COUNT dapl_os_atomic_assign(INOUT DAPL_ATOMIC *v, 153*9517SBill.Taylor@Sun.COM * IN DAT_COUNT match_value, IN DAT_COUNT new_value) 154*9517SBill.Taylor@Sun.COM */ 155*9517SBill.Taylor@Sun.COM #define dapl_os_atomic_assign(v, match_value, new_value) \ 156*9517SBill.Taylor@Sun.COM atomic_cas_32((uint32_t *)(v), (uint32_t)(match_value), \ 157*9517SBill.Taylor@Sun.COM (uint32_t)(new_value)) 158*9517SBill.Taylor@Sun.COM 159*9517SBill.Taylor@Sun.COM /* 160*9517SBill.Taylor@Sun.COM * Thread Functions 161*9517SBill.Taylor@Sun.COM */ 162*9517SBill.Taylor@Sun.COM typedef pthread_t DAPL_OS_THREAD; 163*9517SBill.Taylor@Sun.COM 164*9517SBill.Taylor@Sun.COM DAT_RETURN 165*9517SBill.Taylor@Sun.COM dapl_os_thread_create( 166*9517SBill.Taylor@Sun.COM IN void (*func) (void *), 167*9517SBill.Taylor@Sun.COM IN void *data, 168*9517SBill.Taylor@Sun.COM OUT DAPL_OS_THREAD *thread_id); 169*9517SBill.Taylor@Sun.COM 170*9517SBill.Taylor@Sun.COM 171*9517SBill.Taylor@Sun.COM /* 172*9517SBill.Taylor@Sun.COM * Lock Functions 173*9517SBill.Taylor@Sun.COM */ 174*9517SBill.Taylor@Sun.COM 175*9517SBill.Taylor@Sun.COM typedef pthread_mutex_t DAPL_OS_LOCK; 176*9517SBill.Taylor@Sun.COM 177*9517SBill.Taylor@Sun.COM /* 178*9517SBill.Taylor@Sun.COM * DAT_RETURN dapl_os_lock_init(IN DAPL_OS_LOCK *m) 179*9517SBill.Taylor@Sun.COM */ 180*9517SBill.Taylor@Sun.COM #define dapl_os_lock_init(m) (void) \ 181*9517SBill.Taylor@Sun.COM ((0 == pthread_mutex_init((m), NULL)) ? \ 182*9517SBill.Taylor@Sun.COM DAT_SUCCESS : \ 183*9517SBill.Taylor@Sun.COM (DAT_CLASS_ERROR | DAT_INTERNAL_ERROR)) 184*9517SBill.Taylor@Sun.COM 185*9517SBill.Taylor@Sun.COM /* DAT_RETURN dapl_os_lock(IN DAPL_OS_LOCK *m) */ 186*9517SBill.Taylor@Sun.COM #define dapl_os_lock(m) ((DAT_RETURN)( \ 187*9517SBill.Taylor@Sun.COM (0 == pthread_mutex_lock((m))) ? \ 188*9517SBill.Taylor@Sun.COM DAT_SUCCESS : \ 189*9517SBill.Taylor@Sun.COM (DAT_CLASS_ERROR | DAT_INTERNAL_ERROR))) 190*9517SBill.Taylor@Sun.COM 191*9517SBill.Taylor@Sun.COM /* DAT_RETURN dapl_os_unlock(IN DAPL_OS_LOCK *m) */ 192*9517SBill.Taylor@Sun.COM #define dapl_os_unlock(m) ((DAT_RETURN)( \ 193*9517SBill.Taylor@Sun.COM (0 == pthread_mutex_unlock((m))) ? \ 194*9517SBill.Taylor@Sun.COM DAT_SUCCESS : \ 195*9517SBill.Taylor@Sun.COM (DAT_CLASS_ERROR | DAT_INTERNAL_ERROR))) 196*9517SBill.Taylor@Sun.COM 197*9517SBill.Taylor@Sun.COM /* DAT_RETURN dapl_os_lock_destroy(IN DAPL_OS_LOCK *m) */ 198*9517SBill.Taylor@Sun.COM #define dapl_os_lock_destroy(m) ((DAT_RETURN)( \ 199*9517SBill.Taylor@Sun.COM (0 == pthread_mutex_destroy((m))) ? \ 200*9517SBill.Taylor@Sun.COM DAT_SUCCESS : \ 201*9517SBill.Taylor@Sun.COM (DAT_CLASS_ERROR | DAT_INTERNAL_ERROR))) 202*9517SBill.Taylor@Sun.COM /* 203*9517SBill.Taylor@Sun.COM * Wait Objects 204*9517SBill.Taylor@Sun.COM */ 205*9517SBill.Taylor@Sun.COM 206*9517SBill.Taylor@Sun.COM /* 207*9517SBill.Taylor@Sun.COM * The wait object invariant: Presuming a call to dapl_os_wait_object_wait 208*9517SBill.Taylor@Sun.COM * occurs at some point, there will be at least one wakeup after each call 209*9517SBill.Taylor@Sun.COM * to dapl_os_wait_object_signal. I.e. Signals are not ignored, though 210*9517SBill.Taylor@Sun.COM * they may be coallesced. 211*9517SBill.Taylor@Sun.COM */ 212*9517SBill.Taylor@Sun.COM 213*9517SBill.Taylor@Sun.COM typedef struct 214*9517SBill.Taylor@Sun.COM { 215*9517SBill.Taylor@Sun.COM DAT_BOOLEAN signaled; 216*9517SBill.Taylor@Sun.COM pthread_cond_t cv; 217*9517SBill.Taylor@Sun.COM pthread_mutex_t lock; 218*9517SBill.Taylor@Sun.COM } DAPL_OS_WAIT_OBJECT; 219*9517SBill.Taylor@Sun.COM 220*9517SBill.Taylor@Sun.COM /* function prototypes */ 221*9517SBill.Taylor@Sun.COM DAT_RETURN 222*9517SBill.Taylor@Sun.COM dapl_os_wait_object_init( 223*9517SBill.Taylor@Sun.COM IN DAPL_OS_WAIT_OBJECT *wait_obj); 224*9517SBill.Taylor@Sun.COM 225*9517SBill.Taylor@Sun.COM DAT_RETURN 226*9517SBill.Taylor@Sun.COM dapl_os_wait_object_wait( 227*9517SBill.Taylor@Sun.COM IN DAPL_OS_WAIT_OBJECT *wait_obj, 228*9517SBill.Taylor@Sun.COM IN DAT_TIMEOUT timeout_val); 229*9517SBill.Taylor@Sun.COM 230*9517SBill.Taylor@Sun.COM DAT_RETURN 231*9517SBill.Taylor@Sun.COM dapl_os_wait_object_wakeup( 232*9517SBill.Taylor@Sun.COM IN DAPL_OS_WAIT_OBJECT *wait_obj); 233*9517SBill.Taylor@Sun.COM 234*9517SBill.Taylor@Sun.COM DAT_RETURN 235*9517SBill.Taylor@Sun.COM dapl_os_wait_object_destroy( 236*9517SBill.Taylor@Sun.COM IN DAPL_OS_WAIT_OBJECT *wait_obj); 237*9517SBill.Taylor@Sun.COM 238*9517SBill.Taylor@Sun.COM /* 239*9517SBill.Taylor@Sun.COM * Memory Functions 240*9517SBill.Taylor@Sun.COM */ 241*9517SBill.Taylor@Sun.COM 242*9517SBill.Taylor@Sun.COM /* void *dapl_os_alloc(int size) */ 243*9517SBill.Taylor@Sun.COM #define dapl_os_alloc(size) malloc((size)) 244*9517SBill.Taylor@Sun.COM 245*9517SBill.Taylor@Sun.COM /* void *dapl_os_realloc(void *ptr, int size) */ 246*9517SBill.Taylor@Sun.COM #define dapl_os_realloc(ptr, size) realloc((ptr), (size)) 247*9517SBill.Taylor@Sun.COM 248*9517SBill.Taylor@Sun.COM /* void dapl_os_free(void *ptr, int size) */ 249*9517SBill.Taylor@Sun.COM #define dapl_os_free(ptr, size) free((ptr)) 250*9517SBill.Taylor@Sun.COM 251*9517SBill.Taylor@Sun.COM /* void * dapl_os_memzero(void *loc, int size) */ 252*9517SBill.Taylor@Sun.COM #define dapl_os_memzero(loc, size) memset((loc), 0, (size)) 253*9517SBill.Taylor@Sun.COM 254*9517SBill.Taylor@Sun.COM /* void * dapl_os_memcpy(void *dest, const void *src, int len) */ 255*9517SBill.Taylor@Sun.COM #define dapl_os_memcpy(dest, src, len) memcpy((dest), (src), (len)) 256*9517SBill.Taylor@Sun.COM 257*9517SBill.Taylor@Sun.COM /* int dapl_os_memcmp(const void *mem1, const void *mem2, int len) */ 258*9517SBill.Taylor@Sun.COM #define dapl_os_memcmp(mem1, mem2, len) memcmp((mem1), (mem2), (len)) 259*9517SBill.Taylor@Sun.COM 260*9517SBill.Taylor@Sun.COM /* 261*9517SBill.Taylor@Sun.COM * String Functions 262*9517SBill.Taylor@Sun.COM */ 263*9517SBill.Taylor@Sun.COM 264*9517SBill.Taylor@Sun.COM /* unsigned int dapl_os_strlen(const char *str) */ 265*9517SBill.Taylor@Sun.COM #define dapl_os_strlen(str) strlen((str)) 266*9517SBill.Taylor@Sun.COM /* char * dapl_os_strdup(const char *str) */ 267*9517SBill.Taylor@Sun.COM #define dapl_os_strdup(str) strdup((str)) 268*9517SBill.Taylor@Sun.COM /* char *strcpy(char *dest, char *src) */ 269*9517SBill.Taylor@Sun.COM #define dapl_os_strcpy(dest, src) strcpy((dest), (src)) 270*9517SBill.Taylor@Sun.COM /* char *strncpy(char *s1, const char *s2, size_t n) */ 271*9517SBill.Taylor@Sun.COM #define dapl_os_strncpy(dest, src, len) strncpy((dest), (src), (len)) 272*9517SBill.Taylor@Sun.COM /* char *strcat(char *dest, char *src) */ 273*9517SBill.Taylor@Sun.COM #define dapl_os_strcat(dest, src) strcat((dest), (src)) 274*9517SBill.Taylor@Sun.COM 275*9517SBill.Taylor@Sun.COM /* 276*9517SBill.Taylor@Sun.COM * Timer Functions 277*9517SBill.Taylor@Sun.COM */ 278*9517SBill.Taylor@Sun.COM 279*9517SBill.Taylor@Sun.COM typedef DAT_UINT64 DAPL_OS_TIMEVAL; 280*9517SBill.Taylor@Sun.COM 281*9517SBill.Taylor@Sun.COM 282*9517SBill.Taylor@Sun.COM typedef unsigned long long int DAPL_OS_TICKS; 283*9517SBill.Taylor@Sun.COM 284*9517SBill.Taylor@Sun.COM /* function prototypes */ 285*9517SBill.Taylor@Sun.COM 286*9517SBill.Taylor@Sun.COM /* 287*9517SBill.Taylor@Sun.COM * Sleep for the number of micro seconds specified by the invoking 288*9517SBill.Taylor@Sun.COM * function 289*9517SBill.Taylor@Sun.COM * 290*9517SBill.Taylor@Sun.COM * void dapl_os_sleep_usec(int sleep_time) 291*9517SBill.Taylor@Sun.COM */ 292*9517SBill.Taylor@Sun.COM #define dapl_os_sleep_usec(sleep_time) { \ 293*9517SBill.Taylor@Sun.COM struct timespec sleep_spec; \ 294*9517SBill.Taylor@Sun.COM sleep_spec.tv_sec = (sleep_time) / 100000; \ 295*9517SBill.Taylor@Sun.COM sleep_spec.tv_nsec = (sleep_time) % 100000 * 1000; \ 296*9517SBill.Taylor@Sun.COM nanosleep(&sleep_spec, NULL); \ 297*9517SBill.Taylor@Sun.COM } 298*9517SBill.Taylor@Sun.COM 299*9517SBill.Taylor@Sun.COM DAT_RETURN dapl_os_get_time(DAPL_OS_TIMEVAL *); 300*9517SBill.Taylor@Sun.COM 301*9517SBill.Taylor@Sun.COM /* 302*9517SBill.Taylor@Sun.COM * 303*9517SBill.Taylor@Sun.COM * Name Service Helper functions 304*9517SBill.Taylor@Sun.COM * 305*9517SBill.Taylor@Sun.COM */ 306*9517SBill.Taylor@Sun.COM #if defined(IBHOSTS_NAMING) 307*9517SBill.Taylor@Sun.COM #define dapls_osd_getaddrinfo(name, addr_ptr) \ 308*9517SBill.Taylor@Sun.COM getaddrinfo((name), NULL, NULL, (addr_ptr)) 309*9517SBill.Taylor@Sun.COM #define dapls_osd_freeaddrinfo(addr) freeaddrinfo((addr)) 310*9517SBill.Taylor@Sun.COM 311*9517SBill.Taylor@Sun.COM #endif /* IBHOSTS_NAMING */ 312*9517SBill.Taylor@Sun.COM 313*9517SBill.Taylor@Sun.COM /* 314*9517SBill.Taylor@Sun.COM * *printf format helpers. We use the C string constant concatenation 315*9517SBill.Taylor@Sun.COM * ability to define 64 bit formats, which unfortunatly are non standard 316*9517SBill.Taylor@Sun.COM * in the C compiler world. E.g. %llx for gcc, %I64x for Windows 317*9517SBill.Taylor@Sun.COM */ 318*9517SBill.Taylor@Sun.COM #define F64d "%lld" 319*9517SBill.Taylor@Sun.COM #define F64u "%llu" 320*9517SBill.Taylor@Sun.COM #define F64x "%llx" 321*9517SBill.Taylor@Sun.COM #define F64X "%llX" 322*9517SBill.Taylor@Sun.COM 323*9517SBill.Taylor@Sun.COM 324*9517SBill.Taylor@Sun.COM /* 325*9517SBill.Taylor@Sun.COM * Conversion Functions 326*9517SBill.Taylor@Sun.COM */ 327*9517SBill.Taylor@Sun.COM 328*9517SBill.Taylor@Sun.COM /* long int dapl_os_strtol(const char *nptr, char **endptr, int base) */ 329*9517SBill.Taylor@Sun.COM #define dapl_os_strtol(nptr, endptr, base) strtol((nptr), (endptr), (base)) 330*9517SBill.Taylor@Sun.COM 331*9517SBill.Taylor@Sun.COM /* 332*9517SBill.Taylor@Sun.COM * Helper Functions 333*9517SBill.Taylor@Sun.COM */ 334*9517SBill.Taylor@Sun.COM 335*9517SBill.Taylor@Sun.COM 336*9517SBill.Taylor@Sun.COM #define dapl_os_assert(expression) assert((expression)) 337*9517SBill.Taylor@Sun.COM #define dapl_os_printf printf 338*9517SBill.Taylor@Sun.COM #define dapl_os_vprintf(fmt, args) vprintf((fmt), (args)) 339*9517SBill.Taylor@Sun.COM #define dapl_os_syslog(fmt, args) vsyslog(LOG_USER | LOG_DEBUG, \ 340*9517SBill.Taylor@Sun.COM (fmt), (args)) 341*9517SBill.Taylor@Sun.COM #ifdef __cplusplus 342*9517SBill.Taylor@Sun.COM } 343*9517SBill.Taylor@Sun.COM #endif 344*9517SBill.Taylor@Sun.COM 345*9517SBill.Taylor@Sun.COM #endif /* _DAPL_OSD_H_ */ 346