From 7860d9806f5d983bc246984f2c7e5f57d7b19c80 Mon Sep 17 00:00:00 2001 From: "W. Eric Norum" Date: Mon, 25 Mar 2002 17:57:04 +0000 Subject: [PATCH] OS-dependent files for Mac OS X (Darwin). --- src/libCom/osi/os/Darwin/osdReadline.h | 17 +++++ src/libCom/osi/os/Darwin/osdSock.h | 71 +++++++++++++++++ src/libCom/osi/os/Darwin/osdTime.cpp | 101 +++++++++++++++++++++++++ src/libCom/osi/os/Darwin/osdTime.h | 13 ++++ src/libCom/osi/os/Darwin/osiFileName.h | 12 +++ 5 files changed, 214 insertions(+) create mode 100644 src/libCom/osi/os/Darwin/osdReadline.h create mode 100644 src/libCom/osi/os/Darwin/osdSock.h create mode 100644 src/libCom/osi/os/Darwin/osdTime.cpp create mode 100644 src/libCom/osi/os/Darwin/osdTime.h create mode 100644 src/libCom/osi/os/Darwin/osiFileName.h diff --git a/src/libCom/osi/os/Darwin/osdReadline.h b/src/libCom/osi/os/Darwin/osdReadline.h new file mode 100644 index 000000000..6fb42c491 --- /dev/null +++ b/src/libCom/osi/os/Darwin/osdReadline.h @@ -0,0 +1,17 @@ +/* + * $Id$ + * + * Author: Eric Norum + */ + +#ifndef _OSD_READLINE_H_ +#define _OSD_READLINE_H_ + +/* + * If you don't have the fink readline package installed, uncomment + * the `FAKE' line and comment out the `REAL' line. + */ +/* #define IOCSH_FAKE_READLINE */ +#define IOCSH_REAL_READLINE + +#endif /* _OSD_READLINE_H_ */ diff --git a/src/libCom/osi/os/Darwin/osdSock.h b/src/libCom/osi/os/Darwin/osdSock.h new file mode 100644 index 000000000..4ba2f8422 --- /dev/null +++ b/src/libCom/osi/os/Darwin/osdSock.h @@ -0,0 +1,71 @@ +/* + * $Id$ + * + * Author: Eric Norum + */ + +#ifndef osdSockH +#define osdSockH + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#include +#include /* for MAXHOSTNAMELEN */ +#include +#include +#include +/*#include +#include */ +#include +#include +#include +#include +#include +#include /* close() and others */ + + +#ifdef __cplusplus +} +#endif + +typedef int SOCKET; +#define INVALID_SOCKET (-1) +#define SOCKERRNO errno +#define socket_close(S) close(S) +#define socket_ioctl(A,B,C) ioctl(A,B,C) +typedef int osiSockIoctl_t; +typedef int osiSocklen_t; + +#define FD_IN_FDSET(FD) ((FD)ifr_name)) + +#endif /*osdSockH*/ diff --git a/src/libCom/osi/os/Darwin/osdTime.cpp b/src/libCom/osi/os/Darwin/osdTime.cpp new file mode 100644 index 000000000..812377e69 --- /dev/null +++ b/src/libCom/osi/os/Darwin/osdTime.cpp @@ -0,0 +1,101 @@ +/* + * $Id$ + * + * Author: Eric Norum + */ + +#include "osiSock.h" + +#define epicsExportSharedSymbols +#include "epicsTime.h" +#include "epicsThread.h" +#include "epicsMutex.h" + +// +// epicsTime::osdGetCurrent () +// +extern "C" epicsShareFunc int epicsShareAPI epicsTimeGetCurrent (epicsTimeStamp *pDest) +{ +# ifdef _POSIX_TIMERS + struct timespec ts; + int status; + + status = clock_gettime (CLOCK_REALTIME, &ts); + if (status) { + return epicsTimeERROR; + } + + *pDest = epicsTime (ts); + return epicsTimeOK; +# else + int status; + struct timeval tv; + + status = gettimeofday (&tv, NULL); + if (status) { + return epicsTimeERROR; + } + *pDest = epicsTime (tv); + return epicsTimeOK; +# endif +} + +// +// epicsTimeGetEvent () +// +extern "C" epicsShareFunc int epicsShareAPI epicsTimeGetEvent (epicsTimeStamp *pDest, unsigned eventNumber) +{ + if (eventNumber==epicsTimeEventCurrentTime) { + return epicsTimeGetCurrent (pDest); + } + return epicsTimeERROR; +} + +/* + * Darwin provides neither gmtime_r nor localtime_r and I can't confirm + * the gmtime and localtime are thread-safe, so protect calls to these + * functions with a mutex. + */ +static epicsMutexId timeLock; +static epicsThreadOnceId osdTimeOnceFlag = EPICS_THREAD_ONCE_INIT; +static void osdTimeInit ( void * ) +{ + timeLock = epicsMutexMustCreate(); +} + +int epicsTime_gmtime ( const time_t *pAnsiTime, // X aCC 361 + struct tm *pTM ) +{ + struct tm * pRet; + epicsThreadOnce ( &osdTimeOnceFlag, osdTimeInit, 0 ); + epicsMutexLock(timeLock); + pRet = gmtime ( pAnsiTime ); + if ( pRet ) { + *pTM = *pRet; + epicsMutexUnlock(timeLock); + return epicsTimeOK; + } + else { + epicsMutexUnlock(timeLock); + return epicsTimeERROR; + } +} + +int epicsTime_localtime ( const time_t *clock, // X aCC 361 + struct tm *result ) +{ + struct tm * pRet; + epicsThreadOnce ( &osdTimeOnceFlag, osdTimeInit, 0 ); + epicsMutexLock(timeLock); + pRet = localtime ( clock ); + if ( pRet ) { + *result = *pRet; + epicsMutexUnlock(timeLock); + return epicsTimeOK; + } + else { + epicsMutexUnlock(timeLock); + return epicsTimeERROR; + } +} + diff --git a/src/libCom/osi/os/Darwin/osdTime.h b/src/libCom/osi/os/Darwin/osdTime.h new file mode 100644 index 000000000..fdc282430 --- /dev/null +++ b/src/libCom/osi/os/Darwin/osdTime.h @@ -0,0 +1,13 @@ +/* + * $Id$ + * + * Author: Eric Norum + */ + +#ifndef osdTimeh +#define osdTimeh + +#include + +#endif /* ifndef osdTimeh */ + diff --git a/src/libCom/osi/os/Darwin/osiFileName.h b/src/libCom/osi/os/Darwin/osiFileName.h new file mode 100644 index 000000000..7b024885a --- /dev/null +++ b/src/libCom/osi/os/Darwin/osiFileName.h @@ -0,0 +1,12 @@ +/* + * $Id$ + * + * Author: Eric Norum + */ + +#ifndef osiFileNameH +#define osiFileNameH + +#include "unixFileName.h" + +#endif /* osiFileNameH */