From 3be3acc20d541981156ce7b058db57293f289b47 Mon Sep 17 00:00:00 2001
From: Jerome Duval <jerome.duval@gmail.com>
Date: Thu, 4 Jul 2019 10:36:20 +0200
Subject: Haiku patch.


diff --git a/src/fstorture/cmpdir.h b/src/fstorture/cmpdir.h
index c3df7a0..3b00b01 100644
--- a/src/fstorture/cmpdir.h
+++ b/src/fstorture/cmpdir.h
@@ -20,7 +20,9 @@
 /* ------------------------------------------------------------------------- */
 
 #include "basictypes.h"
+#ifndef __HAIKU__
 #include <sys/acl.h>
+#endif
 
 #define	CMPDIR_MAX_FILES	10
 
diff --git a/src/fstorture/cmpfile.h b/src/fstorture/cmpfile.h
index 8b03014..57dec92 100644
--- a/src/fstorture/cmpfile.h
+++ b/src/fstorture/cmpfile.h
@@ -31,7 +31,9 @@ value is 1 on success, 0 on failure.
 /* ------------------------------------------------------------------------- */
 
 #include "basictypes.h"
+#ifndef __HAIKU__
 #include <sys/acl.h>
+#endif
 
 #define THREADS 5
 
diff --git a/src/fstorture/fstorture.c b/src/fstorture/fstorture.c
index e291bcb..2af9f49 100644
--- a/src/fstorture/fstorture.c
+++ b/src/fstorture/fstorture.c
@@ -47,7 +47,11 @@ static btbool	WinVolume = 0;
 static btbool	noStats = 0;
 static btbool	noPerms = 0;
 static btbool	softlinks = 1;
+#ifdef __HAIKU__
+static btbool	hardlinks = 0;
+#else
 static btbool	hardlinks = 1;
+#endif
 static btbool	sleepy = 0;
 static btbool	acl = 0;
 static btbool	nocache = 0;
@@ -739,7 +743,9 @@ int	main(int argc, char **argv)
 {
 	int			n, i;
 	struct stat sbuf;
+#ifndef __HAIKU__
 	struct statfs st;
+#endif
 	int dirs = 0;
 
 	if(argc < 4)
diff --git a/src/fstorture/stdheaders.h b/src/fstorture/stdheaders.h
index 94d84d5..14f3eb0 100644
--- a/src/fstorture/stdheaders.h
+++ b/src/fstorture/stdheaders.h
@@ -33,11 +33,21 @@ This header includes all system headers that are needed.
 #include <stdio.h>
 #include <stdlib.h>
 #include <strings.h>
+#ifndef __HAIKU__
 #include <sys/mount.h>
+#endif
 #include <sys/stat.h>
+#ifndef __HAIKU__
 #include <sys/uuid.h>
+#else
+#include <uuid/uuid.h>
+#endif
 #include <unistd.h>
 
 #ifdef NeXT
 #	include <libc.h>
 #endif
+
+#ifdef __HAIKU__
+#	include <string.h>
+#endif
diff --git a/src/fsx/Makefile b/src/fsx/Makefile
index e1ee651..7257a27 100644
--- a/src/fsx/Makefile
+++ b/src/fsx/Makefile
@@ -1,7 +1,128 @@
-# $FreeBSD$
+## Haiku Generic Makefile v2.6 ##
 
-PROG=	fsx
+## Fill in this file to specify the project being created, and the referenced
+## Makefile-Engine will do all of the hard work for you. This handles any
+## architecture of Haiku.
 
-MAN=
+# The name of the binary.
+NAME = fsx
 
-.include <bsd.prog.mk>
+# The type of binary, must be one of:
+#	APP:	Application
+#	SHARED:	Shared library or add-on
+#	STATIC:	Static library archive
+#	DRIVER: Kernel driver
+TYPE = APP
+
+# 	If you plan to use localization, specify the application's MIME signature.
+APP_MIME_SIG =
+
+#	The following lines tell Pe and Eddie where the SRCS, RDEFS, and RSRCS are
+#	so that Pe and Eddie can fill them in for you.
+#%{
+# @src->@
+
+#	Specify the source files to use. Full paths or paths relative to the
+#	Makefile can be included. All files, regardless of directory, will have
+#	their object files created in the common object directory. Note that this
+#	means this Makefile will not work correctly if two source files with the
+#	same name (source.c or source.cpp) are included from different directories.
+#	Also note that spaces in folder names do not work well with this Makefile.
+SRCS = fsx.c
+
+#	Specify the resource definition files to use. Full or relative paths can be
+#	used.
+RDEFS = 
+
+#	Specify the resource files to use. Full or relative paths can be used.
+#	Both RDEFS and RSRCS can be utilized in the same Makefile.
+RSRCS =
+
+# End Pe/Eddie support.
+# @<-src@
+#%}
+
+#	Specify libraries to link against.
+#	There are two acceptable forms of library specifications:
+#	-	if your library follows the naming pattern of libXXX.so or libXXX.a,
+#		you can simply specify XXX for the library. (e.g. the entry for
+#		"libtracker.so" would be "tracker")
+#
+#	-	for GCC-independent linking of standard C++ libraries, you can use
+#		$(STDCPPLIBS) instead of the raw "stdc++[.r4] [supc++]" library names.
+#
+#	- 	if your library does not follow the standard library naming scheme,
+#		you need to specify the path to the library and it's name.
+#		(e.g. for mylib.a, specify "mylib.a" or "path/mylib.a")
+LIBS = 
+
+#	Specify additional paths to directories following the standard libXXX.so
+#	or libXXX.a naming scheme. You can specify full paths or paths relative
+#	to the Makefile. The paths included are not parsed recursively, so
+#	include all of the paths where libraries must be found. Directories where
+#	source files were specified are	automatically included.
+LIBPATHS =
+
+#	Additional paths to look for system headers. These use the form
+#	"#include <header>". Directories that contain the files in SRCS are
+#	NOT auto-included here.
+SYSTEM_INCLUDE_PATHS =
+
+#	Additional paths paths to look for local headers. These use the form
+#	#include "header". Directories that contain the files in SRCS are
+#	automatically included.
+LOCAL_INCLUDE_PATHS =
+
+#	Specify the level of optimization that you want. Specify either NONE (O0),
+#	SOME (O1), FULL (O2), or leave blank (for the default optimization level).
+OPTIMIZE :=
+
+# 	Specify the codes for languages you are going to support in this
+# 	application. The default "en" one must be provided too. "make catkeys"
+# 	will recreate only the "locales/en.catkeys" file. Use it as a template
+# 	for creating catkeys for other languages. All localization files must be
+# 	placed in the "locales" subdirectory.
+LOCALES =
+
+#	Specify all the preprocessor symbols to be defined. The symbols will not
+#	have their values set automatically; you must supply the value (if any) to
+#	use. For example, setting DEFINES to "DEBUG=1" will cause the compiler
+#	option "-DDEBUG=1" to be used. Setting DEFINES to "DEBUG" would pass
+#	"-DDEBUG" on the compiler's command line.
+DEFINES =
+
+#	Specify the warning level. Either NONE (suppress all warnings),
+#	ALL (enable all warnings), or leave blank (enable default warnings).
+WARNINGS =
+
+#	With image symbols, stack crawls in the debugger are meaningful.
+#	If set to "TRUE", symbols will be created.
+SYMBOLS :=
+
+#	Includes debug information, which allows the binary to be debugged easily.
+#	If set to "TRUE", debug info will be created.
+DEBUGGER :=
+
+#	Specify any additional compiler flags to be used.
+COMPILER_FLAGS =
+
+#	Specify any additional linker flags to be used.
+LINKER_FLAGS =
+
+#	Specify the version of this binary. Example:
+#		-app 3 4 0 d 0 -short 340 -long "340 "`echo -n -e '\302\251'`"1999 GNU GPL"
+#	This may also be specified in a resource.
+APP_VERSION :=
+
+#	(Only used when "TYPE" is "DRIVER"). Specify the desired driver install
+#	location in the /dev hierarchy. Example:
+#		DRIVER_PATH = video/usb
+#	will instruct the "driverinstall" rule to place a symlink to your driver's
+#	binary in ~/add-ons/kernel/drivers/dev/video/usb, so that your driver will
+#	appear at /dev/video/usb when loaded. The default is "misc".
+DRIVER_PATH =
+
+## Include the Makefile-Engine
+DEVEL_DIRECTORY := \
+	$(shell findpaths -r "makefile_engine" B_FIND_PATH_DEVELOP_DIRECTORY)
+include $(DEVEL_DIRECTORY)/etc/makefile-engine
diff --git a/src/fsx/fsx.c b/src/fsx/fsx.c
index 00ad178..dfc5d51 100644
--- a/src/fsx/fsx.c
+++ b/src/fsx/fsx.c
@@ -50,7 +50,9 @@
 #endif
 #include <fcntl.h>
 #include <sys/mman.h>
+#ifndef __HAIKU__
 #include <sys/extattr.h>
+#endif
 #include <sys/param.h>
 #ifndef MAP_FILE
 # define MAP_FILE 0
@@ -103,9 +105,11 @@ char	*temp_buf;			/* a pointer to the current data */
 char	*fname;				/* name of our test file */
 int	fd;				/* fd for our test file */
 int	ea = 0;				/* -e flag */
+#ifndef __HAIKU__
 int	ea_lastwrite = 0;		/* Size of the last EA Write */
 char	eaname[MAXPATHLEN];		/* Name of the EA key */
 int	eanamespace = EXTATTR_NAMESPACE_USER;
+#endif
 
 off_t		file_size = 0;
 off_t		biggest = 0;
@@ -462,8 +466,10 @@ doread(unsigned offset, unsigned size)
 	off_t ret;
 	unsigned iret;
 
+#ifndef __HAIKU__
 	if (ea)
 		size = ea_lastwrite;
+#endif
 
 	offset -= offset % readbdy;
 	if (size == 0 && !ea) {
@@ -502,7 +508,9 @@ doread(unsigned offset, unsigned size)
 		}
 		iret = read(fd, temp_buf, size);
 	} else {
+#ifndef __HAIKU__
 		iret = extattr_get_fd(fd, eanamespace, eaname, temp_buf, size);
+#endif
 	}
 
 	if (iret != size) {
@@ -665,6 +673,7 @@ dowrite(unsigned offset, unsigned size)
 		}
 		iret = write(fd, good_buf + offset, size);
 	} else {
+#ifndef __HAIKU__
 		if (random() % 100 == 0) {
 			iret = extattr_delete_fd(fd, eanamespace, eaname);
 			if (iret != 0) {
@@ -680,6 +689,7 @@ dowrite(unsigned offset, unsigned size)
 		}
 		iret = extattr_set_fd(fd, eanamespace, eaname, good_buf, size);
 		ea_lastwrite = size;
+#endif
 	}
 
 	if (iret != size) {
@@ -1043,7 +1053,9 @@ main(int argc, char **argv)
 	char goodfile[1024];
 	char logfile[1024];
 
+#ifndef __HAIKU__
 	sprintf(eaname, "%d_%s", getpid(), argv[0]);
+#endif
 
 	goodfile[0] = 0;
 	logfile[0] = 0;
@@ -1078,6 +1090,7 @@ main(int argc, char **argv)
 			debug = 1;
 			break;
 		case 'e':
+#ifndef __HAIKU__
 			ea = 1;
 			mapped_writes = 0;
 			mapped_reads = 0;
@@ -1086,6 +1099,10 @@ main(int argc, char **argv)
 			maxoplen = getnum(optarg, &endp);
 			maxfilelen = maxoplen;
 			printf("Writing into extended attribute maxoplen = %d\n", maxoplen);
+#else
+			printf("Extended attribute disabled\n");
+			usage();
+#endif
 			break;
 		case 'i':
 			invlprob = getnum(optarg, &endp);
@@ -1223,8 +1240,10 @@ main(int argc, char **argv)
 		exit(91);
 	}
 
+#ifndef __HAIKU__
 	if(ea)
 		extattr_set_fd(fd, 1, eaname, NULL, 0);
+#endif
 
 	strncat(goodfile, fname, 256);
 	strcat (goodfile, ".fsxgood");
-- 
2.21.0

