fec: enable building on Mac

Enable the host libfec and the fec tool to be built on Mac with the
help of <utils/Compat.h>.

Change-Id: I5e7c9fac11f4a00814bad92734e703ec8dc22dc9
diff --git a/libfec/Android.mk b/libfec/Android.mk
index 4ca563e..45fb19e 100644
--- a/libfec/Android.mk
+++ b/libfec/Android.mk
@@ -38,13 +38,13 @@
     $(common_static_libraries)
 include $(BUILD_STATIC_LIBRARY)
 
-ifeq ($(HOST_OS),linux)
-
 include $(CLEAR_VARS)
 LOCAL_CFLAGS := $(common_cflags) -D_GNU_SOURCE -DFEC_NO_KLOG
 LOCAL_C_INCLUDES := $(common_c_includes)
 LOCAL_CLANG := true
+ifeq ($(HOST_OS),linux)
 LOCAL_SANITIZE := integer
+endif
 LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include
 LOCAL_MODULE := libfec_host
 LOCAL_SRC_FILES := $(common_src_files)
@@ -55,6 +55,4 @@
     $(common_static_libraries)
 include $(BUILD_HOST_STATIC_LIBRARY)
 
-endif # HOST_OS == linux
-
 include $(LOCAL_PATH)/test/Android.mk
diff --git a/libfec/fec_open.cpp b/libfec/fec_open.cpp
index f25aa7f..1923406 100644
--- a/libfec/fec_open.cpp
+++ b/libfec/fec_open.cpp
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 
-#include <linux/fs.h>
 #include <stdlib.h>
 #include <sys/ioctl.h>
 #include <sys/stat.h>
@@ -24,6 +23,14 @@
     #include <ext4_sb.h>
 }
 
+#if defined(__linux__)
+    #include <linux/fs.h>
+#elif defined(__APPLE__)
+    #include <sys/disk.h>
+    #define BLKGETSIZE64 DKIOCGETBLOCKCOUNT
+    #define fdatasync(fd) fcntl((fd), F_FULLFSYNC)
+#endif
+
 #include "fec_private.h"
 
 /* used by `find_offset'; returns metadata size for a file size `size' and
diff --git a/libfec/fec_private.h b/libfec/fec_private.h
index fab81cf..2175899 100644
--- a/libfec/fec_private.h
+++ b/libfec/fec_private.h
@@ -31,6 +31,7 @@
 #include <unordered_map>
 #include <vector>
 
+#include <utils/Compat.h>
 #include <mincrypt/rsa.h>
 #include <openssl/sha.h>
 #include <fec/io.h>
diff --git a/verity/fec/Android.mk b/verity/fec/Android.mk
index 774878d..c13f577 100644
--- a/verity/fec/Android.mk
+++ b/verity/fec/Android.mk
@@ -1,10 +1,10 @@
 LOCAL_PATH:= $(call my-dir)
 
-ifeq ($(HOST_OS),linux)
-
 include $(CLEAR_VARS)
 LOCAL_CLANG := true
+ifeq ($(HOST_OS),linux)
 LOCAL_SANITIZE := integer
+endif
 LOCAL_MODULE := fec
 LOCAL_SRC_FILES := main.cpp image.cpp
 LOCAL_MODULE_TAGS := optional
@@ -21,8 +21,6 @@
 LOCAL_C_INCLUDES += external/fec
 include $(BUILD_HOST_EXECUTABLE)
 
-endif # HOST_OS == linux
-
 include $(CLEAR_VARS)
 LOCAL_CLANG := true
 LOCAL_SANITIZE := integer
diff --git a/verity/fec/image.cpp b/verity/fec/image.cpp
index 7acf4c8..4101815 100644
--- a/verity/fec/image.cpp
+++ b/verity/fec/image.cpp
@@ -26,7 +26,6 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <getopt.h>
-#include <linux/fs.h>
 #include <openssl/sha.h>
 #include <pthread.h>
 #include <stdbool.h>
@@ -39,6 +38,14 @@
 #endif
 #include "image.h"
 
+#if defined(__linux__)
+    #include <linux/fs.h>
+#elif defined(__APPLE__)
+    #include <sys/disk.h>
+    #define BLKGETSIZE64 DKIOCGETBLOCKCOUNT
+    #define O_LARGEFILE 0
+#endif
+
 void image_init(image *ctx)
 {
     memset(ctx, 0, sizeof(*ctx));
diff --git a/verity/fec/image.h b/verity/fec/image.h
index a7f5553..f235eb5 100644
--- a/verity/fec/image.h
+++ b/verity/fec/image.h
@@ -17,6 +17,7 @@
 #ifndef __FEC_H__
 #define __FEC_H__
 
+#include <utils/Compat.h>
 #include <fec/io.h>
 #include <fec/ecc.h>