smsc_emi2.c
上传用户:gzpyjq
上传日期:2013-01-31
资源大小:1852k
文件大小:50k
源码类别:

手机WAP编程

开发平台:

WINDOWS

  1. /*
  2.  * smsc_emi2.c - interface to EMI SMS centers
  3.  *
  4.  * Uoti Urpala 2001
  5.  */
  6. /* Doesn't warn about unrecognized configuration variables */
  7. /* The EMI specification doesn't document how connections should be
  8.  * opened/used. The way they currently work might need to be changed. */
  9. #include <sys/types.h>
  10. #include <sys/socket.h>
  11. #include <unistd.h>
  12. #include <errno.h>
  13. #include <time.h>
  14. #include <limits.h>
  15. #include <float.h>
  16. #include "gwlib/gwlib.h"
  17. #include "smscconn.h"
  18. #include "smscconn_p.h"
  19. #include "bb_smscconn_cb.h"
  20. #include "msg.h"
  21. #include "sms.h"
  22. #include "emimsg.h"
  23. #include "dlr.h"
  24. #define EMI2_MAX_TRN 100
  25. typedef struct privdata {
  26.     Octstr *name;
  27.     List *outgoing_queue;
  28.     long receiver_thread;
  29.     long sender_thread;
  30.     int retry;    /* Retry always to connect to smsc */
  31.     int shutdown;   /* Internal signal to shut down */
  32.     int listening_socket; /* File descriptor */
  33.     int send_socket;
  34.     int port, alt_port;   /* SMSC port */
  35.     int our_port;   /* Optional local port number in which to
  36.    * bind our end of send connection */
  37.     int rport;   /* Receive-port to listen */
  38.     Octstr *allow_ip, *deny_ip;
  39.     Octstr *host, *alt_host, *username, *password, *our_host;
  40.     Octstr *my_number; /* My number if we want to force one */
  41.     int unacked; /* Sent messages not acked */
  42.     struct {
  43. time_t sendtime; /* When we sent out a message with a given
  44.  * TRN. Is 0 if the TRN slot is currently free. */
  45. int     sendtype; /* OT of message, undefined if time == 0 */
  46. int dlr;            /* dlr = DLR_SMSC_SUCCESS || DLR_SMSC_FAIL */
  47. Msg     *sendmsg;  /* Corresponding message for OT == 51 */
  48.     } slots[EMI2_MAX_TRN];
  49.     int keepalive;  /* Seconds to send a Keepalive Command (OT=31) */
  50.     int flowcontrol; /* 0=Windowing, 1=Stop-and-Wait */
  51.     int waitack; /* Seconds to wait to ack */
  52.     int throughput; /* Messages per second */
  53.     int window; /* In windowed flow-control, the window size */
  54.     int         can_write;      /* write = 1, read = 0, for stop-and-wait flow control */
  55.     int         priv_nexttrn;   /* next TRN, this should never be accessed directly.
  56.  * use int emi2_next_trn (SMSCConn *conn) instead.
  57.  */
  58.     time_t last_activity_time; /* the last time something was sent over the main
  59.      * SMSC connection
  60.      */
  61.     time_t      check_time;
  62.     int         idle_timeout;   /* Seconds a Main connection to the SMSC is allowed to be idle.
  63.    If 0, no idle timeout is in effect */
  64.     Octstr   *npid; /* Notification PID value */
  65.     Octstr   *nadc; /* Notification Address */
  66. } PrivData;
  67. typedef enum {
  68.     EMI2_SENDREQ,  /* somebody asked this driver to send a SMS message */
  69.     EMI2_SMSCREQ,  /* the SMSC wants something from us */
  70.     EMI2_CONNERR,  /* an error condition in the SMSC main connection */
  71.     EMI2_TIMEOUT,  /* timeout on the SMSC main connection */
  72. } EMI2Event;
  73. #define PRIVDATA(conn) ((PrivData *)((conn)->data))
  74. #define SLOTBUSY(conn,i) (PRIVDATA(conn)->slots[(i)].sendtime != 0)
  75. #define CONNECTIONIDLE(conn)
  76. ((PRIVDATA(conn)->unacked == 0) &&
  77.  (PRIVDATA(conn)->idle_timeout ?
  78.   (PRIVDATA(conn)->last_activity_time + PRIVDATA(conn)->idle_timeout) <= time(0):0))
  79. #define emi2_can_send(conn)
  80. ((PRIVDATA(conn)->can_write || !PRIVDATA(conn)->flowcontrol) &&
  81.  (PRIVDATA(conn)->unacked < PRIVDATA(conn)->window) &&
  82.  (!PRIVDATA(conn)->shutdown))
  83. #define emi2_needs_keepalive(conn)
  84. (emi2_can_send(conn) &&
  85.  (PRIVDATA(conn)->keepalive > 0) &&
  86.  (time(NULL) > (PRIVDATA(conn)->last_activity_time + PRIVDATA(conn)->keepalive)))
  87. /*
  88.  * Send an EMI message and update the last_activity_time field.
  89.  */
  90. static int emi2_emimsg_send(SMSCConn *conn, Connection *server, struct emimsg *emimsg)
  91. {
  92.     int result = emimsg_send(server, emimsg, PRIVDATA(conn)->name);
  93.     if (result >= 0 && emimsg->or == 'O' && ( emimsg->ot == 31 || emimsg->ot == 51)) {
  94. PRIVDATA(conn)->last_activity_time = time (NULL);
  95.     }
  96.     return result;
  97. }
  98. /* Wait for a message of type 'ot', sent with TRN 0, to be acked.
  99.  * Timeout after 't' seconds. Any other packets received are ignored.
  100.  * This function is meant for initial login packet(s) and testing.
  101.  * Return 1 for positive ACK, 0 for timeout, -1 for broken/closed connection,
  102.  * -2 for negative NACK. */
  103. static int wait_for_ack(PrivData *privdata, Connection *server, int ot, int t)
  104. {
  105.     time_t timeout_time;
  106.     int time_left;
  107.     Octstr *str;
  108.     struct emimsg *emimsg;
  109.     timeout_time = time(NULL) + t;
  110.     while (1) {
  111. str = conn_read_packet(server, 2, 3);
  112. if (conn_eof(server)) {
  113.     error(0, "EMI2[%s]: connection closed in wait_for_ack",
  114.   octstr_get_cstr(privdata->name));
  115.     return -1;
  116. }
  117. if (conn_read_error(server)) {
  118.     error(0, "EMI2[%s]: connection error in wait_for_ack",
  119.   octstr_get_cstr(privdata->name));
  120.     return -1;
  121. }
  122. if (str) {
  123.     emimsg = get_fields(str, privdata->name);
  124.     if (emimsg == NULL) {
  125. octstr_destroy(str);
  126. continue;
  127.     }
  128.     if (emimsg->ot == ot && emimsg->trn == 0 && emimsg->or == 'R') {
  129. octstr_destroy(str);
  130. break;
  131.     }
  132.     warning(0, "EMI2[%s]: ignoring message %s while waiting for ack to"
  133. "ot:%d trn:%d", octstr_get_cstr(privdata->name),
  134. octstr_get_cstr(str), ot, 0);
  135.     emimsg_destroy(emimsg);
  136.     octstr_destroy(str);
  137. }
  138. time_left = timeout_time - time(NULL);
  139. if (time_left < 0 || privdata->shutdown)
  140.     return 0;
  141. conn_wait(server, time_left);
  142.     }
  143.     if (octstr_get_char(emimsg->fields[0], 0) == 'N') {
  144. emimsg_destroy(emimsg);
  145. return -2;
  146.     }
  147.     emimsg_destroy(emimsg);
  148.     return 1;
  149. }
  150. static struct emimsg *make_emi31(PrivData *privdata, int trn)
  151. {
  152.     struct emimsg *emimsg;
  153.     if(octstr_len(privdata->username) || octstr_len(privdata->my_number)) {
  154.         emimsg = emimsg_create_op(31, trn, privdata->name);
  155.         if(octstr_len(privdata->username)) {
  156.             emimsg->fields[0] = octstr_duplicate(privdata->username);
  157. } else {
  158.             emimsg->fields[0] = octstr_duplicate(privdata->my_number);
  159. }
  160.         emimsg->fields[1] = octstr_create("0539");
  161.         return emimsg;
  162.     } else {
  163.         return NULL;
  164.     }
  165. }
  166. static struct emimsg *make_emi60(PrivData *privdata)
  167. {
  168.     struct emimsg *emimsg;
  169.     emimsg = emimsg_create_op(60, 0, privdata->name);
  170.     emimsg->fields[E60_OADC] = octstr_duplicate(privdata->username);
  171.     emimsg->fields[E60_OTON] = octstr_create("6");
  172.     emimsg->fields[E60_ONPI] = octstr_create("5");
  173.     emimsg->fields[E60_STYP] = octstr_create("1");
  174.     emimsg->fields[E60_PWD] = octstr_duplicate(privdata->password);
  175.     octstr_binary_to_hex(emimsg->fields[E60_PWD], 1);
  176.     emimsg->fields[E60_VERS] = octstr_create("0100");
  177.     return emimsg;
  178. }
  179. static Connection *open_send_connection(SMSCConn *conn)
  180. {
  181.     PrivData *privdata = conn->data;
  182.     int result, wait, alt_host, do_alt_host;
  183.     struct emimsg *emimsg;
  184.     Connection *server;
  185.     Msg *msg;
  186.     do_alt_host = octstr_len(privdata->alt_host) != 0 || 
  187.     privdata->alt_port != 0;
  188.     wait = 0;
  189.     alt_host = -1; /* to avoid waiting in first cicle */
  190.     mutex_lock(conn->flow_mutex);
  191.     conn->status = SMSCCONN_RECONNECTING;
  192.     mutex_unlock(conn->flow_mutex);
  193.     while (!privdata->shutdown) {
  194. /* Change status only if the first attempt to form a
  195.  * connection fails, as it's possible that the SMSC closed the
  196.  * connection because of idle timeout and a new one will be
  197.  * created quickly. */
  198. if (wait) {
  199.     while ((msg = list_extract_first(privdata->outgoing_queue))) {
  200. bb_smscconn_send_failed(conn, msg,
  201. SMSCCONN_FAILED_TEMPORARILY);
  202.     }
  203.     if(alt_host == 0) {
  204. info(0, "EMI2[%s]: waiting for %d %s before trying to "
  205.     "connect again", octstr_get_cstr(privdata->name), 
  206.     (wait < 60 ? wait : wait/60), 
  207.     (wait < 60 ? "seconds" : "minutes"));
  208. gwthread_sleep(wait);
  209. wait = wait > (privdata->retry ? 3600 : 600) ?
  210.     (privdata->retry ? 3600 : 600) : wait * 2;
  211.     }
  212. }
  213. else
  214.     wait = 15; 
  215. if(alt_host != 1) {
  216.     info(0, "EMI2[%s]: connecting to Primary SMSC", 
  217.     octstr_get_cstr(privdata->name));
  218.     server = conn_open_tcp_with_port(privdata->host, privdata->port,
  219.      privdata->our_port, 
  220.      privdata->our_host);
  221.     if(do_alt_host)
  222. alt_host=1;
  223.     else
  224. alt_host=0;
  225. } else {
  226.     info(0, "EMI2[%s]: connecting to Alternate SMSC",
  227.     octstr_get_cstr(privdata->name));
  228.     /* use alt_host or/and alt_port if defined */
  229.     server = conn_open_tcp_with_port(
  230. (octstr_len(privdata->alt_host) ? privdata->alt_host : privdata->host),
  231. (privdata->alt_port ? privdata->alt_port : privdata->port),
  232. privdata->our_port, privdata->our_host);
  233.     alt_host=0;
  234. }
  235. if (privdata->shutdown) {
  236.     conn_destroy(server);
  237.     return NULL;
  238. }
  239. if (server == NULL) {
  240.     error(0, "EMI2[%s]: opening TCP connection to %s failed",
  241.   octstr_get_cstr(privdata->name),
  242.   octstr_get_cstr(privdata->host));
  243.     continue;
  244. }
  245. if (privdata->username && privdata->password) {
  246.     emimsg = make_emi60(privdata);
  247.     emi2_emimsg_send(conn, server, emimsg);
  248.     emimsg_destroy(emimsg);
  249.     result = wait_for_ack(privdata, server, 60, 30);
  250.     if (result == -2) {
  251. /* Are SMSCs going to return any temporary errors? If so,
  252.  * testing for those error codes should be added here. */
  253. error(0, "EMI2[%s]: Server rejected our login, giving up",
  254.       octstr_get_cstr(privdata->name));
  255. conn_destroy(server);
  256. if(! privdata->retry)  {
  257.     conn->why_killed = SMSCCONN_KILLED_WRONG_PASSWORD;
  258.     return NULL;
  259. } else
  260.     continue;
  261.     }
  262.     else if (result == 0) {
  263. error(0, "EMI2[%s]: Got no reply to login attempt "
  264.       "within 30 s", octstr_get_cstr(privdata->name));
  265. conn_destroy(server);
  266. continue;
  267.     }
  268.     else if (result == -1) { /* Broken connection, already logged */
  269. conn_destroy(server);
  270. continue;
  271.     }
  272.     privdata->last_activity_time = 0; /* to force keepalive after login */
  273.     privdata->can_write = 1;
  274. }
  275. mutex_lock(conn->flow_mutex);
  276. conn->status = SMSCCONN_ACTIVE;
  277. conn->connect_time = time(NULL);
  278. mutex_unlock(conn->flow_mutex);
  279. bb_smscconn_connected(conn);
  280. return server;
  281.     }
  282.     return NULL;
  283. }
  284. static void pack_7bit(Octstr *str)
  285. {
  286.     Octstr *result;
  287.     int len, i;
  288.     int numbits, value;
  289.     result = octstr_create("0");
  290.     len = octstr_len(str);
  291.     value = 0;
  292.     numbits = 0;
  293.     for (i = 0; i < len; i++) {
  294. value += octstr_get_char(str, i) << numbits;
  295. numbits += 7;
  296. if (numbits >= 8) {
  297.     octstr_append_char(result, value & 0xff);
  298.     value >>= 8;
  299.     numbits -= 8;
  300. }
  301.     }
  302.     if (numbits > 0)
  303. octstr_append_char(result, value);
  304.     octstr_set_char(result, 0, (len * 7 + 3) / 4);
  305.     octstr_delete(str, 0, LONG_MAX);
  306.     octstr_append(str, result);
  307.     octstr_binary_to_hex(str, 1);
  308.     octstr_destroy(result);
  309. }
  310. static struct emimsg *msg_to_emimsg(Msg *msg, int trn, PrivData *privdata)
  311. {
  312.     Octstr *str;
  313.     struct emimsg *emimsg;
  314.     int dcs;
  315.     struct tm tm;
  316.     char p[20];
  317.     emimsg = emimsg_create_op(51, trn, privdata->name);
  318.     str = octstr_duplicate(msg->sms.sender);
  319.     if(octstr_get_char(str,0) == '+') {
  320.      /* either alphanum or international */
  321.      if (!octstr_check_range(str, 1, 256, gw_isdigit)) {
  322.     /* alphanumeric sender address with + in front*/
  323.     charset_latin1_to_gsm(str);
  324.     octstr_truncate(str, 11); /* max length of alphanumeric OaDC */
  325.     emimsg->fields[E50_OTOA] = octstr_create("5039");
  326.     pack_7bit(str);
  327. }
  328. else {
  329.     /* international number. Set format and remove + */
  330.     emimsg->fields[E50_OTOA] = octstr_create("1139");
  331.     octstr_delete(str, 0, 1);
  332.     octstr_truncate(str, 22);  /* max length of numeric OaDC */
  333. }
  334.     }
  335.     else {
  336. if (!octstr_check_range(str, 0, 256, gw_isdigit)) {
  337.     /* alphanumeric sender address */
  338.             charset_latin1_to_gsm(str);
  339.     octstr_truncate(str, 11); /* max length of alphanumeric OaDC */
  340.     emimsg->fields[E50_OTOA] = octstr_create("5039");
  341.     pack_7bit(str);
  342. }
  343.     }
  344.  
  345.     emimsg->fields[E50_OADC] = str;
  346.     /* set protocoll id */
  347.     if (msg->sms.pid != 0) {
  348.         emimsg->fields[E50_RPID] = octstr_format("%04d", msg->sms.pid);
  349.     }
  350.     /* set reply path indicator */
  351.     if (msg->sms.rpi != 0) {
  352.         emimsg->fields[E50_RPI] = octstr_create("1");
  353.     }
  354.     str = octstr_duplicate(msg->sms.receiver);
  355.     if(octstr_get_char(str,0) == '+') {
  356.       /* international number format */
  357.       /* EMI doesnt understand + so we have to replace it with something useful */
  358.       /* we try 00 here. Should really be done in the config instead so this */
  359.       /* is only a workaround to make wrong configs work  */
  360.  octstr_delete(str, 0, 1);
  361.  octstr_insert_data(str, 0, "00",2);
  362.     }
  363.     octstr_truncate(str, 16); /* max length of ADC */
  364.     emimsg->fields[E50_ADC] = str;
  365.    
  366.     emimsg->fields[E50_XSER] = octstr_create("");
  367.     /* XSer1: UDH */
  368.     if (octstr_len(msg->sms.udhdata)) {
  369. str = octstr_create("");
  370. octstr_append_char(str, 1);
  371. octstr_append_char(str, octstr_len(msg->sms.udhdata));
  372. octstr_append(str, msg->sms.udhdata);
  373. octstr_binary_to_hex(str, 1);
  374. octstr_append(emimsg->fields[E50_XSER],str);
  375.         octstr_destroy(str);
  376.     }
  377.     /* XSer2: DCS */
  378.     dcs = fields_to_dcs(msg, msg->sms.alt_dcs);
  379.     if (dcs != 0 && dcs != 4) {
  380.     str = octstr_create("");
  381. octstr_append_char(str, 2); 
  382. octstr_append_char(str, 1); /* len 01 */
  383. octstr_append_char(str, dcs);
  384. octstr_binary_to_hex(str, 1);
  385. octstr_append(emimsg->fields[E50_XSER],str);
  386. octstr_destroy(str);
  387.     }
  388.     if (msg->sms.coding == DC_8BIT || msg->sms.coding == DC_UCS2) {
  389. emimsg->fields[E50_MT] = octstr_create("4");
  390. emimsg->fields[E50_MCLS] = octstr_create("1");
  391. str = octstr_duplicate(msg->sms.msgdata);
  392. emimsg->fields[E50_NB] =
  393.     octstr_format("%04d", 8 * octstr_len(str));
  394. octstr_binary_to_hex(str, 1);
  395. emimsg->fields[E50_TMSG] = str;
  396.     }
  397.     else {
  398. emimsg->fields[E50_MT] = octstr_create("3");
  399. str = octstr_duplicate(msg->sms.msgdata);
  400. charset_latin1_to_gsm(str);
  401. /* Could still be too long after truncation if there's an UDH part,
  402.  * but this is only to notice errors elsewhere (should never happen).*/
  403. if (charset_gsm_truncate(str, 160))
  404.     error(0, "EMI2[%s]: Message to send is longer "
  405.   "than 160 gsm characters",
  406.   octstr_get_cstr(privdata->name));
  407. octstr_binary_to_hex(str, 1);
  408. emimsg->fields[E50_AMSG] = str;
  409.     }
  410.     if (msg->sms.validity) {
  411. tm = gw_localtime(time(NULL) + msg->sms.validity * 60);
  412. sprintf(p, "%02d%02d%02d%02d%02d",
  413.     tm.tm_mday, tm.tm_mon + 1, tm.tm_year % 100, 
  414.     tm.tm_hour, tm.tm_min);
  415. str = octstr_create(p);
  416. emimsg->fields[E50_VP] = str;
  417.     }
  418.     if (msg->sms.deferred) {
  419. str = octstr_create("1");
  420. emimsg->fields[E50_DD] = str;
  421. tm = gw_localtime(time(NULL) + msg->sms.deferred * 60);
  422. sprintf(p, "%02d%02d%02d%02d%02d",
  423.     tm.tm_mday, tm.tm_mon + 1, tm.tm_year % 100, 
  424.     tm.tm_hour, tm.tm_min);
  425. str = octstr_create(p);
  426. emimsg->fields[E50_DDT] = str;
  427.     }
  428.     /* if delivery reports are asked, lets ask for them too */
  429.     /* even the sender might not be interested in delivery or non delivery */
  430.     /* we still need them back to clear out the memory after the message */
  431.     /* has been delivered or non delivery has been confirmed */
  432.     if (msg->sms.dlr_mask & (DLR_SUCCESS | DLR_FAIL | DLR_BUFFERED)) {
  433.      emimsg->fields[E50_NRQ] = octstr_create("1");
  434.         emimsg->fields[E50_NT] = octstr_create("");
  435.     octstr_append_decimal(emimsg->fields[E50_NT], 3 + (msg->sms.dlr_mask & DLR_BUFFERED)); 
  436.     if (privdata->npid)
  437.             emimsg->fields[E50_NPID] = octstr_duplicate(privdata->npid);
  438.     if (privdata->nadc)
  439.             emimsg->fields[E50_NADC] = octstr_duplicate(privdata->nadc); 
  440.     }
  441.     return emimsg;
  442. }
  443. /* Return -1 if the connection broke, 0 if the request couldn't be handled
  444.  * (unknown type), or 1 if everything was successful */
  445. static int handle_operation(SMSCConn *conn, Connection *server,
  446.    struct emimsg *emimsg)
  447. {
  448.     struct emimsg *reply;
  449.     Octstr *tempstr, *xser;
  450.     int type, len;
  451.     Msg *msg = NULL;
  452.     struct universaltime unitime;
  453.     int st_code;
  454.     PrivData *privdata = conn->data;
  455.   
  456.     switch(emimsg->ot) {
  457.     case 01:
  458. msg = msg_create(sms);
  459. if (emimsg->fields[E01_AMSG] == NULL)
  460.     emimsg->fields[E01_AMSG] = octstr_create("");
  461. else if (octstr_hex_to_binary(emimsg->fields[E01_AMSG]) == -1)
  462.     warning(0, "EMI2[%s]: Couldn't decode message text",
  463.     octstr_get_cstr(privdata->name));
  464. if (emimsg->fields[E01_MT] == NULL) {
  465.     warning(0, "EMI2[%s]: required field MT missing",
  466.     octstr_get_cstr(privdata->name));
  467.     /* This guess could be incorrect, maybe the message should just
  468.        be dropped */
  469.     emimsg->fields[E01_MT] = octstr_create("3");
  470. }
  471. if (octstr_get_char(emimsg->fields[E01_MT], 0) == '3') {
  472.     msg->sms.msgdata = emimsg->fields[E01_AMSG];
  473.     emimsg->fields[E01_AMSG] = NULL; /* So it's not freed */
  474.     charset_gsm_to_latin1(msg->sms.msgdata);
  475. }
  476. else {
  477.     error(0, "EMI2[%s]: MT == %s isn't supported for operation type 01",
  478.   octstr_get_cstr(privdata->name),
  479.   octstr_get_cstr(emimsg->fields[E01_MT]));
  480.     msg->sms.msgdata = octstr_create("");
  481. }
  482. msg->sms.sender = octstr_duplicate(emimsg->fields[E01_OADC]);
  483. if (msg->sms.sender == NULL) {
  484.     warning(0, "EMI2[%s]: Empty sender field in received message",
  485.     octstr_get_cstr(privdata->name));
  486.     msg->sms.sender = octstr_create("");
  487. }
  488. if(octstr_len(PRIVDATA(conn)->my_number)) {
  489.     msg->sms.receiver = octstr_duplicate(PRIVDATA(conn)->my_number);
  490. }
  491. else {
  492.     msg->sms.receiver = octstr_duplicate(emimsg->fields[E01_ADC]);
  493. }
  494. if (msg->sms.sender == NULL) {
  495.     warning(0, "EMI2[%s]: Empty receiver field in received message",
  496.     octstr_get_cstr(privdata->name));
  497.     msg->sms.receiver = octstr_create("");
  498. }
  499. /* Operation type 01 doesn't have a time stamp field */
  500. time(&msg->sms.time);
  501. msg->sms.smsc_id = octstr_duplicate(conn->id);
  502. bb_smscconn_receive(conn, msg);
  503. reply = emimsg_create_reply(01, emimsg->trn, 1, privdata->name);
  504. if (emi2_emimsg_send(conn, server, reply) < 0) {
  505.     emimsg_destroy(reply);
  506.     return -1;
  507. }
  508. emimsg_destroy(reply);
  509. return 1;
  510.     case 52:
  511. msg = msg_create(sms);
  512. /* AMSG is the same field as TMSG */
  513. if (emimsg->fields[E50_AMSG] == NULL)
  514.     emimsg->fields[E50_AMSG] = octstr_create("");
  515. else if (octstr_hex_to_binary(emimsg->fields[E50_AMSG]) == -1)
  516.     warning(0, "EMI2[%s]: Couldn't decode message text",
  517.       octstr_get_cstr(privdata->name));
  518. xser = emimsg->fields[E50_XSER];
  519. while (octstr_len(xser) > 0) {
  520.     tempstr = octstr_copy(xser, 0, 4);
  521.     if (octstr_hex_to_binary(tempstr) == -1)
  522. error(0, "EMI2[%s]: Invalid XSer", 
  523.       octstr_get_cstr(privdata->name));
  524.     type = octstr_get_char(tempstr, 0);
  525.     len = octstr_get_char(tempstr, 1);
  526.     octstr_destroy(tempstr);
  527.     if (len < 0) {
  528. error(0, "EMI2[%s]: Malformed emi XSer field",
  529.       octstr_get_cstr(privdata->name));
  530. break;
  531.     }
  532.     if (type != 1 && type != 2)
  533. warning(0, "EMI2[%s]: Unsupported EMI XSer field %d", 
  534. octstr_get_cstr(privdata->name), type);
  535.     else {
  536. if (type == 1) {
  537.     tempstr = octstr_copy(xser, 4, len * 2);
  538.     if (octstr_hex_to_binary(tempstr) == -1)
  539. error(0, "EMI2[%s]: Invalid UDH contents",
  540.       octstr_get_cstr(privdata->name));
  541.     msg->sms.udhdata = tempstr;
  542. }
  543. if (type == 2) {
  544.     int dcs;
  545.     tempstr = octstr_copy(xser, 4, 2);
  546.     octstr_hex_to_binary(tempstr);
  547.     dcs = octstr_get_char(tempstr, 0);
  548.     octstr_destroy(tempstr);
  549.     if (! dcs_to_fields(&msg, dcs)) {
  550. error(0, "EMI2[%s]: invalid dcs received",
  551.       octstr_get_cstr(privdata->name));
  552. /* XXX Should we discard message ? */
  553. dcs_to_fields(&msg, 0);
  554.     }
  555. }
  556.     }
  557.     octstr_delete(xser, 0, 2 * len + 4);
  558. }
  559. if (emimsg->fields[E50_MT] == NULL) {
  560.     warning(0, "EMI2[%s]: required field MT missing",
  561.     octstr_get_cstr(privdata->name));
  562.     /* This guess could be incorrect, maybe the message should just
  563.        be dropped */
  564.     emimsg->fields[E50_MT] = octstr_create("3");
  565. }
  566. if (octstr_get_char(emimsg->fields[E50_MT], 0) == '3') {
  567.     msg->sms.msgdata = emimsg->fields[E50_AMSG];
  568.     emimsg->fields[E50_AMSG] = NULL; /* So it's not freed */
  569.     charset_gsm_to_latin1(msg->sms.msgdata);
  570. }
  571. else if (octstr_get_char(emimsg->fields[E50_MT], 0) == '4') {
  572.     msg->sms.msgdata = emimsg->fields[E50_TMSG];
  573.     emimsg->fields[E50_TMSG] = NULL;
  574. }
  575. else {
  576.     error(0, "EMI2[%s]: MT == %s isn't supported yet",
  577.   octstr_get_cstr(privdata->name),
  578.   octstr_get_cstr(emimsg->fields[E50_MT]));
  579.     msg->sms.msgdata = octstr_create("");
  580. }
  581. msg->sms.sender = octstr_duplicate(emimsg->fields[E50_OADC]);
  582. if (msg->sms.sender == NULL) {
  583.     warning(0, "EMI2[%s]: Empty sender field in received message",
  584.     octstr_get_cstr(privdata->name));
  585.     msg->sms.sender = octstr_create("");
  586. }
  587. if(octstr_len(PRIVDATA(conn)->my_number)) {
  588.     msg->sms.receiver = octstr_duplicate(PRIVDATA(conn)->my_number);
  589. }
  590. else {
  591.     msg->sms.receiver = octstr_duplicate(emimsg->fields[E50_ADC]);
  592. }
  593. if (msg->sms.sender == NULL) {
  594.     warning(0, "EMI2[%s]: Empty receiver field in received message",
  595.     octstr_get_cstr(privdata->name));
  596.     msg->sms.receiver = octstr_create("");
  597. }
  598. tempstr = emimsg->fields[E50_SCTS]; /* Just a shorter name */
  599. if (tempstr == NULL) {
  600.     warning(0, "EMI2[%s]: Received EMI message doesn't have required timestamp",
  601.     octstr_get_cstr(privdata->name));
  602.     goto notime;
  603. }
  604. if (octstr_len(tempstr) != 12) {
  605.     warning(0, "EMI2[%s]: EMI SCTS field must have length 12, now %ld",
  606.     octstr_get_cstr(privdata->name), octstr_len(tempstr));
  607.     goto notime;
  608. }
  609. if (octstr_parse_long(&unitime.second, tempstr, 10, 10) != 12 ||
  610.     (octstr_delete(tempstr, 10, 2),
  611.      octstr_parse_long(&unitime.minute, tempstr, 8, 10) != 10) ||
  612.     (octstr_delete(tempstr, 8, 2),
  613.      octstr_parse_long(&unitime.hour, tempstr, 6, 10) != 8) ||
  614.     (octstr_delete(tempstr, 6, 2),
  615.      octstr_parse_long(&unitime.year, tempstr, 4, 10) != 6) ||
  616.     (octstr_delete(tempstr, 4, 2),
  617.      octstr_parse_long(&unitime.month, tempstr, 2, 10) != 4) ||
  618.     (octstr_delete(tempstr, 2, 2),
  619.      octstr_parse_long(&unitime.day, tempstr, 0, 10) != 2)) {
  620.     error(0, "EMI2[%s]: EMI delivery time stamp looks malformed",
  621.   octstr_get_cstr(privdata->name));
  622. notime:
  623.     time(&msg->sms.time);
  624. }
  625. else {
  626.     unitime.year += 2000; /* Conversion function expects full year */
  627.         unitime.month -= 1; /* conversion function expects 0-based months */
  628.     msg->sms.time = date_convert_universal(&unitime);
  629. }
  630. msg->sms.smsc_id = octstr_duplicate(conn->id);
  631. counter_increase(conn->received);
  632. bb_smscconn_receive(conn, msg);
  633. reply = emimsg_create_reply(52, emimsg->trn, 1, privdata->name);
  634. if (emi2_emimsg_send(conn, server, reply) < 0) {
  635.     emimsg_destroy(reply);
  636.     return -1;
  637. }
  638. emimsg_destroy(reply);
  639. return 1;
  640.     case 53: /* delivery notification */     
  641. st_code = atoi(octstr_get_cstr(emimsg->fields[E50_DST]));
  642. switch(st_code)
  643. {
  644. case 0: /* delivered */
  645. msg = dlr_find(octstr_get_cstr((conn->id ? conn->id : privdata->name)), 
  646. octstr_get_cstr(emimsg->fields[E50_SCTS]), /* timestamp */
  647. octstr_get_cstr(emimsg->fields[E50_OADC]), /* destination */
  648. DLR_SUCCESS);
  649. break;
  650. case 1: /* buffered */
  651. msg = dlr_find(octstr_get_cstr((conn->id ? conn->id : privdata->name)), 
  652. octstr_get_cstr(emimsg->fields[E50_SCTS]), /* timestamp */
  653. octstr_get_cstr(emimsg->fields[E50_OADC]), /* destination */
  654. DLR_BUFFERED);
  655. break;
  656. case 2: /* not delivered */
  657. msg = dlr_find(octstr_get_cstr((conn->id ? conn->id : privdata->name)), 
  658. octstr_get_cstr(emimsg->fields[E50_SCTS]), /* timestamp */
  659. octstr_get_cstr(emimsg->fields[E50_OADC]), /* destination */
  660. DLR_FAIL);
  661. break;
  662. }
  663. if (msg != NULL) {     
  664.     
  665.         /*
  666.          * Recode the msg structure with the given msgdata.
  667.          * Note: the DLR URL is delivered in msg->sms.dlr_url already.
  668.          */
  669.         msg->sms.msgdata = octstr_duplicate(emimsg->fields[E50_AMSG]);
  670.         octstr_hex_to_binary(msg->sms.msgdata);
  671.         msg->sms.sms_type = report;
  672.     bb_smscconn_receive(conn, msg);
  673. }
  674. reply = emimsg_create_reply(53, emimsg->trn, 1, privdata->name);
  675. if (emi2_emimsg_send(conn, server, reply) < 0) {
  676.     emimsg_destroy(reply);
  677.     return -1;
  678. }
  679. emimsg_destroy(reply);
  680. return 1;
  681.     default:
  682. error(0, "EMI2[%s]: I don't know how to handle operation type %d", 
  683.       octstr_get_cstr(privdata->name), emimsg->ot);
  684. return 0;
  685.     }
  686. }
  687. /*
  688.  * get all unacknowledged messages from the ringbuffer and queue them
  689.  * for retransmission.
  690.  */
  691. static void clear_sent(PrivData *privdata)
  692. {
  693.     int i;
  694.     debug("smsc.emi2", 0, "EMI2[%s]: clear_sent called", 
  695.   octstr_get_cstr(privdata->name));
  696.     for (i = 0; i < EMI2_MAX_TRN; i++) {
  697. if (privdata->slots[i].sendtime && privdata->slots[i].sendtype == 51)
  698.     list_produce(privdata->outgoing_queue, privdata->slots[i].sendmsg);
  699. privdata->slots[i].sendtime = 0;
  700.     }
  701.     privdata->unacked = 0;
  702. }
  703. /*
  704.  * wait seconds seconds for something to happen (a send SMS request, activity
  705.  * on the SMSC main connection, an error or timeout) and tell the caller
  706.  * what happened.
  707.  */
  708. static EMI2Event emi2_wait (SMSCConn *conn, Connection *server, double seconds)
  709. {
  710.     if (emi2_can_send(conn) && list_len(PRIVDATA(conn)->outgoing_queue)) {
  711. return EMI2_SENDREQ;
  712.     }
  713.     
  714.     if (server != NULL) {
  715. switch (conn_wait(server, seconds)) {
  716. case 1: return list_len(PRIVDATA(conn)->outgoing_queue) ? EMI2_SENDREQ : EMI2_TIMEOUT;
  717. case 0: return EMI2_SMSCREQ;
  718. default: return EMI2_CONNERR;
  719. }
  720.     } else {
  721. gwthread_sleep(seconds);
  722. return list_len(PRIVDATA(conn)->outgoing_queue) ? EMI2_SENDREQ : EMI2_TIMEOUT;
  723.     }
  724. }
  725. /*
  726.  * obtain the next free TRN.
  727.  */
  728. static int emi2_next_trn (SMSCConn *conn)
  729. {
  730. #define INC_TRN(x) ((x)=((x) + 1) % EMI2_MAX_TRN)
  731.     int result;
  732.     
  733.     while (SLOTBUSY(conn,PRIVDATA(conn)->priv_nexttrn))
  734. INC_TRN(PRIVDATA(conn)->priv_nexttrn); /* pick unused TRN */
  735.     
  736.     result = PRIVDATA(conn)->priv_nexttrn;
  737.     INC_TRN(PRIVDATA(conn)->priv_nexttrn);
  738.     return result;
  739. #undef INC_TRN
  740. }
  741. /*
  742.  * send an EMI type 31 message when required.
  743.  */
  744. static int emi2_keepalive_handling (SMSCConn *conn, Connection *server)
  745. {
  746.     struct emimsg *emimsg;
  747.     int nexttrn = emi2_next_trn (conn);
  748.     
  749.     emimsg = make_emi31(PRIVDATA(conn), nexttrn);
  750.     if(emimsg) {
  751.         PRIVDATA(conn)->slots[nexttrn].sendtype= 31;
  752.         PRIVDATA(conn)->slots[nexttrn].sendtime = time(NULL);
  753.         PRIVDATA(conn)->unacked++;
  754.         if (emi2_emimsg_send(conn, server, emimsg) == -1) {
  755.            emimsg_destroy(emimsg);
  756.            return -1;
  757.         }
  758.         emimsg_destroy(emimsg);
  759.     }
  760.     PRIVDATA(conn)->can_write = 0;
  761.     return 0;
  762. }
  763. /*
  764.  * the actual send logic: Send all queued messages in a burst.
  765.  */
  766. static int emi2_do_send (SMSCConn *conn, Connection *server)
  767. {
  768.     struct emimsg *emimsg;
  769.     Msg           *msg;
  770.     double         delay = 0;
  771.     if (PRIVDATA(conn)->throughput) {
  772. delay = 1.0 / PRIVDATA(conn)->throughput;
  773.     }
  774.     
  775.     /* Send messages if there's room in the sending window */
  776.     while (emi2_can_send (conn) &&
  777.    (msg = list_extract_first(PRIVDATA(conn)->outgoing_queue)) != NULL) {
  778. int nexttrn = emi2_next_trn (conn);
  779. if (PRIVDATA(conn)->throughput)
  780.     gwthread_sleep(delay);
  781. /* convert the generic Kannel message into an EMI type message */
  782. emimsg = msg_to_emimsg(msg, nexttrn, PRIVDATA(conn));
  783. /* remember the message for retransmission or DLR */
  784. PRIVDATA(conn)->slots[nexttrn].sendmsg = msg;
  785. PRIVDATA(conn)->slots[nexttrn].sendtype = 51;
  786. PRIVDATA(conn)->slots[nexttrn].sendtime = time(NULL);
  787. /* send the message */
  788. if (emi2_emimsg_send(conn, server, emimsg) == -1) {
  789.     emimsg_destroy(emimsg);
  790.     return -1;
  791. }
  792. /* report the submission to the DLR code */
  793. if (msg->sms.dlr_mask & 0x18) {
  794.     Octstr *ts;
  795.     ts = octstr_create("");
  796.     octstr_append(ts, (conn->id ? conn->id : PRIVDATA(conn)->name));
  797.     octstr_append_char(ts, '-');
  798.     octstr_append_decimal(ts, nexttrn);
  799.     dlr_add(octstr_get_cstr((conn->id ? conn->id : PRIVDATA(conn)->name)), 
  800.     octstr_get_cstr(ts),
  801.     octstr_get_cstr(msg->sms.sender),
  802.     octstr_get_cstr(emimsg->fields[E50_ADC]),
  803.     octstr_get_cstr(msg->sms.service),
  804.     octstr_get_cstr(msg->sms.dlr_url),
  805.     msg->sms.dlr_mask);
  806.     
  807.     octstr_destroy(ts);
  808.     PRIVDATA(conn)->slots[nexttrn].dlr = 1;
  809. } else {
  810.     PRIVDATA(conn)->slots[nexttrn].dlr = 0;
  811. }
  812. /* we just sent a message */
  813. PRIVDATA(conn)->unacked++;
  814. emimsg_destroy(emimsg);
  815. /*
  816.  * remember that there is an open request for stop-wait flow control
  817.  * FIXME: couldn't this be done with the unacked field as well? After
  818.  * all stop-wait is just a window of size 1.
  819.  */
  820. PRIVDATA(conn)->can_write = 0;
  821.     }
  822.     return 0;
  823. }
  824. static int emi2_handle_smscreq (SMSCConn *conn, Connection *server)
  825. {
  826.     Octstr   *str;
  827.     struct emimsg *emimsg;
  828.     PrivData *privdata = conn->data;
  829.     
  830.     /* Read acks/nacks/ops from the server */
  831.     while ((str = conn_read_packet(server, 2, 3))) {
  832. debug("smsc.emi2", 0, "EMI2[%s]: Got packet from the main socket",
  833.       octstr_get_cstr(privdata->name));
  834. /* parse the msg */
  835. emimsg = get_fields(str, privdata->name);
  836. octstr_destroy(str);
  837. if (emimsg == NULL) {
  838.     continue; /* The parse functions logged errors */
  839. }
  840. if (emimsg->or == 'O') {
  841.     /* If the SMSC wants to send operations through this
  842.      * socket, we'll have to read them because there
  843.      * might be ACKs too. We just drop them while stopped,
  844.      * hopefully the SMSC will resend them later. */
  845.     if (!conn->is_stopped) {
  846. if (handle_operation(conn, server, emimsg) < 0)
  847.     return -1; /* Connection broke */
  848.     } else {
  849. info(0, "EMI2[%s]: Ignoring operation from main socket "
  850.      "because the connection is stopped.",
  851.      octstr_get_cstr(privdata->name));
  852.     }
  853. } else {   /* Already checked to be 'O' or 'R' */
  854.     if (!SLOTBUSY(conn,emimsg->trn) ||
  855. emimsg->ot != PRIVDATA(conn)->slots[emimsg->trn].sendtype) {
  856. error(0, "EMI2[%s]: Got ack for TRN %d, don't remember sending O?", 
  857.       octstr_get_cstr(privdata->name), emimsg->trn);
  858.     } else {
  859. PRIVDATA(conn)->can_write = 1;
  860. PRIVDATA(conn)->slots[emimsg->trn].sendtime = 0;
  861. PRIVDATA(conn)->unacked--;
  862. if (emimsg->ot == 51) {
  863.     if (PRIVDATA(conn)->slots[emimsg->trn].dlr) {
  864. Msg *dlrmsg;
  865. Octstr *ts;
  866. Msg *origmsg;
  867. origmsg = PRIVDATA(conn)->slots[emimsg->trn].sendmsg;
  868. ts = octstr_create("");
  869. octstr_append(ts, (conn->id ? conn->id : privdata->name));
  870. octstr_append_char(ts, '-');
  871. octstr_append_decimal(ts, emimsg->trn);
  872. dlrmsg = dlr_find(octstr_get_cstr((conn->id ? conn->id : privdata->name)), 
  873.   octstr_get_cstr(ts), /* timestamp */
  874.   octstr_get_cstr(origmsg->sms.receiver), /* destination */
  875.   (octstr_get_char(emimsg->fields[0], 0) == 'A' ? 
  876.    DLR_SMSC_SUCCESS : DLR_SMSC_FAIL));
  877. octstr_destroy(ts);
  878. if (dlrmsg != NULL) {
  879.     Octstr *moretext;
  880.                 /*
  881.                  * Recode the msg structure with the given msgdata.
  882.                  * Note: the DLR URL is delivered in msg->sms.dlr_url already.
  883.                  */
  884.                 dlrmsg->sms.msgdata = octstr_duplicate(emimsg->fields[E50_AMSG]);
  885.                 octstr_hex_to_binary(dlrmsg->sms.msgdata);
  886.                 dlrmsg->sms.sms_type = report;
  887.     moretext = octstr_create("");
  888.     if (octstr_get_char(emimsg->fields[0], 0) == 'N') {
  889.                     octstr_append(moretext, emimsg->fields[1]);
  890.                     octstr_append_char(moretext, '-');
  891.                     octstr_append(moretext, emimsg->fields[2]);
  892.     }
  893.     octstr_append_char(moretext, '/');
  894.     octstr_insert(dlrmsg->sms.msgdata, moretext, 0);
  895.     octstr_destroy(moretext);
  896.     bb_smscconn_receive(conn, dlrmsg);
  897. }
  898.     }
  899.     if (octstr_get_char(emimsg->fields[0], 0) == 'A') {
  900. /* we got an ack back. We might have to store the */
  901. /* timestamp for delivery notifications now */
  902. Octstr *ts, *adc;
  903. int i;
  904. Msg *m;
  905.   
  906. ts = octstr_duplicate(emimsg->fields[2]);
  907. if (octstr_len(ts)) {
  908.     i = octstr_search_char(ts,':',0);
  909.     if (i>0) {
  910. octstr_delete(ts,0,i+1);
  911. adc = octstr_duplicate(emimsg->fields[2]);
  912. octstr_truncate(adc,i);
  913.         
  914. m = PRIVDATA(conn)->slots[emimsg->trn].sendmsg;
  915. if(m == NULL) {
  916.     info(0,"EMI2[%s]: uhhh m is NULL, very bad",
  917.  octstr_get_cstr(privdata->name));
  918. } else if (m->sms.dlr_mask & 0x7) {
  919.     dlr_add(octstr_get_cstr((conn->id ? conn->id : privdata->name)), 
  920.     octstr_get_cstr(ts),
  921.     octstr_get_cstr(m->sms.sender),
  922.     octstr_get_cstr(adc),
  923.     octstr_get_cstr(m->sms.service),
  924.     octstr_get_cstr(m->sms.dlr_url),
  925.     m->sms.dlr_mask);
  926. }
  927. octstr_destroy(ts);
  928. octstr_destroy(adc);
  929.     } else {
  930. octstr_destroy(ts);
  931.     }
  932.     
  933. }
  934. /*
  935.  * report the successful transmission to the generic bb code.
  936.  */
  937. bb_smscconn_sent(conn,
  938.  PRIVDATA(conn)->slots[emimsg->trn].sendmsg);
  939.     } else {
  940. /* XXX Process error code here
  941. long errorcode;
  942. octstr_parse_long(&errorcode, emimsg->fields[1], 0, 10);
  943. ... switch(errorcode) ...
  944. else { */
  945.     bb_smscconn_send_failed(conn,
  946. PRIVDATA(conn)->slots[emimsg->trn].sendmsg,
  947. SMSCCONN_FAILED_REJECTED);
  948. /* } */
  949.     }
  950. } else if (emimsg->ot == 31) {
  951.     /* XXX Process error codes here
  952.     if (octstr_get_char(emimsg->fields[0], 0) == 'N') {
  953. long errorcode;
  954. octstr_parse_long(&errorcode, emimsg->fields[1], 0, 10);
  955. ... switch errorcode ...
  956.     } 
  957.     
  958.     else { */
  959. ;
  960.     /* } */
  961. } else {
  962.     panic(0, "EMI2[%s]: Bug, ACK handler missing for sent packet",
  963.   octstr_get_cstr(privdata->name));
  964. }
  965.     }
  966. }
  967. emimsg_destroy(emimsg);
  968.     }
  969.     if (conn_read_error(server)) {
  970. error(0, "EMI2[%s]: Error trying to read ACKs from SMSC",
  971.       octstr_get_cstr(privdata->name));
  972. return -1;
  973.     }
  974.     
  975.     if (conn_eof(server)) {
  976. info(0, "EMI2[%s]: Main connection closed by SMSC",
  977.      octstr_get_cstr(privdata->name));
  978. return -1;
  979.     }
  980.     return 0;
  981. }
  982. static void emi2_idleprocessing(SMSCConn *conn)
  983. {
  984.     time_t current_time;
  985.     int i;
  986.     PrivData *privdata = conn->data;
  987.     
  988.     /*
  989.      * Check whether there are messages the server hasn't acked in a
  990.      * reasonable time
  991.      */
  992.     current_time = time(NULL);
  993.     
  994.     if (PRIVDATA(conn)->unacked && (current_time > (PRIVDATA(conn)->check_time + 30))) {
  995. PRIVDATA(conn)->check_time = current_time;
  996. for (i = 0; i < EMI2_MAX_TRN; i++) {
  997.     if (SLOTBUSY(conn,i)
  998. && PRIVDATA(conn)->slots[i].sendtime < (current_time - PRIVDATA(conn)->waitack)) {
  999. PRIVDATA(conn)->slots[i].sendtime = 0;
  1000. PRIVDATA(conn)->unacked--;
  1001. if (PRIVDATA(conn)->slots[i].sendtype == 51) {
  1002.     warning(0, "EMI2[%s]: received neither ACK nor NACK for message %d " 
  1003.     "in %d seconds, resending message", octstr_get_cstr(privdata->name),
  1004.     i, PRIVDATA(conn)->waitack);
  1005.     list_produce(PRIVDATA(conn)->outgoing_queue,
  1006.  PRIVDATA(conn)->slots[i].sendmsg);
  1007.     if (PRIVDATA(conn)->flowcontrol) PRIVDATA(conn)->can_write=1;
  1008.     /* Wake up this same thread to send again
  1009.      * (simpler than avoiding sleep) */
  1010.     gwthread_wakeup(PRIVDATA(conn)->sender_thread);
  1011. } else if (PRIVDATA(conn)->slots[i].sendtype == 31) {
  1012.     warning(0, "EMI2[%s]: Alert (operation 31) was not "
  1013.     "ACKed within %d seconds", octstr_get_cstr(privdata->name),
  1014.     PRIVDATA(conn)->waitack);
  1015.     if (PRIVDATA(conn)->flowcontrol) PRIVDATA(conn)->can_write=1;
  1016. } else {
  1017.     panic(0, "EMI2[%s]: Bug, no timeout handler for sent packet",
  1018.   octstr_get_cstr(privdata->name));
  1019. }
  1020.     }
  1021. }
  1022.     }
  1023. }
  1024. static void emi2_idletimeout_handling (SMSCConn *conn, Connection **server)
  1025. {
  1026.     PrivData *privdata = conn->data;
  1027.     /*
  1028.      * close the connection if there was no activity.
  1029.      */
  1030.     if ((*server != NULL) && CONNECTIONIDLE(conn)) {
  1031. info(0, "EMI2[%s]: closing idle connection.",
  1032.      octstr_get_cstr(privdata->name));
  1033. conn_destroy(*server);
  1034. *server = NULL;
  1035.     }
  1036. }
  1037. /*
  1038.  * this function calculates the new timeouttime.
  1039.  */
  1040. static double emi2_get_timeouttime (SMSCConn *conn, Connection *server)
  1041. {
  1042.     double ka_timeouttime = PRIVDATA(conn)->keepalive ? PRIVDATA(conn)->keepalive + 1 : DBL_MAX;
  1043.     double idle_timeouttime = (PRIVDATA(conn)->idle_timeout && server) ? PRIVDATA(conn)->idle_timeout : DBL_MAX;
  1044.     double result = ka_timeouttime < idle_timeouttime ? ka_timeouttime : idle_timeouttime;
  1045.     if (result == DBL_MAX)
  1046. result = 30;
  1047.     return result;
  1048. }
  1049. /*
  1050.  * the main event processing loop.
  1051.  */
  1052. static void emi2_send_loop(SMSCConn *conn, Connection **server)
  1053. {
  1054.     PrivData *privdata = conn->data;
  1055.     for (;;) {
  1056. double timeouttime;
  1057. EMI2Event event;
  1058. if (emi2_needs_keepalive (conn)) {
  1059.     if (*server == NULL) {
  1060. return; /* reopen the connection */
  1061.     }
  1062.     
  1063.     emi2_keepalive_handling (conn, *server);
  1064. }
  1065. timeouttime = emi2_get_timeouttime (conn, *server);
  1066. event = emi2_wait (conn, *server, timeouttime);
  1067. switch (event) {
  1068. case EMI2_CONNERR:
  1069.     return;
  1070.     
  1071. case EMI2_SENDREQ:
  1072.     if (*server == NULL) {
  1073. return; /* reopen the connection */
  1074.     }
  1075.     
  1076.     if (emi2_do_send (conn, *server) < 0) {
  1077. return; /* reopen the connection */
  1078.     }
  1079.     break;
  1080.     
  1081. case EMI2_SMSCREQ:
  1082.     if (emi2_handle_smscreq (conn, *server) < 0) {
  1083. return; /* reopen the connection */
  1084.     }
  1085.     break;
  1086.     
  1087. case EMI2_TIMEOUT:
  1088.     break;
  1089. }
  1090.         if ((*server !=NULL) && (emi2_handle_smscreq (conn, *server) < 0)) {
  1091.             return; /* reopen the connection */
  1092.         }
  1093. emi2_idleprocessing (conn);
  1094. emi2_idletimeout_handling (conn, server);
  1095. if (PRIVDATA(conn)->shutdown && (PRIVDATA(conn)->unacked == 0)) {
  1096.     /* shutdown and no open messages */
  1097.     break;
  1098. }
  1099. if (*server != NULL) {
  1100.     if (conn_read_error(*server)) {
  1101. warning(0, "EMI2[%s]: Error reading from the main connection",
  1102. octstr_get_cstr(privdata->name));
  1103. break;
  1104.     }
  1105.     if (conn_eof(*server)) {
  1106. info(0, "EMI2[%s]: Main connection closed by SMSC",
  1107.      octstr_get_cstr(privdata->name));
  1108. break;
  1109.     }
  1110. }
  1111.     }
  1112. }
  1113. static void emi2_sender(void *arg)
  1114. {
  1115.     SMSCConn *conn = arg;
  1116.     PrivData *privdata = conn->data;
  1117.     Msg *msg;
  1118.     Connection *server;
  1119.     while (!privdata->shutdown) {
  1120. if ((server = open_send_connection(conn)) == NULL) {
  1121.     privdata->shutdown = 1;
  1122.     if (privdata->rport > 0)
  1123. gwthread_wakeup(privdata->receiver_thread);
  1124.     break;
  1125. }
  1126. emi2_send_loop(conn, &server);
  1127. clear_sent(privdata);
  1128. if (server != NULL) {
  1129.     conn_destroy(server);
  1130. }
  1131.     }
  1132.     while((msg = list_extract_first(privdata->outgoing_queue)) != NULL)
  1133. bb_smscconn_send_failed(conn, msg, SMSCCONN_FAILED_SHUTDOWN);
  1134.     if (privdata->rport > 0)
  1135. gwthread_join(privdata->receiver_thread);
  1136.     mutex_lock(conn->flow_mutex);
  1137.     conn->status = SMSCCONN_DEAD;
  1138.     debug("bb.sms", 0, "EMI2[%s]: connection has completed shutdown.",
  1139.   octstr_get_cstr(privdata->name));
  1140.     list_destroy(privdata->outgoing_queue, NULL);
  1141.     octstr_destroy(privdata->name);
  1142.     octstr_destroy(privdata->allow_ip);
  1143.     octstr_destroy(privdata->deny_ip);
  1144.     octstr_destroy(privdata->host);
  1145.     octstr_destroy(privdata->alt_host);
  1146.     octstr_destroy(privdata->my_number);
  1147.     octstr_destroy(privdata->username);
  1148.     octstr_destroy(privdata->password);
  1149.     octstr_destroy(privdata->npid);
  1150.     octstr_destroy(privdata->nadc);
  1151.     gw_free(privdata);
  1152.     conn->data = NULL;
  1153.     mutex_unlock(conn->flow_mutex);
  1154.     bb_smscconn_killed();
  1155. }
  1156. static void emi2_receiver(SMSCConn *conn, Connection *server)
  1157. {
  1158.     PrivData *privdata = conn->data;
  1159.     Octstr *str;
  1160.     struct emimsg *emimsg;
  1161.     while (1) {
  1162. if (conn_eof(server)) {
  1163.     info(0, "EMI2[%s]: receive connection closed by SMSC",
  1164.  octstr_get_cstr(privdata->name));
  1165.     return;
  1166. }
  1167. if (conn_read_error(server)) {
  1168.     error(0, "EMI2[%s]: receive connection broken",
  1169.   octstr_get_cstr(privdata->name));
  1170.     return;
  1171. }
  1172. if (conn->is_stopped)
  1173.     str = NULL;
  1174. else
  1175.     str = conn_read_packet(server, 2, 3);
  1176. if (str) {
  1177.     debug("smsc.emi2", 0, "EMI2[%s]: Got packet from the receive connection.",
  1178.   octstr_get_cstr(privdata->name));
  1179.     if ( (emimsg = get_fields(str, privdata->name)) ) {
  1180. if (emimsg->or == 'O') {
  1181.     if (handle_operation(conn, server, emimsg) < 0) {
  1182. emimsg_destroy(emimsg);
  1183. return;
  1184.     }
  1185. }
  1186. else
  1187.     error(0, "EMI2[%s]: No ACKs expected on receive connection!",
  1188.   octstr_get_cstr(privdata->name));
  1189. emimsg_destroy(emimsg);
  1190.     }
  1191.     octstr_destroy(str);
  1192. }
  1193. else
  1194.     conn_wait(server, -1);
  1195. if (privdata->shutdown)
  1196.     break;
  1197.     }
  1198.     return;
  1199. }
  1200. static int emi2_open_listening_socket(PrivData *privdata)
  1201. {
  1202.     int s;
  1203.     if ( (s = make_server_socket(privdata->rport, NULL)) == -1) {
  1204.     /* XXX add interface_name if required */
  1205. error(0, "EMI2[%s]: could not create listening socket in port %d",
  1206.       octstr_get_cstr(privdata->name), privdata->rport);
  1207. return -1;
  1208.     }
  1209.     if (socket_set_blocking(s, 0) == -1) {
  1210. error(0, "EMI2[%s]: couldn't make listening socket port %d "
  1211.  "non-blocking", octstr_get_cstr(privdata->name), privdata->rport);
  1212. close(s);
  1213. return -1;
  1214.     }
  1215.     privdata->listening_socket = s;
  1216.     return 0;
  1217. }
  1218. static void emi2_listener(void *arg)
  1219. {
  1220.     SMSCConn *conn = arg;
  1221.     PrivData *privdata = conn->data;
  1222.     struct sockaddr_in server_addr;
  1223.     socklen_t server_addr_len;
  1224.     Octstr *ip;
  1225.     Connection *server;
  1226.     int  s, ret;
  1227.     while (!privdata->shutdown) {
  1228. server_addr_len = sizeof(server_addr);
  1229. ret = gwthread_pollfd(privdata->listening_socket, POLLIN, -1);
  1230. if (ret == -1) {
  1231.     if (errno == EINTR)
  1232. continue;
  1233.     error(0, "EMI2[%s]: Poll for emi2 smsc connections failed, shutting down",
  1234.   octstr_get_cstr(privdata->name));
  1235.     break;
  1236. }
  1237. if (privdata->shutdown)
  1238.     break;
  1239. if (ret == 0) /* This thread was woken up from elsewhere, but
  1240.  if we're not shutting down nothing to do here. */
  1241.     continue;
  1242. s = accept(privdata->listening_socket, (struct sockaddr *)&server_addr,
  1243.    &server_addr_len);
  1244. if (s == -1) {
  1245.     warning(errno, "EMI2[%s]: emi2_listener: accept() failed, retrying...",
  1246.     octstr_get_cstr(privdata->name));
  1247.     continue;
  1248. }
  1249. ip = host_ip(server_addr);
  1250. if (!is_allowed_ip(privdata->allow_ip, privdata->deny_ip, ip)) {
  1251.     info(0, "EMI2[%s]: smsc connection tried from denied host <%s>,"
  1252.  " disconnected", octstr_get_cstr(privdata->name), 
  1253.  octstr_get_cstr(ip));
  1254.     octstr_destroy(ip);
  1255.     close(s);
  1256.     continue;
  1257. }
  1258. server = conn_wrap_fd(s, 0);
  1259. if (server == NULL) {
  1260.     error(0, "EMI2[%s]: emi2_listener: conn_wrap_fd failed on accept()ed fd",
  1261.   octstr_get_cstr(privdata->name));
  1262.     octstr_destroy(ip);
  1263.     close(s);
  1264.     continue;
  1265. }
  1266. conn_claim(server);
  1267. info(0, "EMI2[%s]: smsc connected from %s", 
  1268.      octstr_get_cstr(privdata->name), octstr_get_cstr(ip));
  1269. octstr_destroy(ip);
  1270. emi2_receiver(conn, server);
  1271. conn_destroy(server);
  1272.     }
  1273.     if (close(privdata->listening_socket) == -1)
  1274. warning(errno, "EMI2[%s]: couldn't close listening socket "
  1275. "at shutdown", octstr_get_cstr(privdata->name));
  1276.     gwthread_wakeup(privdata->sender_thread);
  1277. }
  1278. static int add_msg_cb(SMSCConn *conn, Msg *sms)
  1279. {
  1280.     PrivData *privdata = conn->data;
  1281.     Msg *copy;
  1282.     copy = msg_duplicate(sms);
  1283.     list_produce(privdata->outgoing_queue, copy);
  1284.     gwthread_wakeup(privdata->sender_thread);
  1285.     return 0;
  1286. }
  1287. static int shutdown_cb(SMSCConn *conn, int finish_sending)
  1288. {
  1289.     PrivData *privdata = conn->data;
  1290.     debug("bb.sms", 0, "EMI2[%s]: Shutting down SMSCConn EMI2, %s",
  1291.   octstr_get_cstr(privdata->name), 
  1292.   finish_sending ? "slow" : "instant");
  1293.     /* Documentation claims this would have been done by smscconn.c,
  1294.        but isn't when this code is being written. */
  1295.     conn->why_killed = SMSCCONN_KILLED_SHUTDOWN;
  1296.     privdata->shutdown = 1; /* Separate from why_killed to avoid locking, as
  1297.    why_killed may be changed from outside? */
  1298.     if (finish_sending == 0) {
  1299. Msg *msg;
  1300. while((msg = list_extract_first(privdata->outgoing_queue)) != NULL) {
  1301.     bb_smscconn_send_failed(conn, msg, SMSCCONN_FAILED_SHUTDOWN);
  1302. }
  1303.     }
  1304.     if (privdata->rport > 0)
  1305. gwthread_wakeup(privdata->receiver_thread);
  1306.     return 0;
  1307. }
  1308. static void start_cb(SMSCConn *conn)
  1309. {
  1310.     PrivData *privdata = conn->data;
  1311.     /* in case there are messages in the buffer already */
  1312.     if (privdata->rport > 0)
  1313. gwthread_wakeup(privdata->receiver_thread);
  1314.     debug("smsc.emi2", 0, "EMI2[%s]: start called",
  1315.   octstr_get_cstr(privdata->name));
  1316. }
  1317. static long queued_cb(SMSCConn *conn)
  1318. {
  1319.     PrivData *privdata = conn->data;
  1320.     long ret;
  1321.     ret = (privdata ? list_len(privdata->outgoing_queue) : 0);
  1322.     /* use internal queue as load, maybe something else later */
  1323.     conn->load = ret;
  1324.     return ret;
  1325. }
  1326. int smsc_emi2_create(SMSCConn *conn, CfgGroup *cfg)
  1327. {
  1328.     PrivData *privdata;
  1329.     Octstr *allow_ip, *deny_ip, *host, *alt_host;
  1330.     long portno, our_port, keepalive, flowcontrol, waitack, throughput, 
  1331.          idle_timeout, alt_portno; 
  1332.     long window;
  1333.      /* has to be long because of cfg_get_integer */
  1334.     int i;
  1335.     allow_ip = deny_ip = host = alt_host = NULL; 
  1336.     privdata = gw_malloc(sizeof(PrivData));
  1337.     privdata->outgoing_queue = list_create();
  1338.     privdata->listening_socket = -1;
  1339.     privdata->can_write = 1;
  1340.     privdata->priv_nexttrn = 0;
  1341.     privdata->last_activity_time = 0;
  1342.     
  1343.     host = cfg_get(cfg, octstr_imm("host"));
  1344.     if (host == NULL) {
  1345. error(0, "EMI2[-]: 'host' missing in emi2 configuration.");
  1346. goto error;
  1347.     }
  1348.     privdata->host = host;
  1349.     if (cfg_get_integer(&portno, cfg, octstr_imm("port")) == -1)
  1350. portno = 0;
  1351.     privdata->port = portno;
  1352.     if (privdata->port <= 0 || privdata->port > 65535) {
  1353. error(0, "EMI2[%s]: 'port' missing/invalid in emi2 configuration.",
  1354.       octstr_get_cstr(host));
  1355. goto error;
  1356.     }
  1357.     privdata->our_host = cfg_get(cfg, octstr_imm("our-host"));
  1358.     if (cfg_get_integer(&our_port, cfg, octstr_imm("our-port")) == -1)
  1359. privdata->our_port = 0; /* 0 means use any port */
  1360.     else
  1361. privdata->our_port = our_port;
  1362.     privdata->name = cfg_get(cfg, octstr_imm("smsc-id"));
  1363.     if(privdata->name == NULL) {
  1364. privdata->name = octstr_create("");
  1365. /* Add our_host */
  1366. if(octstr_len(privdata->our_host)) {
  1367.     octstr_append(privdata->name, privdata->our_host);
  1368. }
  1369. /* Add our_port */
  1370. if(privdata->our_port != 0) {
  1371.     /* if we have our_port but not our_host, add kannel:our_port */
  1372.     if(octstr_len(privdata->name) == 0) {
  1373. octstr_append(privdata->name, octstr_imm("kannel"));
  1374.     }
  1375.     octstr_append_char(privdata->name, ':');
  1376.     octstr_append_decimal(privdata->name, privdata->our_port);
  1377. } else {
  1378.     if(octstr_len(privdata->name) != 0) {
  1379. octstr_append(privdata->name, octstr_imm(":*"));
  1380.     }
  1381. }
  1382.     
  1383. /* if we have our_host neither our_port */
  1384. if(octstr_len(privdata->name) != 0)
  1385.     octstr_append(privdata->name, octstr_imm("->"));
  1386. octstr_append(privdata->name, privdata->host);
  1387. octstr_append_char(privdata->name, ':');
  1388. octstr_append_decimal(privdata->name, privdata->port);
  1389.     }
  1390.     if (cfg_get_integer(&idle_timeout, cfg, octstr_imm("idle-timeout")) == -1)
  1391. idle_timeout = 0;
  1392.     
  1393.     privdata->idle_timeout = idle_timeout;
  1394.     alt_host = cfg_get(cfg, octstr_imm("alt-host"));
  1395.     privdata->alt_host = alt_host;
  1396.     if (cfg_get_integer(&portno, cfg, octstr_imm("receive-port")) < 0)
  1397. portno = 0;
  1398.     privdata->rport = portno;
  1399.     if (cfg_get_integer(&alt_portno, cfg, octstr_imm("alt-port")) < 0) 
  1400. alt_portno = 0;
  1401.     privdata->alt_port = alt_portno;
  1402.     allow_ip = cfg_get(cfg, octstr_imm("connect-allow-ip"));
  1403.     if (allow_ip)
  1404. deny_ip = octstr_create("*.*.*.*");
  1405.     else
  1406. deny_ip = NULL;
  1407.     privdata->username = cfg_get(cfg, octstr_imm("smsc-username"));
  1408.     privdata->password = cfg_get(cfg, octstr_imm("smsc-password"));
  1409.     privdata->my_number = cfg_get(cfg, octstr_imm("my-number"));
  1410.     privdata->npid = cfg_get(cfg, octstr_imm("notification-pid"));
  1411.     privdata->nadc = cfg_get(cfg, octstr_imm("notification-addr"));
  1412.     
  1413.     cfg_get_bool(&privdata->retry, cfg, octstr_imm("retry"));
  1414.     if(privdata->retry < 0) 
  1415. privdata->retry = 0;
  1416.     if ( (privdata->username == NULL && privdata->my_number == NULL)
  1417.          || cfg_get_integer(&keepalive, cfg, octstr_imm("keepalive")) < 0)
  1418. privdata->keepalive = 0;
  1419.     else
  1420. privdata->keepalive = keepalive;
  1421.     if (cfg_get_integer(&flowcontrol, cfg, octstr_imm("flow-control")) < 0)
  1422. privdata->flowcontrol = 0;
  1423.     else
  1424. privdata->flowcontrol = flowcontrol;
  1425.     if (privdata->flowcontrol < 0 || privdata->flowcontrol > 1) {
  1426. error(0, "EMI2[%s]: 'flow-control' invalid in emi2 configuration.",
  1427.       octstr_get_cstr(privdata->name));
  1428. goto error;
  1429.     }
  1430.     if (cfg_get_integer(&throughput, cfg, octstr_imm("throughput")) < 0)
  1431. privdata->throughput = 0;
  1432.     else
  1433. privdata->throughput = throughput;
  1434.     if (cfg_get_integer(&window, cfg, octstr_imm("window")) < 0)
  1435. privdata->window = EMI2_MAX_TRN;
  1436.     else
  1437. privdata->window = window;
  1438.     if (privdata->window > EMI2_MAX_TRN) {
  1439. warning(0, "EMI2[%s]: Value of 'window' should be lesser or equal to %d..", 
  1440. octstr_get_cstr(privdata->name), EMI2_MAX_TRN);
  1441. privdata->window = EMI2_MAX_TRN;
  1442.     }
  1443.     if (cfg_get_integer(&waitack, cfg, octstr_imm("wait-ack")) < 0)
  1444. privdata->waitack = 60;
  1445.     else
  1446. privdata->waitack = waitack;
  1447.     if (privdata->waitack < 30 ) {
  1448. error(0, "EMI2[%s]: 'wait-ack' invalid in emi2 configuration.",
  1449.       octstr_get_cstr(privdata->name));
  1450. goto error;
  1451.     }
  1452.     if (privdata->rport < 0 || privdata->rport > 65535) {
  1453. error(0, "EMI2[%s]: 'receive-port' missing/invalid in emi2 configuration.",
  1454.       octstr_get_cstr(privdata->name));
  1455. goto error;
  1456.     }
  1457.     privdata->allow_ip = allow_ip;
  1458.     privdata->deny_ip = deny_ip;
  1459.     if (privdata->rport > 0 && emi2_open_listening_socket(privdata) < 0) {
  1460. gw_free(privdata);
  1461. privdata = NULL;
  1462. goto error;
  1463.     }
  1464.     conn->data = privdata;
  1465.     conn->name = octstr_format("EMI2:%S:%d:%S", privdata->host, privdata->port,
  1466.                                privdata->username ? privdata->username : octstr_imm("null"));
  1467.     privdata->shutdown = 0;
  1468.     for (i = 0; i < EMI2_MAX_TRN; i++)
  1469. privdata->slots[i].sendtime = 0;
  1470.     privdata->unacked = 0;
  1471.     conn->status = SMSCCONN_CONNECTING;
  1472.     conn->connect_time = time(NULL);
  1473.     if ( privdata->rport > 0 && (privdata->receiver_thread =
  1474.   gwthread_create(emi2_listener, conn)) == -1)
  1475.   goto error;
  1476.     if ((privdata->sender_thread = gwthread_create(emi2_sender, conn)) == -1) {
  1477. privdata->shutdown = 1;
  1478. if (privdata->rport > 0) {
  1479.     gwthread_wakeup(privdata->receiver_thread);
  1480.     gwthread_join(privdata->receiver_thread);
  1481. }
  1482. goto error;
  1483.     }
  1484.     conn->shutdown = shutdown_cb;
  1485.     conn->queued = queued_cb;
  1486.     conn->start_conn = start_cb;
  1487.     conn->send_msg = add_msg_cb;
  1488.     return 0;
  1489. error:
  1490.     error(0, "EMI2[%s]: Failed to create emi2 smsc connection",
  1491.   octstr_get_cstr(privdata->name));
  1492.     if (privdata != NULL) {
  1493. list_destroy(privdata->outgoing_queue, NULL);
  1494.     }
  1495.     gw_free(privdata);
  1496.     octstr_destroy(allow_ip);
  1497.     octstr_destroy(deny_ip);
  1498.     octstr_destroy(host);
  1499.     conn->why_killed = SMSCCONN_KILLED_CANNOT_CONNECT;
  1500.     conn->status = SMSCCONN_DEAD;
  1501.     info(0, "EMI2[%s]: exiting", octstr_get_cstr(privdata->name));
  1502.     return -1;
  1503. }