Nonstandard baud rates

lawson_whitney at juno.com lawson_whitney at juno.com
Sun Feb 17 21:19:36 CST 2002


Good day!

I don't much like this patch, but it does provide support for
nonstandard baud rates, at least on systems with <linux/serial.h>
(I didn't know where else to find serial_struct), and it might make Wine
serial comms more accessible for new users.

I couldn't think of a good way for it to clean up after itself, so it
doesn't; it is easy enough for a reasonably intelligent human to do with
setserial.  OTOH, it is easy for a reasonably intelligent human to get
nonstandard baud rates using setserial...Maybe I should say I didn't
find a good place to keep track of the flags and custom_divisor as they
were before I changed them.  I trust I will get a suggestion or two on
that and can improve it.

I think WARN is too weak, as things are now, with warn off by default
(for good reason), but it's not a fixme nor an err.  Almost, I wanted to
raise a messagebox, but I don't think a messagebox belongs here or
anywhere else.

I guess you know (I had to find out the hard way :-) you have to run
autoheader.

Anyway, this is Asbestos I can do for now.  Comments, suggestions, or
improvements welcome.  A copy is attached in case your mailer folds the
inline one.

Lawson

ChangeLog:
	configure.ac, dlls/kernel/comm.c:
	Lawson Whitney <lawson_whitney at juno..com>
	Support for nunstandard baud rate in SetCommState.

diff -ur was/configure.ac is/configure.ac
--- was/configure.ac	Sat Feb 16 23:36:08 2002
+++ is/configure.ac	Sat Feb 16 23:39:39 2002
@@ -885,6 +885,7 @@
 	linux/cdrom.h \
 	linux/input.h \
 	linux/joystick.h \
+	linux/serial.h \
 	linux/ucdrom.h \
 	net/if.h \
 	netdb.h \
diff -ur was/dlls/kernel/comm.c is/dlls/kernel/comm.c
--- was/dlls/kernel/comm.c	Wed Dec 26 22:14:09 2001
+++ is/dlls/kernel/comm.c	Sun Feb 17 21:08:38 2002
@@ -68,6 +68,10 @@

 #include "debugtools.h"

+#ifdef HAVE_LINUX_SERIAL_H
+#include <linux/serial.h>
+#endif
+
 DEFAULT_DEBUG_CHANNEL(comm);

 #if !defined(TIOCINQ) && defined(FIONREAD)
@@ -911,6 +915,29 @@
 			break;		
 #endif
        	        default:
+#if defined (HAVE_LINUX_SERIAL_H) && defined (TIOCSSERIAL)
+			{   struct serial_struct nuts;
+			    int arby;
+			    ioctl(fd, TIOCGSERIAL, &nuts);
+			    nuts.custom_divisor = nuts.baud_base / lpdcb->BaudRate;
+			    if (!(nuts.custom_divisor)) nuts.custom_divisor = 1;
+			    arby = nuts.baud_base / nuts.custom_divisor;
+			    nuts.flags &= ~ASYNC_SPD_MASK;
+			    nuts.flags |= ASYNC_SPD_CUST;
+			    WARN("You (or a program acting at your behest)\
+ have specified\n a non-standard baud rate %ld.  Wine will set the\
+ rate to %d,\n which is as close as we can get by our present understanding\
+ of your\n hardware. I hope you know what you are doing.  Any disruption\
+ Wine\n has caused to your linux system can be undone with setserial \n\
+ (see man setserial). If you have incapacitated a Hayes type modem,\n\
+ reset it and it will probably recover.\n", lpdcb->BaudRate, arby);
+  			    ioctl(fd, TIOCSSERIAL, &nuts);
+			    port.c_cflag |= B38400;
+ 			}
+ 			break;
+#endif    /* Don't have linux/serial.h or lack TIOCSSERIAL */
+ 			
+			
                         COMM_SetCommError(handle,IE_BAUDRATE);
 			close( fd );
 			ERR("baudrate %ld\n",lpdcb->BaudRate);

-------------- next part --------------
diff -ur was/configure.ac is/configure.ac
--- was/configure.ac	Sat Feb 16 23:36:08 2002
+++ is/configure.ac	Sat Feb 16 23:39:39 2002
@@ -885,6 +885,7 @@
 	linux/cdrom.h \
 	linux/input.h \
 	linux/joystick.h \
+	linux/serial.h \
 	linux/ucdrom.h \
 	net/if.h \
 	netdb.h \
diff -ur was/dlls/kernel/comm.c is/dlls/kernel/comm.c
--- was/dlls/kernel/comm.c	Wed Dec 26 22:14:09 2001
+++ is/dlls/kernel/comm.c	Sun Feb 17 21:08:38 2002
@@ -68,6 +68,10 @@
 
 #include "debugtools.h"
 
+#ifdef HAVE_LINUX_SERIAL_H
+#include <linux/serial.h>
+#endif
+
 DEFAULT_DEBUG_CHANNEL(comm);
 
 #if !defined(TIOCINQ) && defined(FIONREAD)
@@ -911,6 +915,29 @@
 			break;		
 #endif
        	        default:
+#if defined (HAVE_LINUX_SERIAL_H) && defined (TIOCSSERIAL)
+			{   struct serial_struct nuts;
+			    int arby;
+			    ioctl(fd, TIOCGSERIAL, &nuts);
+			    nuts.custom_divisor = nuts.baud_base / lpdcb->BaudRate;
+			    if (!(nuts.custom_divisor)) nuts.custom_divisor = 1;
+			    arby = nuts.baud_base / nuts.custom_divisor;
+			    nuts.flags &= ~ASYNC_SPD_MASK;
+			    nuts.flags |= ASYNC_SPD_CUST;
+			    WARN("You (or a program acting at your behest)\
+ have specified\n a non-standard baud rate %ld.  Wine will set the\
+ rate to %d,\n which is as close as we can get by our present understanding\
+ of your\n hardware. I hope you know what you are doing.  Any disruption\
+ Wine\n has caused to your linux system can be undone with setserial \n\
+ (see man setserial). If you have incapacitated a Hayes type modem,\n\
+ reset it and it will probably recover.\n", lpdcb->BaudRate, arby);
+  			    ioctl(fd, TIOCSSERIAL, &nuts);
+			    port.c_cflag |= B38400;
+ 			}
+ 			break;
+#endif    /* Don't have linux/serial.h or lack TIOCSSERIAL */
+ 			
+			   
                         COMM_SetCommError(handle,IE_BAUDRATE);
 			close( fd );
 			ERR("baudrate %ld\n",lpdcb->BaudRate);


More information about the wine-patches mailing list