* [PATCH] f2fs-tools: build binaries in Mac
@ 2017-11-15 4:17 Jaegeuk Kim
2017-11-15 7:49 ` Chao Yu
0 siblings, 1 reply; 4+ messages in thread
From: Jaegeuk Kim @ 2017-11-15 4:17 UTC (permalink / raw)
To: linux-f2fs-devel; +Cc: Jaegeuk Kim
This patch modifies f2fs-tools to be built in mac.
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
---
configure.ac | 99 +++++++++++++++++++++++++++++++++++++++++-------
fsck/dump.c | 6 +++
fsck/f2fs.h | 5 ++-
fsck/fsck.c | 4 +-
fsck/mount.c | 10 +++++
fsck/quotaio_tree.h | 4 ++
fsck/resize.c | 5 ++-
fsck/sload.c | 2 +
fsck/xattr.c | 3 --
fsck/xattr.h | 20 ++++++++++
include/android_config.h | 54 ++++++++++++++++++++++++++
include/f2fs_fs.h | 39 +++++++++++++++----
lib/libf2fs.c | 61 +++++++++++++++++++++++++----
lib/libf2fs_io.c | 17 +++++++++
mkfs/f2fs_format.c | 4 +-
mkfs/f2fs_format_utils.c | 10 +++--
tools/Makefile.am | 6 ++-
tools/f2fscrypt.c | 9 ++++-
tools/fibmap.c | 65 ++++++++++++++++++++++++++++---
19 files changed, 371 insertions(+), 52 deletions(-)
create mode 100644 include/android_config.h
diff --git a/configure.ac b/configure.ac
index 451b2de..73c830d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -35,16 +35,6 @@ AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_AUX_DIR([build-aux])
AM_INIT_AUTOMAKE([foreign tar-pax dist-xz])
-AC_CHECK_HEADERS_ONCE([
- fcntl.h
- mntent.h
- stdlib.h
- string.h
- unistd.h
- sys/ioctl.h
- sys/mount.h
-])
-
# Test configure options.
AC_ARG_WITH([selinux],
AS_HELP_STRING([--without-selinux],
@@ -91,9 +81,30 @@ AS_IF([test "x$have_blkid" = "xyes"],
)
# Checks for header files.
-AC_CHECK_HEADERS([linux/fs.h linux/blkzoned.h fcntl.h mntent.h stdlib.h string.h \
- sys/ioctl.h sys/mount.h unistd.h linux/falloc.h byteswap.h \
- attr/xattr.h linux/xattr.h linux/posix_acl.h sys/acl.h])
+AC_CHECK_HEADERS(m4_flatten([
+ attr/xattr.h
+ byteswap.h
+ fcntl.h
+ linux/blkzoned.h
+ linux/falloc.h
+ linux/fs.h
+ linux/hdreg.h
+ linux/limits.h
+ linux/posix_acl.h
+ linux/types.h
+ linux/xattr.h
+ mntent.h
+ scsi/sg.h
+ stdlib.h
+ string.h
+ sys/acl.h
+ sys/ioctl.h
+ sys/syscall.h
+ sys/mount.h
+ sys/sysmacros.h
+ sys/xattr.h
+ unistd.h
+]))
# Checks for typedefs, structures, and compiler characteristics.
AC_C_INLINE
@@ -104,15 +115,75 @@ AC_TYPE_SIZE_T
# Checks for library functions.
AC_FUNC_GETMNTENT
AC_CHECK_FUNCS_ONCE([
+ add_key
fallocate
+ fsetxattr
+ fstat
+ fstat64
getmntent
+ keyctl
+ llseek
+ lseek64
memset
- fsetxattr
+ setmntent
])
AS_IF([test "$ac_cv_header_byteswap_h" = "yes"],
[AC_CHECK_DECLS([bswap_64],,,[#include <byteswap.h>])])
+dnl
+dnl Check to see if llseek() is declared in unistd.h. On some libc's
+dnl it is, and on others it isn't..... Thank you glibc developers....
+dnl
+AC_CHECK_DECL(llseek,[AC_DEFINE(HAVE_LLSEEK_PROTOTYPE, 1,
+ [Define to 1 if llseek declared in unistd.h])],,
+ [#include <unistd.h>])
+dnl
+dnl Check to see if lseek64() is declared in unistd.h. Glibc's header files
+dnl are so convoluted that I can't tell whether it will always be defined,
+dnl and if it isn't defined while lseek64 is defined in the library,
+dnl disaster will strike.
+dnl
+dnl Warning! Use of --enable-gcc-wall may throw off this test.
+dnl
+dnl
+AC_CHECK_DECL(lseek64,[AC_DEFINE(HAVE_LSEEK64_PROTOTYPE, 1,
+ [Define to 1 if lseek64 declared in unistd.h])],,
+ [#define _LARGEFILE_SOURCE
+ #define _LARGEFILE64_SOURCE
+ #include <unistd.h>])
+dnl
+dnl Word sizes...
+dnl
+
+# AC_CANONICAL_HOST is needed to access the 'host_os' variable
+AC_CANONICAL_HOST
+
+build_linux=no
+build_windows=no
+build_mac=no
+
+# Detect the target system
+case "${host_os}" in
+linux*)
+ build_linux=yes
+ ;;
+cygwin*|mingw*)
+ build_windows=yes
+ ;;
+darwin*)
+ build_mac=yes
+ ;;
+*)
+ AC_MSG_ERROR(["OS $host_os is not supported"])
+ ;;
+esac
+
+# Pass the conditionals to automake
+AM_CONDITIONAL([LINUX], [test "$build_linux" = "yes"])
+AM_CONDITIONAL([WINDOWS], [test "$build_windows" = "yes"])
+AM_CONDITIONAL([OSX], [test "$build_mac" = "yes"])
+
# Install directories
#AC_PREFIX_DEFAULT([/usr])
#AC_SUBST([sbindir], [/sbin])
diff --git a/fsck/dump.c b/fsck/dump.c
index ec69f25..9f0993e 100644
--- a/fsck/dump.c
+++ b/fsck/dump.c
@@ -360,8 +360,14 @@ static void dump_xattr(struct f2fs_sb_info *sbi, struct f2fs_node *node_blk)
}
DBG(1, "fd %d xattr_name %s\n", c.dump_fd, xattr_name);
+#if defined(__linux__)
ret = fsetxattr(c.dump_fd, xattr_name, value,
le16_to_cpu(ent->e_value_size), 0);
+#elif defined(__APPLE__)
+ ret = fsetxattr(c.dump_fd, xattr_name, value,
+ le16_to_cpu(ent->e_value_size), 0,
+ XATTR_CREATE);
+#endif
if (ret)
MSG(0, "XATTR index 0x%x set xattr failed error %d\n",
ent->e_name_index, errno);
diff --git a/fsck/f2fs.h b/fsck/f2fs.h
index 542594e..34b2481 100644
--- a/fsck/f2fs.h
+++ b/fsck/f2fs.h
@@ -11,6 +11,7 @@
#ifndef _F2FS_H_
#define _F2FS_H_
+#include <f2fs_fs.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
@@ -18,14 +19,14 @@
#include <fcntl.h>
#include <string.h>
#include <errno.h>
+#ifdef HAVE_MNTENT_H
#include <mntent.h>
+#endif
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/mount.h>
#include <assert.h>
-#include <f2fs_fs.h>
-
#define EXIT_ERR_CODE (-1)
#define ver_after(a, b) (typecheck(unsigned long long, a) && \
typecheck(unsigned long long, b) && \
diff --git a/fsck/fsck.c b/fsck/fsck.c
index ef46e33..ec88712 100644
--- a/fsck/fsck.c
+++ b/fsck/fsck.c
@@ -881,14 +881,14 @@ skip_blkcnt_fix:
}
if (ftype == F2FS_FT_SYMLINK && i_blocks && i_size == 0) {
DBG(1, "ino: 0x%x i_blocks: %lu with zero i_size",
- nid, i_blocks);
+ nid, (unsigned long)i_blocks);
if (c.fix_on) {
u64 i_size = i_blocks * F2FS_BLKSIZE;
node_blk->i.i_size = cpu_to_le64(i_size);
need_fix = 1;
FIX_MSG("Symlink: recover 0x%x with i_size=%lu",
- nid, i_size);
+ nid, (unsigned long)i_size);
}
}
diff --git a/fsck/mount.c b/fsck/mount.c
index 826a2f9..653dcf3 100644
--- a/fsck/mount.c
+++ b/fsck/mount.c
@@ -18,6 +18,16 @@
#include <sys/acl.h>
#endif
+#ifndef ACL_UNDEFINED_TAG
+#define ACL_UNDEFINED_TAG (0x00)
+#define ACL_USER_OBJ (0x01)
+#define ACL_USER (0x02)
+#define ACL_GROUP_OBJ (0x04)
+#define ACL_GROUP (0x08)
+#define ACL_MASK (0x10)
+#define ACL_OTHER (0x20)
+#endif
+
u32 get_free_segments(struct f2fs_sb_info *sbi)
{
u32 i, free_segs = 0;
diff --git a/fsck/quotaio_tree.h b/fsck/quotaio_tree.h
index 4ca2d7f..aed93a8 100644
--- a/fsck/quotaio_tree.h
+++ b/fsck/quotaio_tree.h
@@ -6,9 +6,13 @@
#define _LINUX_QUOTA_TREE_H
#include <inttypes.h>
+#ifdef HAVE_LINUX_TYPES_H
#include <linux/types.h>
+#endif
#include <sys/types.h>
+#include <f2fs_fs.h>
+
typedef __u32 qid_t; /* Type in which we store ids in memory */
#define QT_TREEOFF 1 /* Offset of tree in file in blocks */
diff --git a/fsck/resize.c b/fsck/resize.c
index 4584d6f..6c3eeab 100644
--- a/fsck/resize.c
+++ b/fsck/resize.c
@@ -36,7 +36,7 @@ static int get_new_sb(struct f2fs_super_block *sb)
zone_align_start_offset) / segment_size_bytes /
c.segs_per_sec * c.segs_per_sec);
- blocks_for_sit = ALIGN(get_sb(segment_count), SIT_ENTRY_PER_BLOCK);
+ blocks_for_sit = SIZE_ALIGN(get_sb(segment_count), SIT_ENTRY_PER_BLOCK);
sit_segments = SEG_ALIGN(blocks_for_sit);
set_sb(segment_count_sit, sit_segments * 2);
set_sb(nat_blkaddr, get_sb(sit_blkaddr) +
@@ -45,7 +45,8 @@ static int get_new_sb(struct f2fs_super_block *sb)
total_valid_blks_available = (get_sb(segment_count) -
(get_sb(segment_count_ckpt) +
get_sb(segment_count_sit))) * blks_per_seg;
- blocks_for_nat = ALIGN(total_valid_blks_available, NAT_ENTRY_PER_BLOCK);
+ blocks_for_nat = SIZE_ALIGN(total_valid_blks_available,
+ NAT_ENTRY_PER_BLOCK);
set_sb(segment_count_nat, SEG_ALIGN(blocks_for_nat));
sit_bitmap_size = ((get_sb(segment_count_sit) / 2) <<
diff --git a/fsck/sload.c b/fsck/sload.c
index 68799c1..bfc79f2 100644
--- a/fsck/sload.c
+++ b/fsck/sload.c
@@ -15,7 +15,9 @@
#include "fsck.h"
#include <libgen.h>
#include <dirent.h>
+#ifdef HAVE_MNTENT_H
#include <mntent.h>
+#endif
#ifdef HAVE_LIBSELINUX
#include <selinux/selinux.h>
diff --git a/fsck/xattr.c b/fsck/xattr.c
index 1d0f7d3..f2576cd 100644
--- a/fsck/xattr.c
+++ b/fsck/xattr.c
@@ -17,9 +17,6 @@
#include "node.h"
#include "xattr.h"
-#define XATTR_CREATE 0x1
-#define XATTR_REPLACE 0x2
-
void *read_all_xattrs(struct f2fs_sb_info *sbi, struct f2fs_node *inode)
{
struct f2fs_xattr_header *header;
diff --git a/fsck/xattr.h b/fsck/xattr.h
index beed3bb..e4a98e2 100644
--- a/fsck/xattr.h
+++ b/fsck/xattr.h
@@ -17,6 +17,9 @@
#define _XATTR_H_
#include "f2fs.h"
+#ifdef HAVE_SYS_XATTR_H
+#include <sys/xattr.h>
+#endif
struct f2fs_xattr_header {
__le32 h_magic; /* magic number for identification */
@@ -76,6 +79,23 @@ static inline int f2fs_acl_count(int size)
}
}
+#ifndef XATTR_USER_PREFIX
+#define XATTR_USER_PREFIX "user."
+#endif
+#ifndef XATTR_SECURITY_PREFIX
+#define XATTR_SECURITY_PREFIX "security."
+#endif
+#ifndef XATTR_TRUSTED_PREFIX
+#define XATTR_TRUSTED_PREFIX "trusted."
+#endif
+
+#ifndef XATTR_CREATE
+#define XATTR_CREATE 0x1
+#endif
+#ifndef XATTR_REPLACE
+#define XATTR_REPLACE 0x2
+#endif
+
#define XATTR_ROUND (3)
#define XATTR_SELINUX_SUFFIX "selinux"
diff --git a/include/android_config.h b/include/android_config.h
new file mode 100644
index 0000000..bfc4105
--- /dev/null
+++ b/include/android_config.h
@@ -0,0 +1,54 @@
+#if defined(__linux__)
+#define HAVE_BYTESWAP_H 1
+#define HAVE_FCNTL_H 1
+#define HAVE_FALLOC_H 1
+#define HAVE_LINUX_HDREG_H 1
+#define HAVE_LINUX_LIMITS_H 1
+#define HAVE_POSIX_ACL_H 1
+#define HAVE_LINUX_TYPES_H 1
+#define HAVE_LINUX_XATTR_H 1
+#define HAVE_MNTENT_H 1
+#define HAVE_STDLIB_H 1
+#define HAVE_STRING_H 1
+#define HAVE_SYS_IOCTL_H 1
+#define HAVE_SYS_SYSCALL_H 1
+#define HAVE_SYS_MOUNT_H 1
+#define HAVE_SYS_SYSMACROS_H 1
+#define HAVE_SYS_XATTR_H 1
+#define HAVE_UNISTD_H 1
+
+#define HAVE_ADD_KEY 1
+#define HAVE_FALLOCATE 1
+#define HAVE_FSETXATTR 1
+#define HAVE_FSTAT 1
+#define HAVE_FSTAT64 1
+#define HAVE_GETMNTENT 1
+#define HAVE_KEYCTL 1
+#define HAVE_LLSEEK 1
+#define HAVE_LSEEK64 1
+#define HAVE_MEMSET 1
+#define HAVE_SETMNTENT 1
+#endif
+
+#if defined(__APPLE__)
+#define HAVE_FCNTL_H 1
+#define HAVE_FALLOC_H 1
+#define HAVE_POSIX_ACL_H 1
+#define HAVE_STDLIB_H 1
+#define HAVE_STRING_H 1
+#define HAVE_SYS_IOCTL_H 1
+#define HAVE_SYS_SYSCALL_H 1
+#define HAVE_SYS_MOUNT_H 1
+#define HAVE_SYS_XATTR_H 1
+#define HAVE_UNISTD_H 1
+
+#define HAVE_ADD_KEY 1
+#define HAVE_FALLOCATE 1
+#define HAVE_FSETXATTR 1
+#define HAVE_FSTAT 1
+#define HAVE_FSTAT64 1
+#define HAVE_GETMNTENT 1
+#define HAVE_KEYCTL 1
+#define HAVE_LLSEEK 1
+#define HAVE_MEMSET 1
+#endif
diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
index 8d67a76..05b893a 100644
--- a/include/f2fs_fs.h
+++ b/include/f2fs_fs.h
@@ -12,14 +12,20 @@
#ifndef __F2FS_FS_H__
#define __F2FS_FS_H__
-#include <inttypes.h>
-#include <linux/types.h>
-#include <sys/types.h>
-
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
+#ifdef WITH_ANDROID
+#include <android_config.h>
+#endif
+
+#include <inttypes.h>
+#ifdef HAVE_LINUX_TYPES_H
+#include <linux/types.h>
+#endif
+#include <sys/types.h>
+
#ifdef HAVE_LINUX_BLKZONED_H
#include <linux/blkzoned.h>
#endif
@@ -39,10 +45,25 @@ typedef u_int16_t u16;
typedef u_int8_t u8;
typedef u32 block_t;
typedef u32 nid_t;
+#ifndef bool
typedef u8 bool;
+#endif
typedef unsigned long pgoff_t;
typedef unsigned short umode_t;
+#ifndef HAVE_LINUX_TYPES_H
+typedef u8 __u8;
+typedef u16 __u16;
+typedef u32 __u32;
+typedef u64 __u64;
+typedef u16 __le16;
+typedef u32 __le32;
+typedef u64 __le64;
+typedef u16 __be16;
+typedef u32 __be32;
+typedef u64 __be64;
+#endif
+
#if HAVE_BYTESWAP_H
#include <byteswap.h>
#else
@@ -226,7 +247,9 @@ static inline uint64_t bswap_64(uint64_t val)
snprintf(buf, len, #member)
/* these are defined in kernel */
+#ifndef PAGE_SIZE
#define PAGE_SIZE 4096
+#endif
#define PAGE_CACHE_SIZE 4096
#define BITS_PER_BYTE 8
#define F2FS_SUPER_MAGIC 0xF2F52010 /* F2FS Magic Number */
@@ -784,7 +807,7 @@ struct f2fs_nat_block {
* disk is 16 TB and it equals to 16 * 1024 * 1024 / 2 segments.
*/
#define F2FS_MAX_SEGMENT ((16 * 1024 * 1024) / 2)
-#define MAX_SIT_BITMAP_SIZE (SEG_ALIGN(ALIGN(F2FS_MAX_SEGMENT, \
+#define MAX_SIT_BITMAP_SIZE (SEG_ALIGN(SIZE_ALIGN(F2FS_MAX_SEGMENT, \
SIT_ENTRY_PER_BLOCK)) * \
c.blks_per_seg / 8)
@@ -1146,9 +1169,9 @@ extern int f2fs_reset_zones(int);
extern struct f2fs_configuration c;
-#define ALIGN(val, size) ((val) + (size) - 1) / (size)
-#define SEG_ALIGN(blks) ALIGN(blks, c.blks_per_seg)
-#define ZONE_ALIGN(blks) ALIGN(blks, c.blks_per_seg * \
+#define SIZE_ALIGN(val, size) ((val) + (size) - 1) / (size)
+#define SEG_ALIGN(blks) SIZE_ALIGN(blks, c.blks_per_seg)
+#define ZONE_ALIGN(blks) SIZE_ALIGN(blks, c.blks_per_seg * \
c.segs_per_zone)
static inline double get_best_overprovision(struct f2fs_super_block *sb)
diff --git a/lib/libf2fs.c b/lib/libf2fs.c
index 0f1fead..1e63843 100644
--- a/lib/libf2fs.c
+++ b/lib/libf2fs.c
@@ -8,25 +8,34 @@
*/
#define _LARGEFILE64_SOURCE
+#include <f2fs_fs.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
+#ifdef HAVE_MNTENT_H
#include <mntent.h>
+#endif
#include <time.h>
#include <sys/stat.h>
#include <sys/mount.h>
#include <sys/ioctl.h>
+#ifdef HAVE_SYS_SYSMACROS_H
#include <sys/sysmacros.h>
+#endif
#ifndef WITH_ANDROID
+#ifdef HAVE_SCSI_SG_H
#include <scsi/sg.h>
#endif
+#endif
+#ifdef HAVE_LINUX_HDREG_H
#include <linux/hdreg.h>
+#endif
+#ifdef HAVE_LINUX_LIMITS_H
#include <linux/limits.h>
-
-#include <f2fs_fs.h>
+#endif
#ifndef WITH_ANDROID
/* SCSI command for standard inquiry*/
@@ -607,6 +616,7 @@ void f2fs_init_configuration(void)
c.dry_run = 0;
}
+#ifdef HAVE_SETMNTENT
static int is_mounted(const char *mpt, const char *device)
{
FILE *file = NULL;
@@ -628,6 +638,7 @@ static int is_mounted(const char *mpt, const char *device)
endmntent(file);
return mnt ? 1 : 0;
}
+#endif
int f2fs_dev_is_umounted(char *path)
{
@@ -642,29 +653,36 @@ int f2fs_dev_is_umounted(char *path)
* try with /proc/mounts fist to detect RDONLY.
* f2fs_stop_checkpoint makes RO in /proc/mounts while RW in /etc/mtab.
*/
+#ifdef __linux__
ret = is_mounted("/proc/mounts", path);
if (ret) {
MSG(0, "Info: Mounted device!\n");
return -1;
}
-
+#endif
+#if defined(MOUNTED) || defined(_PATH_MOUNTED)
+#ifndef MOUNTED
+#define MOUNTED _PATH_MOUNTED
+#endif
ret = is_mounted(MOUNTED, path);
if (ret) {
MSG(0, "Info: Mounted device!\n");
return -1;
}
-
+#endif
/*
* If we are supposed to operate on the root device, then
* also check the mounts for '/dev/root', which sometimes
* functions as an alias for the root device.
*/
if (is_rootdev) {
+#ifdef __linux__
ret = is_mounted("/proc/mounts", "/dev/root");
if (ret) {
MSG(0, "Info: Mounted device!\n");
return -1;
}
+#endif
}
/*
@@ -681,7 +699,7 @@ int f2fs_dev_is_umounted(char *path)
return -1;
}
}
- return 0;
+ return ret;
}
int f2fs_devs_are_umounted(void)
@@ -704,6 +722,25 @@ void get_kernel_version(__u8 *version)
memset(version + i, 0, VERSION_LEN + 1 - i);
}
+
+#if defined(__linux__) && defined(_IO) && !defined(BLKGETSIZE)
+#define BLKGETSIZE _IO(0x12,96)
+#endif
+
+#if defined(__linux__) && defined(_IOR) && !defined(BLKGETSIZE64)
+#define BLKGETSIZE64 _IOR(0x12,114, size_t)
+#endif
+
+#if defined(__linux__) && defined(_IO) && !defined(BLKSSZGET)
+#define BLKSSZGET _IO(0x12,104)
+#endif
+
+#if defined(__APPLE__)
+#include <sys/disk.h>
+#define BLKGETSIZE DKIOCGETBLOCKCOUNT
+#define BLKSSZGET DKIOCGETBLOCKCOUNT
+#endif /* APPLE_DARWIN */
+
int get_device_info(int i)
{
int32_t fd = 0;
@@ -712,8 +749,10 @@ int get_device_info(int i)
uint32_t total_sectors;
#endif
struct stat stat_buf;
+#ifdef HDIO_GETGIO
struct hd_geometry geom;
-#ifndef WITH_ANDROID
+#endif
+#if !defined(WITH_ANDROID) && defined(__linux__)
sg_io_hdr_t io_hdr;
unsigned char reply_buffer[96] = {0};
unsigned char model_inq[6] = {MODELINQUIRY};
@@ -750,10 +789,12 @@ int get_device_info(int i)
} else if (S_ISREG(stat_buf.st_mode)) {
dev->total_sectors = stat_buf.st_size / dev->sector_size;
} else if (S_ISBLK(stat_buf.st_mode)) {
+#ifdef BLKSSZGET
if (ioctl(fd, BLKSSZGET, §or_size) < 0)
MSG(0, "\tError: Using the default sector size\n");
else if (dev->sector_size < sector_size)
dev->sector_size = sector_size;
+#endif
#ifdef BLKGETSIZE64
if (ioctl(fd, BLKGETSIZE64, &dev->total_sectors) < 0) {
MSG(0, "\tError: Cannot get the device size\n");
@@ -769,13 +810,17 @@ int get_device_info(int i)
dev->total_sectors /= dev->sector_size;
if (i == 0) {
+#ifdef HDIO_GETGIO
if (ioctl(fd, HDIO_GETGEO, &geom) < 0)
c.start_sector = 0;
else
c.start_sector = geom.start;
+#else
+ c.start_sector = 0;
+#endif
}
-#ifndef WITH_ANDROID
+#if !defined(WITH_ANDROID) && defined(__linux__)
/* Send INQUIRY command */
memset(&io_hdr, 0, sizeof(sg_io_hdr_t));
io_hdr.interface_id = 'S';
@@ -809,7 +854,7 @@ int get_device_info(int i)
return -1;
}
-#ifndef WITH_ANDROID
+#if !defined(WITH_ANDROID) && defined(__linux__)
if (S_ISBLK(stat_buf.st_mode))
f2fs_get_zoned_model(i);
diff --git a/lib/libf2fs_io.c b/lib/libf2fs_io.c
index 8a79672..268dcfa 100644
--- a/lib/libf2fs_io.c
+++ b/lib/libf2fs_io.c
@@ -14,12 +14,16 @@
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
+#ifdef HAVE_MNTENT_H
#include <mntent.h>
+#endif
#include <time.h>
#include <sys/stat.h>
#include <sys/mount.h>
#include <sys/ioctl.h>
+#ifdef HAVE_LINUX_HDREG_H
#include <linux/hdreg.h>
+#endif
#include <f2fs_fs.h>
@@ -54,6 +58,15 @@ static int __get_device_fd(__u64 *offset)
return -1;
}
+#ifndef HAVE_LSEEK64
+typedef off_t off64_t;
+
+static inline off64_t lseek64(int fd, __u64 offset, int set)
+{
+ return lseek(fd, offset, set);
+}
+#endif
+
/*
* IO interfaces
*/
@@ -86,7 +99,11 @@ int dev_read(void *buf, __u64 offset, size_t len)
return 0;
}
+#ifdef POSIX_FADV_WILLNEED
int dev_readahead(__u64 offset, size_t len)
+#else
+int dev_readahead(__u64 offset, size_t UNUSED(len))
+#endif
{
int fd = __get_device_fd(&offset);
diff --git a/mkfs/f2fs_format.c b/mkfs/f2fs_format.c
index 2ba8dd3..d5f39ca 100644
--- a/mkfs/f2fs_format.c
+++ b/mkfs/f2fs_format.c
@@ -254,7 +254,7 @@ static int f2fs_prepare_super_block(void)
set_sb(sit_blkaddr, get_sb(segment0_blkaddr) +
get_sb(segment_count_ckpt) * c.blks_per_seg);
- blocks_for_sit = ALIGN(get_sb(segment_count), SIT_ENTRY_PER_BLOCK);
+ blocks_for_sit = SIZE_ALIGN(get_sb(segment_count), SIT_ENTRY_PER_BLOCK);
sit_segments = SEG_ALIGN(blocks_for_sit);
@@ -267,7 +267,7 @@ static int f2fs_prepare_super_block(void)
(get_sb(segment_count_ckpt) +
get_sb(segment_count_sit))) * c.blks_per_seg;
- blocks_for_nat = ALIGN(total_valid_blks_available,
+ blocks_for_nat = SIZE_ALIGN(total_valid_blks_available,
NAT_ENTRY_PER_BLOCK);
set_sb(segment_count_nat, SEG_ALIGN(blocks_for_nat));
diff --git a/mkfs/f2fs_format_utils.c b/mkfs/f2fs_format_utils.c
index 558684d..a474764 100644
--- a/mkfs/f2fs_format_utils.c
+++ b/mkfs/f2fs_format_utils.c
@@ -6,20 +6,24 @@
*
* Dual licensed under the GPL or LGPL version 2 licenses.
*/
+#ifndef _LARGEFILE_SOURCE
#define _LARGEFILE_SOURCE
+#endif
+#ifndef _LARGEFILE64_SOURCE
#define _LARGEFILE64_SOURCE
+#endif
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
+#include <f2fs_fs.h>
+
#include <stdio.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <fcntl.h>
-#include "f2fs_fs.h"
-
#ifdef HAVE_LINUX_FS_H
#include <linux/fs.h>
#endif
@@ -68,7 +72,7 @@ static int trim_device(int i)
MSG(0, "Info: This device doesn't support BLKSECDISCARD\n");
} else {
MSG(0, "Info: Secure Discarded %lu MB\n",
- stat_buf.st_size >> 20);
+ (unsigned long)stat_buf.st_size >> 20);
return 0;
}
#endif
diff --git a/tools/Makefile.am b/tools/Makefile.am
index 5a9303f..81cf89b 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -2,10 +2,14 @@
AM_CPPFLAGS = ${libuuid_CFLAGS} -I$(top_srcdir)/include
AM_CFLAGS = -Wall
-sbin_PROGRAMS = f2fstat fibmap.f2fs parse.f2fs f2fscrypt
+sbin_PROGRAMS = f2fstat fibmap.f2fs parse.f2fs
f2fstat_SOURCES = f2fstat.c
fibmap_f2fs_SOURCES = fibmap.c
parse_f2fs_SOURCES = f2fs_io_parse.c
+
+if LINUX
+sbin_PROGRAMS += f2fscrypt
f2fscrypt_SOURCES = f2fscrypt.c sha512.c
f2fscrypt_LDFLAGS = -luuid
dist_man_MANS = f2fscrypt.8
+endif
diff --git a/tools/f2fscrypt.c b/tools/f2fscrypt.c
index 48ea5f6..81ef830 100644
--- a/tools/f2fscrypt.c
+++ b/tools/f2fscrypt.c
@@ -30,7 +30,9 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#ifdef HAVE_MNTENT_H
#include <mntent.h>
+#endif
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/types.h>
@@ -38,7 +40,9 @@
#include <termios.h>
#include <unistd.h>
#include <signal.h>
+#ifdef __KERNEL__
#include <linux/fs.h>
+#endif
#include <uuid/uuid.h>
#if !defined(HAVE_ADD_KEY) || !defined(HAVE_KEYCTL)
@@ -47,6 +51,7 @@
#ifdef HAVE_SYS_KEY_H
#include <sys/key.h>
#endif
+#include <f2fs_fs.h>
#define F2FS_MAX_KEY_SIZE 64
#define F2FS_MAX_PASSPHRASE_SIZE 1024
@@ -121,7 +126,7 @@ int options;
extern void f2fs_sha512(const unsigned char *in, unsigned long in_size,
unsigned char *out);
-#ifndef HAVE_KEYCTL
+#if !defined(HAVE_KEYCTL)
static long keyctl(int cmd, ...)
{
va_list va;
@@ -137,7 +142,7 @@ static long keyctl(int cmd, ...)
}
#endif
-#ifndef HAVE_ADD_KEY
+#if !defined(HAVE_ADD_KEY)
static key_serial_t add_key(const char *type, const char *description,
const void *payload, size_t plen,
key_serial_t keyring)
diff --git a/tools/fibmap.c b/tools/fibmap.c
index 6b092f5..d17144a 100644
--- a/tools/fibmap.c
+++ b/tools/fibmap.c
@@ -1,4 +1,20 @@
+#if !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__OpenBSD__)
+#define _XOPEN_SOURCE 600
+#define _DARWIN_C_SOURCE
+#define _FILE_OFFSET_BITS 64
+#ifndef _LARGEFILE_SOURCE
+#define _LARGEFILE_SOURCE
+#endif
+#ifndef _LARGEFILE64_SOURCE
#define _LARGEFILE64_SOURCE
+#endif
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+#endif
+#ifndef O_LARGEFILE
+#define O_LARGEFILE 0
+#endif
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
@@ -8,12 +24,25 @@
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
+#ifdef HAVE_SYS_SYSMACROS_H
#include <sys/sysmacros.h>
+#endif
#include <libgen.h>
+#ifdef HAVE_LINUX_HDREG_H
#include <linux/hdreg.h>
+#endif
+#ifdef HAVE_LINUX_TYPES_H
#include <linux/types.h>
+#endif
+#ifdef __KERNEL__
#include <linux/fs.h>
+#endif
#include <inttypes.h>
+#include <f2fs_fs.h>
+
+#ifndef FIBMAP
+#define FIBMAP _IO(0x00, 1) /* bmap access */
+#endif
struct file_ext {
__u32 f_pos;
@@ -31,28 +60,42 @@ void print_ext(struct file_ext *ext)
ext->end_blk, ext->blk_count);
}
+#if defined(HAVE_FSTAT64) && !defined(__OSX_AVAILABLE_BUT_DEPRECATED)
void print_stat(struct stat64 *st)
+#else
+void print_stat(struct stat *st)
+#endif
{
printf("--------------------------------------------\n");
printf("dev [%d:%d]\n", major(st->st_dev), minor(st->st_dev));
printf("ino [0x%8"PRIx64" : %"PRIu64"]\n",
st->st_ino, st->st_ino);
printf("mode [0x%8x : %d]\n", st->st_mode, st->st_mode);
- printf("nlink [0x%8lx : %ld]\n", st->st_nlink, st->st_nlink);
+ printf("nlink [0x%8lx : %ld]\n",
+ (unsigned long)st->st_nlink,
+ (long)st->st_nlink);
printf("uid [0x%8x : %d]\n", st->st_uid, st->st_uid);
printf("gid [0x%8x : %d]\n", st->st_gid, st->st_gid);
printf("size [0x%8"PRIx64" : %"PRIu64"]\n",
- st->st_size, st->st_size);
- printf("blksize [0x%8lx : %ld]\n", st->st_blksize, st->st_blksize);
+ (u64)st->st_size, (u64)st->st_size);
+ printf("blksize [0x%8lx : %ld]\n",
+ (unsigned long)st->st_blksize,
+ (long)st->st_blksize);
printf("blocks [0x%8"PRIx64" : %"PRIu64"]\n",
- st->st_blocks, st->st_blocks);
+ (u64)st->st_blocks, (u64)st->st_blocks);
printf("--------------------------------------------\n\n");
}
-void stat_bdev(struct stat64 *st, unsigned int *start_lba)
+#if defined(HAVE_FSTAT64) && !defined(__OSX_AVAILABLE_BUT_DEPRECATED)
+static void stat_bdev(struct stat64 *st, unsigned int *start_lba)
+#else
+static void stat_bdev(struct stat *st, unsigned int *start_lba)
+#endif
{
struct stat bdev_stat;
+#ifdef HDIO_GETGIO
struct hd_geometry geom;
+#endif
char devname[32] = { 0, };
char linkname[32] = { 0, };
int fd;
@@ -67,10 +110,14 @@ void stat_bdev(struct stat64 *st, unsigned int *start_lba)
goto out;
if (S_ISBLK(bdev_stat.st_mode)) {
+#ifdef HDIO_GETGIO
if (ioctl(fd, HDIO_GETGEO, &geom) < 0)
*start_lba = 0;
else
*start_lba = geom.start;
+#else
+ *start_lba = 0;
+#endif
}
if (readlink(devname, linkname, sizeof(linkname)) < 0)
@@ -90,7 +137,11 @@ int main(int argc, char *argv[])
int fd;
int ret = 0;
char *filename;
+#if defined(HAVE_FSTAT64) && !defined(__OSX_AVAILABLE_BUT_DEPRECATED)
struct stat64 st;
+#else
+ struct stat st;
+#endif
int total_blks;
unsigned int i;
struct file_ext ext;
@@ -112,7 +163,11 @@ int main(int argc, char *argv[])
fsync(fd);
+#if defined(HAVE_FSTAT64) && !defined(__OSX_AVAILABLE_BUT_DEPRECATED)
if (fstat64(fd, &st) < 0) {
+#else
+ if (fstat(fd, &st) < 0) {
+#endif
ret = errno;
perror(filename);
goto out;
--
2.14.0.rc1.383.gd1ce394fe2-goog
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH] f2fs-tools: build binaries in Mac
2017-11-15 4:17 [PATCH] f2fs-tools: build binaries in Mac Jaegeuk Kim
@ 2017-11-15 7:49 ` Chao Yu
2017-11-15 16:22 ` Jaegeuk Kim
0 siblings, 1 reply; 4+ messages in thread
From: Chao Yu @ 2017-11-15 7:49 UTC (permalink / raw)
To: Jaegeuk Kim, linux-f2fs-devel
Hi Jaegeuk,
On 2017/11/15 12:17, Jaegeuk Kim wrote:
> This patch modifies f2fs-tools to be built in mac.
Is there any requirement from Mac ecosystem?
Thanks,
>
> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
> ---
> configure.ac | 99 +++++++++++++++++++++++++++++++++++++++++-------
> fsck/dump.c | 6 +++
> fsck/f2fs.h | 5 ++-
> fsck/fsck.c | 4 +-
> fsck/mount.c | 10 +++++
> fsck/quotaio_tree.h | 4 ++
> fsck/resize.c | 5 ++-
> fsck/sload.c | 2 +
> fsck/xattr.c | 3 --
> fsck/xattr.h | 20 ++++++++++
> include/android_config.h | 54 ++++++++++++++++++++++++++
> include/f2fs_fs.h | 39 +++++++++++++++----
> lib/libf2fs.c | 61 +++++++++++++++++++++++++----
> lib/libf2fs_io.c | 17 +++++++++
> mkfs/f2fs_format.c | 4 +-
> mkfs/f2fs_format_utils.c | 10 +++--
> tools/Makefile.am | 6 ++-
> tools/f2fscrypt.c | 9 ++++-
> tools/fibmap.c | 65 ++++++++++++++++++++++++++++---
> 19 files changed, 371 insertions(+), 52 deletions(-)
> create mode 100644 include/android_config.h
>
> diff --git a/configure.ac b/configure.ac
> index 451b2de..73c830d 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -35,16 +35,6 @@ AC_CONFIG_MACRO_DIR([m4])
> AC_CONFIG_AUX_DIR([build-aux])
> AM_INIT_AUTOMAKE([foreign tar-pax dist-xz])
>
> -AC_CHECK_HEADERS_ONCE([
> - fcntl.h
> - mntent.h
> - stdlib.h
> - string.h
> - unistd.h
> - sys/ioctl.h
> - sys/mount.h
> -])
> -
> # Test configure options.
> AC_ARG_WITH([selinux],
> AS_HELP_STRING([--without-selinux],
> @@ -91,9 +81,30 @@ AS_IF([test "x$have_blkid" = "xyes"],
> )
>
> # Checks for header files.
> -AC_CHECK_HEADERS([linux/fs.h linux/blkzoned.h fcntl.h mntent.h stdlib.h string.h \
> - sys/ioctl.h sys/mount.h unistd.h linux/falloc.h byteswap.h \
> - attr/xattr.h linux/xattr.h linux/posix_acl.h sys/acl.h])
> +AC_CHECK_HEADERS(m4_flatten([
> + attr/xattr.h
> + byteswap.h
> + fcntl.h
> + linux/blkzoned.h
> + linux/falloc.h
> + linux/fs.h
> + linux/hdreg.h
> + linux/limits.h
> + linux/posix_acl.h
> + linux/types.h
> + linux/xattr.h
> + mntent.h
> + scsi/sg.h
> + stdlib.h
> + string.h
> + sys/acl.h
> + sys/ioctl.h
> + sys/syscall.h
> + sys/mount.h
> + sys/sysmacros.h
> + sys/xattr.h
> + unistd.h
> +]))
>
> # Checks for typedefs, structures, and compiler characteristics.
> AC_C_INLINE
> @@ -104,15 +115,75 @@ AC_TYPE_SIZE_T
> # Checks for library functions.
> AC_FUNC_GETMNTENT
> AC_CHECK_FUNCS_ONCE([
> + add_key
> fallocate
> + fsetxattr
> + fstat
> + fstat64
> getmntent
> + keyctl
> + llseek
> + lseek64
> memset
> - fsetxattr
> + setmntent
> ])
>
> AS_IF([test "$ac_cv_header_byteswap_h" = "yes"],
> [AC_CHECK_DECLS([bswap_64],,,[#include <byteswap.h>])])
>
> +dnl
> +dnl Check to see if llseek() is declared in unistd.h. On some libc's
> +dnl it is, and on others it isn't..... Thank you glibc developers....
> +dnl
> +AC_CHECK_DECL(llseek,[AC_DEFINE(HAVE_LLSEEK_PROTOTYPE, 1,
> + [Define to 1 if llseek declared in unistd.h])],,
> + [#include <unistd.h>])
> +dnl
> +dnl Check to see if lseek64() is declared in unistd.h. Glibc's header files
> +dnl are so convoluted that I can't tell whether it will always be defined,
> +dnl and if it isn't defined while lseek64 is defined in the library,
> +dnl disaster will strike.
> +dnl
> +dnl Warning! Use of --enable-gcc-wall may throw off this test.
> +dnl
> +dnl
> +AC_CHECK_DECL(lseek64,[AC_DEFINE(HAVE_LSEEK64_PROTOTYPE, 1,
> + [Define to 1 if lseek64 declared in unistd.h])],,
> + [#define _LARGEFILE_SOURCE
> + #define _LARGEFILE64_SOURCE
> + #include <unistd.h>])
> +dnl
> +dnl Word sizes...
> +dnl
> +
> +# AC_CANONICAL_HOST is needed to access the 'host_os' variable
> +AC_CANONICAL_HOST
> +
> +build_linux=no
> +build_windows=no
> +build_mac=no
> +
> +# Detect the target system
> +case "${host_os}" in
> +linux*)
> + build_linux=yes
> + ;;
> +cygwin*|mingw*)
> + build_windows=yes
> + ;;
> +darwin*)
> + build_mac=yes
> + ;;
> +*)
> + AC_MSG_ERROR(["OS $host_os is not supported"])
> + ;;
> +esac
> +
> +# Pass the conditionals to automake
> +AM_CONDITIONAL([LINUX], [test "$build_linux" = "yes"])
> +AM_CONDITIONAL([WINDOWS], [test "$build_windows" = "yes"])
> +AM_CONDITIONAL([OSX], [test "$build_mac" = "yes"])
> +
> # Install directories
> #AC_PREFIX_DEFAULT([/usr])
> #AC_SUBST([sbindir], [/sbin])
> diff --git a/fsck/dump.c b/fsck/dump.c
> index ec69f25..9f0993e 100644
> --- a/fsck/dump.c
> +++ b/fsck/dump.c
> @@ -360,8 +360,14 @@ static void dump_xattr(struct f2fs_sb_info *sbi, struct f2fs_node *node_blk)
> }
>
> DBG(1, "fd %d xattr_name %s\n", c.dump_fd, xattr_name);
> +#if defined(__linux__)
> ret = fsetxattr(c.dump_fd, xattr_name, value,
> le16_to_cpu(ent->e_value_size), 0);
> +#elif defined(__APPLE__)
> + ret = fsetxattr(c.dump_fd, xattr_name, value,
> + le16_to_cpu(ent->e_value_size), 0,
> + XATTR_CREATE);
> +#endif
> if (ret)
> MSG(0, "XATTR index 0x%x set xattr failed error %d\n",
> ent->e_name_index, errno);
> diff --git a/fsck/f2fs.h b/fsck/f2fs.h
> index 542594e..34b2481 100644
> --- a/fsck/f2fs.h
> +++ b/fsck/f2fs.h
> @@ -11,6 +11,7 @@
> #ifndef _F2FS_H_
> #define _F2FS_H_
>
> +#include <f2fs_fs.h>
> #include <stdlib.h>
> #include <unistd.h>
> #include <stdio.h>
> @@ -18,14 +19,14 @@
> #include <fcntl.h>
> #include <string.h>
> #include <errno.h>
> +#ifdef HAVE_MNTENT_H
> #include <mntent.h>
> +#endif
> #include <sys/stat.h>
> #include <sys/ioctl.h>
> #include <sys/mount.h>
> #include <assert.h>
>
> -#include <f2fs_fs.h>
> -
> #define EXIT_ERR_CODE (-1)
> #define ver_after(a, b) (typecheck(unsigned long long, a) && \
> typecheck(unsigned long long, b) && \
> diff --git a/fsck/fsck.c b/fsck/fsck.c
> index ef46e33..ec88712 100644
> --- a/fsck/fsck.c
> +++ b/fsck/fsck.c
> @@ -881,14 +881,14 @@ skip_blkcnt_fix:
> }
> if (ftype == F2FS_FT_SYMLINK && i_blocks && i_size == 0) {
> DBG(1, "ino: 0x%x i_blocks: %lu with zero i_size",
> - nid, i_blocks);
> + nid, (unsigned long)i_blocks);
> if (c.fix_on) {
> u64 i_size = i_blocks * F2FS_BLKSIZE;
>
> node_blk->i.i_size = cpu_to_le64(i_size);
> need_fix = 1;
> FIX_MSG("Symlink: recover 0x%x with i_size=%lu",
> - nid, i_size);
> + nid, (unsigned long)i_size);
> }
> }
>
> diff --git a/fsck/mount.c b/fsck/mount.c
> index 826a2f9..653dcf3 100644
> --- a/fsck/mount.c
> +++ b/fsck/mount.c
> @@ -18,6 +18,16 @@
> #include <sys/acl.h>
> #endif
>
> +#ifndef ACL_UNDEFINED_TAG
> +#define ACL_UNDEFINED_TAG (0x00)
> +#define ACL_USER_OBJ (0x01)
> +#define ACL_USER (0x02)
> +#define ACL_GROUP_OBJ (0x04)
> +#define ACL_GROUP (0x08)
> +#define ACL_MASK (0x10)
> +#define ACL_OTHER (0x20)
> +#endif
> +
> u32 get_free_segments(struct f2fs_sb_info *sbi)
> {
> u32 i, free_segs = 0;
> diff --git a/fsck/quotaio_tree.h b/fsck/quotaio_tree.h
> index 4ca2d7f..aed93a8 100644
> --- a/fsck/quotaio_tree.h
> +++ b/fsck/quotaio_tree.h
> @@ -6,9 +6,13 @@
> #define _LINUX_QUOTA_TREE_H
>
> #include <inttypes.h>
> +#ifdef HAVE_LINUX_TYPES_H
> #include <linux/types.h>
> +#endif
> #include <sys/types.h>
>
> +#include <f2fs_fs.h>
> +
> typedef __u32 qid_t; /* Type in which we store ids in memory */
>
> #define QT_TREEOFF 1 /* Offset of tree in file in blocks */
> diff --git a/fsck/resize.c b/fsck/resize.c
> index 4584d6f..6c3eeab 100644
> --- a/fsck/resize.c
> +++ b/fsck/resize.c
> @@ -36,7 +36,7 @@ static int get_new_sb(struct f2fs_super_block *sb)
> zone_align_start_offset) / segment_size_bytes /
> c.segs_per_sec * c.segs_per_sec);
>
> - blocks_for_sit = ALIGN(get_sb(segment_count), SIT_ENTRY_PER_BLOCK);
> + blocks_for_sit = SIZE_ALIGN(get_sb(segment_count), SIT_ENTRY_PER_BLOCK);
> sit_segments = SEG_ALIGN(blocks_for_sit);
> set_sb(segment_count_sit, sit_segments * 2);
> set_sb(nat_blkaddr, get_sb(sit_blkaddr) +
> @@ -45,7 +45,8 @@ static int get_new_sb(struct f2fs_super_block *sb)
> total_valid_blks_available = (get_sb(segment_count) -
> (get_sb(segment_count_ckpt) +
> get_sb(segment_count_sit))) * blks_per_seg;
> - blocks_for_nat = ALIGN(total_valid_blks_available, NAT_ENTRY_PER_BLOCK);
> + blocks_for_nat = SIZE_ALIGN(total_valid_blks_available,
> + NAT_ENTRY_PER_BLOCK);
> set_sb(segment_count_nat, SEG_ALIGN(blocks_for_nat));
>
> sit_bitmap_size = ((get_sb(segment_count_sit) / 2) <<
> diff --git a/fsck/sload.c b/fsck/sload.c
> index 68799c1..bfc79f2 100644
> --- a/fsck/sload.c
> +++ b/fsck/sload.c
> @@ -15,7 +15,9 @@
> #include "fsck.h"
> #include <libgen.h>
> #include <dirent.h>
> +#ifdef HAVE_MNTENT_H
> #include <mntent.h>
> +#endif
>
> #ifdef HAVE_LIBSELINUX
> #include <selinux/selinux.h>
> diff --git a/fsck/xattr.c b/fsck/xattr.c
> index 1d0f7d3..f2576cd 100644
> --- a/fsck/xattr.c
> +++ b/fsck/xattr.c
> @@ -17,9 +17,6 @@
> #include "node.h"
> #include "xattr.h"
>
> -#define XATTR_CREATE 0x1
> -#define XATTR_REPLACE 0x2
> -
> void *read_all_xattrs(struct f2fs_sb_info *sbi, struct f2fs_node *inode)
> {
> struct f2fs_xattr_header *header;
> diff --git a/fsck/xattr.h b/fsck/xattr.h
> index beed3bb..e4a98e2 100644
> --- a/fsck/xattr.h
> +++ b/fsck/xattr.h
> @@ -17,6 +17,9 @@
> #define _XATTR_H_
>
> #include "f2fs.h"
> +#ifdef HAVE_SYS_XATTR_H
> +#include <sys/xattr.h>
> +#endif
>
> struct f2fs_xattr_header {
> __le32 h_magic; /* magic number for identification */
> @@ -76,6 +79,23 @@ static inline int f2fs_acl_count(int size)
> }
> }
>
> +#ifndef XATTR_USER_PREFIX
> +#define XATTR_USER_PREFIX "user."
> +#endif
> +#ifndef XATTR_SECURITY_PREFIX
> +#define XATTR_SECURITY_PREFIX "security."
> +#endif
> +#ifndef XATTR_TRUSTED_PREFIX
> +#define XATTR_TRUSTED_PREFIX "trusted."
> +#endif
> +
> +#ifndef XATTR_CREATE
> +#define XATTR_CREATE 0x1
> +#endif
> +#ifndef XATTR_REPLACE
> +#define XATTR_REPLACE 0x2
> +#endif
> +
> #define XATTR_ROUND (3)
>
> #define XATTR_SELINUX_SUFFIX "selinux"
> diff --git a/include/android_config.h b/include/android_config.h
> new file mode 100644
> index 0000000..bfc4105
> --- /dev/null
> +++ b/include/android_config.h
> @@ -0,0 +1,54 @@
> +#if defined(__linux__)
> +#define HAVE_BYTESWAP_H 1
> +#define HAVE_FCNTL_H 1
> +#define HAVE_FALLOC_H 1
> +#define HAVE_LINUX_HDREG_H 1
> +#define HAVE_LINUX_LIMITS_H 1
> +#define HAVE_POSIX_ACL_H 1
> +#define HAVE_LINUX_TYPES_H 1
> +#define HAVE_LINUX_XATTR_H 1
> +#define HAVE_MNTENT_H 1
> +#define HAVE_STDLIB_H 1
> +#define HAVE_STRING_H 1
> +#define HAVE_SYS_IOCTL_H 1
> +#define HAVE_SYS_SYSCALL_H 1
> +#define HAVE_SYS_MOUNT_H 1
> +#define HAVE_SYS_SYSMACROS_H 1
> +#define HAVE_SYS_XATTR_H 1
> +#define HAVE_UNISTD_H 1
> +
> +#define HAVE_ADD_KEY 1
> +#define HAVE_FALLOCATE 1
> +#define HAVE_FSETXATTR 1
> +#define HAVE_FSTAT 1
> +#define HAVE_FSTAT64 1
> +#define HAVE_GETMNTENT 1
> +#define HAVE_KEYCTL 1
> +#define HAVE_LLSEEK 1
> +#define HAVE_LSEEK64 1
> +#define HAVE_MEMSET 1
> +#define HAVE_SETMNTENT 1
> +#endif
> +
> +#if defined(__APPLE__)
> +#define HAVE_FCNTL_H 1
> +#define HAVE_FALLOC_H 1
> +#define HAVE_POSIX_ACL_H 1
> +#define HAVE_STDLIB_H 1
> +#define HAVE_STRING_H 1
> +#define HAVE_SYS_IOCTL_H 1
> +#define HAVE_SYS_SYSCALL_H 1
> +#define HAVE_SYS_MOUNT_H 1
> +#define HAVE_SYS_XATTR_H 1
> +#define HAVE_UNISTD_H 1
> +
> +#define HAVE_ADD_KEY 1
> +#define HAVE_FALLOCATE 1
> +#define HAVE_FSETXATTR 1
> +#define HAVE_FSTAT 1
> +#define HAVE_FSTAT64 1
> +#define HAVE_GETMNTENT 1
> +#define HAVE_KEYCTL 1
> +#define HAVE_LLSEEK 1
> +#define HAVE_MEMSET 1
> +#endif
> diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
> index 8d67a76..05b893a 100644
> --- a/include/f2fs_fs.h
> +++ b/include/f2fs_fs.h
> @@ -12,14 +12,20 @@
> #ifndef __F2FS_FS_H__
> #define __F2FS_FS_H__
>
> -#include <inttypes.h>
> -#include <linux/types.h>
> -#include <sys/types.h>
> -
> #ifdef HAVE_CONFIG_H
> #include <config.h>
> #endif
>
> +#ifdef WITH_ANDROID
> +#include <android_config.h>
> +#endif
> +
> +#include <inttypes.h>
> +#ifdef HAVE_LINUX_TYPES_H
> +#include <linux/types.h>
> +#endif
> +#include <sys/types.h>
> +
> #ifdef HAVE_LINUX_BLKZONED_H
> #include <linux/blkzoned.h>
> #endif
> @@ -39,10 +45,25 @@ typedef u_int16_t u16;
> typedef u_int8_t u8;
> typedef u32 block_t;
> typedef u32 nid_t;
> +#ifndef bool
> typedef u8 bool;
> +#endif
> typedef unsigned long pgoff_t;
> typedef unsigned short umode_t;
>
> +#ifndef HAVE_LINUX_TYPES_H
> +typedef u8 __u8;
> +typedef u16 __u16;
> +typedef u32 __u32;
> +typedef u64 __u64;
> +typedef u16 __le16;
> +typedef u32 __le32;
> +typedef u64 __le64;
> +typedef u16 __be16;
> +typedef u32 __be32;
> +typedef u64 __be64;
> +#endif
> +
> #if HAVE_BYTESWAP_H
> #include <byteswap.h>
> #else
> @@ -226,7 +247,9 @@ static inline uint64_t bswap_64(uint64_t val)
> snprintf(buf, len, #member)
>
> /* these are defined in kernel */
> +#ifndef PAGE_SIZE
> #define PAGE_SIZE 4096
> +#endif
> #define PAGE_CACHE_SIZE 4096
> #define BITS_PER_BYTE 8
> #define F2FS_SUPER_MAGIC 0xF2F52010 /* F2FS Magic Number */
> @@ -784,7 +807,7 @@ struct f2fs_nat_block {
> * disk is 16 TB and it equals to 16 * 1024 * 1024 / 2 segments.
> */
> #define F2FS_MAX_SEGMENT ((16 * 1024 * 1024) / 2)
> -#define MAX_SIT_BITMAP_SIZE (SEG_ALIGN(ALIGN(F2FS_MAX_SEGMENT, \
> +#define MAX_SIT_BITMAP_SIZE (SEG_ALIGN(SIZE_ALIGN(F2FS_MAX_SEGMENT, \
> SIT_ENTRY_PER_BLOCK)) * \
> c.blks_per_seg / 8)
>
> @@ -1146,9 +1169,9 @@ extern int f2fs_reset_zones(int);
>
> extern struct f2fs_configuration c;
>
> -#define ALIGN(val, size) ((val) + (size) - 1) / (size)
> -#define SEG_ALIGN(blks) ALIGN(blks, c.blks_per_seg)
> -#define ZONE_ALIGN(blks) ALIGN(blks, c.blks_per_seg * \
> +#define SIZE_ALIGN(val, size) ((val) + (size) - 1) / (size)
> +#define SEG_ALIGN(blks) SIZE_ALIGN(blks, c.blks_per_seg)
> +#define ZONE_ALIGN(blks) SIZE_ALIGN(blks, c.blks_per_seg * \
> c.segs_per_zone)
>
> static inline double get_best_overprovision(struct f2fs_super_block *sb)
> diff --git a/lib/libf2fs.c b/lib/libf2fs.c
> index 0f1fead..1e63843 100644
> --- a/lib/libf2fs.c
> +++ b/lib/libf2fs.c
> @@ -8,25 +8,34 @@
> */
> #define _LARGEFILE64_SOURCE
>
> +#include <f2fs_fs.h>
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> #include <errno.h>
> #include <unistd.h>
> #include <fcntl.h>
> +#ifdef HAVE_MNTENT_H
> #include <mntent.h>
> +#endif
> #include <time.h>
> #include <sys/stat.h>
> #include <sys/mount.h>
> #include <sys/ioctl.h>
> +#ifdef HAVE_SYS_SYSMACROS_H
> #include <sys/sysmacros.h>
> +#endif
> #ifndef WITH_ANDROID
> +#ifdef HAVE_SCSI_SG_H
> #include <scsi/sg.h>
> #endif
> +#endif
> +#ifdef HAVE_LINUX_HDREG_H
> #include <linux/hdreg.h>
> +#endif
> +#ifdef HAVE_LINUX_LIMITS_H
> #include <linux/limits.h>
> -
> -#include <f2fs_fs.h>
> +#endif
>
> #ifndef WITH_ANDROID
> /* SCSI command for standard inquiry*/
> @@ -607,6 +616,7 @@ void f2fs_init_configuration(void)
> c.dry_run = 0;
> }
>
> +#ifdef HAVE_SETMNTENT
> static int is_mounted(const char *mpt, const char *device)
> {
> FILE *file = NULL;
> @@ -628,6 +638,7 @@ static int is_mounted(const char *mpt, const char *device)
> endmntent(file);
> return mnt ? 1 : 0;
> }
> +#endif
>
> int f2fs_dev_is_umounted(char *path)
> {
> @@ -642,29 +653,36 @@ int f2fs_dev_is_umounted(char *path)
> * try with /proc/mounts fist to detect RDONLY.
> * f2fs_stop_checkpoint makes RO in /proc/mounts while RW in /etc/mtab.
> */
> +#ifdef __linux__
> ret = is_mounted("/proc/mounts", path);
> if (ret) {
> MSG(0, "Info: Mounted device!\n");
> return -1;
> }
> -
> +#endif
> +#if defined(MOUNTED) || defined(_PATH_MOUNTED)
> +#ifndef MOUNTED
> +#define MOUNTED _PATH_MOUNTED
> +#endif
> ret = is_mounted(MOUNTED, path);
> if (ret) {
> MSG(0, "Info: Mounted device!\n");
> return -1;
> }
> -
> +#endif
> /*
> * If we are supposed to operate on the root device, then
> * also check the mounts for '/dev/root', which sometimes
> * functions as an alias for the root device.
> */
> if (is_rootdev) {
> +#ifdef __linux__
> ret = is_mounted("/proc/mounts", "/dev/root");
> if (ret) {
> MSG(0, "Info: Mounted device!\n");
> return -1;
> }
> +#endif
> }
>
> /*
> @@ -681,7 +699,7 @@ int f2fs_dev_is_umounted(char *path)
> return -1;
> }
> }
> - return 0;
> + return ret;
> }
>
> int f2fs_devs_are_umounted(void)
> @@ -704,6 +722,25 @@ void get_kernel_version(__u8 *version)
> memset(version + i, 0, VERSION_LEN + 1 - i);
> }
>
> +
> +#if defined(__linux__) && defined(_IO) && !defined(BLKGETSIZE)
> +#define BLKGETSIZE _IO(0x12,96)
> +#endif
> +
> +#if defined(__linux__) && defined(_IOR) && !defined(BLKGETSIZE64)
> +#define BLKGETSIZE64 _IOR(0x12,114, size_t)
> +#endif
> +
> +#if defined(__linux__) && defined(_IO) && !defined(BLKSSZGET)
> +#define BLKSSZGET _IO(0x12,104)
> +#endif
> +
> +#if defined(__APPLE__)
> +#include <sys/disk.h>
> +#define BLKGETSIZE DKIOCGETBLOCKCOUNT
> +#define BLKSSZGET DKIOCGETBLOCKCOUNT
> +#endif /* APPLE_DARWIN */
> +
> int get_device_info(int i)
> {
> int32_t fd = 0;
> @@ -712,8 +749,10 @@ int get_device_info(int i)
> uint32_t total_sectors;
> #endif
> struct stat stat_buf;
> +#ifdef HDIO_GETGIO
> struct hd_geometry geom;
> -#ifndef WITH_ANDROID
> +#endif
> +#if !defined(WITH_ANDROID) && defined(__linux__)
> sg_io_hdr_t io_hdr;
> unsigned char reply_buffer[96] = {0};
> unsigned char model_inq[6] = {MODELINQUIRY};
> @@ -750,10 +789,12 @@ int get_device_info(int i)
> } else if (S_ISREG(stat_buf.st_mode)) {
> dev->total_sectors = stat_buf.st_size / dev->sector_size;
> } else if (S_ISBLK(stat_buf.st_mode)) {
> +#ifdef BLKSSZGET
> if (ioctl(fd, BLKSSZGET, §or_size) < 0)
> MSG(0, "\tError: Using the default sector size\n");
> else if (dev->sector_size < sector_size)
> dev->sector_size = sector_size;
> +#endif
> #ifdef BLKGETSIZE64
> if (ioctl(fd, BLKGETSIZE64, &dev->total_sectors) < 0) {
> MSG(0, "\tError: Cannot get the device size\n");
> @@ -769,13 +810,17 @@ int get_device_info(int i)
> dev->total_sectors /= dev->sector_size;
>
> if (i == 0) {
> +#ifdef HDIO_GETGIO
> if (ioctl(fd, HDIO_GETGEO, &geom) < 0)
> c.start_sector = 0;
> else
> c.start_sector = geom.start;
> +#else
> + c.start_sector = 0;
> +#endif
> }
>
> -#ifndef WITH_ANDROID
> +#if !defined(WITH_ANDROID) && defined(__linux__)
> /* Send INQUIRY command */
> memset(&io_hdr, 0, sizeof(sg_io_hdr_t));
> io_hdr.interface_id = 'S';
> @@ -809,7 +854,7 @@ int get_device_info(int i)
> return -1;
> }
>
> -#ifndef WITH_ANDROID
> +#if !defined(WITH_ANDROID) && defined(__linux__)
> if (S_ISBLK(stat_buf.st_mode))
> f2fs_get_zoned_model(i);
>
> diff --git a/lib/libf2fs_io.c b/lib/libf2fs_io.c
> index 8a79672..268dcfa 100644
> --- a/lib/libf2fs_io.c
> +++ b/lib/libf2fs_io.c
> @@ -14,12 +14,16 @@
> #include <errno.h>
> #include <unistd.h>
> #include <fcntl.h>
> +#ifdef HAVE_MNTENT_H
> #include <mntent.h>
> +#endif
> #include <time.h>
> #include <sys/stat.h>
> #include <sys/mount.h>
> #include <sys/ioctl.h>
> +#ifdef HAVE_LINUX_HDREG_H
> #include <linux/hdreg.h>
> +#endif
>
> #include <f2fs_fs.h>
>
> @@ -54,6 +58,15 @@ static int __get_device_fd(__u64 *offset)
> return -1;
> }
>
> +#ifndef HAVE_LSEEK64
> +typedef off_t off64_t;
> +
> +static inline off64_t lseek64(int fd, __u64 offset, int set)
> +{
> + return lseek(fd, offset, set);
> +}
> +#endif
> +
> /*
> * IO interfaces
> */
> @@ -86,7 +99,11 @@ int dev_read(void *buf, __u64 offset, size_t len)
> return 0;
> }
>
> +#ifdef POSIX_FADV_WILLNEED
> int dev_readahead(__u64 offset, size_t len)
> +#else
> +int dev_readahead(__u64 offset, size_t UNUSED(len))
> +#endif
> {
> int fd = __get_device_fd(&offset);
>
> diff --git a/mkfs/f2fs_format.c b/mkfs/f2fs_format.c
> index 2ba8dd3..d5f39ca 100644
> --- a/mkfs/f2fs_format.c
> +++ b/mkfs/f2fs_format.c
> @@ -254,7 +254,7 @@ static int f2fs_prepare_super_block(void)
> set_sb(sit_blkaddr, get_sb(segment0_blkaddr) +
> get_sb(segment_count_ckpt) * c.blks_per_seg);
>
> - blocks_for_sit = ALIGN(get_sb(segment_count), SIT_ENTRY_PER_BLOCK);
> + blocks_for_sit = SIZE_ALIGN(get_sb(segment_count), SIT_ENTRY_PER_BLOCK);
>
> sit_segments = SEG_ALIGN(blocks_for_sit);
>
> @@ -267,7 +267,7 @@ static int f2fs_prepare_super_block(void)
> (get_sb(segment_count_ckpt) +
> get_sb(segment_count_sit))) * c.blks_per_seg;
>
> - blocks_for_nat = ALIGN(total_valid_blks_available,
> + blocks_for_nat = SIZE_ALIGN(total_valid_blks_available,
> NAT_ENTRY_PER_BLOCK);
>
> set_sb(segment_count_nat, SEG_ALIGN(blocks_for_nat));
> diff --git a/mkfs/f2fs_format_utils.c b/mkfs/f2fs_format_utils.c
> index 558684d..a474764 100644
> --- a/mkfs/f2fs_format_utils.c
> +++ b/mkfs/f2fs_format_utils.c
> @@ -6,20 +6,24 @@
> *
> * Dual licensed under the GPL or LGPL version 2 licenses.
> */
> +#ifndef _LARGEFILE_SOURCE
> #define _LARGEFILE_SOURCE
> +#endif
> +#ifndef _LARGEFILE64_SOURCE
> #define _LARGEFILE64_SOURCE
> +#endif
> #ifndef _GNU_SOURCE
> #define _GNU_SOURCE
> #endif
>
> +#include <f2fs_fs.h>
> +
> #include <stdio.h>
> #include <unistd.h>
> #include <sys/ioctl.h>
> #include <sys/stat.h>
> #include <fcntl.h>
>
> -#include "f2fs_fs.h"
> -
> #ifdef HAVE_LINUX_FS_H
> #include <linux/fs.h>
> #endif
> @@ -68,7 +72,7 @@ static int trim_device(int i)
> MSG(0, "Info: This device doesn't support BLKSECDISCARD\n");
> } else {
> MSG(0, "Info: Secure Discarded %lu MB\n",
> - stat_buf.st_size >> 20);
> + (unsigned long)stat_buf.st_size >> 20);
> return 0;
> }
> #endif
> diff --git a/tools/Makefile.am b/tools/Makefile.am
> index 5a9303f..81cf89b 100644
> --- a/tools/Makefile.am
> +++ b/tools/Makefile.am
> @@ -2,10 +2,14 @@
>
> AM_CPPFLAGS = ${libuuid_CFLAGS} -I$(top_srcdir)/include
> AM_CFLAGS = -Wall
> -sbin_PROGRAMS = f2fstat fibmap.f2fs parse.f2fs f2fscrypt
> +sbin_PROGRAMS = f2fstat fibmap.f2fs parse.f2fs
> f2fstat_SOURCES = f2fstat.c
> fibmap_f2fs_SOURCES = fibmap.c
> parse_f2fs_SOURCES = f2fs_io_parse.c
> +
> +if LINUX
> +sbin_PROGRAMS += f2fscrypt
> f2fscrypt_SOURCES = f2fscrypt.c sha512.c
> f2fscrypt_LDFLAGS = -luuid
> dist_man_MANS = f2fscrypt.8
> +endif
> diff --git a/tools/f2fscrypt.c b/tools/f2fscrypt.c
> index 48ea5f6..81ef830 100644
> --- a/tools/f2fscrypt.c
> +++ b/tools/f2fscrypt.c
> @@ -30,7 +30,9 @@
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> +#ifdef HAVE_MNTENT_H
> #include <mntent.h>
> +#endif
> #include <sys/ioctl.h>
> #include <sys/stat.h>
> #include <sys/types.h>
> @@ -38,7 +40,9 @@
> #include <termios.h>
> #include <unistd.h>
> #include <signal.h>
> +#ifdef __KERNEL__
> #include <linux/fs.h>
> +#endif
> #include <uuid/uuid.h>
>
> #if !defined(HAVE_ADD_KEY) || !defined(HAVE_KEYCTL)
> @@ -47,6 +51,7 @@
> #ifdef HAVE_SYS_KEY_H
> #include <sys/key.h>
> #endif
> +#include <f2fs_fs.h>
>
> #define F2FS_MAX_KEY_SIZE 64
> #define F2FS_MAX_PASSPHRASE_SIZE 1024
> @@ -121,7 +126,7 @@ int options;
> extern void f2fs_sha512(const unsigned char *in, unsigned long in_size,
> unsigned char *out);
>
> -#ifndef HAVE_KEYCTL
> +#if !defined(HAVE_KEYCTL)
> static long keyctl(int cmd, ...)
> {
> va_list va;
> @@ -137,7 +142,7 @@ static long keyctl(int cmd, ...)
> }
> #endif
>
> -#ifndef HAVE_ADD_KEY
> +#if !defined(HAVE_ADD_KEY)
> static key_serial_t add_key(const char *type, const char *description,
> const void *payload, size_t plen,
> key_serial_t keyring)
> diff --git a/tools/fibmap.c b/tools/fibmap.c
> index 6b092f5..d17144a 100644
> --- a/tools/fibmap.c
> +++ b/tools/fibmap.c
> @@ -1,4 +1,20 @@
> +#if !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__OpenBSD__)
> +#define _XOPEN_SOURCE 600
> +#define _DARWIN_C_SOURCE
> +#define _FILE_OFFSET_BITS 64
> +#ifndef _LARGEFILE_SOURCE
> +#define _LARGEFILE_SOURCE
> +#endif
> +#ifndef _LARGEFILE64_SOURCE
> #define _LARGEFILE64_SOURCE
> +#endif
> +#ifndef _GNU_SOURCE
> +#define _GNU_SOURCE
> +#endif
> +#endif
> +#ifndef O_LARGEFILE
> +#define O_LARGEFILE 0
> +#endif
> #include <unistd.h>
> #include <string.h>
> #include <stdlib.h>
> @@ -8,12 +24,25 @@
> #include <sys/types.h>
> #include <sys/ioctl.h>
> #include <sys/stat.h>
> +#ifdef HAVE_SYS_SYSMACROS_H
> #include <sys/sysmacros.h>
> +#endif
> #include <libgen.h>
> +#ifdef HAVE_LINUX_HDREG_H
> #include <linux/hdreg.h>
> +#endif
> +#ifdef HAVE_LINUX_TYPES_H
> #include <linux/types.h>
> +#endif
> +#ifdef __KERNEL__
> #include <linux/fs.h>
> +#endif
> #include <inttypes.h>
> +#include <f2fs_fs.h>
> +
> +#ifndef FIBMAP
> +#define FIBMAP _IO(0x00, 1) /* bmap access */
> +#endif
>
> struct file_ext {
> __u32 f_pos;
> @@ -31,28 +60,42 @@ void print_ext(struct file_ext *ext)
> ext->end_blk, ext->blk_count);
> }
>
> +#if defined(HAVE_FSTAT64) && !defined(__OSX_AVAILABLE_BUT_DEPRECATED)
> void print_stat(struct stat64 *st)
> +#else
> +void print_stat(struct stat *st)
> +#endif
> {
> printf("--------------------------------------------\n");
> printf("dev [%d:%d]\n", major(st->st_dev), minor(st->st_dev));
> printf("ino [0x%8"PRIx64" : %"PRIu64"]\n",
> st->st_ino, st->st_ino);
> printf("mode [0x%8x : %d]\n", st->st_mode, st->st_mode);
> - printf("nlink [0x%8lx : %ld]\n", st->st_nlink, st->st_nlink);
> + printf("nlink [0x%8lx : %ld]\n",
> + (unsigned long)st->st_nlink,
> + (long)st->st_nlink);
> printf("uid [0x%8x : %d]\n", st->st_uid, st->st_uid);
> printf("gid [0x%8x : %d]\n", st->st_gid, st->st_gid);
> printf("size [0x%8"PRIx64" : %"PRIu64"]\n",
> - st->st_size, st->st_size);
> - printf("blksize [0x%8lx : %ld]\n", st->st_blksize, st->st_blksize);
> + (u64)st->st_size, (u64)st->st_size);
> + printf("blksize [0x%8lx : %ld]\n",
> + (unsigned long)st->st_blksize,
> + (long)st->st_blksize);
> printf("blocks [0x%8"PRIx64" : %"PRIu64"]\n",
> - st->st_blocks, st->st_blocks);
> + (u64)st->st_blocks, (u64)st->st_blocks);
> printf("--------------------------------------------\n\n");
> }
>
> -void stat_bdev(struct stat64 *st, unsigned int *start_lba)
> +#if defined(HAVE_FSTAT64) && !defined(__OSX_AVAILABLE_BUT_DEPRECATED)
> +static void stat_bdev(struct stat64 *st, unsigned int *start_lba)
> +#else
> +static void stat_bdev(struct stat *st, unsigned int *start_lba)
> +#endif
> {
> struct stat bdev_stat;
> +#ifdef HDIO_GETGIO
> struct hd_geometry geom;
> +#endif
> char devname[32] = { 0, };
> char linkname[32] = { 0, };
> int fd;
> @@ -67,10 +110,14 @@ void stat_bdev(struct stat64 *st, unsigned int *start_lba)
> goto out;
>
> if (S_ISBLK(bdev_stat.st_mode)) {
> +#ifdef HDIO_GETGIO
> if (ioctl(fd, HDIO_GETGEO, &geom) < 0)
> *start_lba = 0;
> else
> *start_lba = geom.start;
> +#else
> + *start_lba = 0;
> +#endif
> }
>
> if (readlink(devname, linkname, sizeof(linkname)) < 0)
> @@ -90,7 +137,11 @@ int main(int argc, char *argv[])
> int fd;
> int ret = 0;
> char *filename;
> +#if defined(HAVE_FSTAT64) && !defined(__OSX_AVAILABLE_BUT_DEPRECATED)
> struct stat64 st;
> +#else
> + struct stat st;
> +#endif
> int total_blks;
> unsigned int i;
> struct file_ext ext;
> @@ -112,7 +163,11 @@ int main(int argc, char *argv[])
>
> fsync(fd);
>
> +#if defined(HAVE_FSTAT64) && !defined(__OSX_AVAILABLE_BUT_DEPRECATED)
> if (fstat64(fd, &st) < 0) {
> +#else
> + if (fstat(fd, &st) < 0) {
> +#endif
> ret = errno;
> perror(filename);
> goto out;
>
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] f2fs-tools: build binaries in Mac
2017-11-15 7:49 ` Chao Yu
@ 2017-11-15 16:22 ` Jaegeuk Kim
2017-11-16 2:28 ` Chao Yu
0 siblings, 1 reply; 4+ messages in thread
From: Jaegeuk Kim @ 2017-11-15 16:22 UTC (permalink / raw)
To: Chao Yu; +Cc: linux-f2fs-devel
On 11/15, Chao Yu wrote:
> Hi Jaegeuk,
>
> On 2017/11/15 12:17, Jaegeuk Kim wrote:
> > This patch modifies f2fs-tools to be built in mac.
>
> Is there any requirement from Mac ecosystem?
It's for Android SDK. ;)
>
> Thanks,
>
> >
> > Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
> > ---
> > configure.ac | 99 +++++++++++++++++++++++++++++++++++++++++-------
> > fsck/dump.c | 6 +++
> > fsck/f2fs.h | 5 ++-
> > fsck/fsck.c | 4 +-
> > fsck/mount.c | 10 +++++
> > fsck/quotaio_tree.h | 4 ++
> > fsck/resize.c | 5 ++-
> > fsck/sload.c | 2 +
> > fsck/xattr.c | 3 --
> > fsck/xattr.h | 20 ++++++++++
> > include/android_config.h | 54 ++++++++++++++++++++++++++
> > include/f2fs_fs.h | 39 +++++++++++++++----
> > lib/libf2fs.c | 61 +++++++++++++++++++++++++----
> > lib/libf2fs_io.c | 17 +++++++++
> > mkfs/f2fs_format.c | 4 +-
> > mkfs/f2fs_format_utils.c | 10 +++--
> > tools/Makefile.am | 6 ++-
> > tools/f2fscrypt.c | 9 ++++-
> > tools/fibmap.c | 65 ++++++++++++++++++++++++++++---
> > 19 files changed, 371 insertions(+), 52 deletions(-)
> > create mode 100644 include/android_config.h
> >
> > diff --git a/configure.ac b/configure.ac
> > index 451b2de..73c830d 100644
> > --- a/configure.ac
> > +++ b/configure.ac
> > @@ -35,16 +35,6 @@ AC_CONFIG_MACRO_DIR([m4])
> > AC_CONFIG_AUX_DIR([build-aux])
> > AM_INIT_AUTOMAKE([foreign tar-pax dist-xz])
> >
> > -AC_CHECK_HEADERS_ONCE([
> > - fcntl.h
> > - mntent.h
> > - stdlib.h
> > - string.h
> > - unistd.h
> > - sys/ioctl.h
> > - sys/mount.h
> > -])
> > -
> > # Test configure options.
> > AC_ARG_WITH([selinux],
> > AS_HELP_STRING([--without-selinux],
> > @@ -91,9 +81,30 @@ AS_IF([test "x$have_blkid" = "xyes"],
> > )
> >
> > # Checks for header files.
> > -AC_CHECK_HEADERS([linux/fs.h linux/blkzoned.h fcntl.h mntent.h stdlib.h string.h \
> > - sys/ioctl.h sys/mount.h unistd.h linux/falloc.h byteswap.h \
> > - attr/xattr.h linux/xattr.h linux/posix_acl.h sys/acl.h])
> > +AC_CHECK_HEADERS(m4_flatten([
> > + attr/xattr.h
> > + byteswap.h
> > + fcntl.h
> > + linux/blkzoned.h
> > + linux/falloc.h
> > + linux/fs.h
> > + linux/hdreg.h
> > + linux/limits.h
> > + linux/posix_acl.h
> > + linux/types.h
> > + linux/xattr.h
> > + mntent.h
> > + scsi/sg.h
> > + stdlib.h
> > + string.h
> > + sys/acl.h
> > + sys/ioctl.h
> > + sys/syscall.h
> > + sys/mount.h
> > + sys/sysmacros.h
> > + sys/xattr.h
> > + unistd.h
> > +]))
> >
> > # Checks for typedefs, structures, and compiler characteristics.
> > AC_C_INLINE
> > @@ -104,15 +115,75 @@ AC_TYPE_SIZE_T
> > # Checks for library functions.
> > AC_FUNC_GETMNTENT
> > AC_CHECK_FUNCS_ONCE([
> > + add_key
> > fallocate
> > + fsetxattr
> > + fstat
> > + fstat64
> > getmntent
> > + keyctl
> > + llseek
> > + lseek64
> > memset
> > - fsetxattr
> > + setmntent
> > ])
> >
> > AS_IF([test "$ac_cv_header_byteswap_h" = "yes"],
> > [AC_CHECK_DECLS([bswap_64],,,[#include <byteswap.h>])])
> >
> > +dnl
> > +dnl Check to see if llseek() is declared in unistd.h. On some libc's
> > +dnl it is, and on others it isn't..... Thank you glibc developers....
> > +dnl
> > +AC_CHECK_DECL(llseek,[AC_DEFINE(HAVE_LLSEEK_PROTOTYPE, 1,
> > + [Define to 1 if llseek declared in unistd.h])],,
> > + [#include <unistd.h>])
> > +dnl
> > +dnl Check to see if lseek64() is declared in unistd.h. Glibc's header files
> > +dnl are so convoluted that I can't tell whether it will always be defined,
> > +dnl and if it isn't defined while lseek64 is defined in the library,
> > +dnl disaster will strike.
> > +dnl
> > +dnl Warning! Use of --enable-gcc-wall may throw off this test.
> > +dnl
> > +dnl
> > +AC_CHECK_DECL(lseek64,[AC_DEFINE(HAVE_LSEEK64_PROTOTYPE, 1,
> > + [Define to 1 if lseek64 declared in unistd.h])],,
> > + [#define _LARGEFILE_SOURCE
> > + #define _LARGEFILE64_SOURCE
> > + #include <unistd.h>])
> > +dnl
> > +dnl Word sizes...
> > +dnl
> > +
> > +# AC_CANONICAL_HOST is needed to access the 'host_os' variable
> > +AC_CANONICAL_HOST
> > +
> > +build_linux=no
> > +build_windows=no
> > +build_mac=no
> > +
> > +# Detect the target system
> > +case "${host_os}" in
> > +linux*)
> > + build_linux=yes
> > + ;;
> > +cygwin*|mingw*)
> > + build_windows=yes
> > + ;;
> > +darwin*)
> > + build_mac=yes
> > + ;;
> > +*)
> > + AC_MSG_ERROR(["OS $host_os is not supported"])
> > + ;;
> > +esac
> > +
> > +# Pass the conditionals to automake
> > +AM_CONDITIONAL([LINUX], [test "$build_linux" = "yes"])
> > +AM_CONDITIONAL([WINDOWS], [test "$build_windows" = "yes"])
> > +AM_CONDITIONAL([OSX], [test "$build_mac" = "yes"])
> > +
> > # Install directories
> > #AC_PREFIX_DEFAULT([/usr])
> > #AC_SUBST([sbindir], [/sbin])
> > diff --git a/fsck/dump.c b/fsck/dump.c
> > index ec69f25..9f0993e 100644
> > --- a/fsck/dump.c
> > +++ b/fsck/dump.c
> > @@ -360,8 +360,14 @@ static void dump_xattr(struct f2fs_sb_info *sbi, struct f2fs_node *node_blk)
> > }
> >
> > DBG(1, "fd %d xattr_name %s\n", c.dump_fd, xattr_name);
> > +#if defined(__linux__)
> > ret = fsetxattr(c.dump_fd, xattr_name, value,
> > le16_to_cpu(ent->e_value_size), 0);
> > +#elif defined(__APPLE__)
> > + ret = fsetxattr(c.dump_fd, xattr_name, value,
> > + le16_to_cpu(ent->e_value_size), 0,
> > + XATTR_CREATE);
> > +#endif
> > if (ret)
> > MSG(0, "XATTR index 0x%x set xattr failed error %d\n",
> > ent->e_name_index, errno);
> > diff --git a/fsck/f2fs.h b/fsck/f2fs.h
> > index 542594e..34b2481 100644
> > --- a/fsck/f2fs.h
> > +++ b/fsck/f2fs.h
> > @@ -11,6 +11,7 @@
> > #ifndef _F2FS_H_
> > #define _F2FS_H_
> >
> > +#include <f2fs_fs.h>
> > #include <stdlib.h>
> > #include <unistd.h>
> > #include <stdio.h>
> > @@ -18,14 +19,14 @@
> > #include <fcntl.h>
> > #include <string.h>
> > #include <errno.h>
> > +#ifdef HAVE_MNTENT_H
> > #include <mntent.h>
> > +#endif
> > #include <sys/stat.h>
> > #include <sys/ioctl.h>
> > #include <sys/mount.h>
> > #include <assert.h>
> >
> > -#include <f2fs_fs.h>
> > -
> > #define EXIT_ERR_CODE (-1)
> > #define ver_after(a, b) (typecheck(unsigned long long, a) && \
> > typecheck(unsigned long long, b) && \
> > diff --git a/fsck/fsck.c b/fsck/fsck.c
> > index ef46e33..ec88712 100644
> > --- a/fsck/fsck.c
> > +++ b/fsck/fsck.c
> > @@ -881,14 +881,14 @@ skip_blkcnt_fix:
> > }
> > if (ftype == F2FS_FT_SYMLINK && i_blocks && i_size == 0) {
> > DBG(1, "ino: 0x%x i_blocks: %lu with zero i_size",
> > - nid, i_blocks);
> > + nid, (unsigned long)i_blocks);
> > if (c.fix_on) {
> > u64 i_size = i_blocks * F2FS_BLKSIZE;
> >
> > node_blk->i.i_size = cpu_to_le64(i_size);
> > need_fix = 1;
> > FIX_MSG("Symlink: recover 0x%x with i_size=%lu",
> > - nid, i_size);
> > + nid, (unsigned long)i_size);
> > }
> > }
> >
> > diff --git a/fsck/mount.c b/fsck/mount.c
> > index 826a2f9..653dcf3 100644
> > --- a/fsck/mount.c
> > +++ b/fsck/mount.c
> > @@ -18,6 +18,16 @@
> > #include <sys/acl.h>
> > #endif
> >
> > +#ifndef ACL_UNDEFINED_TAG
> > +#define ACL_UNDEFINED_TAG (0x00)
> > +#define ACL_USER_OBJ (0x01)
> > +#define ACL_USER (0x02)
> > +#define ACL_GROUP_OBJ (0x04)
> > +#define ACL_GROUP (0x08)
> > +#define ACL_MASK (0x10)
> > +#define ACL_OTHER (0x20)
> > +#endif
> > +
> > u32 get_free_segments(struct f2fs_sb_info *sbi)
> > {
> > u32 i, free_segs = 0;
> > diff --git a/fsck/quotaio_tree.h b/fsck/quotaio_tree.h
> > index 4ca2d7f..aed93a8 100644
> > --- a/fsck/quotaio_tree.h
> > +++ b/fsck/quotaio_tree.h
> > @@ -6,9 +6,13 @@
> > #define _LINUX_QUOTA_TREE_H
> >
> > #include <inttypes.h>
> > +#ifdef HAVE_LINUX_TYPES_H
> > #include <linux/types.h>
> > +#endif
> > #include <sys/types.h>
> >
> > +#include <f2fs_fs.h>
> > +
> > typedef __u32 qid_t; /* Type in which we store ids in memory */
> >
> > #define QT_TREEOFF 1 /* Offset of tree in file in blocks */
> > diff --git a/fsck/resize.c b/fsck/resize.c
> > index 4584d6f..6c3eeab 100644
> > --- a/fsck/resize.c
> > +++ b/fsck/resize.c
> > @@ -36,7 +36,7 @@ static int get_new_sb(struct f2fs_super_block *sb)
> > zone_align_start_offset) / segment_size_bytes /
> > c.segs_per_sec * c.segs_per_sec);
> >
> > - blocks_for_sit = ALIGN(get_sb(segment_count), SIT_ENTRY_PER_BLOCK);
> > + blocks_for_sit = SIZE_ALIGN(get_sb(segment_count), SIT_ENTRY_PER_BLOCK);
> > sit_segments = SEG_ALIGN(blocks_for_sit);
> > set_sb(segment_count_sit, sit_segments * 2);
> > set_sb(nat_blkaddr, get_sb(sit_blkaddr) +
> > @@ -45,7 +45,8 @@ static int get_new_sb(struct f2fs_super_block *sb)
> > total_valid_blks_available = (get_sb(segment_count) -
> > (get_sb(segment_count_ckpt) +
> > get_sb(segment_count_sit))) * blks_per_seg;
> > - blocks_for_nat = ALIGN(total_valid_blks_available, NAT_ENTRY_PER_BLOCK);
> > + blocks_for_nat = SIZE_ALIGN(total_valid_blks_available,
> > + NAT_ENTRY_PER_BLOCK);
> > set_sb(segment_count_nat, SEG_ALIGN(blocks_for_nat));
> >
> > sit_bitmap_size = ((get_sb(segment_count_sit) / 2) <<
> > diff --git a/fsck/sload.c b/fsck/sload.c
> > index 68799c1..bfc79f2 100644
> > --- a/fsck/sload.c
> > +++ b/fsck/sload.c
> > @@ -15,7 +15,9 @@
> > #include "fsck.h"
> > #include <libgen.h>
> > #include <dirent.h>
> > +#ifdef HAVE_MNTENT_H
> > #include <mntent.h>
> > +#endif
> >
> > #ifdef HAVE_LIBSELINUX
> > #include <selinux/selinux.h>
> > diff --git a/fsck/xattr.c b/fsck/xattr.c
> > index 1d0f7d3..f2576cd 100644
> > --- a/fsck/xattr.c
> > +++ b/fsck/xattr.c
> > @@ -17,9 +17,6 @@
> > #include "node.h"
> > #include "xattr.h"
> >
> > -#define XATTR_CREATE 0x1
> > -#define XATTR_REPLACE 0x2
> > -
> > void *read_all_xattrs(struct f2fs_sb_info *sbi, struct f2fs_node *inode)
> > {
> > struct f2fs_xattr_header *header;
> > diff --git a/fsck/xattr.h b/fsck/xattr.h
> > index beed3bb..e4a98e2 100644
> > --- a/fsck/xattr.h
> > +++ b/fsck/xattr.h
> > @@ -17,6 +17,9 @@
> > #define _XATTR_H_
> >
> > #include "f2fs.h"
> > +#ifdef HAVE_SYS_XATTR_H
> > +#include <sys/xattr.h>
> > +#endif
> >
> > struct f2fs_xattr_header {
> > __le32 h_magic; /* magic number for identification */
> > @@ -76,6 +79,23 @@ static inline int f2fs_acl_count(int size)
> > }
> > }
> >
> > +#ifndef XATTR_USER_PREFIX
> > +#define XATTR_USER_PREFIX "user."
> > +#endif
> > +#ifndef XATTR_SECURITY_PREFIX
> > +#define XATTR_SECURITY_PREFIX "security."
> > +#endif
> > +#ifndef XATTR_TRUSTED_PREFIX
> > +#define XATTR_TRUSTED_PREFIX "trusted."
> > +#endif
> > +
> > +#ifndef XATTR_CREATE
> > +#define XATTR_CREATE 0x1
> > +#endif
> > +#ifndef XATTR_REPLACE
> > +#define XATTR_REPLACE 0x2
> > +#endif
> > +
> > #define XATTR_ROUND (3)
> >
> > #define XATTR_SELINUX_SUFFIX "selinux"
> > diff --git a/include/android_config.h b/include/android_config.h
> > new file mode 100644
> > index 0000000..bfc4105
> > --- /dev/null
> > +++ b/include/android_config.h
> > @@ -0,0 +1,54 @@
> > +#if defined(__linux__)
> > +#define HAVE_BYTESWAP_H 1
> > +#define HAVE_FCNTL_H 1
> > +#define HAVE_FALLOC_H 1
> > +#define HAVE_LINUX_HDREG_H 1
> > +#define HAVE_LINUX_LIMITS_H 1
> > +#define HAVE_POSIX_ACL_H 1
> > +#define HAVE_LINUX_TYPES_H 1
> > +#define HAVE_LINUX_XATTR_H 1
> > +#define HAVE_MNTENT_H 1
> > +#define HAVE_STDLIB_H 1
> > +#define HAVE_STRING_H 1
> > +#define HAVE_SYS_IOCTL_H 1
> > +#define HAVE_SYS_SYSCALL_H 1
> > +#define HAVE_SYS_MOUNT_H 1
> > +#define HAVE_SYS_SYSMACROS_H 1
> > +#define HAVE_SYS_XATTR_H 1
> > +#define HAVE_UNISTD_H 1
> > +
> > +#define HAVE_ADD_KEY 1
> > +#define HAVE_FALLOCATE 1
> > +#define HAVE_FSETXATTR 1
> > +#define HAVE_FSTAT 1
> > +#define HAVE_FSTAT64 1
> > +#define HAVE_GETMNTENT 1
> > +#define HAVE_KEYCTL 1
> > +#define HAVE_LLSEEK 1
> > +#define HAVE_LSEEK64 1
> > +#define HAVE_MEMSET 1
> > +#define HAVE_SETMNTENT 1
> > +#endif
> > +
> > +#if defined(__APPLE__)
> > +#define HAVE_FCNTL_H 1
> > +#define HAVE_FALLOC_H 1
> > +#define HAVE_POSIX_ACL_H 1
> > +#define HAVE_STDLIB_H 1
> > +#define HAVE_STRING_H 1
> > +#define HAVE_SYS_IOCTL_H 1
> > +#define HAVE_SYS_SYSCALL_H 1
> > +#define HAVE_SYS_MOUNT_H 1
> > +#define HAVE_SYS_XATTR_H 1
> > +#define HAVE_UNISTD_H 1
> > +
> > +#define HAVE_ADD_KEY 1
> > +#define HAVE_FALLOCATE 1
> > +#define HAVE_FSETXATTR 1
> > +#define HAVE_FSTAT 1
> > +#define HAVE_FSTAT64 1
> > +#define HAVE_GETMNTENT 1
> > +#define HAVE_KEYCTL 1
> > +#define HAVE_LLSEEK 1
> > +#define HAVE_MEMSET 1
> > +#endif
> > diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
> > index 8d67a76..05b893a 100644
> > --- a/include/f2fs_fs.h
> > +++ b/include/f2fs_fs.h
> > @@ -12,14 +12,20 @@
> > #ifndef __F2FS_FS_H__
> > #define __F2FS_FS_H__
> >
> > -#include <inttypes.h>
> > -#include <linux/types.h>
> > -#include <sys/types.h>
> > -
> > #ifdef HAVE_CONFIG_H
> > #include <config.h>
> > #endif
> >
> > +#ifdef WITH_ANDROID
> > +#include <android_config.h>
> > +#endif
> > +
> > +#include <inttypes.h>
> > +#ifdef HAVE_LINUX_TYPES_H
> > +#include <linux/types.h>
> > +#endif
> > +#include <sys/types.h>
> > +
> > #ifdef HAVE_LINUX_BLKZONED_H
> > #include <linux/blkzoned.h>
> > #endif
> > @@ -39,10 +45,25 @@ typedef u_int16_t u16;
> > typedef u_int8_t u8;
> > typedef u32 block_t;
> > typedef u32 nid_t;
> > +#ifndef bool
> > typedef u8 bool;
> > +#endif
> > typedef unsigned long pgoff_t;
> > typedef unsigned short umode_t;
> >
> > +#ifndef HAVE_LINUX_TYPES_H
> > +typedef u8 __u8;
> > +typedef u16 __u16;
> > +typedef u32 __u32;
> > +typedef u64 __u64;
> > +typedef u16 __le16;
> > +typedef u32 __le32;
> > +typedef u64 __le64;
> > +typedef u16 __be16;
> > +typedef u32 __be32;
> > +typedef u64 __be64;
> > +#endif
> > +
> > #if HAVE_BYTESWAP_H
> > #include <byteswap.h>
> > #else
> > @@ -226,7 +247,9 @@ static inline uint64_t bswap_64(uint64_t val)
> > snprintf(buf, len, #member)
> >
> > /* these are defined in kernel */
> > +#ifndef PAGE_SIZE
> > #define PAGE_SIZE 4096
> > +#endif
> > #define PAGE_CACHE_SIZE 4096
> > #define BITS_PER_BYTE 8
> > #define F2FS_SUPER_MAGIC 0xF2F52010 /* F2FS Magic Number */
> > @@ -784,7 +807,7 @@ struct f2fs_nat_block {
> > * disk is 16 TB and it equals to 16 * 1024 * 1024 / 2 segments.
> > */
> > #define F2FS_MAX_SEGMENT ((16 * 1024 * 1024) / 2)
> > -#define MAX_SIT_BITMAP_SIZE (SEG_ALIGN(ALIGN(F2FS_MAX_SEGMENT, \
> > +#define MAX_SIT_BITMAP_SIZE (SEG_ALIGN(SIZE_ALIGN(F2FS_MAX_SEGMENT, \
> > SIT_ENTRY_PER_BLOCK)) * \
> > c.blks_per_seg / 8)
> >
> > @@ -1146,9 +1169,9 @@ extern int f2fs_reset_zones(int);
> >
> > extern struct f2fs_configuration c;
> >
> > -#define ALIGN(val, size) ((val) + (size) - 1) / (size)
> > -#define SEG_ALIGN(blks) ALIGN(blks, c.blks_per_seg)
> > -#define ZONE_ALIGN(blks) ALIGN(blks, c.blks_per_seg * \
> > +#define SIZE_ALIGN(val, size) ((val) + (size) - 1) / (size)
> > +#define SEG_ALIGN(blks) SIZE_ALIGN(blks, c.blks_per_seg)
> > +#define ZONE_ALIGN(blks) SIZE_ALIGN(blks, c.blks_per_seg * \
> > c.segs_per_zone)
> >
> > static inline double get_best_overprovision(struct f2fs_super_block *sb)
> > diff --git a/lib/libf2fs.c b/lib/libf2fs.c
> > index 0f1fead..1e63843 100644
> > --- a/lib/libf2fs.c
> > +++ b/lib/libf2fs.c
> > @@ -8,25 +8,34 @@
> > */
> > #define _LARGEFILE64_SOURCE
> >
> > +#include <f2fs_fs.h>
> > #include <stdio.h>
> > #include <stdlib.h>
> > #include <string.h>
> > #include <errno.h>
> > #include <unistd.h>
> > #include <fcntl.h>
> > +#ifdef HAVE_MNTENT_H
> > #include <mntent.h>
> > +#endif
> > #include <time.h>
> > #include <sys/stat.h>
> > #include <sys/mount.h>
> > #include <sys/ioctl.h>
> > +#ifdef HAVE_SYS_SYSMACROS_H
> > #include <sys/sysmacros.h>
> > +#endif
> > #ifndef WITH_ANDROID
> > +#ifdef HAVE_SCSI_SG_H
> > #include <scsi/sg.h>
> > #endif
> > +#endif
> > +#ifdef HAVE_LINUX_HDREG_H
> > #include <linux/hdreg.h>
> > +#endif
> > +#ifdef HAVE_LINUX_LIMITS_H
> > #include <linux/limits.h>
> > -
> > -#include <f2fs_fs.h>
> > +#endif
> >
> > #ifndef WITH_ANDROID
> > /* SCSI command for standard inquiry*/
> > @@ -607,6 +616,7 @@ void f2fs_init_configuration(void)
> > c.dry_run = 0;
> > }
> >
> > +#ifdef HAVE_SETMNTENT
> > static int is_mounted(const char *mpt, const char *device)
> > {
> > FILE *file = NULL;
> > @@ -628,6 +638,7 @@ static int is_mounted(const char *mpt, const char *device)
> > endmntent(file);
> > return mnt ? 1 : 0;
> > }
> > +#endif
> >
> > int f2fs_dev_is_umounted(char *path)
> > {
> > @@ -642,29 +653,36 @@ int f2fs_dev_is_umounted(char *path)
> > * try with /proc/mounts fist to detect RDONLY.
> > * f2fs_stop_checkpoint makes RO in /proc/mounts while RW in /etc/mtab.
> > */
> > +#ifdef __linux__
> > ret = is_mounted("/proc/mounts", path);
> > if (ret) {
> > MSG(0, "Info: Mounted device!\n");
> > return -1;
> > }
> > -
> > +#endif
> > +#if defined(MOUNTED) || defined(_PATH_MOUNTED)
> > +#ifndef MOUNTED
> > +#define MOUNTED _PATH_MOUNTED
> > +#endif
> > ret = is_mounted(MOUNTED, path);
> > if (ret) {
> > MSG(0, "Info: Mounted device!\n");
> > return -1;
> > }
> > -
> > +#endif
> > /*
> > * If we are supposed to operate on the root device, then
> > * also check the mounts for '/dev/root', which sometimes
> > * functions as an alias for the root device.
> > */
> > if (is_rootdev) {
> > +#ifdef __linux__
> > ret = is_mounted("/proc/mounts", "/dev/root");
> > if (ret) {
> > MSG(0, "Info: Mounted device!\n");
> > return -1;
> > }
> > +#endif
> > }
> >
> > /*
> > @@ -681,7 +699,7 @@ int f2fs_dev_is_umounted(char *path)
> > return -1;
> > }
> > }
> > - return 0;
> > + return ret;
> > }
> >
> > int f2fs_devs_are_umounted(void)
> > @@ -704,6 +722,25 @@ void get_kernel_version(__u8 *version)
> > memset(version + i, 0, VERSION_LEN + 1 - i);
> > }
> >
> > +
> > +#if defined(__linux__) && defined(_IO) && !defined(BLKGETSIZE)
> > +#define BLKGETSIZE _IO(0x12,96)
> > +#endif
> > +
> > +#if defined(__linux__) && defined(_IOR) && !defined(BLKGETSIZE64)
> > +#define BLKGETSIZE64 _IOR(0x12,114, size_t)
> > +#endif
> > +
> > +#if defined(__linux__) && defined(_IO) && !defined(BLKSSZGET)
> > +#define BLKSSZGET _IO(0x12,104)
> > +#endif
> > +
> > +#if defined(__APPLE__)
> > +#include <sys/disk.h>
> > +#define BLKGETSIZE DKIOCGETBLOCKCOUNT
> > +#define BLKSSZGET DKIOCGETBLOCKCOUNT
> > +#endif /* APPLE_DARWIN */
> > +
> > int get_device_info(int i)
> > {
> > int32_t fd = 0;
> > @@ -712,8 +749,10 @@ int get_device_info(int i)
> > uint32_t total_sectors;
> > #endif
> > struct stat stat_buf;
> > +#ifdef HDIO_GETGIO
> > struct hd_geometry geom;
> > -#ifndef WITH_ANDROID
> > +#endif
> > +#if !defined(WITH_ANDROID) && defined(__linux__)
> > sg_io_hdr_t io_hdr;
> > unsigned char reply_buffer[96] = {0};
> > unsigned char model_inq[6] = {MODELINQUIRY};
> > @@ -750,10 +789,12 @@ int get_device_info(int i)
> > } else if (S_ISREG(stat_buf.st_mode)) {
> > dev->total_sectors = stat_buf.st_size / dev->sector_size;
> > } else if (S_ISBLK(stat_buf.st_mode)) {
> > +#ifdef BLKSSZGET
> > if (ioctl(fd, BLKSSZGET, §or_size) < 0)
> > MSG(0, "\tError: Using the default sector size\n");
> > else if (dev->sector_size < sector_size)
> > dev->sector_size = sector_size;
> > +#endif
> > #ifdef BLKGETSIZE64
> > if (ioctl(fd, BLKGETSIZE64, &dev->total_sectors) < 0) {
> > MSG(0, "\tError: Cannot get the device size\n");
> > @@ -769,13 +810,17 @@ int get_device_info(int i)
> > dev->total_sectors /= dev->sector_size;
> >
> > if (i == 0) {
> > +#ifdef HDIO_GETGIO
> > if (ioctl(fd, HDIO_GETGEO, &geom) < 0)
> > c.start_sector = 0;
> > else
> > c.start_sector = geom.start;
> > +#else
> > + c.start_sector = 0;
> > +#endif
> > }
> >
> > -#ifndef WITH_ANDROID
> > +#if !defined(WITH_ANDROID) && defined(__linux__)
> > /* Send INQUIRY command */
> > memset(&io_hdr, 0, sizeof(sg_io_hdr_t));
> > io_hdr.interface_id = 'S';
> > @@ -809,7 +854,7 @@ int get_device_info(int i)
> > return -1;
> > }
> >
> > -#ifndef WITH_ANDROID
> > +#if !defined(WITH_ANDROID) && defined(__linux__)
> > if (S_ISBLK(stat_buf.st_mode))
> > f2fs_get_zoned_model(i);
> >
> > diff --git a/lib/libf2fs_io.c b/lib/libf2fs_io.c
> > index 8a79672..268dcfa 100644
> > --- a/lib/libf2fs_io.c
> > +++ b/lib/libf2fs_io.c
> > @@ -14,12 +14,16 @@
> > #include <errno.h>
> > #include <unistd.h>
> > #include <fcntl.h>
> > +#ifdef HAVE_MNTENT_H
> > #include <mntent.h>
> > +#endif
> > #include <time.h>
> > #include <sys/stat.h>
> > #include <sys/mount.h>
> > #include <sys/ioctl.h>
> > +#ifdef HAVE_LINUX_HDREG_H
> > #include <linux/hdreg.h>
> > +#endif
> >
> > #include <f2fs_fs.h>
> >
> > @@ -54,6 +58,15 @@ static int __get_device_fd(__u64 *offset)
> > return -1;
> > }
> >
> > +#ifndef HAVE_LSEEK64
> > +typedef off_t off64_t;
> > +
> > +static inline off64_t lseek64(int fd, __u64 offset, int set)
> > +{
> > + return lseek(fd, offset, set);
> > +}
> > +#endif
> > +
> > /*
> > * IO interfaces
> > */
> > @@ -86,7 +99,11 @@ int dev_read(void *buf, __u64 offset, size_t len)
> > return 0;
> > }
> >
> > +#ifdef POSIX_FADV_WILLNEED
> > int dev_readahead(__u64 offset, size_t len)
> > +#else
> > +int dev_readahead(__u64 offset, size_t UNUSED(len))
> > +#endif
> > {
> > int fd = __get_device_fd(&offset);
> >
> > diff --git a/mkfs/f2fs_format.c b/mkfs/f2fs_format.c
> > index 2ba8dd3..d5f39ca 100644
> > --- a/mkfs/f2fs_format.c
> > +++ b/mkfs/f2fs_format.c
> > @@ -254,7 +254,7 @@ static int f2fs_prepare_super_block(void)
> > set_sb(sit_blkaddr, get_sb(segment0_blkaddr) +
> > get_sb(segment_count_ckpt) * c.blks_per_seg);
> >
> > - blocks_for_sit = ALIGN(get_sb(segment_count), SIT_ENTRY_PER_BLOCK);
> > + blocks_for_sit = SIZE_ALIGN(get_sb(segment_count), SIT_ENTRY_PER_BLOCK);
> >
> > sit_segments = SEG_ALIGN(blocks_for_sit);
> >
> > @@ -267,7 +267,7 @@ static int f2fs_prepare_super_block(void)
> > (get_sb(segment_count_ckpt) +
> > get_sb(segment_count_sit))) * c.blks_per_seg;
> >
> > - blocks_for_nat = ALIGN(total_valid_blks_available,
> > + blocks_for_nat = SIZE_ALIGN(total_valid_blks_available,
> > NAT_ENTRY_PER_BLOCK);
> >
> > set_sb(segment_count_nat, SEG_ALIGN(blocks_for_nat));
> > diff --git a/mkfs/f2fs_format_utils.c b/mkfs/f2fs_format_utils.c
> > index 558684d..a474764 100644
> > --- a/mkfs/f2fs_format_utils.c
> > +++ b/mkfs/f2fs_format_utils.c
> > @@ -6,20 +6,24 @@
> > *
> > * Dual licensed under the GPL or LGPL version 2 licenses.
> > */
> > +#ifndef _LARGEFILE_SOURCE
> > #define _LARGEFILE_SOURCE
> > +#endif
> > +#ifndef _LARGEFILE64_SOURCE
> > #define _LARGEFILE64_SOURCE
> > +#endif
> > #ifndef _GNU_SOURCE
> > #define _GNU_SOURCE
> > #endif
> >
> > +#include <f2fs_fs.h>
> > +
> > #include <stdio.h>
> > #include <unistd.h>
> > #include <sys/ioctl.h>
> > #include <sys/stat.h>
> > #include <fcntl.h>
> >
> > -#include "f2fs_fs.h"
> > -
> > #ifdef HAVE_LINUX_FS_H
> > #include <linux/fs.h>
> > #endif
> > @@ -68,7 +72,7 @@ static int trim_device(int i)
> > MSG(0, "Info: This device doesn't support BLKSECDISCARD\n");
> > } else {
> > MSG(0, "Info: Secure Discarded %lu MB\n",
> > - stat_buf.st_size >> 20);
> > + (unsigned long)stat_buf.st_size >> 20);
> > return 0;
> > }
> > #endif
> > diff --git a/tools/Makefile.am b/tools/Makefile.am
> > index 5a9303f..81cf89b 100644
> > --- a/tools/Makefile.am
> > +++ b/tools/Makefile.am
> > @@ -2,10 +2,14 @@
> >
> > AM_CPPFLAGS = ${libuuid_CFLAGS} -I$(top_srcdir)/include
> > AM_CFLAGS = -Wall
> > -sbin_PROGRAMS = f2fstat fibmap.f2fs parse.f2fs f2fscrypt
> > +sbin_PROGRAMS = f2fstat fibmap.f2fs parse.f2fs
> > f2fstat_SOURCES = f2fstat.c
> > fibmap_f2fs_SOURCES = fibmap.c
> > parse_f2fs_SOURCES = f2fs_io_parse.c
> > +
> > +if LINUX
> > +sbin_PROGRAMS += f2fscrypt
> > f2fscrypt_SOURCES = f2fscrypt.c sha512.c
> > f2fscrypt_LDFLAGS = -luuid
> > dist_man_MANS = f2fscrypt.8
> > +endif
> > diff --git a/tools/f2fscrypt.c b/tools/f2fscrypt.c
> > index 48ea5f6..81ef830 100644
> > --- a/tools/f2fscrypt.c
> > +++ b/tools/f2fscrypt.c
> > @@ -30,7 +30,9 @@
> > #include <stdio.h>
> > #include <stdlib.h>
> > #include <string.h>
> > +#ifdef HAVE_MNTENT_H
> > #include <mntent.h>
> > +#endif
> > #include <sys/ioctl.h>
> > #include <sys/stat.h>
> > #include <sys/types.h>
> > @@ -38,7 +40,9 @@
> > #include <termios.h>
> > #include <unistd.h>
> > #include <signal.h>
> > +#ifdef __KERNEL__
> > #include <linux/fs.h>
> > +#endif
> > #include <uuid/uuid.h>
> >
> > #if !defined(HAVE_ADD_KEY) || !defined(HAVE_KEYCTL)
> > @@ -47,6 +51,7 @@
> > #ifdef HAVE_SYS_KEY_H
> > #include <sys/key.h>
> > #endif
> > +#include <f2fs_fs.h>
> >
> > #define F2FS_MAX_KEY_SIZE 64
> > #define F2FS_MAX_PASSPHRASE_SIZE 1024
> > @@ -121,7 +126,7 @@ int options;
> > extern void f2fs_sha512(const unsigned char *in, unsigned long in_size,
> > unsigned char *out);
> >
> > -#ifndef HAVE_KEYCTL
> > +#if !defined(HAVE_KEYCTL)
> > static long keyctl(int cmd, ...)
> > {
> > va_list va;
> > @@ -137,7 +142,7 @@ static long keyctl(int cmd, ...)
> > }
> > #endif
> >
> > -#ifndef HAVE_ADD_KEY
> > +#if !defined(HAVE_ADD_KEY)
> > static key_serial_t add_key(const char *type, const char *description,
> > const void *payload, size_t plen,
> > key_serial_t keyring)
> > diff --git a/tools/fibmap.c b/tools/fibmap.c
> > index 6b092f5..d17144a 100644
> > --- a/tools/fibmap.c
> > +++ b/tools/fibmap.c
> > @@ -1,4 +1,20 @@
> > +#if !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__OpenBSD__)
> > +#define _XOPEN_SOURCE 600
> > +#define _DARWIN_C_SOURCE
> > +#define _FILE_OFFSET_BITS 64
> > +#ifndef _LARGEFILE_SOURCE
> > +#define _LARGEFILE_SOURCE
> > +#endif
> > +#ifndef _LARGEFILE64_SOURCE
> > #define _LARGEFILE64_SOURCE
> > +#endif
> > +#ifndef _GNU_SOURCE
> > +#define _GNU_SOURCE
> > +#endif
> > +#endif
> > +#ifndef O_LARGEFILE
> > +#define O_LARGEFILE 0
> > +#endif
> > #include <unistd.h>
> > #include <string.h>
> > #include <stdlib.h>
> > @@ -8,12 +24,25 @@
> > #include <sys/types.h>
> > #include <sys/ioctl.h>
> > #include <sys/stat.h>
> > +#ifdef HAVE_SYS_SYSMACROS_H
> > #include <sys/sysmacros.h>
> > +#endif
> > #include <libgen.h>
> > +#ifdef HAVE_LINUX_HDREG_H
> > #include <linux/hdreg.h>
> > +#endif
> > +#ifdef HAVE_LINUX_TYPES_H
> > #include <linux/types.h>
> > +#endif
> > +#ifdef __KERNEL__
> > #include <linux/fs.h>
> > +#endif
> > #include <inttypes.h>
> > +#include <f2fs_fs.h>
> > +
> > +#ifndef FIBMAP
> > +#define FIBMAP _IO(0x00, 1) /* bmap access */
> > +#endif
> >
> > struct file_ext {
> > __u32 f_pos;
> > @@ -31,28 +60,42 @@ void print_ext(struct file_ext *ext)
> > ext->end_blk, ext->blk_count);
> > }
> >
> > +#if defined(HAVE_FSTAT64) && !defined(__OSX_AVAILABLE_BUT_DEPRECATED)
> > void print_stat(struct stat64 *st)
> > +#else
> > +void print_stat(struct stat *st)
> > +#endif
> > {
> > printf("--------------------------------------------\n");
> > printf("dev [%d:%d]\n", major(st->st_dev), minor(st->st_dev));
> > printf("ino [0x%8"PRIx64" : %"PRIu64"]\n",
> > st->st_ino, st->st_ino);
> > printf("mode [0x%8x : %d]\n", st->st_mode, st->st_mode);
> > - printf("nlink [0x%8lx : %ld]\n", st->st_nlink, st->st_nlink);
> > + printf("nlink [0x%8lx : %ld]\n",
> > + (unsigned long)st->st_nlink,
> > + (long)st->st_nlink);
> > printf("uid [0x%8x : %d]\n", st->st_uid, st->st_uid);
> > printf("gid [0x%8x : %d]\n", st->st_gid, st->st_gid);
> > printf("size [0x%8"PRIx64" : %"PRIu64"]\n",
> > - st->st_size, st->st_size);
> > - printf("blksize [0x%8lx : %ld]\n", st->st_blksize, st->st_blksize);
> > + (u64)st->st_size, (u64)st->st_size);
> > + printf("blksize [0x%8lx : %ld]\n",
> > + (unsigned long)st->st_blksize,
> > + (long)st->st_blksize);
> > printf("blocks [0x%8"PRIx64" : %"PRIu64"]\n",
> > - st->st_blocks, st->st_blocks);
> > + (u64)st->st_blocks, (u64)st->st_blocks);
> > printf("--------------------------------------------\n\n");
> > }
> >
> > -void stat_bdev(struct stat64 *st, unsigned int *start_lba)
> > +#if defined(HAVE_FSTAT64) && !defined(__OSX_AVAILABLE_BUT_DEPRECATED)
> > +static void stat_bdev(struct stat64 *st, unsigned int *start_lba)
> > +#else
> > +static void stat_bdev(struct stat *st, unsigned int *start_lba)
> > +#endif
> > {
> > struct stat bdev_stat;
> > +#ifdef HDIO_GETGIO
> > struct hd_geometry geom;
> > +#endif
> > char devname[32] = { 0, };
> > char linkname[32] = { 0, };
> > int fd;
> > @@ -67,10 +110,14 @@ void stat_bdev(struct stat64 *st, unsigned int *start_lba)
> > goto out;
> >
> > if (S_ISBLK(bdev_stat.st_mode)) {
> > +#ifdef HDIO_GETGIO
> > if (ioctl(fd, HDIO_GETGEO, &geom) < 0)
> > *start_lba = 0;
> > else
> > *start_lba = geom.start;
> > +#else
> > + *start_lba = 0;
> > +#endif
> > }
> >
> > if (readlink(devname, linkname, sizeof(linkname)) < 0)
> > @@ -90,7 +137,11 @@ int main(int argc, char *argv[])
> > int fd;
> > int ret = 0;
> > char *filename;
> > +#if defined(HAVE_FSTAT64) && !defined(__OSX_AVAILABLE_BUT_DEPRECATED)
> > struct stat64 st;
> > +#else
> > + struct stat st;
> > +#endif
> > int total_blks;
> > unsigned int i;
> > struct file_ext ext;
> > @@ -112,7 +163,11 @@ int main(int argc, char *argv[])
> >
> > fsync(fd);
> >
> > +#if defined(HAVE_FSTAT64) && !defined(__OSX_AVAILABLE_BUT_DEPRECATED)
> > if (fstat64(fd, &st) < 0) {
> > +#else
> > + if (fstat(fd, &st) < 0) {
> > +#endif
> > ret = errno;
> > perror(filename);
> > goto out;
> >
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] f2fs-tools: build binaries in Mac
2017-11-15 16:22 ` Jaegeuk Kim
@ 2017-11-16 2:28 ` Chao Yu
0 siblings, 0 replies; 4+ messages in thread
From: Chao Yu @ 2017-11-16 2:28 UTC (permalink / raw)
To: Jaegeuk Kim; +Cc: linux-f2fs-devel
On 2017/11/16 0:22, Jaegeuk Kim wrote:
> On 11/15, Chao Yu wrote:
>> Hi Jaegeuk,
>>
>> On 2017/11/15 12:17, Jaegeuk Kim wrote:
>>> This patch modifies f2fs-tools to be built in mac.
>>
>> Is there any requirement from Mac ecosystem?
>
> It's for Android SDK. ;)
Alright... still can't catch up its purpose.
Thanks,
>
>>
>> Thanks,
>>
>>>
>>> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
>>> ---
>>> configure.ac | 99 +++++++++++++++++++++++++++++++++++++++++-------
>>> fsck/dump.c | 6 +++
>>> fsck/f2fs.h | 5 ++-
>>> fsck/fsck.c | 4 +-
>>> fsck/mount.c | 10 +++++
>>> fsck/quotaio_tree.h | 4 ++
>>> fsck/resize.c | 5 ++-
>>> fsck/sload.c | 2 +
>>> fsck/xattr.c | 3 --
>>> fsck/xattr.h | 20 ++++++++++
>>> include/android_config.h | 54 ++++++++++++++++++++++++++
>>> include/f2fs_fs.h | 39 +++++++++++++++----
>>> lib/libf2fs.c | 61 +++++++++++++++++++++++++----
>>> lib/libf2fs_io.c | 17 +++++++++
>>> mkfs/f2fs_format.c | 4 +-
>>> mkfs/f2fs_format_utils.c | 10 +++--
>>> tools/Makefile.am | 6 ++-
>>> tools/f2fscrypt.c | 9 ++++-
>>> tools/fibmap.c | 65 ++++++++++++++++++++++++++++---
>>> 19 files changed, 371 insertions(+), 52 deletions(-)
>>> create mode 100644 include/android_config.h
>>>
>>> diff --git a/configure.ac b/configure.ac
>>> index 451b2de..73c830d 100644
>>> --- a/configure.ac
>>> +++ b/configure.ac
>>> @@ -35,16 +35,6 @@ AC_CONFIG_MACRO_DIR([m4])
>>> AC_CONFIG_AUX_DIR([build-aux])
>>> AM_INIT_AUTOMAKE([foreign tar-pax dist-xz])
>>>
>>> -AC_CHECK_HEADERS_ONCE([
>>> - fcntl.h
>>> - mntent.h
>>> - stdlib.h
>>> - string.h
>>> - unistd.h
>>> - sys/ioctl.h
>>> - sys/mount.h
>>> -])
>>> -
>>> # Test configure options.
>>> AC_ARG_WITH([selinux],
>>> AS_HELP_STRING([--without-selinux],
>>> @@ -91,9 +81,30 @@ AS_IF([test "x$have_blkid" = "xyes"],
>>> )
>>>
>>> # Checks for header files.
>>> -AC_CHECK_HEADERS([linux/fs.h linux/blkzoned.h fcntl.h mntent.h stdlib.h string.h \
>>> - sys/ioctl.h sys/mount.h unistd.h linux/falloc.h byteswap.h \
>>> - attr/xattr.h linux/xattr.h linux/posix_acl.h sys/acl.h])
>>> +AC_CHECK_HEADERS(m4_flatten([
>>> + attr/xattr.h
>>> + byteswap.h
>>> + fcntl.h
>>> + linux/blkzoned.h
>>> + linux/falloc.h
>>> + linux/fs.h
>>> + linux/hdreg.h
>>> + linux/limits.h
>>> + linux/posix_acl.h
>>> + linux/types.h
>>> + linux/xattr.h
>>> + mntent.h
>>> + scsi/sg.h
>>> + stdlib.h
>>> + string.h
>>> + sys/acl.h
>>> + sys/ioctl.h
>>> + sys/syscall.h
>>> + sys/mount.h
>>> + sys/sysmacros.h
>>> + sys/xattr.h
>>> + unistd.h
>>> +]))
>>>
>>> # Checks for typedefs, structures, and compiler characteristics.
>>> AC_C_INLINE
>>> @@ -104,15 +115,75 @@ AC_TYPE_SIZE_T
>>> # Checks for library functions.
>>> AC_FUNC_GETMNTENT
>>> AC_CHECK_FUNCS_ONCE([
>>> + add_key
>>> fallocate
>>> + fsetxattr
>>> + fstat
>>> + fstat64
>>> getmntent
>>> + keyctl
>>> + llseek
>>> + lseek64
>>> memset
>>> - fsetxattr
>>> + setmntent
>>> ])
>>>
>>> AS_IF([test "$ac_cv_header_byteswap_h" = "yes"],
>>> [AC_CHECK_DECLS([bswap_64],,,[#include <byteswap.h>])])
>>>
>>> +dnl
>>> +dnl Check to see if llseek() is declared in unistd.h. On some libc's
>>> +dnl it is, and on others it isn't..... Thank you glibc developers....
>>> +dnl
>>> +AC_CHECK_DECL(llseek,[AC_DEFINE(HAVE_LLSEEK_PROTOTYPE, 1,
>>> + [Define to 1 if llseek declared in unistd.h])],,
>>> + [#include <unistd.h>])
>>> +dnl
>>> +dnl Check to see if lseek64() is declared in unistd.h. Glibc's header files
>>> +dnl are so convoluted that I can't tell whether it will always be defined,
>>> +dnl and if it isn't defined while lseek64 is defined in the library,
>>> +dnl disaster will strike.
>>> +dnl
>>> +dnl Warning! Use of --enable-gcc-wall may throw off this test.
>>> +dnl
>>> +dnl
>>> +AC_CHECK_DECL(lseek64,[AC_DEFINE(HAVE_LSEEK64_PROTOTYPE, 1,
>>> + [Define to 1 if lseek64 declared in unistd.h])],,
>>> + [#define _LARGEFILE_SOURCE
>>> + #define _LARGEFILE64_SOURCE
>>> + #include <unistd.h>])
>>> +dnl
>>> +dnl Word sizes...
>>> +dnl
>>> +
>>> +# AC_CANONICAL_HOST is needed to access the 'host_os' variable
>>> +AC_CANONICAL_HOST
>>> +
>>> +build_linux=no
>>> +build_windows=no
>>> +build_mac=no
>>> +
>>> +# Detect the target system
>>> +case "${host_os}" in
>>> +linux*)
>>> + build_linux=yes
>>> + ;;
>>> +cygwin*|mingw*)
>>> + build_windows=yes
>>> + ;;
>>> +darwin*)
>>> + build_mac=yes
>>> + ;;
>>> +*)
>>> + AC_MSG_ERROR(["OS $host_os is not supported"])
>>> + ;;
>>> +esac
>>> +
>>> +# Pass the conditionals to automake
>>> +AM_CONDITIONAL([LINUX], [test "$build_linux" = "yes"])
>>> +AM_CONDITIONAL([WINDOWS], [test "$build_windows" = "yes"])
>>> +AM_CONDITIONAL([OSX], [test "$build_mac" = "yes"])
>>> +
>>> # Install directories
>>> #AC_PREFIX_DEFAULT([/usr])
>>> #AC_SUBST([sbindir], [/sbin])
>>> diff --git a/fsck/dump.c b/fsck/dump.c
>>> index ec69f25..9f0993e 100644
>>> --- a/fsck/dump.c
>>> +++ b/fsck/dump.c
>>> @@ -360,8 +360,14 @@ static void dump_xattr(struct f2fs_sb_info *sbi, struct f2fs_node *node_blk)
>>> }
>>>
>>> DBG(1, "fd %d xattr_name %s\n", c.dump_fd, xattr_name);
>>> +#if defined(__linux__)
>>> ret = fsetxattr(c.dump_fd, xattr_name, value,
>>> le16_to_cpu(ent->e_value_size), 0);
>>> +#elif defined(__APPLE__)
>>> + ret = fsetxattr(c.dump_fd, xattr_name, value,
>>> + le16_to_cpu(ent->e_value_size), 0,
>>> + XATTR_CREATE);
>>> +#endif
>>> if (ret)
>>> MSG(0, "XATTR index 0x%x set xattr failed error %d\n",
>>> ent->e_name_index, errno);
>>> diff --git a/fsck/f2fs.h b/fsck/f2fs.h
>>> index 542594e..34b2481 100644
>>> --- a/fsck/f2fs.h
>>> +++ b/fsck/f2fs.h
>>> @@ -11,6 +11,7 @@
>>> #ifndef _F2FS_H_
>>> #define _F2FS_H_
>>>
>>> +#include <f2fs_fs.h>
>>> #include <stdlib.h>
>>> #include <unistd.h>
>>> #include <stdio.h>
>>> @@ -18,14 +19,14 @@
>>> #include <fcntl.h>
>>> #include <string.h>
>>> #include <errno.h>
>>> +#ifdef HAVE_MNTENT_H
>>> #include <mntent.h>
>>> +#endif
>>> #include <sys/stat.h>
>>> #include <sys/ioctl.h>
>>> #include <sys/mount.h>
>>> #include <assert.h>
>>>
>>> -#include <f2fs_fs.h>
>>> -
>>> #define EXIT_ERR_CODE (-1)
>>> #define ver_after(a, b) (typecheck(unsigned long long, a) && \
>>> typecheck(unsigned long long, b) && \
>>> diff --git a/fsck/fsck.c b/fsck/fsck.c
>>> index ef46e33..ec88712 100644
>>> --- a/fsck/fsck.c
>>> +++ b/fsck/fsck.c
>>> @@ -881,14 +881,14 @@ skip_blkcnt_fix:
>>> }
>>> if (ftype == F2FS_FT_SYMLINK && i_blocks && i_size == 0) {
>>> DBG(1, "ino: 0x%x i_blocks: %lu with zero i_size",
>>> - nid, i_blocks);
>>> + nid, (unsigned long)i_blocks);
>>> if (c.fix_on) {
>>> u64 i_size = i_blocks * F2FS_BLKSIZE;
>>>
>>> node_blk->i.i_size = cpu_to_le64(i_size);
>>> need_fix = 1;
>>> FIX_MSG("Symlink: recover 0x%x with i_size=%lu",
>>> - nid, i_size);
>>> + nid, (unsigned long)i_size);
>>> }
>>> }
>>>
>>> diff --git a/fsck/mount.c b/fsck/mount.c
>>> index 826a2f9..653dcf3 100644
>>> --- a/fsck/mount.c
>>> +++ b/fsck/mount.c
>>> @@ -18,6 +18,16 @@
>>> #include <sys/acl.h>
>>> #endif
>>>
>>> +#ifndef ACL_UNDEFINED_TAG
>>> +#define ACL_UNDEFINED_TAG (0x00)
>>> +#define ACL_USER_OBJ (0x01)
>>> +#define ACL_USER (0x02)
>>> +#define ACL_GROUP_OBJ (0x04)
>>> +#define ACL_GROUP (0x08)
>>> +#define ACL_MASK (0x10)
>>> +#define ACL_OTHER (0x20)
>>> +#endif
>>> +
>>> u32 get_free_segments(struct f2fs_sb_info *sbi)
>>> {
>>> u32 i, free_segs = 0;
>>> diff --git a/fsck/quotaio_tree.h b/fsck/quotaio_tree.h
>>> index 4ca2d7f..aed93a8 100644
>>> --- a/fsck/quotaio_tree.h
>>> +++ b/fsck/quotaio_tree.h
>>> @@ -6,9 +6,13 @@
>>> #define _LINUX_QUOTA_TREE_H
>>>
>>> #include <inttypes.h>
>>> +#ifdef HAVE_LINUX_TYPES_H
>>> #include <linux/types.h>
>>> +#endif
>>> #include <sys/types.h>
>>>
>>> +#include <f2fs_fs.h>
>>> +
>>> typedef __u32 qid_t; /* Type in which we store ids in memory */
>>>
>>> #define QT_TREEOFF 1 /* Offset of tree in file in blocks */
>>> diff --git a/fsck/resize.c b/fsck/resize.c
>>> index 4584d6f..6c3eeab 100644
>>> --- a/fsck/resize.c
>>> +++ b/fsck/resize.c
>>> @@ -36,7 +36,7 @@ static int get_new_sb(struct f2fs_super_block *sb)
>>> zone_align_start_offset) / segment_size_bytes /
>>> c.segs_per_sec * c.segs_per_sec);
>>>
>>> - blocks_for_sit = ALIGN(get_sb(segment_count), SIT_ENTRY_PER_BLOCK);
>>> + blocks_for_sit = SIZE_ALIGN(get_sb(segment_count), SIT_ENTRY_PER_BLOCK);
>>> sit_segments = SEG_ALIGN(blocks_for_sit);
>>> set_sb(segment_count_sit, sit_segments * 2);
>>> set_sb(nat_blkaddr, get_sb(sit_blkaddr) +
>>> @@ -45,7 +45,8 @@ static int get_new_sb(struct f2fs_super_block *sb)
>>> total_valid_blks_available = (get_sb(segment_count) -
>>> (get_sb(segment_count_ckpt) +
>>> get_sb(segment_count_sit))) * blks_per_seg;
>>> - blocks_for_nat = ALIGN(total_valid_blks_available, NAT_ENTRY_PER_BLOCK);
>>> + blocks_for_nat = SIZE_ALIGN(total_valid_blks_available,
>>> + NAT_ENTRY_PER_BLOCK);
>>> set_sb(segment_count_nat, SEG_ALIGN(blocks_for_nat));
>>>
>>> sit_bitmap_size = ((get_sb(segment_count_sit) / 2) <<
>>> diff --git a/fsck/sload.c b/fsck/sload.c
>>> index 68799c1..bfc79f2 100644
>>> --- a/fsck/sload.c
>>> +++ b/fsck/sload.c
>>> @@ -15,7 +15,9 @@
>>> #include "fsck.h"
>>> #include <libgen.h>
>>> #include <dirent.h>
>>> +#ifdef HAVE_MNTENT_H
>>> #include <mntent.h>
>>> +#endif
>>>
>>> #ifdef HAVE_LIBSELINUX
>>> #include <selinux/selinux.h>
>>> diff --git a/fsck/xattr.c b/fsck/xattr.c
>>> index 1d0f7d3..f2576cd 100644
>>> --- a/fsck/xattr.c
>>> +++ b/fsck/xattr.c
>>> @@ -17,9 +17,6 @@
>>> #include "node.h"
>>> #include "xattr.h"
>>>
>>> -#define XATTR_CREATE 0x1
>>> -#define XATTR_REPLACE 0x2
>>> -
>>> void *read_all_xattrs(struct f2fs_sb_info *sbi, struct f2fs_node *inode)
>>> {
>>> struct f2fs_xattr_header *header;
>>> diff --git a/fsck/xattr.h b/fsck/xattr.h
>>> index beed3bb..e4a98e2 100644
>>> --- a/fsck/xattr.h
>>> +++ b/fsck/xattr.h
>>> @@ -17,6 +17,9 @@
>>> #define _XATTR_H_
>>>
>>> #include "f2fs.h"
>>> +#ifdef HAVE_SYS_XATTR_H
>>> +#include <sys/xattr.h>
>>> +#endif
>>>
>>> struct f2fs_xattr_header {
>>> __le32 h_magic; /* magic number for identification */
>>> @@ -76,6 +79,23 @@ static inline int f2fs_acl_count(int size)
>>> }
>>> }
>>>
>>> +#ifndef XATTR_USER_PREFIX
>>> +#define XATTR_USER_PREFIX "user."
>>> +#endif
>>> +#ifndef XATTR_SECURITY_PREFIX
>>> +#define XATTR_SECURITY_PREFIX "security."
>>> +#endif
>>> +#ifndef XATTR_TRUSTED_PREFIX
>>> +#define XATTR_TRUSTED_PREFIX "trusted."
>>> +#endif
>>> +
>>> +#ifndef XATTR_CREATE
>>> +#define XATTR_CREATE 0x1
>>> +#endif
>>> +#ifndef XATTR_REPLACE
>>> +#define XATTR_REPLACE 0x2
>>> +#endif
>>> +
>>> #define XATTR_ROUND (3)
>>>
>>> #define XATTR_SELINUX_SUFFIX "selinux"
>>> diff --git a/include/android_config.h b/include/android_config.h
>>> new file mode 100644
>>> index 0000000..bfc4105
>>> --- /dev/null
>>> +++ b/include/android_config.h
>>> @@ -0,0 +1,54 @@
>>> +#if defined(__linux__)
>>> +#define HAVE_BYTESWAP_H 1
>>> +#define HAVE_FCNTL_H 1
>>> +#define HAVE_FALLOC_H 1
>>> +#define HAVE_LINUX_HDREG_H 1
>>> +#define HAVE_LINUX_LIMITS_H 1
>>> +#define HAVE_POSIX_ACL_H 1
>>> +#define HAVE_LINUX_TYPES_H 1
>>> +#define HAVE_LINUX_XATTR_H 1
>>> +#define HAVE_MNTENT_H 1
>>> +#define HAVE_STDLIB_H 1
>>> +#define HAVE_STRING_H 1
>>> +#define HAVE_SYS_IOCTL_H 1
>>> +#define HAVE_SYS_SYSCALL_H 1
>>> +#define HAVE_SYS_MOUNT_H 1
>>> +#define HAVE_SYS_SYSMACROS_H 1
>>> +#define HAVE_SYS_XATTR_H 1
>>> +#define HAVE_UNISTD_H 1
>>> +
>>> +#define HAVE_ADD_KEY 1
>>> +#define HAVE_FALLOCATE 1
>>> +#define HAVE_FSETXATTR 1
>>> +#define HAVE_FSTAT 1
>>> +#define HAVE_FSTAT64 1
>>> +#define HAVE_GETMNTENT 1
>>> +#define HAVE_KEYCTL 1
>>> +#define HAVE_LLSEEK 1
>>> +#define HAVE_LSEEK64 1
>>> +#define HAVE_MEMSET 1
>>> +#define HAVE_SETMNTENT 1
>>> +#endif
>>> +
>>> +#if defined(__APPLE__)
>>> +#define HAVE_FCNTL_H 1
>>> +#define HAVE_FALLOC_H 1
>>> +#define HAVE_POSIX_ACL_H 1
>>> +#define HAVE_STDLIB_H 1
>>> +#define HAVE_STRING_H 1
>>> +#define HAVE_SYS_IOCTL_H 1
>>> +#define HAVE_SYS_SYSCALL_H 1
>>> +#define HAVE_SYS_MOUNT_H 1
>>> +#define HAVE_SYS_XATTR_H 1
>>> +#define HAVE_UNISTD_H 1
>>> +
>>> +#define HAVE_ADD_KEY 1
>>> +#define HAVE_FALLOCATE 1
>>> +#define HAVE_FSETXATTR 1
>>> +#define HAVE_FSTAT 1
>>> +#define HAVE_FSTAT64 1
>>> +#define HAVE_GETMNTENT 1
>>> +#define HAVE_KEYCTL 1
>>> +#define HAVE_LLSEEK 1
>>> +#define HAVE_MEMSET 1
>>> +#endif
>>> diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
>>> index 8d67a76..05b893a 100644
>>> --- a/include/f2fs_fs.h
>>> +++ b/include/f2fs_fs.h
>>> @@ -12,14 +12,20 @@
>>> #ifndef __F2FS_FS_H__
>>> #define __F2FS_FS_H__
>>>
>>> -#include <inttypes.h>
>>> -#include <linux/types.h>
>>> -#include <sys/types.h>
>>> -
>>> #ifdef HAVE_CONFIG_H
>>> #include <config.h>
>>> #endif
>>>
>>> +#ifdef WITH_ANDROID
>>> +#include <android_config.h>
>>> +#endif
>>> +
>>> +#include <inttypes.h>
>>> +#ifdef HAVE_LINUX_TYPES_H
>>> +#include <linux/types.h>
>>> +#endif
>>> +#include <sys/types.h>
>>> +
>>> #ifdef HAVE_LINUX_BLKZONED_H
>>> #include <linux/blkzoned.h>
>>> #endif
>>> @@ -39,10 +45,25 @@ typedef u_int16_t u16;
>>> typedef u_int8_t u8;
>>> typedef u32 block_t;
>>> typedef u32 nid_t;
>>> +#ifndef bool
>>> typedef u8 bool;
>>> +#endif
>>> typedef unsigned long pgoff_t;
>>> typedef unsigned short umode_t;
>>>
>>> +#ifndef HAVE_LINUX_TYPES_H
>>> +typedef u8 __u8;
>>> +typedef u16 __u16;
>>> +typedef u32 __u32;
>>> +typedef u64 __u64;
>>> +typedef u16 __le16;
>>> +typedef u32 __le32;
>>> +typedef u64 __le64;
>>> +typedef u16 __be16;
>>> +typedef u32 __be32;
>>> +typedef u64 __be64;
>>> +#endif
>>> +
>>> #if HAVE_BYTESWAP_H
>>> #include <byteswap.h>
>>> #else
>>> @@ -226,7 +247,9 @@ static inline uint64_t bswap_64(uint64_t val)
>>> snprintf(buf, len, #member)
>>>
>>> /* these are defined in kernel */
>>> +#ifndef PAGE_SIZE
>>> #define PAGE_SIZE 4096
>>> +#endif
>>> #define PAGE_CACHE_SIZE 4096
>>> #define BITS_PER_BYTE 8
>>> #define F2FS_SUPER_MAGIC 0xF2F52010 /* F2FS Magic Number */
>>> @@ -784,7 +807,7 @@ struct f2fs_nat_block {
>>> * disk is 16 TB and it equals to 16 * 1024 * 1024 / 2 segments.
>>> */
>>> #define F2FS_MAX_SEGMENT ((16 * 1024 * 1024) / 2)
>>> -#define MAX_SIT_BITMAP_SIZE (SEG_ALIGN(ALIGN(F2FS_MAX_SEGMENT, \
>>> +#define MAX_SIT_BITMAP_SIZE (SEG_ALIGN(SIZE_ALIGN(F2FS_MAX_SEGMENT, \
>>> SIT_ENTRY_PER_BLOCK)) * \
>>> c.blks_per_seg / 8)
>>>
>>> @@ -1146,9 +1169,9 @@ extern int f2fs_reset_zones(int);
>>>
>>> extern struct f2fs_configuration c;
>>>
>>> -#define ALIGN(val, size) ((val) + (size) - 1) / (size)
>>> -#define SEG_ALIGN(blks) ALIGN(blks, c.blks_per_seg)
>>> -#define ZONE_ALIGN(blks) ALIGN(blks, c.blks_per_seg * \
>>> +#define SIZE_ALIGN(val, size) ((val) + (size) - 1) / (size)
>>> +#define SEG_ALIGN(blks) SIZE_ALIGN(blks, c.blks_per_seg)
>>> +#define ZONE_ALIGN(blks) SIZE_ALIGN(blks, c.blks_per_seg * \
>>> c.segs_per_zone)
>>>
>>> static inline double get_best_overprovision(struct f2fs_super_block *sb)
>>> diff --git a/lib/libf2fs.c b/lib/libf2fs.c
>>> index 0f1fead..1e63843 100644
>>> --- a/lib/libf2fs.c
>>> +++ b/lib/libf2fs.c
>>> @@ -8,25 +8,34 @@
>>> */
>>> #define _LARGEFILE64_SOURCE
>>>
>>> +#include <f2fs_fs.h>
>>> #include <stdio.h>
>>> #include <stdlib.h>
>>> #include <string.h>
>>> #include <errno.h>
>>> #include <unistd.h>
>>> #include <fcntl.h>
>>> +#ifdef HAVE_MNTENT_H
>>> #include <mntent.h>
>>> +#endif
>>> #include <time.h>
>>> #include <sys/stat.h>
>>> #include <sys/mount.h>
>>> #include <sys/ioctl.h>
>>> +#ifdef HAVE_SYS_SYSMACROS_H
>>> #include <sys/sysmacros.h>
>>> +#endif
>>> #ifndef WITH_ANDROID
>>> +#ifdef HAVE_SCSI_SG_H
>>> #include <scsi/sg.h>
>>> #endif
>>> +#endif
>>> +#ifdef HAVE_LINUX_HDREG_H
>>> #include <linux/hdreg.h>
>>> +#endif
>>> +#ifdef HAVE_LINUX_LIMITS_H
>>> #include <linux/limits.h>
>>> -
>>> -#include <f2fs_fs.h>
>>> +#endif
>>>
>>> #ifndef WITH_ANDROID
>>> /* SCSI command for standard inquiry*/
>>> @@ -607,6 +616,7 @@ void f2fs_init_configuration(void)
>>> c.dry_run = 0;
>>> }
>>>
>>> +#ifdef HAVE_SETMNTENT
>>> static int is_mounted(const char *mpt, const char *device)
>>> {
>>> FILE *file = NULL;
>>> @@ -628,6 +638,7 @@ static int is_mounted(const char *mpt, const char *device)
>>> endmntent(file);
>>> return mnt ? 1 : 0;
>>> }
>>> +#endif
>>>
>>> int f2fs_dev_is_umounted(char *path)
>>> {
>>> @@ -642,29 +653,36 @@ int f2fs_dev_is_umounted(char *path)
>>> * try with /proc/mounts fist to detect RDONLY.
>>> * f2fs_stop_checkpoint makes RO in /proc/mounts while RW in /etc/mtab.
>>> */
>>> +#ifdef __linux__
>>> ret = is_mounted("/proc/mounts", path);
>>> if (ret) {
>>> MSG(0, "Info: Mounted device!\n");
>>> return -1;
>>> }
>>> -
>>> +#endif
>>> +#if defined(MOUNTED) || defined(_PATH_MOUNTED)
>>> +#ifndef MOUNTED
>>> +#define MOUNTED _PATH_MOUNTED
>>> +#endif
>>> ret = is_mounted(MOUNTED, path);
>>> if (ret) {
>>> MSG(0, "Info: Mounted device!\n");
>>> return -1;
>>> }
>>> -
>>> +#endif
>>> /*
>>> * If we are supposed to operate on the root device, then
>>> * also check the mounts for '/dev/root', which sometimes
>>> * functions as an alias for the root device.
>>> */
>>> if (is_rootdev) {
>>> +#ifdef __linux__
>>> ret = is_mounted("/proc/mounts", "/dev/root");
>>> if (ret) {
>>> MSG(0, "Info: Mounted device!\n");
>>> return -1;
>>> }
>>> +#endif
>>> }
>>>
>>> /*
>>> @@ -681,7 +699,7 @@ int f2fs_dev_is_umounted(char *path)
>>> return -1;
>>> }
>>> }
>>> - return 0;
>>> + return ret;
>>> }
>>>
>>> int f2fs_devs_are_umounted(void)
>>> @@ -704,6 +722,25 @@ void get_kernel_version(__u8 *version)
>>> memset(version + i, 0, VERSION_LEN + 1 - i);
>>> }
>>>
>>> +
>>> +#if defined(__linux__) && defined(_IO) && !defined(BLKGETSIZE)
>>> +#define BLKGETSIZE _IO(0x12,96)
>>> +#endif
>>> +
>>> +#if defined(__linux__) && defined(_IOR) && !defined(BLKGETSIZE64)
>>> +#define BLKGETSIZE64 _IOR(0x12,114, size_t)
>>> +#endif
>>> +
>>> +#if defined(__linux__) && defined(_IO) && !defined(BLKSSZGET)
>>> +#define BLKSSZGET _IO(0x12,104)
>>> +#endif
>>> +
>>> +#if defined(__APPLE__)
>>> +#include <sys/disk.h>
>>> +#define BLKGETSIZE DKIOCGETBLOCKCOUNT
>>> +#define BLKSSZGET DKIOCGETBLOCKCOUNT
>>> +#endif /* APPLE_DARWIN */
>>> +
>>> int get_device_info(int i)
>>> {
>>> int32_t fd = 0;
>>> @@ -712,8 +749,10 @@ int get_device_info(int i)
>>> uint32_t total_sectors;
>>> #endif
>>> struct stat stat_buf;
>>> +#ifdef HDIO_GETGIO
>>> struct hd_geometry geom;
>>> -#ifndef WITH_ANDROID
>>> +#endif
>>> +#if !defined(WITH_ANDROID) && defined(__linux__)
>>> sg_io_hdr_t io_hdr;
>>> unsigned char reply_buffer[96] = {0};
>>> unsigned char model_inq[6] = {MODELINQUIRY};
>>> @@ -750,10 +789,12 @@ int get_device_info(int i)
>>> } else if (S_ISREG(stat_buf.st_mode)) {
>>> dev->total_sectors = stat_buf.st_size / dev->sector_size;
>>> } else if (S_ISBLK(stat_buf.st_mode)) {
>>> +#ifdef BLKSSZGET
>>> if (ioctl(fd, BLKSSZGET, §or_size) < 0)
>>> MSG(0, "\tError: Using the default sector size\n");
>>> else if (dev->sector_size < sector_size)
>>> dev->sector_size = sector_size;
>>> +#endif
>>> #ifdef BLKGETSIZE64
>>> if (ioctl(fd, BLKGETSIZE64, &dev->total_sectors) < 0) {
>>> MSG(0, "\tError: Cannot get the device size\n");
>>> @@ -769,13 +810,17 @@ int get_device_info(int i)
>>> dev->total_sectors /= dev->sector_size;
>>>
>>> if (i == 0) {
>>> +#ifdef HDIO_GETGIO
>>> if (ioctl(fd, HDIO_GETGEO, &geom) < 0)
>>> c.start_sector = 0;
>>> else
>>> c.start_sector = geom.start;
>>> +#else
>>> + c.start_sector = 0;
>>> +#endif
>>> }
>>>
>>> -#ifndef WITH_ANDROID
>>> +#if !defined(WITH_ANDROID) && defined(__linux__)
>>> /* Send INQUIRY command */
>>> memset(&io_hdr, 0, sizeof(sg_io_hdr_t));
>>> io_hdr.interface_id = 'S';
>>> @@ -809,7 +854,7 @@ int get_device_info(int i)
>>> return -1;
>>> }
>>>
>>> -#ifndef WITH_ANDROID
>>> +#if !defined(WITH_ANDROID) && defined(__linux__)
>>> if (S_ISBLK(stat_buf.st_mode))
>>> f2fs_get_zoned_model(i);
>>>
>>> diff --git a/lib/libf2fs_io.c b/lib/libf2fs_io.c
>>> index 8a79672..268dcfa 100644
>>> --- a/lib/libf2fs_io.c
>>> +++ b/lib/libf2fs_io.c
>>> @@ -14,12 +14,16 @@
>>> #include <errno.h>
>>> #include <unistd.h>
>>> #include <fcntl.h>
>>> +#ifdef HAVE_MNTENT_H
>>> #include <mntent.h>
>>> +#endif
>>> #include <time.h>
>>> #include <sys/stat.h>
>>> #include <sys/mount.h>
>>> #include <sys/ioctl.h>
>>> +#ifdef HAVE_LINUX_HDREG_H
>>> #include <linux/hdreg.h>
>>> +#endif
>>>
>>> #include <f2fs_fs.h>
>>>
>>> @@ -54,6 +58,15 @@ static int __get_device_fd(__u64 *offset)
>>> return -1;
>>> }
>>>
>>> +#ifndef HAVE_LSEEK64
>>> +typedef off_t off64_t;
>>> +
>>> +static inline off64_t lseek64(int fd, __u64 offset, int set)
>>> +{
>>> + return lseek(fd, offset, set);
>>> +}
>>> +#endif
>>> +
>>> /*
>>> * IO interfaces
>>> */
>>> @@ -86,7 +99,11 @@ int dev_read(void *buf, __u64 offset, size_t len)
>>> return 0;
>>> }
>>>
>>> +#ifdef POSIX_FADV_WILLNEED
>>> int dev_readahead(__u64 offset, size_t len)
>>> +#else
>>> +int dev_readahead(__u64 offset, size_t UNUSED(len))
>>> +#endif
>>> {
>>> int fd = __get_device_fd(&offset);
>>>
>>> diff --git a/mkfs/f2fs_format.c b/mkfs/f2fs_format.c
>>> index 2ba8dd3..d5f39ca 100644
>>> --- a/mkfs/f2fs_format.c
>>> +++ b/mkfs/f2fs_format.c
>>> @@ -254,7 +254,7 @@ static int f2fs_prepare_super_block(void)
>>> set_sb(sit_blkaddr, get_sb(segment0_blkaddr) +
>>> get_sb(segment_count_ckpt) * c.blks_per_seg);
>>>
>>> - blocks_for_sit = ALIGN(get_sb(segment_count), SIT_ENTRY_PER_BLOCK);
>>> + blocks_for_sit = SIZE_ALIGN(get_sb(segment_count), SIT_ENTRY_PER_BLOCK);
>>>
>>> sit_segments = SEG_ALIGN(blocks_for_sit);
>>>
>>> @@ -267,7 +267,7 @@ static int f2fs_prepare_super_block(void)
>>> (get_sb(segment_count_ckpt) +
>>> get_sb(segment_count_sit))) * c.blks_per_seg;
>>>
>>> - blocks_for_nat = ALIGN(total_valid_blks_available,
>>> + blocks_for_nat = SIZE_ALIGN(total_valid_blks_available,
>>> NAT_ENTRY_PER_BLOCK);
>>>
>>> set_sb(segment_count_nat, SEG_ALIGN(blocks_for_nat));
>>> diff --git a/mkfs/f2fs_format_utils.c b/mkfs/f2fs_format_utils.c
>>> index 558684d..a474764 100644
>>> --- a/mkfs/f2fs_format_utils.c
>>> +++ b/mkfs/f2fs_format_utils.c
>>> @@ -6,20 +6,24 @@
>>> *
>>> * Dual licensed under the GPL or LGPL version 2 licenses.
>>> */
>>> +#ifndef _LARGEFILE_SOURCE
>>> #define _LARGEFILE_SOURCE
>>> +#endif
>>> +#ifndef _LARGEFILE64_SOURCE
>>> #define _LARGEFILE64_SOURCE
>>> +#endif
>>> #ifndef _GNU_SOURCE
>>> #define _GNU_SOURCE
>>> #endif
>>>
>>> +#include <f2fs_fs.h>
>>> +
>>> #include <stdio.h>
>>> #include <unistd.h>
>>> #include <sys/ioctl.h>
>>> #include <sys/stat.h>
>>> #include <fcntl.h>
>>>
>>> -#include "f2fs_fs.h"
>>> -
>>> #ifdef HAVE_LINUX_FS_H
>>> #include <linux/fs.h>
>>> #endif
>>> @@ -68,7 +72,7 @@ static int trim_device(int i)
>>> MSG(0, "Info: This device doesn't support BLKSECDISCARD\n");
>>> } else {
>>> MSG(0, "Info: Secure Discarded %lu MB\n",
>>> - stat_buf.st_size >> 20);
>>> + (unsigned long)stat_buf.st_size >> 20);
>>> return 0;
>>> }
>>> #endif
>>> diff --git a/tools/Makefile.am b/tools/Makefile.am
>>> index 5a9303f..81cf89b 100644
>>> --- a/tools/Makefile.am
>>> +++ b/tools/Makefile.am
>>> @@ -2,10 +2,14 @@
>>>
>>> AM_CPPFLAGS = ${libuuid_CFLAGS} -I$(top_srcdir)/include
>>> AM_CFLAGS = -Wall
>>> -sbin_PROGRAMS = f2fstat fibmap.f2fs parse.f2fs f2fscrypt
>>> +sbin_PROGRAMS = f2fstat fibmap.f2fs parse.f2fs
>>> f2fstat_SOURCES = f2fstat.c
>>> fibmap_f2fs_SOURCES = fibmap.c
>>> parse_f2fs_SOURCES = f2fs_io_parse.c
>>> +
>>> +if LINUX
>>> +sbin_PROGRAMS += f2fscrypt
>>> f2fscrypt_SOURCES = f2fscrypt.c sha512.c
>>> f2fscrypt_LDFLAGS = -luuid
>>> dist_man_MANS = f2fscrypt.8
>>> +endif
>>> diff --git a/tools/f2fscrypt.c b/tools/f2fscrypt.c
>>> index 48ea5f6..81ef830 100644
>>> --- a/tools/f2fscrypt.c
>>> +++ b/tools/f2fscrypt.c
>>> @@ -30,7 +30,9 @@
>>> #include <stdio.h>
>>> #include <stdlib.h>
>>> #include <string.h>
>>> +#ifdef HAVE_MNTENT_H
>>> #include <mntent.h>
>>> +#endif
>>> #include <sys/ioctl.h>
>>> #include <sys/stat.h>
>>> #include <sys/types.h>
>>> @@ -38,7 +40,9 @@
>>> #include <termios.h>
>>> #include <unistd.h>
>>> #include <signal.h>
>>> +#ifdef __KERNEL__
>>> #include <linux/fs.h>
>>> +#endif
>>> #include <uuid/uuid.h>
>>>
>>> #if !defined(HAVE_ADD_KEY) || !defined(HAVE_KEYCTL)
>>> @@ -47,6 +51,7 @@
>>> #ifdef HAVE_SYS_KEY_H
>>> #include <sys/key.h>
>>> #endif
>>> +#include <f2fs_fs.h>
>>>
>>> #define F2FS_MAX_KEY_SIZE 64
>>> #define F2FS_MAX_PASSPHRASE_SIZE 1024
>>> @@ -121,7 +126,7 @@ int options;
>>> extern void f2fs_sha512(const unsigned char *in, unsigned long in_size,
>>> unsigned char *out);
>>>
>>> -#ifndef HAVE_KEYCTL
>>> +#if !defined(HAVE_KEYCTL)
>>> static long keyctl(int cmd, ...)
>>> {
>>> va_list va;
>>> @@ -137,7 +142,7 @@ static long keyctl(int cmd, ...)
>>> }
>>> #endif
>>>
>>> -#ifndef HAVE_ADD_KEY
>>> +#if !defined(HAVE_ADD_KEY)
>>> static key_serial_t add_key(const char *type, const char *description,
>>> const void *payload, size_t plen,
>>> key_serial_t keyring)
>>> diff --git a/tools/fibmap.c b/tools/fibmap.c
>>> index 6b092f5..d17144a 100644
>>> --- a/tools/fibmap.c
>>> +++ b/tools/fibmap.c
>>> @@ -1,4 +1,20 @@
>>> +#if !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__OpenBSD__)
>>> +#define _XOPEN_SOURCE 600
>>> +#define _DARWIN_C_SOURCE
>>> +#define _FILE_OFFSET_BITS 64
>>> +#ifndef _LARGEFILE_SOURCE
>>> +#define _LARGEFILE_SOURCE
>>> +#endif
>>> +#ifndef _LARGEFILE64_SOURCE
>>> #define _LARGEFILE64_SOURCE
>>> +#endif
>>> +#ifndef _GNU_SOURCE
>>> +#define _GNU_SOURCE
>>> +#endif
>>> +#endif
>>> +#ifndef O_LARGEFILE
>>> +#define O_LARGEFILE 0
>>> +#endif
>>> #include <unistd.h>
>>> #include <string.h>
>>> #include <stdlib.h>
>>> @@ -8,12 +24,25 @@
>>> #include <sys/types.h>
>>> #include <sys/ioctl.h>
>>> #include <sys/stat.h>
>>> +#ifdef HAVE_SYS_SYSMACROS_H
>>> #include <sys/sysmacros.h>
>>> +#endif
>>> #include <libgen.h>
>>> +#ifdef HAVE_LINUX_HDREG_H
>>> #include <linux/hdreg.h>
>>> +#endif
>>> +#ifdef HAVE_LINUX_TYPES_H
>>> #include <linux/types.h>
>>> +#endif
>>> +#ifdef __KERNEL__
>>> #include <linux/fs.h>
>>> +#endif
>>> #include <inttypes.h>
>>> +#include <f2fs_fs.h>
>>> +
>>> +#ifndef FIBMAP
>>> +#define FIBMAP _IO(0x00, 1) /* bmap access */
>>> +#endif
>>>
>>> struct file_ext {
>>> __u32 f_pos;
>>> @@ -31,28 +60,42 @@ void print_ext(struct file_ext *ext)
>>> ext->end_blk, ext->blk_count);
>>> }
>>>
>>> +#if defined(HAVE_FSTAT64) && !defined(__OSX_AVAILABLE_BUT_DEPRECATED)
>>> void print_stat(struct stat64 *st)
>>> +#else
>>> +void print_stat(struct stat *st)
>>> +#endif
>>> {
>>> printf("--------------------------------------------\n");
>>> printf("dev [%d:%d]\n", major(st->st_dev), minor(st->st_dev));
>>> printf("ino [0x%8"PRIx64" : %"PRIu64"]\n",
>>> st->st_ino, st->st_ino);
>>> printf("mode [0x%8x : %d]\n", st->st_mode, st->st_mode);
>>> - printf("nlink [0x%8lx : %ld]\n", st->st_nlink, st->st_nlink);
>>> + printf("nlink [0x%8lx : %ld]\n",
>>> + (unsigned long)st->st_nlink,
>>> + (long)st->st_nlink);
>>> printf("uid [0x%8x : %d]\n", st->st_uid, st->st_uid);
>>> printf("gid [0x%8x : %d]\n", st->st_gid, st->st_gid);
>>> printf("size [0x%8"PRIx64" : %"PRIu64"]\n",
>>> - st->st_size, st->st_size);
>>> - printf("blksize [0x%8lx : %ld]\n", st->st_blksize, st->st_blksize);
>>> + (u64)st->st_size, (u64)st->st_size);
>>> + printf("blksize [0x%8lx : %ld]\n",
>>> + (unsigned long)st->st_blksize,
>>> + (long)st->st_blksize);
>>> printf("blocks [0x%8"PRIx64" : %"PRIu64"]\n",
>>> - st->st_blocks, st->st_blocks);
>>> + (u64)st->st_blocks, (u64)st->st_blocks);
>>> printf("--------------------------------------------\n\n");
>>> }
>>>
>>> -void stat_bdev(struct stat64 *st, unsigned int *start_lba)
>>> +#if defined(HAVE_FSTAT64) && !defined(__OSX_AVAILABLE_BUT_DEPRECATED)
>>> +static void stat_bdev(struct stat64 *st, unsigned int *start_lba)
>>> +#else
>>> +static void stat_bdev(struct stat *st, unsigned int *start_lba)
>>> +#endif
>>> {
>>> struct stat bdev_stat;
>>> +#ifdef HDIO_GETGIO
>>> struct hd_geometry geom;
>>> +#endif
>>> char devname[32] = { 0, };
>>> char linkname[32] = { 0, };
>>> int fd;
>>> @@ -67,10 +110,14 @@ void stat_bdev(struct stat64 *st, unsigned int *start_lba)
>>> goto out;
>>>
>>> if (S_ISBLK(bdev_stat.st_mode)) {
>>> +#ifdef HDIO_GETGIO
>>> if (ioctl(fd, HDIO_GETGEO, &geom) < 0)
>>> *start_lba = 0;
>>> else
>>> *start_lba = geom.start;
>>> +#else
>>> + *start_lba = 0;
>>> +#endif
>>> }
>>>
>>> if (readlink(devname, linkname, sizeof(linkname)) < 0)
>>> @@ -90,7 +137,11 @@ int main(int argc, char *argv[])
>>> int fd;
>>> int ret = 0;
>>> char *filename;
>>> +#if defined(HAVE_FSTAT64) && !defined(__OSX_AVAILABLE_BUT_DEPRECATED)
>>> struct stat64 st;
>>> +#else
>>> + struct stat st;
>>> +#endif
>>> int total_blks;
>>> unsigned int i;
>>> struct file_ext ext;
>>> @@ -112,7 +163,11 @@ int main(int argc, char *argv[])
>>>
>>> fsync(fd);
>>>
>>> +#if defined(HAVE_FSTAT64) && !defined(__OSX_AVAILABLE_BUT_DEPRECATED)
>>> if (fstat64(fd, &st) < 0) {
>>> +#else
>>> + if (fstat(fd, &st) < 0) {
>>> +#endif
>>> ret = errno;
>>> perror(filename);
>>> goto out;
>>>
>
> .
>
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2017-11-16 2:28 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-11-15 4:17 [PATCH] f2fs-tools: build binaries in Mac Jaegeuk Kim
2017-11-15 7:49 ` Chao Yu
2017-11-15 16:22 ` Jaegeuk Kim
2017-11-16 2:28 ` Chao Yu
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).