123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334 |
- 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
|