From ec9c71129f67c5b1c2429dbaefe23e0d19149780 Mon Sep 17 00:00:00 2001
From: pwpiwi <pwpiwi@users.noreply.github.com>
Date: Wed, 7 Jun 2017 22:35:20 +0200
Subject: [PATCH] Fix compile errors with MacOS (#312)

* Fix compile errors with MacOS
- _POSIX_C_SOURCE must not be defined for num_CPU()

* separate util_posix.c require changes in tools directory as well

* remove unnecessary self-include
---
 client/Makefile                           |  3 +-
 client/cmdhf14a.c                         |  1 +
 client/cmdhfepa.c                         |  1 +
 client/cmdhfmf.c                          |  1 +
 client/cmdhfmfhard.c                      |  1 +
 client/cmdmain.c                          |  1 +
 client/flash.c                            |  1 +
 client/flasher.c                          |  1 +
 client/hardnested/hardnested_bruteforce.c |  1 +
 client/loclass/elite_crack.c              |  1 +
 client/util.c                             | 50 ++----------------
 client/util.h                             | 10 ----
 client/util_posix.c                       | 63 +++++++++++++++++++++++
 client/util_posix.h                       | 26 ++++++++++
 tools/mfkey/Makefile                      |  2 +-
 tools/mfkey/mfkey32.c                     |  3 +-
 tools/mfkey/mfkey64.c                     |  2 +-
 17 files changed, 109 insertions(+), 59 deletions(-)
 create mode 100644 client/util_posix.c
 create mode 100644 client/util_posix.h

diff --git a/client/Makefile b/client/Makefile
index f6af8602..0d2ae25f 100644
--- a/client/Makefile
+++ b/client/Makefile
@@ -79,7 +79,8 @@ DEPFLAGS = -MT $@ -MMD -MP -MF $(OBJDIR)/$*.Td
 POSTCOMPILE = $(MV) -f $(OBJDIR)/$*.Td $(OBJDIR)/$*.d
 
 CORESRCS = 	uart.c \
-			util.c
+			util.c \
+			util_posix.c
 
 CMDSRCS = 	crapto1/crapto1.c\
 			crapto1/crypto1.c\
diff --git a/client/cmdhf14a.c b/client/cmdhf14a.c
index 58d1e8b2..258a5578 100644
--- a/client/cmdhf14a.c
+++ b/client/cmdhf14a.c
@@ -15,6 +15,7 @@
 #include <string.h>
 #include <unistd.h>
 #include "util.h"
+#include "util_posix.h"
 #include "iso14443crc.h"
 #include "data.h"
 #include "proxmark3.h"
diff --git a/client/cmdhfepa.c b/client/cmdhfepa.c
index e73f5834..f3456afb 100644
--- a/client/cmdhfepa.c
+++ b/client/cmdhfepa.c
@@ -16,6 +16,7 @@
 #include <unistd.h>
 #include <stdio.h>
 #include "util.h"
+#include "util_posix.h"
 #include "proxmark3.h"
 #include "ui.h"
 #include "cmdparser.h"
diff --git a/client/cmdhfmf.c b/client/cmdhfmf.c
index 3fde208f..4cb9577b 100644
--- a/client/cmdhfmf.c
+++ b/client/cmdhfmf.c
@@ -19,6 +19,7 @@
 #include "cmdmain.h"
 #include "cmdhfmfhard.h"
 #include "util.h"
+#include "util_posix.h"
 #include "usb_cmd.h"
 #include "ui.h"
 #include "mifarehost.h"
diff --git a/client/cmdhfmfhard.c b/client/cmdhfmfhard.c
index 01dcc35d..6cd75af5 100644
--- a/client/cmdhfmfhard.c
+++ b/client/cmdhfmfhard.c
@@ -28,6 +28,7 @@
 #include "cmdmain.h"
 #include "ui.h"
 #include "util.h"
+#include "util_posix.h"
 #include "crapto1/crapto1.h"
 #include "parity.h"
 #include "hardnested/hardnested_bruteforce.h"
diff --git a/client/cmdmain.c b/client/cmdmain.c
index 44c11aeb..f407cee4 100644
--- a/client/cmdmain.c
+++ b/client/cmdmain.c
@@ -23,6 +23,7 @@
 #include "cmdlf.h"
 #include "cmdmain.h"
 #include "util.h"
+#include "util_posix.h"
 #include "cmdscript.h"
 #include "cmdcrc.h"
 
diff --git a/client/flash.c b/client/flash.c
index 0b940e99..7622e8a5 100644
--- a/client/flash.c
+++ b/client/flash.c
@@ -15,6 +15,7 @@
 #include <unistd.h>
 #include "proxmark3.h"
 #include "util.h"
+#include "util_posix.h"
 #include "flash.h"
 #include "elf.h"
 #include "proxendian.h"
diff --git a/client/flasher.c b/client/flasher.c
index 0c1dbd71..48317c1e 100644
--- a/client/flasher.c
+++ b/client/flasher.c
@@ -12,6 +12,7 @@
 #include <inttypes.h>
 #include "proxmark3.h"
 #include "util.h"
+#include "util_posix.h"
 #include "flash.h"
 #include "uart.h"
 #include "usb_cmd.h"
diff --git a/client/hardnested/hardnested_bruteforce.c b/client/hardnested/hardnested_bruteforce.c
index 3218c1aa..3b1c5071 100644
--- a/client/hardnested/hardnested_bruteforce.c
+++ b/client/hardnested/hardnested_bruteforce.c
@@ -60,6 +60,7 @@ THE SOFTWARE.
 #include "hardnested_bf_core.h"
 #include "ui.h"
 #include "util.h"
+#include "util_posix.h"
 #include "crapto1/crapto1.h"
 #include "parity.h"
 
diff --git a/client/loclass/elite_crack.c b/client/loclass/elite_crack.c
index e52c9a6a..83fb8515 100644
--- a/client/loclass/elite_crack.c
+++ b/client/loclass/elite_crack.c
@@ -41,6 +41,7 @@
 #include <string.h>
 #include <stdio.h>
 #include "util.h"
+#include "util_posix.h"
 #include "cipherutils.h"
 #include "cipher.h"
 #include "ikeys.h"
diff --git a/client/util.c b/client/util.c
index 13067ec1..0a92f15a 100644
--- a/client/util.c
+++ b/client/util.c
@@ -8,10 +8,6 @@
 // utilities
 //-----------------------------------------------------------------------------
 
-#if !defined(_WIN32)
-#define _POSIX_C_SOURCE	199309L			// need nanosleep()
-#endif
-
 #include "util.h"
 
 #include <stdint.h>
@@ -22,6 +18,10 @@
 #include <time.h>
 #include "data.h"
 
+#ifdef _WIN32
+#include <windows.h>
+#endif
+
 #define MAX_BIN_BREAK_LENGTH   (3072+384+1)
 
 #ifndef _WIN32
@@ -614,48 +614,7 @@ void clean_ascii(unsigned char *buf, size_t len) {
 }
 
 
-// Timer functions
-#if !defined (_WIN32)
-#include <errno.h>
-
-static void nsleep(uint64_t n) {
-  struct timespec timeout;
-  timeout.tv_sec = n/1000000000;
-  timeout.tv_nsec = n%1000000000;
-  while (nanosleep(&timeout, &timeout) && errno == EINTR);
-}
-
-void msleep(uint32_t n) {
-	nsleep(1000000 * n);
-}
-
-#endif // _WIN32
 
-// a milliseconds timer for performance measurement
-uint64_t msclock() {
-#if defined(_WIN32)
-    #include <sys/types.h>
-    
-    // WORKAROUND FOR MinGW (some versions - use if normal code does not compile)
-    // It has no _ftime_s and needs explicit inclusion of timeb.h
-    #include <sys/timeb.h>
-    struct _timeb t;
-    _ftime(&t);
-    return 1000 * t.time + t.millitm;
-    
-    // NORMAL CODE (use _ftime_s)
-	//struct _timeb t;
-    //if (_ftime_s(&t)) {
-	//	return 0;
-	//} else {
-	//	return 1000 * t.time + t.millitm;
-	//}
-#else
-	struct timespec t;
-	clock_gettime(CLOCK_MONOTONIC, &t);
-	return (t.tv_sec * 1000 + t.tv_nsec / 1000000);
-#endif
-}
 
 // determine number of logical CPU cores (use for multithreaded functions)
 extern int num_CPUs(void)
@@ -672,3 +631,4 @@ extern int num_CPUs(void)
 	return 1;
 #endif
 }
+
diff --git a/client/util.h b/client/util.h
index 55cc3877..640ef434 100644
--- a/client/util.h
+++ b/client/util.h
@@ -77,16 +77,6 @@ extern void rol(uint8_t *data, const size_t len);
 
 extern void clean_ascii(unsigned char *buf, size_t len);
 
-// timer functions/macros
-#ifdef _WIN32
-# include <windows.h>
-# define sleep(n) Sleep(1000 *(n))
-# define msleep(n) Sleep((n))
-#else
-extern void msleep(uint32_t n);		// sleep n milliseconds
-#endif // _WIN32
-
-extern uint64_t msclock(); 			// a milliseconds clock
 extern int num_CPUs(void);			// number of logical CPUs
 
 #endif // UTIL_H__
diff --git a/client/util_posix.c b/client/util_posix.c
new file mode 100644
index 00000000..3e61b674
--- /dev/null
+++ b/client/util_posix.c
@@ -0,0 +1,63 @@
+//-----------------------------------------------------------------------------
+// Copyright (C) 2010 iZsh <izsh at fail0verflow.com>
+//
+// This code is licensed to you under the terms of the GNU GPL, version 2 or,
+// at your option, any later version. See the LICENSE.txt file for the text of
+// the license.
+//-----------------------------------------------------------------------------
+// utilities requiring Posix library functions
+//-----------------------------------------------------------------------------
+
+#if !defined(_WIN32)
+#define _POSIX_C_SOURCE	199309L			// need nanosleep()
+#else
+#include <windows.h>
+#endif
+
+#include "util_posix.h"
+#include <stdint.h>
+#include <time.h>
+
+
+// Timer functions
+#if !defined (_WIN32)
+#include <errno.h>
+
+static void nsleep(uint64_t n) {
+  struct timespec timeout;
+  timeout.tv_sec = n/1000000000;
+  timeout.tv_nsec = n%1000000000;
+  while (nanosleep(&timeout, &timeout) && errno == EINTR);
+}
+
+void msleep(uint32_t n) {
+	nsleep(1000000 * n);
+}
+#endif // _WIN32
+
+// a milliseconds timer for performance measurement
+uint64_t msclock() {
+#if defined(_WIN32)
+    #include <sys/types.h>
+    
+    // WORKAROUND FOR MinGW (some versions - use if normal code does not compile)
+    // It has no _ftime_s and needs explicit inclusion of timeb.h
+    #include <sys/timeb.h>
+    struct _timeb t;
+    _ftime(&t);
+    return 1000 * t.time + t.millitm;
+    
+    // NORMAL CODE (use _ftime_s)
+	//struct _timeb t;
+    //if (_ftime_s(&t)) {
+	//	return 0;
+	//} else {
+	//	return 1000 * t.time + t.millitm;
+	//}
+#else
+	struct timespec t;
+	clock_gettime(CLOCK_MONOTONIC, &t);
+	return (t.tv_sec * 1000 + t.tv_nsec / 1000000);
+#endif
+}
+
diff --git a/client/util_posix.h b/client/util_posix.h
new file mode 100644
index 00000000..dcf9d99a
--- /dev/null
+++ b/client/util_posix.h
@@ -0,0 +1,26 @@
+//-----------------------------------------------------------------------------
+// Copyright (C) 2010 iZsh <izsh at fail0verflow.com>
+//
+// This code is licensed to you under the terms of the GNU GPL, version 2 or,
+// at your option, any later version. See the LICENSE.txt file for the text of
+// the license.
+//-----------------------------------------------------------------------------
+// utilities requiring Posix library functions
+//-----------------------------------------------------------------------------
+
+#ifndef UTIL_POSIX_H__
+#define UTIL_POSIX_H__
+
+#include <stdint.h>
+
+#ifdef _WIN32
+# include <windows.h>
+# define sleep(n) Sleep(1000 *(n))
+# define msleep(n) Sleep((n))
+#else
+extern void msleep(uint32_t n);		// sleep n milliseconds
+#endif // _WIN32
+
+extern uint64_t msclock(); 			// a milliseconds clock
+
+#endif
diff --git a/tools/mfkey/Makefile b/tools/mfkey/Makefile
index fc6170e4..ede971dc 100755
--- a/tools/mfkey/Makefile
+++ b/tools/mfkey/Makefile
@@ -4,7 +4,7 @@ LD = gcc
 CFLAGS = -std=c99 -D_ISOC99_SOURCE -I../../common -I../../client -Wall -O3
 LDFLAGS =
 
-OBJS = crypto1.o crapto1.o parity.o util.o mfkey.o
+OBJS = crypto1.o crapto1.o parity.o util_posix.o mfkey.o
 EXES = mfkey32 mfkey64
 WINEXES = $(patsubst %, %.exe, $(EXES))
 
diff --git a/tools/mfkey/mfkey32.c b/tools/mfkey/mfkey32.c
index 4ab4bad4..a5665ab2 100755
--- a/tools/mfkey/mfkey32.c
+++ b/tools/mfkey/mfkey32.c
@@ -4,7 +4,8 @@
 #include <stdlib.h>
 #include "crapto1/crapto1.h"
 #include "mfkey.h"
-#include "util.h"
+#include "util_posix.h"
+
 
 // 32 bit recover key from 2 nonces
 int main (int argc, char *argv[]) {
diff --git a/tools/mfkey/mfkey64.c b/tools/mfkey/mfkey64.c
index 1b002812..8bf1d801 100755
--- a/tools/mfkey/mfkey64.c
+++ b/tools/mfkey/mfkey64.c
@@ -2,7 +2,7 @@
 #include <string.h>
 #include <inttypes.h>
 #include "crapto1/crapto1.h"
-#include "util.h"
+#include "util_posix.h"
 
 int main (int argc, char *argv[]) 
 {
-- 
2.39.5