diff --git a/configure.in b/configure.in
index ac3cd92..296021a 100644
--- a/configure.in
+++ b/configure.in
@@ -96,8 +96,11 @@ AC_MSG_ERROR([--with-ldopts no longer supported; use LDFLAGS= instead]))
 dnl
 AC_PROG_CC
 if test "$GCC" = yes; then
-   RDYNAMIC="-rdynamic"
-   AC_SUBST(RDYNAMIC)
+	case "$host_os" in 
+	haiku*) RDYNAMIC="-Wl,-export-dynamic" ;; 
+	*) RDYNAMIC="-rdynamic" ;; 
+	esac 
+	AC_SUBST(RDYNAMIC)
 fi
 AC_PROG_CPP
 dnl
@@ -1051,6 +1054,7 @@ AC_CHECK_FUNCS(m4_flatten([
 	backtrace
 	blkid_probe_get_topology
 	chflags
+	daemon
 	fallocate
 	fallocate64
 	fchown
@@ -1094,9 +1098,10 @@ AC_CHECK_FUNCS(m4_flatten([
 dnl
 dnl Check to see if -lsocket is required (solaris) to make something
 dnl that uses socket() to compile; this is needed for the UUID library
+dnl Haiku needs -lnetwork to get socket().
 dnl
 SOCKET_LIB=''
-AC_CHECK_LIB(socket, socket, [SOCKET_LIB=-lsocket])
+AC_CHECK_LIB(socket, socket, [SOCKET_LIB=-lsocket],[AC_CHECK_LIB(network, socket, [SOCKET_LIB=-lnetwork])])
 AC_SUBST(SOCKET_LIB)
 dnl
 dnl See if optreset exists
@@ -1187,6 +1192,16 @@ linux* | gnu* | k*bsd*-gnu)
 		fi
 	fi
 ;;
+haiku*)
+	if test "$prefix" = NONE ; then
+		prefix="`finddir B_COMMON_DIRECTORY`";
+		AC_MSG_RESULT([On $host_os systems, prefix defaults to `finddir B_COMMON_DIRECTORY`])
+		if test "$sbindir" = '${exec_prefix}/sbin' ; then
+			AC_MSG_RESULT([...and sbindir defaults to `finddir B_COMMON_DIRECTORY`/bin])
+			mandir="`finddir B_COMMON_DIRECTORY`/bin"
+		fi
+	fi
+;;
 esac
 if test "$root_prefix" = NONE ; then
 	if test "$prefix" = NONE ; then
diff --git a/contrib/spd_readdir.c b/contrib/spd_readdir.c
index 8345fa1..b5984e9 100644
--- a/contrib/spd_readdir.c
+++ b/contrib/spd_readdir.c
@@ -254,7 +254,7 @@ DIR *opendir(const char *name)
 	dirstruct = alloc_dirstruct(dir);
 	if (!dirstruct) {
 		(*real_closedir)(dir);
-		errno = -ENOMEM;
+		errno = ENOMEM;
 		return NULL;
 	}
 
@@ -287,7 +287,7 @@ DIR *fdopendir(int fd)
 	dirstruct = alloc_dirstruct(dir);
 	if (!dirstruct) {
 		(*real_closedir)(dir);
-		errno = -ENOMEM;
+		errno = ENOMEM;
 		return NULL;
 	}
 
diff --git a/e2fsck/e2fsck.h b/e2fsck/e2fsck.h
index 09a9d08..6cb3746 100644
--- a/e2fsck/e2fsck.h
+++ b/e2fsck/e2fsck.h
@@ -67,7 +67,9 @@
 #define E2FSCK_ATTR(x)
 #endif
 
+#ifdef CONFIG_QUOTA
 #include "quota/mkquota.h"
+#endif
 
 /*
  * Exit codes used by fsck-type programs
@@ -320,7 +322,9 @@ struct e2fsck_struct {
 	/*
 	 * Ext4 quota support
 	 */
+#ifdef CONFIG_QUOTA
 	quota_ctx_t qctx;
+#endif
 #ifdef RESOURCE_TRACK
 	/*
 	 * For timing purposes
diff --git a/e2fsck/logfile.c b/e2fsck/logfile.c
index c48b8eb..ec45dd3 100644
--- a/e2fsck/logfile.c
+++ b/e2fsck/logfile.c
@@ -233,10 +233,14 @@ static FILE *save_output(const char *s0, const char *s1, const char *s2)
 	}
 
 	if (pid == 0) {
+#ifdef HAVE_DAEMON
 		if (daemon(0, 0) < 0) {
 			perror("daemon");
 			exit(1);
 		}
+#else
+#warning daemon() not present
+#endif
 		/*
 		 * Grab the output from our parent
 		 */
diff --git a/e2fsck/pass1.c b/e2fsck/pass1.c
index a20b57b..253a681 100644
--- a/e2fsck/pass1.c
+++ b/e2fsck/pass1.c
@@ -2206,11 +2206,13 @@ static void check_blocks(e2fsck_t ctx, struct problem_context *pctx,
 		}
 	}
 
+#ifdef CONFIG_QUOTA
 	if (ino == EXT2_ROOT_INO || ino >= EXT2_FIRST_INODE(ctx->fs->super)) {
 		quota_data_add(ctx->qctx, inode, ino,
 			       pb.num_blocks * fs->blocksize);
 		quota_data_inodes(ctx->qctx, inode, ino, +1);
 	}
+#endif
 
 	if (!(fs->super->s_feature_ro_compat &
 	      EXT4_FEATURE_RO_COMPAT_HUGE_FILE) ||
diff --git a/e2fsck/pass1b.c b/e2fsck/pass1b.c
index 05cbd10..a4bae9e 100644
--- a/e2fsck/pass1b.c
+++ b/e2fsck/pass1b.c
@@ -644,8 +644,10 @@ static void delete_file(e2fsck_t ctx, ext2_ino_t ino,
 	if (ctx->inode_bad_map)
 		ext2fs_unmark_inode_bitmap2(ctx->inode_bad_map, ino);
 	ext2fs_inode_alloc_stats2(fs, ino, -1, LINUX_S_ISDIR(inode.i_mode));
+#ifdef CONFIG_QUOTA
 	quota_data_sub(ctx->qctx, &inode, ino, pb.dup_blocks * fs->blocksize);
 	quota_data_inodes(ctx->qctx, &inode, ino, -1);
+#endif
 
 	/* Inode may have changed by block_iterate, so reread it */
 	e2fsck_read_inode(ctx, ino, &inode, "delete_file");
@@ -677,7 +679,9 @@ static void delete_file(e2fsck_t ctx, ext2_ino_t ino,
 			delete_file_block(fs, &blk,
 					  BLOCK_COUNT_EXTATTR, 0, 0, &pb);
 			ext2fs_file_acl_block_set(fs, &inode, blk);
+#ifdef CONFIG_QUOTA
 			quota_data_sub(ctx->qctx, &inode, ino, fs->blocksize);
+#endif
 		}
 	}
 }
diff --git a/e2fsck/pass3.c b/e2fsck/pass3.c
index a379e9b..0d3af58 100644
--- a/e2fsck/pass3.c
+++ b/e2fsck/pass3.c
@@ -491,8 +491,10 @@ ext2_ino_t e2fsck_get_lost_and_found(e2fsck_t ctx, int fix)
 	ext2fs_icount_store(ctx->inode_count, ino, 2);
 	ext2fs_icount_store(ctx->inode_link_info, ino, 2);
 	ctx->lost_and_found = ino;
+#ifdef CONFIG_QUOTA
 	quota_data_add(ctx->qctx, &inode, ino, fs->blocksize);
 	quota_data_inodes(ctx->qctx, &inode, ino, +1);
+#endif
 #if 0
 	printf("/lost+found created; inode #%lu\n", ino);
 #endif
@@ -802,7 +804,9 @@ errcode_t e2fsck_expand_directory(e2fsck_t ctx, ext2_ino_t dir,
 
 	inode.i_size = (es.last_block + 1) * fs->blocksize;
 	ext2fs_iblk_add_blocks(fs, &inode, es.newblocks);
+#ifdef CONFIG_QUOTA
 	quota_data_add(ctx->qctx, &inode, dir, es.newblocks * fs->blocksize);
+#endif
 
 	e2fsck_write_inode(ctx, dir, &inode, "expand_directory");
 
diff --git a/e2fsck/pass4.c b/e2fsck/pass4.c
index 2d55180..c5ca971 100644
--- a/e2fsck/pass4.c
+++ b/e2fsck/pass4.c
@@ -64,7 +64,9 @@ static int disconnect_inode(e2fsck_t ctx, ext2_ino_t i,
 			e2fsck_read_bitmaps(ctx);
 			ext2fs_inode_alloc_stats2(fs, i, -1,
 						  LINUX_S_ISDIR(inode->i_mode));
+#ifdef CONFIG_QUOTA
 			quota_data_inodes(ctx->qctx, inode, i, -1);
+#endif
 			return 0;
 		}
 	}
diff --git a/e2fsck/quota.c b/e2fsck/quota.c
index 7a1476e..2dc01ff 100644
--- a/e2fsck/quota.c
+++ b/e2fsck/quota.c
@@ -21,6 +21,7 @@
 static void move_quota_inode(ext2_filsys fs, ext2_ino_t from_ino,
 			     ext2_ino_t to_ino, int qtype)
 {
+#ifdef CONFIG_QUOTA
 	struct ext2_inode	inode;
 	char			qf_name[QUOTA_NAME_LEN];
 
@@ -46,10 +47,12 @@ static void move_quota_inode(ext2_filsys fs, ext2_ino_t from_ino,
 	/* Clear out the original inode in the inode-table block. */
 	memset(&inode, 0, sizeof(struct ext2_inode));
 	ext2fs_write_inode(fs, from_ino, &inode);
+#endif
 }
 
 void e2fsck_hide_quota(e2fsck_t ctx)
 {
+#ifdef CONFIG_QUOTA
 	struct ext2_super_block *sb = ctx->fs->super;
 	struct problem_context	pctx;
 	ext2_filsys		fs = ctx->fs;
@@ -79,4 +82,5 @@ void e2fsck_hide_quota(e2fsck_t ctx)
 	}
 
 	return;
+#endif
 }
diff --git a/e2fsck/unix.c b/e2fsck/unix.c
index 5b705ed..93e270e 100644
--- a/e2fsck/unix.c
+++ b/e2fsck/unix.c
@@ -1616,6 +1616,7 @@ print_unsupp_features:
 		journal_size = -1;
 
 	if (sb->s_feature_ro_compat & EXT4_FEATURE_RO_COMPAT_QUOTA) {
+#ifdef CONFIG_QUOTA
 		/* Quotas were enabled. Do quota accounting during fsck. */
 		if ((sb->s_usr_quota_inum && sb->s_grp_quota_inum) ||
 		    (!sb->s_usr_quota_inum && !sb->s_grp_quota_inum))
@@ -1624,6 +1625,11 @@ print_unsupp_features:
 			qtype = sb->s_usr_quota_inum ? USRQUOTA : GRPQUOTA;
 
 		quota_init_context(&ctx->qctx, ctx->fs, qtype);
+#else
+		log_err(ctx, _("%s: e2fsck not compiled with QUOTA support,\n\t"
+			  "but filesystem %s has QUOTA enabled.\n"),
+			ctx->program_name, ctx->device_name);
+#endif
 	}
 
 	run_result = e2fsck_run(ctx);
@@ -1658,6 +1664,7 @@ print_unsupp_features:
 	}
 no_journal:
 
+#ifdef CONFIG_QUOTA
 	if (ctx->qctx) {
 		int i, needs_writeout;
 		for (i = 0; i < MAXQUOTAS; i++) {
@@ -1673,6 +1680,7 @@ no_journal:
 		}
 		quota_release_context(&ctx->qctx);
 	}
+#endif
 
 	if (run_result == E2F_FLAG_RESTART) {
 		log_out(ctx, _("Restarting e2fsck from the beginning...\n"));
diff --git a/lib/blkid/devname.c b/lib/blkid/devname.c
index a6673c1..c2ea2f7 100644
--- a/lib/blkid/devname.c
+++ b/lib/blkid/devname.c
@@ -40,6 +40,10 @@
 
 #include "blkidP.h"
 
+#ifndef makedev
+#define makedev(major,minor) (-1)
+#endif
+
 /*
  * Find a dev struct in the cache by device name, if available.
  *
diff --git a/lib/ext2fs/bmap64.h b/lib/ext2fs/bmap64.h
index c5384c9..4573fc6 100644
--- a/lib/ext2fs/bmap64.h
+++ b/lib/ext2fs/bmap64.h
@@ -9,6 +9,8 @@
  * %End-Header%
  */
 
+#include <sys/time.h>
+
 struct ext2_bmap_statistics {
 	int		type;
 	struct timeval	created;
diff --git a/lib/ext2fs/csum.c b/lib/ext2fs/csum.c
index ebd544f..f72525b 100644
--- a/lib/ext2fs/csum.c
+++ b/lib/ext2fs/csum.c
@@ -722,6 +722,7 @@ __u16 ext2fs_group_desc_csum(ext2_filsys fs, dgrp_t group)
 	__u16 crc = 0;
 	struct ext2_group_desc *desc;
 	size_t size;
+	size_t offset;
 
 	size = fs->super->s_desc_size;
 	if (size < EXT2_MIN_DESC_SIZE)
@@ -764,7 +765,7 @@ __u16 ext2fs_group_desc_csum(ext2_filsys fs, dgrp_t group)
 	}
 
 	/* old crc16 code */
-	size_t offset = offsetof(struct ext2_group_desc, bg_checksum);
+	offset = offsetof(struct ext2_group_desc, bg_checksum);
 	crc = ext2fs_crc16(~0, fs->super->s_uuid,
 			   sizeof(fs->super->s_uuid));
 	crc = ext2fs_crc16(crc, &group, sizeof(group));
diff --git a/lib/ext2fs/dblist.c b/lib/ext2fs/dblist.c
index 3503615..3236c6a 100644
--- a/lib/ext2fs/dblist.c
+++ b/lib/ext2fs/dblist.c
@@ -365,9 +365,9 @@ int ext2fs_dblist_count(ext2_dblist dblist)
 errcode_t ext2fs_dblist_get_last(ext2_dblist dblist,
 				 struct ext2_db_entry **entry)
 {
-	EXT2_CHECK_MAGIC(dblist, EXT2_ET_MAGIC_DBLIST);
 	static struct ext2_db_entry ret_entry;
 	struct ext2_db_entry2 *last;
+	EXT2_CHECK_MAGIC(dblist, EXT2_ET_MAGIC_DBLIST);
 
 	if (dblist->count == 0)
 		return EXT2_ET_DBLIST_EMPTY;
diff --git a/lib/ext2fs/unix_io.c b/lib/ext2fs/unix_io.c
index 19be630..d556594 100644
--- a/lib/ext2fs/unix_io.c
+++ b/lib/ext2fs/unix_io.c
@@ -24,6 +24,9 @@
 #include "config.h"
 #include <stdio.h>
 #include <string.h>
+#if HAVE_STDINT_H
+#include <stdint.h>
+#endif
 #if HAVE_UNISTD_H
 #include <unistd.h>
 #endif
diff --git a/lib/quota/common.h b/lib/quota/common.h
index 7f3f4b9..fee81b1 100644
--- a/lib/quota/common.h
+++ b/lib/quota/common.h
@@ -13,9 +13,15 @@
 # endif
 #endif
 
+# if !defined __GNUC__ || __GNUC__ > 2
 #define log_err(format, arg ...)					\
 	fprintf(stderr, "[ERROR] %s:%d:%s:: " format "\n",		\
 		__FILE__, __LINE__, __func__, ## arg)
+#else
+#define log_err(format, arg...)					\
+	fprintf(stderr, "[ERROR] %s:%d:%s:: " format "\n",		\
+		__FILE__, __LINE__, __func__ , ## arg)
+#endif
 
 #ifdef DEBUG_QUOTA
 # define log_debug(format, arg ...)					\
diff --git a/lib/quota/quotaio_tree.h b/lib/quota/quotaio_tree.h
index 6ee54c9..4c22c21 100644
--- a/lib/quota/quotaio_tree.h
+++ b/lib/quota/quotaio_tree.h
@@ -6,6 +6,7 @@
 #define _LINUX_QUOTA_TREE_H
 
 #include <sys/types.h>
+#include <stdint.h>
 
 typedef u_int32_t qid_t;        /* Type in which we store ids in memory */
 
diff --git a/misc/mke2fs.c b/misc/mke2fs.c
index bbf477a..40ae31c 100644
--- a/misc/mke2fs.c
+++ b/misc/mke2fs.c
@@ -2334,6 +2334,7 @@ static void fix_cluster_bg_counts(ext2_filsys fs)
 	ext2fs_free_blocks_count_set(fs->super, EXT2FS_C2B(fs, tot_free));
 }
 
+#ifdef CONFIG_QUOTA
 static int create_quota_inodes(ext2_filsys fs)
 {
 	quota_ctx_t qctx;
@@ -2345,6 +2346,7 @@ static int create_quota_inodes(ext2_filsys fs)
 
 	return 0;
 }
+#endif
 
 int main (int argc, char *argv[])
 {
@@ -2729,9 +2731,11 @@ no_journal:
 	if (EXT2_HAS_RO_COMPAT_FEATURE(&fs_param,
 				       EXT4_FEATURE_RO_COMPAT_BIGALLOC))
 		fix_cluster_bg_counts(fs);
+#ifdef CONFIG_QUOTA
 	if (EXT2_HAS_RO_COMPAT_FEATURE(&fs_param,
 				       EXT4_FEATURE_RO_COMPAT_QUOTA))
 		create_quota_inodes(fs);
+#endif
 
 	if (!quiet)
 		printf(_("Writing superblocks and "
diff --git a/misc/tune2fs.c b/misc/tune2fs.c
index c1ecae8..267b672 100644
--- a/misc/tune2fs.c
+++ b/misc/tune2fs.c
@@ -56,7 +56,9 @@ extern int optind;
 #include "jfs_user.h"
 #include "util.h"
 #include "blkid/blkid.h"
+#ifdef CONFIG_QUOTA
 #include "quota/mkquota.h"
+#endif
 
 #include "../version.h"
 #include "nls-enable.h"
@@ -477,6 +479,7 @@ static int rewrite_dir_block(ext2_filsys fs,
 				dcl->limit = ext2fs_cpu_to_le16(max_entries);
 			}
 		} else {
+			int max_entries;
 			/* If htree block is full then rebuild the dir */
 			if (ext2fs_le16_to_cpu(dcl->count) ==
 			    ext2fs_le16_to_cpu(dcl->limit)) {
@@ -487,7 +490,7 @@ static int rewrite_dir_block(ext2_filsys fs,
 			 * Ensure dcl->limit is small enough to leave room for
 			 * the checksum tail.
 			 */
-			int max_entries = (fs->blocksize - (dcl_offset +
+			max_entries = (fs->blocksize - (dcl_offset +
 						sizeof(struct ext2_dx_tail))) /
 					  sizeof(struct ext2_dx_entry);
 			if (ext2fs_le16_to_cpu(dcl->limit) != max_entries)
@@ -1127,6 +1130,7 @@ err:
 	return 1;
 }
 
+#ifdef CONFIG_QUOTA
 void handle_quota_options(ext2_filsys fs)
 {
 	quota_ctx_t qctx;
@@ -1176,6 +1180,7 @@ void handle_quota_options(ext2_filsys fs)
 
 	return;
 }
+#endif
 
 void parse_quota_opts(const char *opts)
 {
@@ -2547,7 +2552,13 @@ retry_open:
 			rc = 1;
 			goto closefs;
 		}
+#ifdef CONFIG_QUOTA
 		handle_quota_options(fs);
+#else
+		fputs(_("The quota feature is disabled.\n"), stderr);
+		rc = 1;
+		goto closefs;
+#endif
 	}
 
 	if (U_flag) {
