This patch modifies f2fs-tools to be built in mac.
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
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],
)
# 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
# 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])
}
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);
#ifndef _F2FS_H_
#define _F2FS_H_
+#include <f2fs_fs.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#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) && \
}
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);
}
}
#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;
#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 */
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) +
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) <<
#include "fsck.h"
#include <libgen.h>
#include <dirent.h>
+#ifdef HAVE_MNTENT_H
#include <mntent.h>
+#endif
#ifdef HAVE_LIBSELINUX
#include <selinux/selinux.h>
#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;
#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 */
}
}
+#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"
--- /dev/null
+#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
#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
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
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 */
* 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)
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)
*/
#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*/
c.dry_run = 0;
}
+#ifdef HAVE_SETMNTENT
static int is_mounted(const char *mpt, const char *device)
{
FILE *file = NULL;
endmntent(file);
return mnt ? 1 : 0;
}
+#endif
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
}
/*
return -1;
}
}
- return 0;
+ return ret;
}
int f2fs_devs_are_umounted(void)
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;
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};
} 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");
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';
return -1;
}
-#ifndef WITH_ANDROID
+#if !defined(WITH_ANDROID) && defined(__linux__)
if (S_ISBLK(stat_buf.st_mode))
f2fs_get_zoned_model(i);
#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>
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
*/
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);
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);
(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));
*
* 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
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
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
#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>
#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)
#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
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;
}
#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)
+#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>
#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;
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;
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)
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;
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;