diff --git a/src/comio/comio.h b/src/comio/comio.h
index 03f87889c6941f844c0895aa770a5a04ba702d12..34a6278413a7f54d22cd91131515613f2dafb97e 100644
--- a/src/comio/comio.h
+++ b/src/comio/comio.h
@@ -54,9 +54,34 @@
 	#define COM_RING					MS_RING_ON
 	#define	COM_DCD						MS_RLSD_ON
 #else
+	#include <termios.h>
+
     #define COM_HANDLE					int
 	#define COM_HANDLE_INVALID			-1
 	#define COM_ERROR_VALUE				errno
+
+/* Stuff we apparently don't care about... */
+ *
+ *	TIOCM_LE   Line Enable.
+ *	TIOCM_DTR  Data Terminal Ready.
+ *	TIOCM_RTS  Request To Send.
+ *	TIOCM_ST   Secondary Transmit.
+ *	TIOCM_SR   Secondary Receive.
+ */
+
+	#define COM_CTS						TIOCM_CTS  /* Clear To Send. */
+#ifdef TIOCM_CAR
+	#define COM_DCD						TIOCM_CAR  /* Carrier Detect. */
+#else
+	#define COM_DCD						TIOCM_CD   /* Carrier Detect (synonym). */
+#endif
+#ifdef TIOCM_RNG
+	#define COM_RING					TIOCM_RNG  /* Ring Indication. */
+#else
+	#define COM_RING					TIOCM_RI   /* Ring Indication (synonym). */
+#endif
+	#define COM_DSR						TIOCM_DSR  /* Data Set Ready. */
+
 #endif
 
 /**************/
diff --git a/src/comio/comio_nix.c b/src/comio/comio_nix.c
new file mode 100644
index 0000000000000000000000000000000000000000..f040443df8a46611a537d4ee2a72f1b36e672833
--- /dev/null
+++ b/src/comio/comio_nix.c
@@ -0,0 +1,197 @@
+/* comio_nix.c */
+
+/* Synchronet Serial Communications I/O Library Functions for *nix */
+
+/* $Id$ */
+
+/****************************************************************************
+ * @format.tab-size 4		(Plain Text/Source Code File Header)			*
+ * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
+ *																			*
+ * Copyright 2007 Rob Swindell - http://www.synchro.net/copyright.html		*
+ *																			*
+ * This library is free software; you can redistribute it and/or			*
+ * modify it under the terms of the GNU Lesser General Public License		*
+ * as published by the Free Software Foundation; either version 2			*
+ * of the License, or (at your option) any later version.					*
+ * See the GNU Lesser General Public License for more details: lgpl.txt or	*
+ * http://www.fsf.org/copyleft/lesser.html									*
+ *																			*
+ * Anonymous FTP access to the most recent released source is available at	*
+ * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
+ *																			*
+ * Anonymous CVS access to the development source and modification history	*
+ * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
+ * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
+ *     (just hit return, no password is necessary)							*
+ * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
+ *																			*
+ * For Synchronet coding style and modification guidelines, see				*
+ * http://www.synchro.net/source.html										*
+ *																			*
+ * You are encouraged to submit any modifications (preferably in Unix diff	*
+ * format) via e-mail to mods@synchro.net									*
+ *																			*
+ * Note: If this box doesn't appear square, then you need to fix your tabs.	*
+ ****************************************************************************/
+
+#include <sys/file.h>
+#include "comio.h"
+#include "genwrap.h"
+
+char* comVersion(char* str, size_t len)
+{
+	char revision[16];
+
+	sscanf("$Revision$", "%*s %s", revision);
+
+	safe_snprintf(str,len,"Synchronet Communications I/O Library for "PLATFORM_DESC" v%s", revision);
+	return str;
+}
+
+COM_HANDLE comOpen(const char* device)
+{
+	COM_HANDLE handle;
+	struct termios t;
+
+	if((handle=open(device, O_NONBLOCK|O_RDWR)==INVALID_HANDLE_VALUE)
+		return COM_HANDLE_INVALID;
+
+	if(tcgetattr(handle, &t)==-1) {
+		close(device);
+		return COM_HANDLE_INVALID;
+	}
+
+	t.c_iflag = (
+				  IGNBRK   /* ignore BREAK condition */
+				| IGNPAR   /* ignore (discard) parity errors */
+				);
+	t.c_oflag = 0;	/* No output processing */
+	t.c_cflag = (
+				  CS8         /* 8 bits */
+				| CREAD       /* enable receiver */
+/*
+Fun snippet from the FreeBSD manpage:
+
+     If CREAD is set, the receiver is enabled.  Otherwise, no character is
+     received.  Not all hardware supports this bit.  In fact, this flag is
+     pretty silly and if it were not part of the termios specification it
+     would be omitted.
+*/
+				| HUPCL       /* hang up on last close */
+				| CLOCAL      /* ignore modem status lines */
+/* The next two are pretty much never used */
+#ifdef CCTX_OFLOW
+				| CCTS_OFLOW  /* CTS flow control of output */
+#endif
+#ifdef CRTSCTS
+				| CRTSCTS     /* same as CCTS_OFLOW */
+#endif
+#ifdef CRTS_IFLOW
+				| CRTS_IFLOW  /* RTS flow control of input */
+#endif
+				);
+	t.c_lflag = 0;	/* No local modes */
+	if(tcsetattr(handle, TCSANOW, &t)==-1) {
+		close(device);
+		return COM_HANDLE_INVALID;
+	}
+	
+	return handle;
+}
+
+BOOL comClose(COM_HANDLE handle)
+{
+	return (!close(handle));
+}
+
+long comGetBaudRate(COM_HANDLE handle)
+{
+	struct termios t;
+	speed_t	in;
+	speed_t	out;
+
+	if(tcgetattr(handle, &t))
+		return COM_ERROR;
+
+	/* 
+	 * We actually have TWO speeds available...
+	 * return the biggest one
+	 */
+	in = cfgetispeed(&t);
+	out = cfgetospeed(&t);
+	return ((long)(in>out?in:out));
+}
+
+BOOL comSetBaudRate(COM_HANDLE handle, unsigned long rate)
+{
+	struct termios t;
+
+	if(tcgetattr(handle, &t))
+		return FALSE;
+
+	cfsetispeed(&t);
+	cfsetospeed(&t);
+	if(tcsetattr(handle, TCSANOW, &t)==-1)
+		return FALSE;
+
+	return TRUE;
+}
+
+int comGetModemStatus(COM_HANDLE handle)
+{
+	int status;
+
+	if(ioctl(handle, TIOCMGET, &status)==-1)
+		return COM_ERROR;
+
+	return status;
+}
+
+BOOL comRaiseDTR(COM_HANDLE handle)
+{
+	return(ioctl(handle, TIOCSDTR)==0);
+}
+
+BOOL comLowerDTR(COM_HANDLE handle)
+{
+	return(ioctl(handle, TIOCCDTR)==0);
+}
+
+BOOL comWriteByte(COM_HANDLE handle, BYTE ch)
+{
+	return(write(handle, &ch, 1)==1);
+}
+
+int comWriteBuf(COM_HANDLE handle, const BYTE* buf, size_t buflen)
+{
+	return write(handle, &buf, buflen);
+}
+
+/*
+ * TODO: This seem kinda dangerous for short writes...
+ */
+int comWriteString(COM_HANDLE handle, const char* str)
+{
+	return comWriteBuf(handle, str, strlen(str));
+}
+
+BOOL comReadByte(COM_HANDLE handle, BYTE* ch)
+{
+	return(read(handle, ch, 1)==1);
+}
+
+BOOL comPurgeInput(COM_HANDLE handle)
+{
+	int what = FREAD;
+
+	return(ioctl(handle, TIOCFLUSH, &what)==0);
+}
+
+BOOL comPurgeOutput(COM_HANDLE handle)
+{
+	int what = FWRITE;
+
+	return(ioctl(handle, TIOCFLUSH, &what)==0);
+}
+