76 #include <sys/types.h> 77 #include <sys/socket.h> 78 #include <sys/param.h> 79 #include <sys/ioctl.h> 107 char *rawmessage,
int length);
110 char *rawmessage,
int length);
113 char *rawmessage,
int length);
122 static int at_dial(
char *device,
char *phonenum,
123 char *at_prefix, time_t how_long);
128 unsigned char *checksum_out);
178 error(0,
"emi_open failed");
188 error(0,
"emi_reopen failed");
200 int max_ia5passwd_len;
203 max_ia5passwd_len = strlen(passwd) * 2 + 1;
204 ia5passwd = gw_malloc(max_ia5passwd_len);
207 error(0,
"parse_binary_to_emi failed");
212 sprintf(buf,
"%s/%c/%c/%c/%s//%s/////",
227 char message_whole [1024];
228 char message_body [1024];
229 char message_header [50];
230 char message_footer [10];
231 char my_buffer [1024];
234 memset(message_whole, 0,
sizeof(message_whole));
235 memset(message_body, 0,
sizeof(message_body));
236 memset(message_header, 0,
sizeof(message_header));
237 memset(message_footer, 0,
sizeof(message_footer));
240 error(0,
"emi_fill_ucp60_login failed");
244 length = strlen(message_body);
249 sprintf(message_header,
"%02i/%05i/O/60",
254 sprintf(my_buffer,
"%s/%s/", message_header, message_body);
257 sprintf(message_whole,
"\x02%s/%s/%s\x03", message_header,
258 message_body, message_footer);
260 debug(
"bb.sms.emi", 0,
"final UCP60 msg: <%s>", message_whole);
262 put_data(smsc, message_whole, strlen(message_whole), 0);
265 info(0,
"emi_open_session: wait for ack failed!");
306 info(0,
"Trying to close already closed EMI, ignoring");
334 tmpbuff = gw_malloc(10 * 1024);
335 memset(tmpbuff, 0, 10*1024);
338 n =
get_data(smsc, tmpbuff, 10 * 1024);
374 char *tmpbuff = NULL;
376 if (smsc == NULL)
goto error;
377 if (omsg == NULL)
goto error;
379 tmpbuff = gw_malloc(10 * 1024);
380 memset(tmpbuff, 0, 10*1024);
385 if (
put_data(smsc, tmpbuff, strlen(tmpbuff), 0) < 0) {
386 info(0,
"put_data failed!");
393 debug(
"bb.sms.emi", 0,
"Submit Ok...");
399 debug(
"bb.sms.emi", 0,
"Submit Error...");
415 tmpbuff = gw_malloc(10 * 1024);
416 memset(tmpbuff, 0, 10*1024);
451 int need_to_connect = 0;
454 if (strstr(smsc->
buffer,
"OK")) need_to_connect = 1;
455 if (strstr(smsc->
buffer,
"NO CARRIER")) need_to_connect = 1;
456 if (strstr(smsc->
buffer,
"NO DIALTONE")) need_to_connect = 1;
459 while (need_to_connect) {
472 static int at_dial(
char *device,
char *phonenum,
char *at_prefix, time_t how_long)
490 fd = open(device, O_RDWR | O_NONBLOCK | O_NOCTTY);
492 error(errno,
"at_dial: error opening character device <%s>", device);
495 tcflush(fd, TCIOFLUSH);
498 tcgetattr(fd, &tios);
500 cfsetospeed(&tios, B115200);
501 cfsetispeed(&tios, B115200);
502 #elif defined(B76800) 503 cfsetospeed(&tios, B76800);
504 cfsetispeed(&tios, B76800);
505 #elif defined(B57600) 506 cfsetospeed(&tios, B57600);
507 cfsetispeed(&tios, B57600);
508 #elif defined(B38400) 509 cfsetospeed(&tios, B38400);
510 cfsetispeed(&tios, B38400);
511 #elif defined(B19200) 512 cfsetospeed(&tios, B19200);
513 cfsetispeed(&tios, B19200);
515 cfsetospeed(&tios, B9600);
516 cfsetispeed(&tios, B9600);
519 tios.c_cflag |= (HUPCL | CREAD |
CRTSCTS);
520 ret = tcsetattr(fd, TCSANOW, &tios);
522 error(errno,
"EMI[X25]: at_dial: fail to set termios attribute");
526 for (redial = 1; redial; ) {
527 info(0,
"at_dial: dialing <%s> on <%s> for <%i> seconds",
529 (
int)(how_long - (time(NULL) - timestart)));
533 sprintf(tmpbuff,
"%s%s\r\n", at_prefix, phonenum);
534 ret = write(fd, tmpbuff, strlen(tmpbuff));
535 memset(&tmpbuff, 0,
sizeof(tmpbuff));
540 if (how_long != 0 && time(NULL) > timestart + how_long)
544 if (howmanyread >= (
int)
sizeof(tmpbuff))
550 thistime = read(fd, &tmpbuff[howmanyread], 1);
551 if (thistime == -1) {
552 if (errno == EAGAIN)
continue;
553 if (errno == EINTR)
continue;
556 howmanyread += thistime;
560 if (tmpbuff[howmanyread - 1] ==
'\r' 561 || tmpbuff[howmanyread - 1] ==
'\n') {
565 if (strstr(tmpbuff,
"CONNECT") != NULL) {
566 debug(
"bb.sms.emi", 0,
"at_dial: CONNECT");
570 }
else if (strstr(tmpbuff,
"NO CARRIER") != NULL) {
571 debug(
"bb.sms.emi", 0,
"at_dial: NO CARRIER");
575 }
else if (strstr(tmpbuff,
"BUSY") != NULL) {
576 debug(
"bb.sms.emi", 0,
"at_dial: BUSY");
580 }
else if (strstr(tmpbuff,
"NO DIALTONE") != NULL) {
581 debug(
"bb.sms.emi", 0,
"at_dial: NO DIALTONE");
602 debug(
"bb.sms.emi", 0,
"at_dial: done with dialing");
606 error(0,
"at_dial timed out");
611 error(0,
"at_dial failed");
628 tmpbuff = gw_malloc(10 * 1024);
629 memset(tmpbuff, 0, 10*1024);
633 n =
get_data(smsc, tmpbuff, 1024 * 10);
645 debug(
"bb.sms.emi", 0,
"Found ACK/NACK: <%s>", tmpbuff);
648 }
while (!
found && ((time(NULL) -
start) < 5));
664 struct sockaddr_in client_addr;
671 memset(buff, 0, length);
675 n = read(smsc->
emi_fd, buff, length);
688 ret = select(FD_SETSIZE, &rf, NULL, NULL, &to);
695 error(errno,
"Error - Secondary socket closed");
699 info(0,
"Secondary socket closed by SMSC");
706 }
else if (smsc->
emi_fd >= 0 && FD_ISSET(smsc->
emi_fd, &rf)) {
707 n = read(smsc->
emi_fd, buff, length);
710 info(0,
"Main EMI socket closed by SMSC");
719 (
struct sockaddr *)&client_addr, &client_addr_len);
727 info(0,
"SMSC secondary connection tried from <%s>, " 736 info(0,
"Secondary socket opened by SMSC from <%s>",
741 info(0,
"New connection request while old secondary is open!");
745 debug(
"bb.sms.emi", 0,
"get_data:Read %d bytes: <%.*s>", n, n, buff);
746 debug(
"bb.sms.emi", 0,
"get_data:smsc->buffer == <%s>", smsc->
buffer);
766 ret = write(fd, buff, len);
768 if (errno == EINTR)
continue;
769 if (errno == EAGAIN)
continue;
770 error(errno,
"Writing to fd failed");
819 memcpy(smsc->
buffer, buff, length);
830 char tmpbuff[1024], tmpbuff2[1024];
836 if (stx && etx && stx < etx) {
837 strncpy(tmpbuff, stx, etx - stx + 1);
838 tmpbuff[etx - stx + 1] =
'\0';
840 sprintf(tmpbuff2,
"/%c/%02i/", auth,
type);
842 sprintf(tmpbuff2,
"/%02i/",
type);
844 if (strstr(tmpbuff, tmpbuff2) != NULL) {
845 debug(
"bb.sms.emi", 0,
"found message <%c/%02i>...msg <%s>", auth,
type, tmpbuff);
861 int size_of_cut_piece;
869 if (*(etx + 1) ==
'X')
872 size_of_cut_piece = (etx - stx) + 1;
874 if (length < size_of_cut_piece) {
875 error(0,
"the buffer you provided for cutting was too small");
880 memcpy(buff, stx, size_of_cut_piece);
881 buff[size_of_cut_piece] =
'\0';
884 memmove(stx, etx + 1, (smsc->
buffer + smsc->
bufsize) - stx );
886 smsc->
buflen -= size_of_cut_piece;
896 char *rawmessage,
int length)
899 char emivars[128][1024];
900 char *leftslash, *rightslash;
907 memset(isotext, 0,
sizeof(isotext));
909 strncpy(isotext, rawmessage, length);
912 for (tmpint = 0; leftslash != NULL; tmpint++) {
913 rightslash = strchr(leftslash + 1,
'/');
915 if (rightslash == NULL)
916 rightslash = strchr(leftslash + 1,
'\3');
918 if (rightslash == NULL)
922 strcpy(emivars[tmpint], leftslash + 1);
923 leftslash = rightslash;
926 if (strcmp(emivars[3],
"01") == 0) {
927 if (strcmp(emivars[7],
"2") == 0) {
928 strcpy(isotext, emivars[8]);
929 }
else if (strcmp(emivars[7],
"3") == 0) {
933 error(0,
"Unknown 01-type EMI SMS (%s)", emivars[7]);
936 }
else if (strcmp(emivars[3],
"51") == 0) {
939 }
else if (strcmp(emivars[3],
"52") == 0) {
943 error(0,
"HEY WE SHOULD NOT BE HERE!! Type = %s", emivars[3]);
953 (*msg)->sms.udhdata = NULL;
965 char *rawmessage,
int length)
968 char emivars[128][1024];
969 char timestamp[2048], sender[2048],
receiver[2048];
970 char emitext[2048], isotext[2048];
971 char *leftslash, *rightslash;
977 memset(&sender, 0,
sizeof(sender));
979 memset(&emitext, 0,
sizeof(emitext));
980 memset(&isotext, 0,
sizeof(isotext));
981 memset(×tamp, 0,
sizeof(timestamp));
983 strncpy(isotext, rawmessage, length);
986 if (isotext[length - 1] ==
'X')
989 for (tmpint = 0; leftslash != NULL; tmpint++) {
990 rightslash = strchr(leftslash + 1,
'/');
992 if (rightslash == NULL)
993 rightslash = strchr(leftslash + 1,
'\3');
995 if (rightslash == NULL)
999 strcpy(emivars[tmpint], leftslash + 1);
1000 leftslash = rightslash;
1004 sprintf(isotext,
"A//%s:%s", emivars[4], emivars[18]);
1005 sprintf(isotext,
"A//%s:", emivars[5]);
1010 debug(
"bb.sms.emi", 0,
"acknowledge: type = '%s'", emivars[3]);
1012 sprintf(emitext,
"%s/%05i/%s/%s", emivars[0], (
int) strlen(isotext) + 17,
1018 sprintf(timestamp,
"%s/%s/", emitext, isotext);
1021 sprintf(sender,
"%c%s/%s/%s%c", 0x02, emitext, isotext,
receiver, 0x03);
1022 put_data(smsc, sender, strlen(sender), is_backup);
1034 char message_whole[10*1024];
1035 char message_body[10*1024];
1036 char message_header[1024];
1037 char message_footer[1024];
1039 char my_buffer[10*1024];
1040 char my_buffer2[10*1024];
1049 memset(&message_whole, 0,
sizeof(message_whole));
1050 memset(&message_body, 0,
sizeof(message_body));
1051 memset(&message_header, 0,
sizeof(message_header));
1052 memset(&message_footer, 0,
sizeof(message_footer));
1053 memset(&my_buffer, 0,
sizeof(my_buffer));
1054 memset(&my_buffer2, 0,
sizeof(my_buffer2));
1056 memset(&snumbits, 0,
sizeof(snumbits));
1057 memset(&xser, 0,
sizeof(xser));
1069 xserbuf[1] = udh_len;
1083 strcpy(snumbits,
"");
1100 sprintf(message_body,
1101 "%s/%s/%s/%s/%s//%s////////////%c/%s/%s////%s//////%s//",
1116 length = strlen(message_body);
1125 sprintf(my_buffer,
"%s/%s/", message_header, message_body);
1128 sprintf(message_whole,
"%c%s/%s/%s%c", 0x02, message_header, message_body, message_footer, 0x03);
1130 strncpy(rawmessage, message_whole, rawmessage_length);
1134 strcat(rawmessage,
"\r");
1136 debug(
"bb.sms.emi", 0,
"emi %d message %s",
1138 return strlen(rawmessage);
1148 unsigned int mychar;
1151 for (hmtg = 0; hmtg <= (int)strlen(
from); hmtg += 2) {
1152 strncpy(tmpbuff,
from + hmtg, 2);
1153 sscanf(tmpbuff,
"%x", &mychar);
1157 to[(hmtg / 2)-1] =
'\0';
1170 unsigned char tmpchar;
1173 if (!
from || !to || length <= 0)
1178 debug(
"bb.sms.emi", 0,
"emi parsing <%s> to emi, length %d",
from, length);
1180 for (ptr =
from; length > 0; ptr++, length--) {
1182 sprintf(buf,
"%02X", tmpchar);
1183 strncat(to, buf, 2);
1196 if (!
from || !to || length <= 0)
1201 for (ptr =
from; length > 0; ptr++, length--) {
1202 sprintf(buf,
"%02X", (
unsigned char)*ptr);
1203 strncat(to, buf, 2);
1215 const unsigned char *p;
1219 for (p = buf; *p !=
'\0'; p++) {
1226 sprintf((
char *)out,
"%02X", j);
1238 switch ((
char)
from) {
1514 switch ((
int)
from) {
static int emi_open_connection_ip(SMSCenter *smsc)
void error(int err, const char *fmt,...)
void info(int err, const char *fmt,...)
static int parse_binary_to_emi(char *from, char *to, int length)
static char char_sms_to_iso(unsigned char from, int alt_charset)
static char char_iso_to_sms(unsigned char from, int alt_charset)
#define EMI_SWAPPED_CHARS
static int parse_iso88591_to_emi(char *from, char *to, int length, int alt_charset)
static void generate_checksum(const unsigned char *buffer, unsigned char *checksum_out)
int emi_submit_msg(SMSCenter *smsc, Msg *omsg)
int emi_pending_smsmessage(SMSCenter *smsc)
static int acknowledge_from_rawmessage(SMSCenter *smsc, char *rawmessage, int length)
#define octstr_get_cstr(ostr)
static struct pid_list * found
int is_allowed_ip(Octstr *allow_ip, Octstr *deny_ip, Octstr *ip)
static int emi_fill_ucp60_login(char *buf, char *OAdC, char *passwd)
SMSCenter * emi_open(char *phonenum, char *serialdevice, char *username, char *password)
Octstr * octstr_imm(const char *cstr)
static int memorybuffer_insert_data(SMSCenter *smsc, char *buff, int length)
static int parse_msg_to_rawmessage(SMSCenter *smsc, Msg *msg, char *rawmessage, int length)
int emi_receive_msg(SMSCenter *smsc, Msg **tmsg)
static int guarantee_link(SMSCenter *smsc)
int emi_reopen_ip(SMSCenter *smsc)
static int memorybuffer_cut_rawmessage(SMSCenter *smsc, char *buff, int length)
static int parse_rawmessage_to_msg(SMSCenter *smsc, Msg **msg, char *rawmessage, int length)
void msg_destroy(Msg *msg)
SMSCenter * smscenter_construct(void)
void smscenter_destruct(SMSCenter *smsc)
int tcpip_connect_to_server_with_port(char *hostname, int port, int our_port, const char *source_addr)
void octstr_destroy(Octstr *ostr)
#define octstr_create(cstr)
static int get_data(SMSCenter *smsc, char *buff, int length)
static int memorybuffer_has_rawmessage(SMSCenter *smsc, int type, char auth)
static int emi_open_connection(SMSCenter *smsc)
int emi_reopen(SMSCenter *smsc)
static int at_dial(char *device, char *phonenum, char *at_prefix, time_t how_long)
int emi_close(SMSCenter *smsc)
long octstr_len(const Octstr *ostr)
static int wait_for_ack(SMSCenter *smsc, int op_type)
static int emi_open_session(SMSCenter *smsc)
char * emi_backup_allow_ip
Octstr * host_ip(struct sockaddr_in addr)
void debug(const char *place, int err, const char *fmt,...)
static int parse_emi_to_iso88591(char *from, char *to, int length, int alt_charset)
void kannel_cfmakeraw(struct termios *tio)
static int put_data(SMSCenter *smsc, char *buff, int length, int is_backup)
void octstr_get_many_chars(char *buf, Octstr *ostr, long pos, long len)
int octstr_get_char(const Octstr *ostr, long pos)
static Octstr * alt_charset
int emi_close_ip(SMSCenter *smsc)
static XMLRPCDocument * msg
int emi_current_msg_number
static int memorybuffer_append_data(SMSCenter *smsc, char *buff, int length)