BUG: Opening of serial device fails under FreeBSD 6.0 and Open2300 v1.10
Running Open2300 v1.10 under
FreeBSD 6.0 produces:
Serial device is locked by other program
: Operation not supported
First I thought changes in
FreeBSD were to blame (the serial device in 6.0 is now at /dev/cuad0), but interestingly, v1.8 of Open2300 works fine on the same system.
Obviously, the new code in linux2300.c must be problematic under
FreeBSD 6.0 in some way. Here is the relevant portion of the diff between v1.8 and v1.10 of linux2300.c:
@@ -14,6 +14,7 @@
#define DEBUG 0
#include <errno.h>
+#include <sys/file.h>
#include "rw2300.h"
/********************************************************************
@@ -35,10 +36,18 @@
if ((ws2300 = open(device, O_RDWR | O_NOCTTY)) < 0)
{
printf("\nUnable to open serial device %s\n", device);
- - exit(0);
+ exit(EXIT_FAILURE);
}
- -
- - tcgetattr(ws2300, &adtio);
+
+ if ( flock(ws2300, LOCK_EX) < 0 ) {
+ perror("\nSerial device is locked by other program\n");
+ exit(EXIT_FAILURE);
+ }
+
+ //We want full control of what is set and simply reset the entire adtio struct
+ memset(&adtio, 0, sizeof(adtio));
+
+ //tcgetattr(ws2300, &adtio); // Commented out and replaced by the memset above
// Serial control options
adtio.c_cflag &= ~PARENB; // No parity
Test case
Environment
Open2300 version: |
1.10 |
Shared libraries: |
|
Server OS: |
FreeBSD 6.0 |
--
MartinDoege - 06 Feb 2006
Follow up
Is there any easy way to let the compilor skip the flock?
Is there some environment variable that you usually use to know that it is
FreeBSD?
There is another patch that I implemented which change the flock call. Maybe that works also with
FreeBSD.
We will see when I release 1.11
--
KennethLavrsen - 19 Jul 2006
You can use a preprocessor macro definition as in
#ifndef __FreeBSD__
if ( flock(ws2300, LOCK_EX) < 0 ) {
perror("\nSerial device is locked by other program\n");
exit(EXIT_FAILURE);
}
#endif
Locking of serial devices in
FreeBSD should be done using the uu_lock(3) function, but simply removing Linux's flock when compiling under
FreeBSD is better than nothing.
--
DiomidisSpinellis - 11 Feb 2007
Fix record