summaryrefslogtreecommitdiffabout
path: root/gammu/emb/common/device/serial/ser_unx.c
Side-by-side diff
Diffstat (limited to 'gammu/emb/common/device/serial/ser_unx.c') (more/less context) (ignore whitespace changes)
-rw-r--r--gammu/emb/common/device/serial/ser_unx.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/gammu/emb/common/device/serial/ser_unx.c b/gammu/emb/common/device/serial/ser_unx.c
index 69c7515..18b5f6f 100644
--- a/gammu/emb/common/device/serial/ser_unx.c
+++ b/gammu/emb/common/device/serial/ser_unx.c
@@ -1,18 +1,27 @@
/* (c) 2002-2004 by Marcin Wiacek */
/* locking device and settings all speeds by Michal Cihar */
/* based on some work from Gnokii (www.gnokii.org)
* (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
* GNU GPL version 2 or later
*/
+/* Due to a problem in the source code management, the names of some of
+ * the authors have unfortunately been lost. We do not mean to belittle
+ * their efforts and hope they will contact us to see their names
+ * properly added to the Copyright notice above.
+ * Having published their contributions under the terms of the GNU
+ * General Public License (GPL) [version 2], the Copyright of these
+ * authors will remain respected by adhering to the license they chose
+ * to publish their code under.
+ */
#include "../../gsmstate.h"
#ifdef GSM_ENABLE_SERIALDEVICE
#ifndef WIN32
#ifndef DJGPP
#include <sys/file.h>
#include <sys/time.h>
#include <string.h>
#include <termios.h>
#include <errno.h>
@@ -51,26 +60,26 @@ static GSM_Error serial_close(GSM_StateMachine *s)
/* Restores old settings */
tcsetattr(d->hPhone, TCSANOW, &d->old_settings);
/* Closes device */
close(d->hPhone);
return ERR_NONE;
}
static GSM_Error serial_open (GSM_StateMachine *s)
{
GSM_Device_SerialData *d = &s->Device.Data.Serial;
- struct termios t;
- int i;
+ struct termios t;
+ int i;
/* O_NONBLOCK MUST is required to avoid waiting for DCD */
d->hPhone = open(s->CurrentConfig->Device, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (d->hPhone < 0) {
i = errno;
GSM_OSErrorInfo(s,"open in serial_open");
if (i == 2) return ERR_DEVICENOTEXIST; //no such file or directory
if (i == 13) return ERR_DEVICENOPERMISSION; //permission denied
return ERR_DEVICEOPENERROR;
}
#ifdef TIOCEXCL
@@ -115,25 +124,25 @@ static GSM_Error serial_open (GSM_StateMachine *s)
if (fcntl(d->hPhone, F_SETFL, FASYNC | FNONBLOCK) == -1) {
serial_close(s);
GSM_OSErrorInfo(s,"fcntl in serial_open");
return ERR_DEVICEOPENERROR;
}
return ERR_NONE;
}
static GSM_Error serial_setparity(GSM_StateMachine *s, bool parity)
{
GSM_Device_SerialData *d = &s->Device.Data.Serial;
- struct termios t;
+ struct termios t;
if (tcgetattr(d->hPhone, &t)) {
GSM_OSErrorInfo(s,"tcgetattr in serial_setparity");
return ERR_DEVICEREADERROR;
}
if (parity) {
t.c_cflag |= (PARENB | PARODD);
t.c_iflag = 0;
} else {
t.c_iflag = IGNPAR;
}
@@ -141,26 +150,26 @@ static GSM_Error serial_setparity(GSM_StateMachine *s, bool parity)
if (tcsetattr(d->hPhone, TCSANOW, &t) == -1){
serial_close(s);
GSM_OSErrorInfo(s,"tcsetattr in serial_setparity");
return ERR_DEVICEPARITYERROR;
}
return ERR_NONE;
}
static GSM_Error serial_setdtrrts(GSM_StateMachine *s, bool dtr, bool rts)
{
GSM_Device_SerialData *d = &s->Device.Data.Serial;
- struct termios t;
- unsigned int flags;
+ struct termios t;
+ unsigned int flags;
if (tcgetattr(d->hPhone, &t)) {
GSM_OSErrorInfo(s,"tcgetattr in serial_setdtrrts");
return ERR_DEVICEREADERROR;
}
#ifdef CRTSCTS
/* Disabling hardware flow control */
t.c_cflag &= ~CRTSCTS;
#endif
if (tcsetattr(d->hPhone, TCSANOW, &t) == -1) {
@@ -255,45 +264,45 @@ static GSM_Error serial_setspeed(GSM_StateMachine *s, int speed)
serial_close(s);
GSM_OSErrorInfo(s,"tcsetattr in serial_setspeed");
return ERR_DEVICECHANGESPEEDERROR;
}
return ERR_NONE;
}
static int serial_read(GSM_StateMachine *s, void *buf, size_t nbytes)
{
GSM_Device_SerialData *d = &s->Device.Data.Serial;
struct timeval timeout2;
- fd_set readfds;
- int actual = 0;
+ fd_set readfds;
+ int actual = 0;
FD_ZERO(&readfds);
FD_SET(d->hPhone, &readfds);
timeout2.tv_sec = 0;
timeout2.tv_usec = 1;
if (select(d->hPhone+1, &readfds, NULL, NULL, &timeout2)) {
actual = read(d->hPhone, buf, nbytes);
if (actual == -1) GSM_OSErrorInfo(s,"serial_read");
}
return actual;
}
static int serial_write(GSM_StateMachine *s, void *buf, size_t nbytes)
{
GSM_Device_SerialData *d = &s->Device.Data.Serial;
- int ret;
- size_t actual = 0;
+ int ret;
+ size_t actual = 0;
do {
ret = write(d->hPhone, (unsigned char *)buf, nbytes - actual);
if (ret < 0 && errno == EAGAIN) continue;
if (ret < 0) {
if (actual != nbytes) GSM_OSErrorInfo(s,"serial_write");
return actual;
}
actual += ret;
buf += ret;
if (s->ConnectionType == GCT_FBUS2PL2303) my_sleep(1);
} while (actual < nbytes);