From cfd620b3d0cd312f21f2e97c732796e549e6750e Mon Sep 17 00:00:00 2001
From: Gerasim Troeglazov <3dEyes@gmail.com>
Date: Sat, 11 Apr 2015 15:11:24 +1000
Subject: [PATCH 1/1] Add Haiku support

---
 src/SerialImp.c                | 16 +++++++++++++---
 src/SerialImp.h                |  6 ++++++
 src/gnu/io/RXTXCommDriver.java |  9 ++++++++-
 3 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/src/SerialImp.c b/src/SerialImp.c
index 617eaac..1352581 100644
--- a/src/SerialImp.c
+++ b/src/SerialImp.c
@@ -148,6 +148,11 @@
 #include	<lockdev.h>
 #endif /* LIBLOCKDEV */
 
+#ifdef __HAIKU__
+#define major(x) (0)
+#define minor(x) (0)
+#endif
+
 extern int errno;
 
 #ifdef WIN32
@@ -288,7 +293,7 @@ JNIEXPORT void JNICALL RXTXPort(Initialize)(
 	   threads, because it slows things down.  Go figure. */
 
 	/* POSIX signal handling functions */
-#if !defined(WIN32)
+#if !defined(WIN32) && !defined(__HAIKU__)
 	struct sigaction old_action;
 	sigaction(SIGIO, NULL, &old_action);
 	/* green threads already has handler, no touch */
@@ -426,7 +431,7 @@ int configure_port( int fd )
 	if( cfsetospeed( &ttyset, B9600 ) < 0 ) goto fail;
 #endif
 	if( tcsetattr( fd, TCSANOW, &ttyset ) < 0 ) goto fail;
-#ifndef WIN32
+#if !defined(WIN32) && !defined(__HAIKU__)
 	fcntl( fd, F_SETOWN, getpid() );
 #endif /* WIN32 */
 #ifdef FASYNC
@@ -566,8 +571,10 @@ void set_java_vars( JNIEnv *env, jobject jobj, int fd )
 
 
 	switch( ttyset.c_cflag&CSIZE ) {
+#ifndef __HAIKU__
 		case CS5:  databits = JDATABITS_5; break;
 		case CS6:  databits = JDATABITS_6; break;
+#endif
 		case CS7:  databits = JDATABITS_7; break;
 		case CS8:  databits = JDATABITS_8; break;
 	}
@@ -2774,8 +2781,10 @@ JNIEXPORT jint JNICALL RXTXPort(nativeStaticGetDataBits)( JNIEnv *env, jobject j
 		return(-1);
 	}
 	switch( ttyset.c_cflag&CSIZE ) {
+#ifndef __HAIKU__
 		case CS5:  return JDATABITS_5;
 		case CS6:  return JDATABITS_6;
+#endif
 		case CS7:  return JDATABITS_7;
 		case CS8:  return JDATABITS_8;
 		default:  return(-1);
@@ -3962,9 +3971,10 @@ void check_tiocmget_changes( struct event_info_struct * eis )
 		send_event( eis, SPE_DSR, change );
 	}
 
+#ifndef __HAIKU__
 	change = (mflags&TIOCM_RNG) - (eis->omflags&TIOCM_RNG);
 	if( eis && change ) send_event( eis, SPE_RI, change );
-
+#endif
 	change = (mflags&TIOCM_CD) - (eis->omflags&TIOCM_CD);
 	if( eis && change ) send_event( eis, SPE_CD, change );
 
diff --git a/src/SerialImp.h b/src/SerialImp.h
index 2677c28..f0820e1 100644
--- a/src/SerialImp.h
+++ b/src/SerialImp.h
@@ -271,6 +271,12 @@ Trent
 #	define LOCKFILEPREFIX ""
 #	define UUCP
 #endif /* __BEOS__ */
+#if defined(__HAIKU__)
+#	define DEVICEDIR "/dev/ports/"
+#	define LOCKDIR "/var"
+#	define LOCKFILEPREFIX ""
+#	define UUCP
+#endif /* __BEOS__ */
 #if defined(WIN32)
 #	define DEVICEDIR "//./"
 #	define LOCKDIR ""
diff --git a/src/gnu/io/RXTXCommDriver.java b/src/gnu/io/RXTXCommDriver.java
index 75929c1..0ce9333 100644
--- a/src/gnu/io/RXTXCommDriver.java
+++ b/src/gnu/io/RXTXCommDriver.java
@@ -848,7 +848,14 @@ public class RXTXCommDriver implements CommDriver
 						};
 						CandidatePortPrefixes=Temp;
 					}
-
+					else if(osName.equals("Haiku"))
+					{
+						String[] Temp = {
+							"serial",
+							"usb"
+						};
+						CandidatePortPrefixes=Temp;
+					}
 					else if(osName.equals("BeOS"))
 					{
 						String[] Temp = {
-- 
2.2.2

