diff options
Diffstat (limited to 'tools/dosfstools/patches/0014-Add-OSX-and-FreeBSD-support.patch')
-rw-r--r-- | tools/dosfstools/patches/0014-Add-OSX-and-FreeBSD-support.patch | 334 |
1 files changed, 334 insertions, 0 deletions
diff --git a/tools/dosfstools/patches/0014-Add-OSX-and-FreeBSD-support.patch b/tools/dosfstools/patches/0014-Add-OSX-and-FreeBSD-support.patch new file mode 100644 index 0000000000..cc3c2c3d6e --- /dev/null +++ b/tools/dosfstools/patches/0014-Add-OSX-and-FreeBSD-support.patch @@ -0,0 +1,334 @@ +From 514985ae786dcde9842e46899ef5b6218662a119 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <noltari@gmail.com> +Date: Sat, 7 Mar 2015 16:32:51 +0100 +Subject: [PATCH 14/14] Add OSX and FreeBSD support +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com> +--- + Makefile | 9 ++++++++- + src/boot.c | 1 + + src/check.c | 1 + + src/endian.h | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/fat.c | 1 + + src/fatlabel.c | 1 + + src/fsck.fat.h | 3 +-- + src/io.h | 2 +- + src/lfn.c | 1 + + src/mkfs.fat.c | 19 ++++++++++++++++--- + src/types.h | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 11 files changed, 145 insertions(+), 7 deletions(-) + create mode 100644 src/endian.h + create mode 100644 src/types.h + +diff --git a/Makefile b/Makefile +index 1593f3d..7359a79 100644 +--- a/Makefile ++++ b/Makefile +@@ -28,12 +28,19 @@ DOCDIR = $(PREFIX)/share/doc + MANDIR = $(PREFIX)/share/man + + #OPTFLAGS = -O2 -fomit-frame-pointer -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 +-OPTFLAGS = -O2 -fomit-frame-pointer -D_GNU_SOURCE $(shell getconf LFS_CFLAGS) ++OPTFLAGS = -O2 -fomit-frame-pointer -D_GNU_SOURCE + #WARNFLAGS = -Wall -pedantic -std=c99 + WARNFLAGS = -Wall -Wextra -Wno-sign-compare -Wno-missing-field-initializers -Wmissing-prototypes -Wstrict-prototypes -Wwrite-strings + DEBUGFLAGS = -g + CFLAGS += $(OPTFLAGS) $(WARNFLAGS) $(DEBUGFLAGS) + ++UNAME_S := $(shell uname -s) ++ifeq ($(UNAME_S),Darwin) ++ LDLIBS += -liconv ++else ++ OPTFLAGS += $(shell getconf LFS_CFLAGS) ++endif ++ + VPATH = src + + all: build +diff --git a/src/boot.c b/src/boot.c +index 0c0918f..1da9889 100644 +--- a/src/boot.c ++++ b/src/boot.c +@@ -31,6 +31,7 @@ + #include <time.h> + + #include "common.h" ++#include "endian.h" + #include "fsck.fat.h" + #include "fat.h" + #include "io.h" +diff --git a/src/check.c b/src/check.c +index 488f715..17ff16a 100644 +--- a/src/check.c ++++ b/src/check.c +@@ -31,6 +31,7 @@ + #include <time.h> + + #include "common.h" ++#include "endian.h" + #include "fsck.fat.h" + #include "io.h" + #include "fat.h" +diff --git a/src/endian.h b/src/endian.h +new file mode 100644 +index 0000000..6613e65 +--- /dev/null ++++ b/src/endian.h +@@ -0,0 +1,57 @@ ++/* endian.h - Endian functions ++ ++ Copyright (C) 2015 Álvaro Fernández Rojas <noltari@gmail.com> ++ ++ This program is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see <http://www.gnu.org/licenses/>. ++ ++ The complete text of the GNU General Public License ++ can be found in /usr/share/common-licenses/GPL-3 file. ++*/ ++ ++#ifndef _ENDIAN_H ++#define _ENDIAN_H ++ ++#if defined(__linux__) ++ #include <endian.h> ++#elif defined(__APPLE__) ++ #include <libkern/OSByteOrder.h> ++ ++ #define htobe16(x) OSSwapHostToBigInt16(x) ++ #define htole16(x) OSSwapHostToLittleInt16(x) ++ #define be16toh(x) OSSwapBigToHostInt16(x) ++ #define le16toh(x) OSSwapLittleToHostInt16(x) ++ ++ #define htobe32(x) OSSwapHostToBigInt32(x) ++ #define htole32(x) OSSwapHostToLittleInt32(x) ++ #define be32toh(x) OSSwapBigToHostInt32(x) ++ #define le32toh(x) OSSwapLittleToHostInt32(x) ++ ++ #define htobe64(x) OSSwapHostToBigInt64(x) ++ #define htole64(x) OSSwapHostToLittleInt64(x) ++ #define be64toh(x) OSSwapBigToHostInt64(x) ++ #define le64toh(x) OSSwapLittleToHostInt64(x) ++#elif defined(__FreeBSD__) ++ #include <sys/endian.h> ++ ++ #define be16toh(x) betoh16(x) ++ #define le16toh(x) letoh16(x) ++ ++ #define be32toh(x) betoh32(x) ++ #define le32toh(x) letoh32(x) ++ ++ #define be64toh(x) betoh64(x) ++ #define le64toh(x) letoh64(x) ++#endif ++ ++#endif /* _ENDIAN_H */ +diff --git a/src/fat.c b/src/fat.c +index 5a92f56..481c08a 100644 +--- a/src/fat.c ++++ b/src/fat.c +@@ -30,6 +30,7 @@ + #include <unistd.h> + + #include "common.h" ++#include "endian.h" + #include "fsck.fat.h" + #include "io.h" + #include "check.h" +diff --git a/src/fatlabel.c b/src/fatlabel.c +index 1484ba5..6de831c 100644 +--- a/src/fatlabel.c ++++ b/src/fatlabel.c +@@ -33,6 +33,7 @@ + #include <ctype.h> + + #include "common.h" ++#include "types.h" + #include "fsck.fat.h" + #include "io.h" + #include "boot.h" +diff --git a/src/fsck.fat.h b/src/fsck.fat.h +index e5f6178..8b0ccb9 100644 +--- a/src/fsck.fat.h ++++ b/src/fsck.fat.h +@@ -27,11 +27,10 @@ + #ifndef _DOSFSCK_H + #define _DOSFSCK_H + +-#include <fcntl.h> + #include <stddef.h> + #include <stdint.h> +-#include <endian.h> + ++#include "types.h" + #include "msdos_fs.h" + + #define VFAT_LN_ATTR (ATTR_RO | ATTR_HIDDEN | ATTR_SYS | ATTR_VOLUME) +diff --git a/src/io.h b/src/io.h +index d23d07e..eecfdc5 100644 +--- a/src/io.h ++++ b/src/io.h +@@ -27,7 +27,7 @@ + #ifndef _IO_H + #define _IO_H + +-#include <fcntl.h> /* for loff_t */ ++#include "types.h" + + loff_t llseek(int fd, loff_t offset, int whence); + +diff --git a/src/lfn.c b/src/lfn.c +index 2601172..f679168 100644 +--- a/src/lfn.c ++++ b/src/lfn.c +@@ -28,6 +28,7 @@ + #include <time.h> + + #include "common.h" ++#include "endian.h" + #include "io.h" + #include "fsck.fat.h" + #include "lfn.h" +diff --git a/src/mkfs.fat.c b/src/mkfs.fat.c +index 02e0918..f2cee09 100644 +--- a/src/mkfs.fat.c ++++ b/src/mkfs.fat.c +@@ -48,8 +48,6 @@ + + #include <fcntl.h> + #include <sys/mount.h> +-#include <endian.h> +-#include <mntent.h> + #include <signal.h> + #include <string.h> + #include <stdio.h> +@@ -61,13 +59,14 @@ + #include <errno.h> + #include <ctype.h> + #include <stdint.h> +-#include <endian.h> + + #if defined(__linux__) ++ #include <mntent.h> + #include <linux/hdreg.h> + #include <linux/fs.h> + #include <linux/fd.h> + #elif defined(__FreeBSD__) || defined(__APPLE__) ++ #include <sys/mount.h> + #include <sys/disk.h> + + #define BLOCK_SIZE_BITS 10 +@@ -97,7 +96,9 @@ + }; + #endif + ++#include "endian.h" + #include "msdos_fs.h" ++#include "types.h" + + /* In earlier versions, an own llseek() was used, but glibc lseek() is + * sufficient (or even better :) for 64 bit offsets in the meantime */ +@@ -525,6 +526,7 @@ static uint64_t count_blocks(char *filename, int *remainder) + + static void check_mount(char *device_name) + { ++#if defined(__linux__) + FILE *f; + struct mntent *mnt; + +@@ -534,6 +536,17 @@ static void check_mount(char *device_name) + if (strcmp(device_name, mnt->mnt_fsname) == 0) + die("%s contains a mounted filesystem."); + endmntent(f); ++#elif defined(__APPLE__) || defined(__FreeBSD__) ++ struct statfs* mounts; ++ int num_mounts = getmntinfo(&mounts, MNT_WAIT); ++ if (num_mounts < 0) ++ return; ++ for ( int i = 0; i < num_mounts; i++ ) ++ { ++ if (strcmp(device_name, mounts[i].f_mntfromname) == 0) ++ die("%s contains a mounted filesystem."); ++ } ++#endif + } + + /* Establish the geometry and media parameters for the device */ +diff --git a/src/types.h b/src/types.h +new file mode 100644 +index 0000000..a3f1a47 +--- /dev/null ++++ b/src/types.h +@@ -0,0 +1,57 @@ ++/* types.h - Missing types ++ ++ Copyright (C) 2015 Álvaro Fernández Rojas <noltari@gmail.com> ++ ++ This program is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see <http://www.gnu.org/licenses/>. ++ ++ The complete text of the GNU General Public License ++ can be found in /usr/share/common-licenses/GPL-3 file. ++*/ ++ ++#ifndef _TYPES_H ++#define _TYPES_H ++ ++#if defined(__linux__) ++ #include <fcntl.h> ++#elif defined(__APPLE__) ++ #ifndef loff_t ++ typedef long long loff_t; ++ #endif /* loff_t */ ++ ++ #ifndef lseek64 ++ #define lseek64 lseek ++ #endif /* lseek64 */ ++ ++ #ifndef off64_t ++ #ifdef _LP64 ++ typedef off_t off64_t; ++ #else ++ typedef __longlong_t off64_t; ++ #endif /* _LP64 */ ++ #endif /* off64_t */ ++#elif defined(__FreeBSD__) ++ #ifndef loff_t ++ typedef long long loff_t; ++ #endif /* loff_t */ ++ ++ #ifndef lseek64 ++ #define lseek64 lseek ++ #endif /* lseek64 */ ++ ++ #ifndef off64_t ++ typedef off_t off64_t; ++ #endif /* off64_t */ ++#endif ++ ++#endif /* _TYPES_H */ +-- +1.9.1 + |