瀏覽代碼

compat: add support for clock_gettime on Darwin

Felix Paul Kühne 10 年之前
父節點
當前提交
5003022c1e
共有 4 個文件被更改,包括 73 次插入1 次删除
  1. 59 0
      compat/clock_gettime.c
  2. 11 1
      compat/compat.h
  3. 1 0
      configure.ac
  4. 2 0
      src/netbios_ns.c

+ 59 - 0
compat/clock_gettime.c

@@ -0,0 +1,59 @@
+/*
+ * Copyright (c), MM Weiss
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ *     1. Redistributions of source code must retain the above copyright notice,
+ *     this list of conditions and the following disclaimer.
+ *
+ *     2. Redistributions in binary form must reproduce the above copyright notice,
+ *     this list of conditions and the following disclaimer in the documentation
+ *     and/or other materials provided with the distribution.
+ *
+ *     3. Neither the name of the MM Weiss nor the names of its contributors
+ *     may be used to endorse or promote products derived from this software without
+ *     specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <mach/mach.h>
+#include <mach/clock.h>
+#include <mach/mach_time.h>
+#include <unistd.h>
+#include <sched.h>
+#include "compat.h"
+
+int clock_gettime(clockid_t clk_id, struct timespec *tp) {
+    kern_return_t   ret;
+    clock_serv_t    clk;
+    clock_id_t clk_serv_id;
+    mach_timespec_t tm;
+
+    if (clk_id != CLOCK_REALTIME)
+        return -1;
+
+    clk_serv_id = clk_id == CLOCK_REALTIME ? CALENDAR_CLOCK : SYSTEM_CLOCK;
+    if (KERN_SUCCESS == (ret = host_get_clock_service(mach_host_self(), clk_serv_id, &clk))) {
+        if (KERN_SUCCESS == (ret = clock_get_time(clk, &tm))) {
+            tp->tv_sec  = tm.tv_sec;
+            tp->tv_nsec = tm.tv_nsec;
+        }
+    }
+    if (KERN_SUCCESS != ret)
+        return -1;
+
+    return 0;
+}

+ 11 - 1
compat/compat.h

@@ -30,6 +30,16 @@
 
 #include "config.h"
 
-#if !defined HAVE_strlcpy && !defined HAVE_LIBBSD
+#if !defined HAVE_STRLCPY && !defined HAVE_LIBBSD
 size_t strlcpy(char *dst, const char *src, size_t siz);
 #endif
+
+#if !defined HAVE_CLOCK_GETTIME
+typedef enum {
+    CLOCK_REALTIME,
+    CLOCK_MONOTONIC,
+    CLOCK_PROCESS_CPUTIME_ID,
+    CLOCK_THREAD_CPUTIME_ID
+} clockid_t;
+int clock_gettime(clockid_t clk_id, struct timespec *tp);
+#endif

+ 1 - 0
configure.ac

@@ -85,6 +85,7 @@ AC_SEARCH_LIBS([strlcpy], [bsd], [
   AC_DEFINE([HAVE_LIBBSD], [1], [Does this system have libbsd strl*** functions implementation])
 ])
 AC_REPLACE_FUNCS([strlcpy])
+AC_REPLACE_FUNCS([clock_gettime])
 
 AC_CHECK_HEADERS([bsd/string.h])
 AC_CHECK_HEADERS([langinfo.h])

+ 2 - 0
src/netbios_ns.c

@@ -54,6 +54,8 @@
 #include "netbios_query.h"
 #include "netbios_utils.h"
 
+#include "compat.h"
+
 enum name_query_type {
     NAME_QUERY_TYPE_INVALID,
     NAME_QUERY_TYPE_NB,