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

手机WAP编程

开发平台:

WINDOWS

  1. /*
  2.  * smsc.c - implement interface to SMS centers as defined by smsc.h
  3.  *
  4.  * Lars Wirzenius and Kalle Marjola for WapIT Ltd.
  5.  */
  6. /* NOTE: private functions (only for smsc_* use) are named smscenter_*,
  7.  * public functions (used by gateway) are named smsc_*
  8.  */
  9. #include <errno.h>
  10. #include <signal.h>
  11. #include <stdarg.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14. #include <time.h>
  15. #include <unistd.h>
  16. #include <sys/time.h>
  17. #include "gwlib/gwlib.h"
  18. #include "smsc.h"
  19. #include "smsc_p.h"
  20. #include "msg.h"
  21. /*
  22.  * Maximum number of characters for read_into_buffer to read at a time.
  23.  */
  24. #define MAX_READ_INTO_BUFFER (1024)
  25. static void smscenter_lock(SMSCenter *smsc);
  26. static void smscenter_unlock(SMSCenter *smsc);
  27. /*--------------------------------------------------------------------
  28.  * TODO: WAP WDP functions!
  29.  */
  30. /*--------------------------------------------------------------------
  31.  * smscenter functions
  32.  */
  33. SMSCenter *smscenter_construct(void)
  34. {
  35.     SMSCenter *smsc;
  36.     static int next_id = 1;
  37.     smsc = gw_malloc(sizeof(SMSCenter));
  38.     smsc->killed = 0;
  39.     smsc->type = SMSC_TYPE_DELETED;
  40.     smsc->preferred_prefix = NULL;
  41.     smsc->allowed_prefix = NULL;
  42.     smsc->denied_prefix = NULL;
  43.     smsc->alt_charset = 0;
  44.     smsc->keepalive = 0;
  45.     smsc->mutex = mutex_create();
  46.     sprintf(smsc->name, "Unknown SMSC");
  47.     smsc->id = next_id++;
  48.     /* FAKE */
  49.     smsc->hostname = NULL;
  50.     smsc->port = -1;
  51.     smsc->socket = -1;
  52.     /* CIMD */
  53.     smsc->cimd_hostname = NULL;
  54.     smsc->cimd_port = -1;
  55.     smsc->cimd_username = NULL;
  56.     smsc->cimd_password = NULL;
  57.     /* CIMD 2 */
  58.     smsc->cimd2_hostname = NULL;
  59.     smsc->cimd2_port = -1;
  60.     smsc->cimd2_username = NULL;
  61.     smsc->cimd2_password = NULL;
  62.     smsc->cimd2_send_seq = 1;
  63.     smsc->cimd2_receive_seq = 0;
  64.     smsc->cimd2_inbuffer = NULL;
  65.     smsc->cimd2_received = NULL;
  66.     smsc->cimd2_error = 0;
  67.     smsc->cimd2_next_ping = 0;
  68.     /* EMI */
  69.     smsc->emi_phonenum = NULL;
  70.     smsc->emi_serialdevice = NULL;
  71.     smsc->emi_username = NULL;
  72.     smsc->emi_password = NULL;
  73.     /* EMI IP */
  74.     smsc->emi_hostname = NULL;
  75.     smsc->emi_port = -1;
  76.     smsc->emi_backup_fd = -1;
  77.     smsc->emi_backup_port = -1;
  78.     smsc->emi_backup_allow_ip = NULL;
  79.     smsc->emi_our_port = -1;
  80.     smsc->emi_secondary_fd = -1;
  81.     /* SEMA SMS2000 */
  82.     smsc->sema_smscnua = NULL;
  83.     smsc->sema_homenua = NULL;
  84.     smsc->sema_serialdevice = NULL;
  85.     smsc->sema_fd = -1;
  86.     /* SEMA SMS2000 OIS X.25 */
  87.     smsc->ois_alive = 0;
  88.     smsc->ois_alive2 = 0;
  89.     smsc->ois_received_mo = NULL;
  90.     smsc->ois_ack_debt = 0;
  91.     smsc->ois_flags = 0;
  92.     smsc->ois_listening_socket = -1;
  93.     smsc->ois_socket = -1;
  94.     smsc->ois_buflen = 0;
  95.     smsc->ois_bufsize = 0;
  96.     smsc->ois_buffer = 0;
  97.     /* AT Wireless modems  (GSM 03.40 version 7.4.0) */
  98.     smsc->at_serialdevice = NULL;
  99.     smsc->at_fd = -1;
  100.     smsc->at_modemtype = NULL;
  101.     smsc->at_received = NULL;
  102.     smsc->at_inbuffer = NULL;
  103.     smsc->at_pin = NULL;
  104.     smsc->at_validityperiod = NULL;
  105.     smsc->at_alt_dcs = 0;
  106.     /* add new SMSCes here */
  107.     /* Memory */
  108.     smsc->buflen = 0;
  109.     smsc->bufsize = 10*1024;
  110.     smsc->buffer = gw_malloc(smsc->bufsize);
  111.     memset(smsc->buffer, 0, smsc->bufsize);
  112.     return smsc;
  113. }
  114. void smscenter_destruct(SMSCenter *smsc)
  115. {
  116.     if (smsc == NULL)
  117.         return;
  118.     /* FAKE */
  119.     gw_free(smsc->hostname);
  120.     /* CIMD */
  121.     gw_free(smsc->cimd_hostname);
  122.     gw_free(smsc->cimd_username);
  123.     gw_free(smsc->cimd_password);
  124.     /* CIMD 2 */
  125.     octstr_destroy(smsc->cimd2_hostname);
  126.     octstr_destroy(smsc->cimd2_username);
  127.     octstr_destroy(smsc->cimd2_password);
  128.     octstr_destroy(smsc->cimd2_inbuffer);
  129.     octstr_destroy(smsc->sender_prefix);
  130.     list_destroy(smsc->cimd2_received, NULL);
  131.     /* EMI */
  132.     gw_free(smsc->emi_phonenum);
  133.     gw_free(smsc->emi_serialdevice);
  134.     gw_free(smsc->emi_username);
  135.     gw_free(smsc->emi_password);
  136.     /* EMI IP */
  137.     gw_free(smsc->emi_hostname);
  138.     gw_free(smsc->emi_backup_allow_ip);
  139.     /* SEMA */
  140.     gw_free(smsc->sema_smscnua);
  141.     gw_free(smsc->sema_homenua);
  142.     gw_free(smsc->sema_serialdevice);
  143.     /* OIS */
  144.     ois_delete_queue(smsc);
  145.     gw_free(smsc->ois_buffer);
  146.     /* AT */
  147.     gw_free(smsc->at_serialdevice);
  148.     gw_free(smsc->at_modemtype);
  149.     gw_free(smsc->at_pin);
  150.     list_destroy(smsc->at_received, NULL);
  151.     gw_free(smsc->at_inbuffer);
  152.     /* add new SMSCes here */
  153.     /* Other fields */
  154.     mutex_destroy(smsc->mutex);
  155.     /* Memory */
  156.     gw_free(smsc->buffer);
  157.     gw_free(smsc);
  158. }
  159. int smscenter_submit_msg(SMSCenter *smsc, Msg *msg)
  160. {
  161.     smscenter_lock(smsc);
  162.     switch (smsc->type) {
  163.     case SMSC_TYPE_CIMD:
  164.         if (cimd_submit_msg(smsc, msg) == -1)
  165.             goto error;
  166.         break;
  167.     case SMSC_TYPE_CIMD2:
  168.         if (cimd2_submit_msg(smsc, msg) == -1)
  169.             goto error;
  170.         break;
  171.     case SMSC_TYPE_EMI:
  172.     case SMSC_TYPE_EMI_IP:
  173.         if (emi_submit_msg(smsc, msg) == -1)
  174.             goto error;
  175.         break;
  176.     case SMSC_TYPE_SEMA_X28:
  177.         if (sema_submit_msg(smsc, msg) == -1)
  178.             goto error;
  179.         break;
  180.     case SMSC_TYPE_OIS:
  181.         if (ois_submit_msg(smsc, msg) == -1)
  182.             goto error;
  183.         break;
  184.     case SMSC_TYPE_AT:
  185.         if (at_submit_msg(smsc, msg) == -1)
  186.             goto error;
  187.         break;
  188.         /* add new SMSCes here */
  189.     default:
  190.         goto error;
  191.     }
  192.     smscenter_unlock(smsc);
  193.     return 0;
  194. error:
  195.     smscenter_unlock(smsc);
  196.     return -1;
  197. }
  198. int smscenter_receive_msg(SMSCenter *smsc, Msg **msg)
  199. {
  200.     int ret;
  201.     smscenter_lock(smsc);
  202.     switch (smsc->type) {
  203.     case SMSC_TYPE_CIMD:
  204.         ret = cimd_receive_msg(smsc, msg);
  205.         if (ret == -1)
  206.             goto error;
  207.         break;
  208.     case SMSC_TYPE_CIMD2:
  209.         ret = cimd2_receive_msg(smsc, msg);
  210.         if (ret == -1)
  211.             goto error;
  212.         break;
  213.     case SMSC_TYPE_EMI:
  214.     case SMSC_TYPE_EMI_IP:
  215.         ret = emi_receive_msg(smsc, msg);
  216.         if (ret == -1)
  217.             goto error;
  218.         break;
  219.     case SMSC_TYPE_OIS:
  220.         ret = ois_receive_msg(smsc, msg);
  221.         if (ret == -1)
  222.             goto error;
  223.         break;
  224.     case SMSC_TYPE_SEMA_X28:
  225.         ret = sema_receive_msg(smsc, msg);
  226.         if (ret == -1)
  227.             goto error;
  228.         break;
  229.     case SMSC_TYPE_AT:
  230.         ret = at_receive_msg(smsc, msg);
  231.         if (ret == -1)
  232.             goto error;
  233.         break;
  234.     default:
  235.         goto error;
  236.     }
  237.     smscenter_unlock(smsc);
  238.     /* If the SMSC didn't set the timestamp, set it here. */
  239.     if (ret == 1 && msg_type(*msg) == sms && (*msg)->sms.time == 0)
  240.         time(&(*msg)->sms.time);
  241.     return ret;
  242. error:
  243.     smscenter_unlock(smsc);
  244.     return -1;
  245. }
  246. int smscenter_pending_smsmessage(SMSCenter *smsc)
  247. {
  248.     int ret;
  249.     smscenter_lock(smsc);
  250.     switch (smsc->type) {
  251.     case SMSC_TYPE_CIMD:
  252.         ret = cimd_pending_smsmessage(smsc);
  253.         if (ret == -1)
  254.             goto error;
  255.         break;
  256.     case SMSC_TYPE_CIMD2:
  257.         ret = cimd2_pending_smsmessage(smsc);
  258.         if (ret == -1)
  259.             goto error;
  260.         break;
  261.     case SMSC_TYPE_EMI:
  262.     case SMSC_TYPE_EMI_IP:
  263.         ret = emi_pending_smsmessage(smsc);
  264.         if (ret == -1)
  265.             goto error;
  266.         break;
  267.     case SMSC_TYPE_SEMA_X28:
  268.         ret = sema_pending_smsmessage(smsc);
  269.         if (ret == -1)
  270.             goto error;
  271.         break;
  272.     case SMSC_TYPE_OIS:
  273.         ret = ois_pending_smsmessage(smsc);
  274.         if (ret == -1)
  275.             goto error;
  276.         break;
  277.     case SMSC_TYPE_AT:
  278.         ret = at_pending_smsmessage(smsc);
  279.         if (ret == -1)
  280.             goto error;
  281.         break;
  282.     default:
  283.         goto error;
  284.     }
  285.     smscenter_unlock(smsc);
  286.     return ret;
  287. error:
  288.     error(0, "smscenter_pending_smsmessage is failing");
  289.     smscenter_unlock(smsc);
  290.     return -1;
  291. }
  292. int smscenter_read_into_buffer(SMSCenter *smsc)
  293. {
  294.     char *p;
  295.     int ret, result;
  296.     fd_set read_fd;
  297.     struct timeval tv, tvinit;
  298.     size_t bytes_read;
  299.     tvinit.tv_sec = 0;
  300.     tvinit.tv_usec = 1000;
  301.     bytes_read = 0;
  302.     result = 0;
  303.     for (;;) {
  304.         FD_ZERO(&read_fd);
  305.         FD_SET(smsc->socket, &read_fd);
  306.         tv = tvinit;
  307.         ret = select(smsc->socket + 1, &read_fd, NULL, NULL, &tv);
  308.         if (ret == -1) {
  309.             if (errno == EINTR) goto got_data;
  310.             if (errno == EAGAIN) goto got_data;
  311.             error(errno, "Error doing select for socket");
  312.             goto error;
  313.         } else if (ret == 0)
  314.             goto got_data;
  315.         if (smsc->buflen == smsc->bufsize) {
  316.             p = gw_realloc(smsc->buffer, smsc->bufsize * 2);
  317.             smsc->buffer = p;
  318.             smsc->bufsize *= 2;
  319.         }
  320.         ret = read(smsc->socket,
  321.                    smsc->buffer + smsc->buflen,
  322.                    1);
  323.         if (ret == -1) {
  324.             error(errno, "Reading from `%s' port `%d' failed.",
  325.                   smsc->hostname, smsc->port);
  326.             goto error;
  327.         }
  328.         if (ret == 0)
  329.             goto eof;
  330.         smsc->buflen += ret;
  331.         bytes_read += ret;
  332.         if (bytes_read >= MAX_READ_INTO_BUFFER)
  333.             break;
  334.     }
  335. eof:
  336.     ret = 0;
  337.     goto unblock;
  338. got_data:
  339.     ret = 1;
  340.     goto unblock;
  341. error:
  342.     ret = -1;
  343.     goto unblock;
  344. unblock:
  345.     return ret;
  346. }
  347. void smscenter_remove_from_buffer(SMSCenter *smsc, size_t n)
  348. {
  349.     memmove(smsc->buffer, smsc->buffer + n, smsc->buflen - n);
  350.     smsc->buflen -= n;
  351. }
  352. /*
  353.  * Lock an SMSCenter. Return -1 for error, 0 for OK. 
  354.  */
  355. static void smscenter_lock(SMSCenter *smsc)
  356. {
  357.     if (smsc->type == SMSC_TYPE_DELETED)
  358.         error(0, "smscenter_lock called on DELETED SMSC.");
  359.     mutex_lock(smsc->mutex);
  360. }
  361. /*
  362.  * Unlock an SMSCenter. Return -1 for error, 0 for OK.
  363.  */
  364. static void smscenter_unlock(SMSCenter *smsc)
  365. {
  366.     mutex_unlock(smsc->mutex);
  367. }
  368. /*------------------------------------------------------------------------
  369.  * Public SMSC functions
  370.  */
  371. SMSCenter *smsc_open(CfgGroup *grp)
  372. {
  373.     SMSCenter *smsc;
  374.     Octstr *type, *host, *username, *password, *phone, *device;
  375.     Octstr *preferred_prefix, *allowed_prefix, *denied_prefix;
  376.     Octstr *alt_chars, *allow_ip;
  377.     Octstr *sema_smscnua, *sema_homenua, *sema_report;
  378.     Octstr *at_modemtype, *at_pin, *at_validityperiod;
  379.     Octstr *sender_prefix;
  380.     long iwaitreport;
  381.     long port, receive_port, our_port;
  382.     long keepalive;
  383.     long ois_debug;
  384.     long alt_dcs;
  385.     int typeno;
  386.     type = cfg_get(grp, octstr_imm("smsc"));
  387.     if (type == NULL) {
  388. error(0, "Required field 'smsc' missing for smsc group.");
  389. return NULL;
  390.     }
  391.     if (octstr_compare(type, octstr_imm("cimd")) == 0)
  392.      typeno = SMSC_TYPE_CIMD;
  393.     else if (octstr_compare(type, octstr_imm("cimd2")) == 0)
  394.      typeno = SMSC_TYPE_CIMD2;
  395.     else if (octstr_compare(type, octstr_imm("emi")) == 0)
  396.      typeno = SMSC_TYPE_EMI;
  397.     else if (octstr_compare(type, octstr_imm("emi_ip")) == 0)
  398.      typeno = SMSC_TYPE_EMI_IP;
  399.     else if (octstr_compare(type, octstr_imm("sema")) == 0)
  400.      typeno = SMSC_TYPE_SEMA_X28;
  401.     else if (octstr_compare(type, octstr_imm("ois")) == 0)
  402.      typeno = SMSC_TYPE_OIS;
  403.     else if (octstr_compare(type, octstr_imm("at")) == 0)
  404.      typeno = SMSC_TYPE_AT;
  405.     else {
  406. error(0, "Unknown SMSC type '%s'", octstr_get_cstr(type));
  407. octstr_destroy(type);
  408. return NULL;
  409.     }
  410.     host = cfg_get(grp, octstr_imm("host"));
  411.     if (cfg_get_integer(&port, grp, octstr_imm("port")) == -1)
  412.      port = 0;
  413.     if (cfg_get_integer(&receive_port, grp, octstr_imm("receive-port")) == -1)
  414.      receive_port = 0;
  415.     if (cfg_get_integer(&our_port, grp, octstr_imm("our-port")) == -1)
  416.      our_port = 0;
  417.     username = cfg_get(grp, octstr_imm("smsc-username"));
  418.     password = cfg_get(grp, octstr_imm("smsc-password"));
  419.     phone = cfg_get(grp, octstr_imm("phone"));
  420.     device = cfg_get(grp, octstr_imm("device"));
  421.     preferred_prefix = cfg_get(grp, octstr_imm("preferred-prefix"));
  422.     allowed_prefix = cfg_get(grp, octstr_imm("allowed-prefix"));
  423.     denied_prefix = cfg_get(grp, octstr_imm("denied-prefix"));
  424.     alt_chars = cfg_get(grp, octstr_imm("alt-charset"));
  425.     allow_ip = cfg_get(grp, octstr_imm("connect-allow-ip"));
  426.     sema_smscnua = cfg_get(grp, octstr_imm("smsc_nua"));
  427.     sema_homenua = cfg_get(grp, octstr_imm("home_nua"));
  428.     sema_report = cfg_get(grp, octstr_imm("wait_report"));
  429.     if (sema_report == NULL)
  430.      iwaitreport = 1;
  431.     else
  432.      octstr_parse_long(&iwaitreport, sema_report, 0, 0);
  433.     if (cfg_get_integer(&keepalive, grp, octstr_imm("keepalive")) == -1)
  434.      keepalive = 0;
  435.     if (cfg_get_integer(&alt_dcs, grp, octstr_imm("alt-dcs")) == -1)
  436.      alt_dcs = 0;
  437.     if (alt_dcs > 1)
  438.         alt_dcs = 1;
  439.     if (cfg_get_integer(&ois_debug, grp, octstr_imm("ois-debug-level")) == -1)
  440.      ois_debug = 0;
  441.     at_modemtype = cfg_get(grp, octstr_imm("modemtype"));
  442.     at_pin = cfg_get(grp, octstr_imm("pin"));
  443.     at_validityperiod = cfg_get(grp, octstr_imm("validityperiod"));
  444.     sender_prefix = cfg_get(grp, octstr_imm("sender-prefix"));
  445.     if (sender_prefix == NULL)
  446.         sender_prefix = octstr_create("never");
  447.     smsc = NULL;
  448.     switch (typeno) {
  449.     case SMSC_TYPE_CIMD:
  450.         if (host == NULL || port == 0 || username == NULL || password == NULL)
  451.             error(0, "Required field missing for CIMD center.");
  452.         else
  453.             smsc = cimd_open(octstr_get_cstr(host),
  454.                port, 
  455.                octstr_get_cstr(username), 
  456.      octstr_get_cstr(password));
  457.         break;
  458.     case SMSC_TYPE_CIMD2:
  459.         if (host == NULL || port == 0 || username == NULL || password == NULL)
  460.             error(0, "Required field missing for CIMD 2 center.");
  461.         else
  462.             smsc = cimd2_open(host,
  463.                 port, 
  464.       username, 
  465.       password, 
  466.       keepalive,
  467.                               sender_prefix);
  468.         break;
  469.     case SMSC_TYPE_EMI:
  470.         if (phone == NULL || device == NULL || username == NULL ||
  471.             password == NULL)
  472.             error(0, "Required field missing for EMI center.");
  473.         else
  474.             smsc = emi_open(octstr_get_cstr(phone), 
  475.               octstr_get_cstr(device), 
  476.     octstr_get_cstr(username), 
  477.     octstr_get_cstr(password));
  478.         break;
  479.     case SMSC_TYPE_EMI_IP:
  480.         if (host == NULL || port == 0)
  481.             error(0, "Required field missing for EMI IP center.");
  482.         else
  483.     smsc = emi_open_ip(octstr_get_cstr(host), 
  484.                  port, 
  485.        username ? octstr_get_cstr(username) : 0, 
  486.        password ? octstr_get_cstr(password) : 0,
  487.                                receive_port, 
  488.        allow_ip ? octstr_get_cstr(allow_ip) : 0, 
  489.        our_port);
  490.         break;
  491.     case SMSC_TYPE_SEMA_X28:
  492.         if (device == NULL || sema_smscnua == NULL || sema_homenua == NULL)
  493.             error(0, "Required field missing for SEMA center.");
  494.         else
  495.             smsc = sema_open(octstr_get_cstr(sema_smscnua), 
  496.                octstr_get_cstr(sema_homenua), 
  497.      octstr_get_cstr(device),
  498.                              iwaitreport);
  499.         break;
  500.     case SMSC_TYPE_OIS:
  501.         if (host == NULL || port == 0 || receive_port == 0)
  502.             error(0, "Required field missing for OIS center.");
  503.         else
  504.             smsc = ois_open(receive_port, 
  505.               octstr_get_cstr(host), 
  506.     port, 
  507.               ois_debug);
  508.         break;
  509.     case SMSC_TYPE_AT:
  510.         if (device == NULL)
  511.             error(0, "Required field missing for AT virtual center.");
  512.         else
  513.             smsc = at_open(octstr_get_cstr(device), 
  514.              at_modemtype ? octstr_get_cstr(at_modemtype) : 0, 
  515.    at_pin ? octstr_get_cstr(at_pin) : 0,
  516.              at_validityperiod ? 
  517.        octstr_get_cstr(at_validityperiod) : 0,
  518.        alt_dcs);
  519.         break;
  520.         /* add new SMSCes here */
  521.     default:  /* Unknown SMSC type */
  522.         break;
  523.     }
  524.     if (smsc != NULL) {
  525. if (cfg_get_integer(&smsc->alt_charset, grp, 
  526.               octstr_imm("alt-charset")) == -1)
  527.     smsc->alt_charset = 0;
  528.      if (preferred_prefix == NULL)
  529.     smsc->preferred_prefix = NULL;
  530. else
  531.     smsc->preferred_prefix = 
  532.      gw_strdup(octstr_get_cstr(preferred_prefix));
  533.      if (allowed_prefix == NULL)
  534.     smsc->allowed_prefix = NULL;
  535. else
  536.     smsc->allowed_prefix = gw_strdup(octstr_get_cstr(allowed_prefix));
  537.      if (denied_prefix == NULL)
  538.     smsc->denied_prefix = NULL;
  539. else
  540.     smsc->denied_prefix = gw_strdup(octstr_get_cstr(denied_prefix));
  541.     }
  542.     octstr_destroy(type);
  543.     octstr_destroy(host);
  544.     octstr_destroy(username);
  545.     octstr_destroy(password);
  546.     octstr_destroy(phone);
  547.     octstr_destroy(device);
  548.     octstr_destroy(preferred_prefix);
  549.     octstr_destroy(denied_prefix);
  550.     octstr_destroy(allowed_prefix);
  551.     octstr_destroy(alt_chars);
  552.     octstr_destroy(allow_ip);
  553.     octstr_destroy(sema_smscnua);
  554.     octstr_destroy(sema_homenua);
  555.     octstr_destroy(sema_report);
  556.     octstr_destroy(at_modemtype);
  557.     octstr_destroy(at_pin);
  558.     octstr_destroy(at_validityperiod);
  559.     octstr_destroy(sender_prefix);
  560.     return smsc;
  561. }
  562. int smsc_reopen(SMSCenter *smsc)
  563. {
  564.     int ret;
  565.     if (smsc->killed)
  566. return -2;
  567.     smscenter_lock(smsc);
  568.     switch (smsc->type) {
  569.     case SMSC_TYPE_CIMD:
  570.         ret = cimd_reopen(smsc);
  571. break;
  572.     case SMSC_TYPE_CIMD2:
  573.         ret = cimd2_reopen(smsc);
  574. break;
  575.     case SMSC_TYPE_EMI_IP:
  576.         ret = emi_reopen_ip(smsc);
  577. break;
  578.     case SMSC_TYPE_EMI:
  579.         ret = emi_reopen(smsc);
  580. break;
  581.     case SMSC_TYPE_SEMA_X28:
  582.         ret = sema_reopen(smsc);
  583. break;
  584.     case SMSC_TYPE_OIS:
  585.         ret = ois_reopen(smsc);
  586. break;
  587.     case SMSC_TYPE_AT:
  588.         ret = at_reopen(smsc);
  589. break;
  590.         /* add new SMSCes here */
  591.     default:  /* Unknown SMSC type */
  592.         ret = -2;  /* no use */
  593.     }
  594.     smscenter_unlock(smsc);
  595.     return ret;
  596. }
  597. char *smsc_name(SMSCenter *smsc)
  598. {
  599.     return smsc->name;
  600. }
  601. int smsc_close(SMSCenter *smsc)
  602. {
  603.     int errors = 0;
  604.     if (smsc == NULL)
  605.         return 0;
  606.     smscenter_lock(smsc);
  607.     switch (smsc->type) {
  608.     case SMSC_TYPE_CIMD:
  609.         if (cimd_close(smsc) == -1)
  610.             errors = 1;
  611.         break;
  612.     case SMSC_TYPE_CIMD2:
  613.         if (cimd2_close(smsc) == -1)
  614.             errors = 1;
  615.         break;
  616.     case SMSC_TYPE_EMI:
  617.         if (emi_close(smsc) == -1)
  618.             errors = 1;
  619.         break;
  620.     case SMSC_TYPE_EMI_IP:
  621.         if (emi_close_ip(smsc) == -1)
  622.             errors = 1;
  623.         break;
  624.     case SMSC_TYPE_SEMA_X28:
  625.         if (sema_close(smsc) == -1)
  626.             errors = 1;
  627.         break;
  628.     case SMSC_TYPE_OIS:
  629.         if (ois_close(smsc) == -1)
  630.             errors = 1;
  631.         break;
  632.     case SMSC_TYPE_AT:
  633.         if (at_close(smsc) == -1)
  634.             errors = 1;
  635.         break;
  636.         /* add new SMSCes here */
  637.     default:  /* Unknown SMSC type */
  638.         break;
  639.     }
  640.     /*
  641.      smsc->type = SMSC_TYPE_DELETED;
  642.      smscenter_unlock(smsc);
  643.     */
  644.     if (errors)
  645.         return -1;
  646.     return 0;
  647. }