89 #include <sys/types.h> 90 #include <sys/socket.h> 91 #include <sys/param.h> 94 #include <netinet/in.h> 114 char* serialdevice,
int waitreport)
123 sprintf(smsc->
name,
"SEMA:X28:");
139 debug(
"smsc.sema", 0,
"sema_open: open datalink");
144 debug(
"smsc.sema", 0,
"sema_open: test send link");
156 error(0,
"sema_open: could not open");
166 debug(
"smsc.sema", 0,
"reopening the connection");
182 error(0,
"sema_reopen_data_link: device file error");
188 error(0,
"test send data link failed");
194 error(0,
"sema_reopen_data_link: failed");
215 char x28sender[2] =
"A3";
219 error(0,
"sema_submit_msg: SMSC is empty");
223 error(0,
"sema_submit_msg: Msg is empty");
228 error(0,
"sema_submit_sms: Msg is WRONG TYPE");
300 debug(
"smsc.sema", 0,
"sema_submit_msg: message is successfully delivered");
304 info(0,
"sema_submit msg: session timed out without return");
308 info(0,
"sema_submit msg: smsc says submit failed!");
335 if(recieve_sm==NULL)
goto error;
360 error(0,
"sema_receive_msg: can not create Smart Msg");
370 char clrbuff[]=
"CLR\0";
371 char errbuff[]=
"ERR\0";
378 if(ret == -1)
goto error;
383 memset(data,0,
sizeof(data));
385 if(strlen(data) > 0){
386 if(strstr(data,clrbuff) != NULL ||
387 strstr(data,errbuff) != NULL){
388 debug(
"smsc.sema", 0,
"sema_pending_msg: Radio Pad Command line-%s",data);
393 if(ret == -1)
goto error;
395 memset(data,0,
sizeof(data));
408 error(0,
"sema_pending message: device file error");
423 if(
msg == NULL)
return 0;
443 if(mlist == NULL)
return;
445 if(pmsg==NULL)
break;
457 info(0,
"msglist_push: NULL msg list");
461 info(0,
"msglist_push: NULL input");
465 if( plist->
first == NULL ) {
482 error(0,
"msglist_push: error");
490 info(0,
"msglist_pop: NULL list");
493 if(plist->
first == NULL) {
521 info(0,
"open serial device %s",device);
522 fd = open(device, O_RDWR|O_NONBLOCK|O_NOCTTY);
524 error(errno,
"sema_open_data_link: error open(2)ing the character device <%s>",
527 error(0,
"sema_open_data_link: user has no right to access the serial device");
531 tcgetattr(fd, &tios);
532 cfsetospeed(&tios, B4800);
533 cfsetispeed(&tios, B4800);
535 tios.c_iflag |= IGNBRK|IGNPAR|INPCK|ISTRIP;
536 tios.c_cflag |= (CSIZE|HUPCL | CREAD |
CRTSCTS);
537 tios.c_cflag ^= PARODD;
539 iret = tcsetattr(fd, TCSANOW, &tios);
541 error(errno,
"sema_open_data_link: fail to set termios attribute");
544 tcflush(fd, TCIOFLUSH);
554 nret= close(oldpadfd);
556 error(errno,
"sema_reopen_data_link: close device file failed!!");
568 char finishconfirm[]=
"CLR CONF\0";
569 int nret = 0, readall = 0;
573 sprintf(discnntbuff,
"%cCLR\r",0x10);
574 memset(readbuff,0,
sizeof(readbuff));
582 nret =write(padfd, discnntbuff, 6);
584 if(errno == EAGAIN || errno ==EINTR)
continue;
590 nret=read(padfd, readbuff+readall,128);
592 if(errno == EAGAIN || errno ==EINTR)
continue;
599 if(strstr(readbuff,finishconfirm))
605 error(errno,
"sema_close_send_link, device file error");
616 int readall = 0, readonce = 0, writeonce = 0, writeall = 0, i = 0;
617 char X28prompt[]=
"*\r\n\0";
620 debug(
"smsc.sema", 0,
"sema_open send link: call smsc <%s> for <%i> seconds",
625 memset(readbuff,0,
sizeof(readbuff));
626 for(i = 0; i <= 3; i++)
628 readonce = writeonce = -1;
629 writeonce = write(padfd, writebuff, 1);
631 if(errno == EINTR || errno == EAGAIN)
continue;
637 readonce = read(padfd, &readbuff[readall],1024);
639 if(errno == EINTR || errno == EAGAIN)
continue;
647 if(strstr(readbuff, X28prompt) == NULL){
648 warning(0,
"X28_open_send_link: can not read command prompt, abort");
654 memset(writebuff,0,
sizeof(writebuff));
655 memset(readbuff,0,
sizeof(readbuff));
656 writeall = readall = 0;
657 sprintf(writebuff,
"%s\r", nua);
658 sprintf(smscbuff,
"%s COM",nua);
660 while((
size_t) writeall < strlen(writebuff)){
662 writeonce = write(padfd, writebuff+writeall, strlen(writebuff)-writeall);
664 if(errno == EINTR || errno == EAGAIN)
670 writeall +=writeonce;
677 if((
size_t) readall >=
sizeof(readbuff))
680 readonce = read(padfd, &readbuff[readall], 1);
682 if(errno == EINTR || errno == EAGAIN)
continue;
690 readbuff[readall-1] ==
'\n' &&
691 readbuff[readall-2] ==
'\r') {
692 if(strstr(readbuff, smscbuff)) {
693 debug(
"smsc.sema", 0,
694 "sema_open send link: smsc responded, virtual link established");
701 info(0,
"sema_open_send_link: connect timeout");
704 warning(0,
"sema_open_send_link: command buffer overflow");
707 error(errno,
"sema_open_send_link: device file error");
717 struct timeval tv, tvinit;
721 tvinit.tv_usec = 1000;
726 FD_SET(padfd, &read_fd);
728 ret = select(padfd + 1, &read_fd, NULL, NULL, &tv);
730 if(errno==EINTR)
goto got_data;
731 if(errno==EAGAIN)
goto got_data;
732 error(errno,
"Error doing select for fad");
736 len = strlen(cbuffer);
741 error(errno,
" read device file");
748 if ((
size_t) len >
sizeof(cbuffer)- 256) {
749 p = gw_realloc(cbuffer,
sizeof(cbuffer) * 2);
750 memset(p+len,0,
sizeof(cbuffer)*2 - len);
772 int len = 0, pos = 0,writeonce = 0,writeall = 0;
775 len = strlen(cbuffer);
778 writeonce = write(padfd, cbuffer+pos, len);
781 writeonce = write(padfd, cbuffer+pos, sentonce);
783 if (writeonce == -1) {
784 if(errno == EINTR || errno == EINTR)
800 error(errno,
"sema_send data error: device file error");
808 char mobuff[] =
"COM\r\n\0";
809 char mobuffend[] =
"\r\0";
810 char prompbuff[] =
"*\r\0";
811 int len = 0, Llen= 0, Rlen = 0,RRlen = 0;
814 if(len <=0)
goto no_msg;
817 while(*
from ==
'\r' || *
from ==
'\n'){
821 memset(
from+(len-1), 0, 1);
831 if((Rbuff=memchr(
from,
'\r',len)) == NULL)
836 if((Rbuff -
from) > 0 && *(Rbuff -1) ==
'*'){
837 if(strlen(Rbuff) < 2)
goto no_msg;
840 Rlen = Rbuff -1 -
from;
841 memcpy(to,
from,Rlen);
844 if(strlen(Rbuff+1) > 1){
845 Rlen = strlen(Rbuff +2);
846 memmove(
from, Rbuff +2, Rlen);
847 memset(
from+Rlen, 0, len-Rlen);
852 else if((Rbuff-
from) > 3 && strstr(Rbuff-4,mobuff)!= NULL){
853 if(strlen(Rbuff) < 3 ||
854 (RRbuff = strstr(Rbuff + 2, mobuffend)) == NULL)
857 RRlen = RRbuff - (Rbuff+2);
859 memcpy(to, Rbuff +2 , RRlen);
863 if(strlen(RRbuff) > 1){
864 Rlen = strlen(RRbuff +1);
865 memmove(
from, RRbuff+1 ,Rlen);
866 memset(
from+Rlen,0,len -Rlen);
872 if(Rbuff -
from > 0){
874 memcpy(to,
from, Llen);
876 if(strlen(Rbuff) > 1){
877 Rlen = strlen(Rbuff+1);
878 memmove(
from,Rbuff+1,Rlen);
879 memset(
from+Rlen,0,len-Rlen);
886 if(strstr(
from,prompbuff) != NULL)
899 unsigned char oct1byte[1];
900 unsigned char ia5byte[2];
901 unsigned char cTr=
't';
902 unsigned char cMr=
'm';
903 unsigned char ccontinuebyte =
'P', ccr =
'\r';
906 memset(IA5buff,0,
sizeof(IA5buff));
910 memcpy(IA5buff,&cMr,1);
911 memcpy(IA5buff+1,&ccontinuebyte,1);
912 memcpy(IA5buff+2,srcmsg->
optref,4);
915 memcpy(IA5buff+6,ia5byte,j);
916 memcpy(IA5buff+6+j,&ccr,1);
918 if(iret == -1)
goto error;
921 memcpy(IA5buff,&cTr,1);
922 memcpy(IA5buff+1,&ccontinuebyte,1);
923 memcpy(IA5buff+2,srcmsg->
optref,4);
926 memcpy(IA5buff+6,ia5byte,j);
927 memcpy(IA5buff+6+j,&ccr,1);
929 if(iret == -1)
goto error;
936 error(0,
"sk_submit_result: write to device file failed");
948 char data[1024], IA5buff[256], IA5chars[1024], mochars[10*1024];
949 unsigned char ccontinuebyte, ccr =
'\r';
950 unsigned char cerr[] =
"ERR\0",cclr[] =
"CLR\0", tmp1[5] , tmp2[5];
952 int i, iseg = 0, ilen = 0,iret = 0, moret;
953 int isrcved = 0, iTrcved = 0, decoderesult = 0;
957 if(submit_invoke == NULL)
goto error;
960 memset(IA5chars,0,
sizeof(IA5chars));
965 iseg = strlen(IA5chars)/121 + 1;
966 segments = gw_malloc(iseg *
sizeof(
struct msg_hash));
967 if(segments == NULL)
goto error;
971 if(strlen(IA5chars) < 121)
972 ilen = strlen(IA5chars);
978 (
char *)&ccontinuebyte, 1);
980 2, (
char *)pmsg->
optref, 4);
987 for( i = 1; i < iseg; i++){
988 if(strlen(IA5chars) - i*121 < 121)
989 ilen = strlen(IA5chars) - i*121;
997 IA5chars + i*121, ilen);
1017 goto sendlink_error;
1021 for(i = 0; i < iseg; i++){
1022 memset(IA5buff,0,
sizeof(IA5buff));
1035 memset(mochars,0,
sizeof(mochars));
1044 memset(data,0,
sizeof(data));
1046 if(strlen(data) > 0){
1047 if(strstr(data,(
char *)cerr) != NULL ||
1048 strstr(data,(
char *)cclr) != NULL){
1049 debug(
"smsc.sema", 0,
"sema_mt_session: Radio Pad Command line-%s",data);
1050 goto sendlink_error;
1054 if(decoderesult >= 0){
1055 if(mtrmsg->
type ==
's'){
1058 if(submit_result == NULL)
goto error;
1060 memset(tmp1,0,5); memset(tmp2,0,5);
1061 memcpy(tmp1,mtrmsg->
optref,4);
1062 memcpy(tmp2, pmsg->
optref,4);
1063 if(strstr((
char *)tmp1,(
char *)tmp2) != NULL){
1069 gw_free(submit_result);
1072 gw_free(submit_result);
1075 else if(mtrmsg->
type ==
'T'){
1078 if(report_invoke == NULL)
goto error;
1080 memset(tmp1,0,
sizeof(tmp1)); memset(tmp2,0,
sizeof(tmp2));
1083 if(strstr((
char *)tmp1,(
char *)tmp2) != NULL){
1088 if(iret == -1)
goto error;
1090 report_invoke->
status != 3){
1091 info(0,
"sema_mt_session: submit invoke failed with report value-%i",report_invoke->
status);
1092 gw_free(report_invoke);
1095 gw_free(report_invoke);
1098 else if(mtrmsg->
type ==
'M'){
1103 if(iret == -1)
goto error;
1105 if(deliver_invoke != NULL){
1106 gw_free(deliver_invoke);
1108 ilen=strlen(mochars);
1109 memcpy(mochars+ilen,data,strlen(data));
1110 ilen=strlen(mochars);
1111 memcpy(mochars+ilen,&ccr,1);
1116 memset(mtrmsg,0,
sizeof(
struct sema_msg));
1119 memset(data,0,
sizeof(data));
1122 info(0,
"sema_mt_session: submit invoke delivered successfully to smsc");
1126 isrcved == 1 && iTrcved == 1)
1128 info(0,
"sema_mt_session: submit invoke delivered successfully to msisdn");
1136 info(0,
"sema_mt_session: timeout without receiving all expected returns");
1143 info(0,
"sema_mt_session: smsc says message deliver failed!");
1151 ilen = strlen(mochars);
1152 i = strlen(smsc->
buffer);
1155 memcpy(smsc->
buffer, mochars,ilen);
1159 info(0,
"sema_mt_session: X28 data link has broken");
1164 info(0,
"sema_mt_session: Msg encode error");
1167 error(0,
"sema_mt session: memory allocation error or device file error");
1176 int iret = 0, retresult = 0;
1184 if(iret == - 1)
goto msg_error;
1194 info(0,
"sema_mo_session: can not establish send link");
1199 if(rmsg->
type ==
'M'){
1202 if(iret == -1)
goto error;
1204 if(deliver_invoke == NULL)
goto msg_error;
1208 else if(rmsg->
type ==
'T'){
1211 if(iret == -1)
goto error;
1213 if(report_invoke != NULL)
1214 gw_free(report_invoke);
1223 error(0,
"sema_mo session: Msg decode failed");
1226 error(0,
"sema_mo session: device file error or memory allocation problem!");
1237 unsigned char tmp[1024],tmpgsm[1024];
1238 int octetlen, iret, iusedbyte;
1239 int imsgtopseg = 0, imsgfollownum = 0, imsgencodetype = 0;
1240 unsigned char cmsgtype, cmsgcontinuebyte;
1243 if(strlen(octsrc) <= 4)
goto no_msg;
1249 && cmsgtype !=
'T'){
1250 info(0,
"sema_decode: msg type not supported");
1255 cmsgcontinuebyte = *(octsrc+1);
1257 &imsgencodetype,&imsgtopseg, &imsgfollownum);
1260 info(0,
"sema_decode: msg continue bit can not be interpreted");
1268 if(imsgtopseg == 0){
1269 info(0,
"sema_decode: can not interpret more than one segments msg");
1273 (*desmsg)->type = cmsgtype;
1274 (*desmsg)->continuebyte = cmsgcontinuebyte;
1275 (*desmsg)->encodetype = imsgencodetype;
1279 memcpy((*desmsg)->optref, octsrc +2, 4);
1290 if(iusedbyte < 1)
goto error_submit;
1296 octsrc += iusedbyte;
1298 if(iusedbyte <1)
goto error_submit;
1301 octsrc += iusedbyte;
1303 if(iusedbyte < 1)
goto error_submit;
1306 (*desmsg)->msgbody = submit_result;
1314 if(iusedbyte < 1)
goto error_deliver;
1320 if(iusedbyte < 1)
goto error_deliver;
1325 if(iusedbyte < 1)
goto error_deliver;
1330 if(iusedbyte < 1)
goto error_deliver;
1336 if(iusedbyte < 1)
goto error_deliver;
1340 if(iusedbyte < 1)
goto error_deliver;
1345 info(0,
"sema_decode, Data encoding scheme not supported");
1351 if(iusedbyte < 1)
goto error_deliver;
1357 if(iusedbyte < 1)
goto error_deliver;
1363 if(iusedbyte < 1)
goto error_deliver;
1368 if(iusedbyte < 1)
goto error_deliver;
1375 memset(tmp,0,
sizeof(tmp));
1379 if(iusedbyte < 1)
goto error_deliver;
1384 memset(tmpgsm,0,
sizeof(tmpgsm));
1387 if(iusedbyte < 1)
goto error_deliver;
1400 if(iusedbyte < 1)
goto error_deliver;
1405 if(iusedbyte < 1)
goto error_deliver;
1407 (*desmsg)->msgbody = receive_sm;
1415 if(iusedbyte < 1)
goto error_receive;
1419 octsrc += iusedbyte;
1421 if(iusedbyte < 1)
goto error_receive;
1424 octsrc += iusedbyte;
1426 if(iusedbyte < 1)
goto error_receive;
1430 octsrc += iusedbyte;
1432 if(iusedbyte < 1)
goto error_receive;
1433 memcpy(receive_report->
smerefnum ,tmp, 4);
1435 octsrc += iusedbyte;
1437 if(iusedbyte < 1)
goto error_receive;
1440 octsrc += iusedbyte;
1442 if(iusedbyte < 1)
goto error_receive;
1445 octsrc += iusedbyte;
1447 if(iusedbyte < 1)
goto error_receive;
1450 octsrc += iusedbyte;
1451 if(receive_report->
status != 6)
1454 if(iusedbyte < 1)
goto error_receive;
1460 if(iusedbyte < 1)
goto error_receive;
1463 if(receive_report->
status == 6 || receive_report->
status == 1)
1465 octsrc += iusedbyte;
1467 if(iusedbyte < 1)
goto error_receive;
1472 octsrc += iusedbyte;
1474 if(iusedbyte < 1)
goto error_receive;
1478 octsrc += iusedbyte;
1480 if(iusedbyte < 1)
goto error_receive;
1483 octsrc += iusedbyte;
1489 (*desmsg)->msgbody = receive_report;
1495 info(0,
"sema_decode: msg is empty");
1498 gw_free(receive_report);
1501 gw_free(submit_result);
1504 gw_free(receive_sm);
1507 info(0,
"sema_decode:msg parameter is not recognized or unsupported");
1516 unsigned char oc1byte[10];
1570 int octects ,
int spetets,
unsigned char* to)
1577 int lenin2=octects*8;
1578 cin2 = gw_malloc(lenin2);
1580 memset(cin2,48,lenin2);
1582 for(i = 0; i < octects; i ++)
1587 cin2[(octects-1-i)*8 +7] = 49;
1589 cin2[(octects-1-i)*8 +6] = 49;
1591 cin2[(octects-1-i)*8 +5] = 49;
1593 cin2[(octects-1-i)*8 +4] = 49;
1595 cin2[(octects-1-i)*8 +3] = 49;
1597 cin2[(octects-1-i)*8 +2] = 49;
1599 cin2[(octects-1-i)*8 +1] = 49;
1601 cin2[(octects-1-i)*8] = 49;
1605 while( i <= spetets ){
1606 pos=lenin2 -1 -(i*7 -1);
1607 memset(cin7,0,
sizeof(cin7));
1608 memcpy(cin7, cin2 + pos, 7);
1637 unsigned char IA5char[3];
1638 unsigned char tmp[1024];
1641 for(i=0; i<len; i++)
1643 memset(IA5char, 0,
sizeof(IA5char));
1646 memcpy(tmp+iall,IA5char,j);
1657 int hexnum,
unsigned char* to)
1659 unsigned char cha[1];
1660 int cn =0, cnall = 0, i = 0;
1661 char *tmpfrom = NULL;
1663 for(i = 0; i< hexnum; i++)
1682 case 0x00:
return '@';
1683 case 0x01:
return '£';
1684 case 0x02:
return '$';
1685 case 0x03:
return '¥';
1686 case 0x04:
return 'è';
1687 case 0x05:
return 'é';
1688 case 0x06:
return 'ù';
1689 case 0x07:
return 'ì';
1690 case 0x08:
return 'ò';
1691 case 0x09:
return 'Ç';
1692 case 0x0A:
return '\n';
1693 case 0x0B:
return 'Ø';
1694 case 0x0C:
return 'ø';
1695 case 0x0D:
return '\r';
1696 case 0x0E:
return 'Å';
1697 case 0x0F:
return 'å';
1698 case 0x10:
return 'D';
1699 case 0x11:
return ' ';
1700 case 0x12:
return 'F';
1701 case 0x13:
return 'G';
1702 case 0x14:
return 'L';
1703 case 0x15:
return 'W';
1704 case 0x16:
return 'P';
1705 case 0x17:
return 'Y';
1706 case 0x18:
return 'S';
1707 case 0x19:
return 'Q';
1708 case 0x1A:
return 'X';
1709 case 0x1B:
return ' ';
1710 case 0x1C:
return 'Æ';
1711 case 0x1D:
return 'æ';
1712 case 0x1E:
return 'b';
1713 case 0x1F:
return 'É';
1714 case 0x5B:
return 'Ä';
1715 case 0x5C:
return 'Ö';
1716 case 0x5D:
return 'Ñ';
1717 case 0x5E:
return 'Ü';
1718 case 0x5F:
return '§';
1719 case 0x60:
return '¿';
1720 case 0x7B:
return 'a';
1721 case 0x7C:
return 'ö';
1722 case 0x7D:
return 'ñ';
1723 case 0x7E:
return 'ü';
1724 case 0x7F:
return 'à';
1725 default:
return from;
1735 to[1] = 0x40 +
from;
1738 else if(
from ==0x5C)
1744 else if(
from == 0x5E)
1750 else if(
from == 0x60)
1756 else if(
from == 0x7E)
1762 else if(
from >= 0x20 &&
from <= 0x7E)
1767 else if(
from == 0x7F)
1773 else if(
from >= 0x80 &&
from <=0x9F)
1779 else if(
from >= 0xA0 &&
from <=0xFE)
1785 else if(
from == 0xFF)
1787 to[0] =to[1] = 0x7E;
1797 int len = strlen(
from);
1799 if(*
from ==
'^' && len >= 2 &&
1805 else if(*
from ==0x5C && len >= 2 &&
1811 else if(*
from == 0x5C && len >= 2 &&
1817 else if(*
from == 0x5C && len >= 2 &&
1823 else if(*
from == 0x5C && len >=2 &&
1829 else if(*
from ==
'^' && len >= 2 &&
1830 (*(
from +1) >= 0x40 && *(
from +1) <= 0x5F))
1832 *to = *(
from +1) -0x40;
1835 else if(*
from ==
'~' && len >= 2 &&
1836 (*(
from +1) >= 0x40 && *(
from +1) <= 0x5F))
1838 *to = *(
from +1) +0x40;
1841 else if(*
from ==
'`' && len >= 2 &&
1842 (*(
from+1) >= 0x20 && *(
from +1) <= 0x7E))
1844 *to = *(
from +1) +0x80;
1847 else if(*
from >=0x20 &&
1890 int isfirst,
int follownum)
1899 strncpy(bin,
"0101",4);
1901 strncpy(bin,
"0110",4);
1911 return (value+follownum);
1923 if(continueCount & 1)
1925 if(continueCount & 2)
1927 if(continueCount & 4)
1929 if(continueCount & 8)
1934 if(continueCount & 16)
1937 if(continueCount & 32)
1940 if(continueCount & 64)
1943 if(continueCount & 128)
1947 *encode = *isfirst = -1;
1979 if(*encode != -1 && *isfirst != -1)
#define SM_RESULT_SUCCESS
#define SESSION_MT_RECEIVE_ERR
int sema_reopen(SMSCenter *smsc)
void error(int err, const char *fmt,...)
void info(int err, const char *fmt,...)
unsigned int statusreportrequest
static int line_scan_hex_GSM7(unsigned char *from, int octects, int spetets, unsigned char *to)
unsigned int textsizeoctect
unsigned int textsizeoctect
#define INTERNAL_CONNECT_TIMEVAL
static int X28_close_send_link(int padfd)
#define INTERNAL_DISCONNECT_TIMEVAL
struct sema_msglist * sema_mo
static int sema_msg_session_mt(SMSCenter *smsc, sema_msg *pmsg)
static int line_scan_IA5_hex(char *from, int hexnum, unsigned char *to)
unsigned int validperiodtype
static void sema_msglist_free(sema_msglist *mlist)
unsigned char smerefnum[4]
unsigned char smscrefnum[4]
void octstr_insert_data(Octstr *ostr, long pos, const char *data, long len)
unsigned int validperiodrela
#define octstr_get_cstr(ostr)
#define octstr_copy(ostr, from, len)
#define INTERNAL_SESSION_MT_TIMEVAL
static int sema_msg_session_mo(SMSCenter *smsc, char *cbuff)
static int sema_msglist_pop(sema_msglist *plist, sema_msg **msg)
static int X28_data_read(int padfd, char *cbuffer)
static unsigned char internal_char_hex_to_gsm(unsigned char from)
unsigned char smscrefnum[4]
static int X28_msg_pop(char *from, char *to)
static int sema_msglist_push(sema_msglist *plist, sema_msg *pmsg)
static void increment_counter(void)
static int sema_encode_msg(sema_msg *pmsg, char *str)
#define octstr_duplicate(ostr)
#define SESSION_MT_RECEIVE_SUCCESS
static unsigned char sema_counter[4]
SMSCenter * smscenter_construct(void)
int sema_close(SMSCenter *smsc)
void warning(int err, const char *fmt,...)
void smscenter_destruct(SMSCenter *smsc)
unsigned int textsizeseptet
static int sema_submit_result(SMSCenter *smsc, sema_msg *srcmsg, int result)
int sema_submit_msg(SMSCenter *smsc, Msg *msg)
void octstr_destroy(Octstr *ostr)
unsigned int textsizeseptet
#define octstr_create(cstr)
int sema_receive_msg(SMSCenter *smsc, Msg **msg)
static sema_msglist * sema_msglist_new(void)
static int sema_wait_report
static unsigned char pack_continous_byte(int encode, int isfirst, int follownum)
long octstr_len(const Octstr *ostr)
struct sema_msglist * sema_mt
static int unpack_continous_byte(unsigned char continueCount, int *encode, int *isfirst, int *follownum)
void debug(const char *place, int err, const char *fmt,...)
static int X28_open_data_link(char *device)
SMSCenter * sema_open(char *smscnua, char *homenua, char *serialdevice, int waitreport)
static int internal_char_hex_to_IA5(unsigned char from, unsigned char *to)
MultibyteInt get_variable_value(Octet *source, int *len)
static int internal_char_IA5_to_hex(char *from, unsigned char *to)
unsigned char smscrefnum[4]
void kannel_cfmakeraw(struct termios *tio)
unsigned char smerefnum[4]
int write_variable_value(MultibyteInt value, Octet *dest)
static int sema_msg_free(sema_msg *msg)
static int X28_open_send_link(int padfd, char *nua)
unsigned char smscrefnum[4]
static int X28_data_send(int padfd, char *cbuffer, int sentonce)
static int sema_decode_msg(sema_msg **desmsg, char *octsrc)
static sema_msg * sema_msg_new(void)
#define octstr_create_from_data(data, len)
static int line_append_hex_IA5(Octstr *des, unsigned char *src, int len)
#define SESSION_MT_RECEIVE_TIMEOUT
static XMLRPCDocument * msg
static int X28_reopen_data_link(int oldpadfd, char *device)
int sema_pending_smsmessage(SMSCenter *smsc)