Index: gw/smsc/smsc_at.c
===================================================================
RCS file: /home/cvs/gateway/gw/smsc/smsc_at.c,v
retrieving revision 1.35
diff -u -r1.35 smsc_at.c
--- gw/smsc/smsc_at.c	20 May 2007 16:11:31 -0000	1.35
+++ gw/smsc/smsc_at.c	30 Jul 2007 14:30:56 -0000
@@ -105,7 +105,11 @@
     }
     if (privdata->is_serial) {
         privdata->fd = open(octstr_get_cstr(privdata->device),
-                            O_RDWR | O_NONBLOCK | O_NOCTTY);
+                            O_RDWR | O_NDELAY | O_NOCTTY);
+	if (privdata->fd >= 0) {
+	     int n = fcntl(privdata->fd, F_GETFL, 0);
+	     fcntl(privdata->fd, F_SETFL, n & ~O_NDELAY);
+	}
     } else {
         if (octstr_str_compare(privdata->device, "rawtcp") == 0) {
             privdata->fd = tcpip_connect_to_server(octstr_get_cstr(privdata->rawtcp_host),
@@ -129,6 +133,7 @@
 {
     struct termios tios;
     int ret;
+    int out = 0;
 
     if ((ret = at2_open_device1(privdata)) != 0)
         return ret;
@@ -140,19 +145,29 @@
 
     kannel_cfmakeraw(&tios);
                       
-    tios.c_iflag |= IGNBRK; /* ignore break & parity errors */
-    tios.c_iflag &= ~INPCK; /* INPCK: disable parity check */
-    tios.c_cflag |= HUPCL; /* hangup on close */
-    tios.c_cflag |= CREAD; /* enable receiver */
+    tios.c_iflag  = IGNBRK; /* ignore break & parity errors */
+    tios.c_lflag  = 0;
+    tios.c_oflag  = 0;
+    tios.c_cflag  = CLOCAL | CREAD; /* enable receiver */
+    tios.c_cflag |= HUPCL;
+
+    tios.c_iflag &= ~(IXON | IXOFF | IXANY);
+    
+    tios.c_cc[VMIN] = 1;
+    tios.c_cc[VTIME] = 5;
+
+    tios.c_cflag &= ~(PARENB | PARODD);
+    tios.c_cflag &= ~(CSTOPB);
+    
+#if defined(_DCDFLOW)
+    tios.c_cflag &= ~CRTSCTS;
+#endif
+
+
     tios.c_cflag &= ~CSIZE; /* set to 8 bit */
     tios.c_cflag |= CS8;
-    tios.c_oflag &= ~ONLCR; /* no NL to CR-NL mapping outgoing */
-    tios.c_iflag |= IGNPAR; /* ignore parity */
-    tios.c_iflag &= ~INPCK;
-#if defined(CRTSCTS)
-    tios.c_cflag |= CRTSCTS; /* enable hardware flow control */
-#endif
-    tios.c_cc[VSUSP] = 0; /* otherwhise we can not send CTRL Z */
+
+    tios.c_cc[VSUSP] = 0;  /* otherwhise we can not send CTRL Z */
 
     /*
     if ( ModemTypes[privdata->modemid].enable_parity )
@@ -166,6 +181,8 @@
     }
     tcflush(privdata->fd, TCIOFLUSH);
          
+/*    ioctl(privdata->fd, TIOCFLUSH, &out); */
+
     /* 
      * Nokia 7110 and 6210 need some time between opening
      * the connection and sending the first AT commands 
@@ -349,8 +366,8 @@
     }
     O_DESTROY(linestr);
     if (s < 0) {
-        error(errno, "AT2[%s]: Couldnot write to device.", 
-              octstr_get_cstr(privdata->name));
+        error(errno, "AT2[%s]: Couldnot write to device: %s", 
+              octstr_get_cstr(privdata->name), strerror(errno));
         tcflush(privdata->fd, TCOFLUSH);
         return s;
     }
@@ -2059,11 +2076,10 @@
                 sprintf(command, "%s%s", sc, octstr_get_cstr(pdu));
                 at2_write(privdata, command);
                 at2_write_ctrlz(privdata);
-            
-            } else {
+	    } else {
             
                 /* include the CTRL-Z in the PDU string */
-                sprintf(command, "%s%s%c", sc, octstr_get_cstr(pdu), 0x1A);
+                sprintf(command, "%s%s%c\r", sc, octstr_get_cstr(pdu), 0x1A);
        
                 /* chop PDU into 18-byte-at-a-time pieces to prevent choking 
                  * of certain GSM Phones (e.g. Nokia 6310, 6230 etc.) */
@@ -2086,7 +2102,7 @@
                     at2_write(privdata, command);
                 }
             }               
-                
+	 
             /* wait 20 secs for modem command */
             ret = at2_wait_modem_command(privdata, 20, 0, &msg_id);
             debug("bb.smsc.at2", 0, "AT2[%s]: send command status: %d",
