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)