80 #define SMSCCONN_RECONNECT_DELAY     10.0    97         debug(
"smscconn",0,
"Adding general internal routing for smsc id <%s>",
   104          debug(
"smscconn",0,
"Adding internal routing: smsc id <%s> to smsc id <%s>",
   129                 debug(
"smscconn",0,
"Adding internal routing for smsc id <%s>: "   130                           "receiver <%s> to smsc id <%s>",
   134                     panic(0, 
"Could not set internal routing for smsc id <%s>: "   135                               "receiver <%s> to smsc id <%s>, because receiver has already routing entry!",
   170                 if ((re = gw_regex_comp(
receiver, REG_EXTENDED)) == NULL) {
   181                 debug(
"smscconn",0,
"Adding internal routing for smsc id <%s>: "   182                           "receiver-regex <%s> to smsc id <%s>",
   215     Octstr *allowed_smsc_id_regex;
   216     Octstr *denied_smsc_id_regex;
   217     Octstr *allowed_prefix_regex;
   218     Octstr *denied_prefix_regex;
   219     Octstr *preferred_prefix_regex;
   225     conn = gw_malloc(
sizeof(*conn));
   226     memset(conn, 0, 
sizeof(*conn));
   233 #define OCTSTR(os)  octstr_imm(#os)   245             OCTSTR(preferred-smsc-
id),
   255             OCTSTR(allowed-smsc-
id-regex),
   256             OCTSTR(denied-smsc-
id-regex),
   257             OCTSTR(preferred-smsc-
id-regex),
   258             OCTSTR(allowed-prefix-regex),
   259             OCTSTR(denied-prefix-regex),
   260             OCTSTR(preferred-prefix-regex),
   296 #define GET_OPTIONAL_VAL(x, n) x = cfg_get(grp, octstr_imm(n))   297 #define SPLIT_OPTIONAL_VAL(x, n) \   299                 Octstr *tmp = cfg_get(grp, octstr_imm(n)); \   300                 if (tmp) x = octstr_split(tmp, octstr_imm(";")); \   302                 octstr_destroy(tmp); \   318     if (allowed_smsc_id_regex != NULL) 
   322     if (denied_smsc_id_regex != NULL) 
   326     if (allowed_prefix_regex != NULL) 
   330     if (denied_prefix_regex != NULL) 
   331         if ((conn->
denied_prefix_regex = gw_regex_comp(denied_prefix_regex, REG_EXTENDED)) == NULL)
   334     if (preferred_prefix_regex != NULL) 
   365 #undef GET_OPTIONAL_VAL   366 #undef SPLIT_OPTIONAL_VAL   369     warning(0, 
"Both 'allowed-smsc-id' and 'denied-smsc-id' set, deny-list "   370         "automatically ignored");
   372         warning(0, 
"Both 'allowed-smsc-id_regex' and 'denied-smsc-id_regex' set, deny-regex "   373                 "automatically ignored");
   380     if (smsc_type == NULL) {
   381         error(0, 
"Required field 'smsc' missing for smsc group.");
   409         ret = smsc_soap_parlayx_create(conn, grp);
   444         conn->
shutdown(conn, finish_sending);
   458     gw_regex_destroy(r->
re);
   598         if (
msg->sms.smsc_id == NULL)
   668     if (
msg->sms.split_parts == NULL) {    
   693         split->smsc_conn = conn;
   694         debug(
"bb.sms.splits", 0, 
"new split_parts created %p", 
split);
   695         for (i = 0; i < parts_len; i++) {
   713                 warning(0, 
"Could not send all parts of a split message");
   734     if (conn == NULL || infotable == NULL)
   772 #define GET_OPTIONAL_VAL(x, n) \   774         x = cfg_get(grp, octstr_imm(n))   775 #define SPLIT_OPTIONAL_VAL(x, n) \   776         gwlist_destroy(x, octstr_destroy_item); \   777         if ((tmp = cfg_get(grp, octstr_imm(n))) != NULL) \   778             x = octstr_split(tmp, octstr_imm(";")); \   782 #define GET_OPTIONAL_REGEX(x, n) \   783         gw_regex_destroy(x); \   784         if ((tmp = cfg_get(grp, octstr_imm(n))) != NULL) { \   785             if ((x = gw_regex_comp(tmp, REG_EXTENDED)) == NULL) \   786                 error(0, "Could not compile pattern '%s'", octstr_get_cstr(tmp)); \   787             octstr_destroy(tmp); \ 
Dict * dict_create(long size_hint, void(*destroy_value)(void *))
 
void error(int err, const char *fmt,...)
 
int smsc_oisd_create(SMSCConn *conn, CfgGroup *grp)
 
void info(int err, const char *fmt,...)
 
Msg * msg_duplicate(Msg *msg)
 
int smsc_cgw_create(SMSCConn *conn, CfgGroup *cfg)
 
regex_t * allowed_smsc_id_regex
 
unsigned long received_dlr
 
void * gwlist_search(List *list, void *pattern, int(*cmp)(void *, void *))
 
void bb_smscconn_ready(SMSCConn *conn)
 
int smscconn_destroy(SMSCConn *conn)
 
int smsc_cimd2_create(SMSCConn *conn, CfgGroup *grp)
 
gw_assert(wtls_machine->packet_to_send !=NULL)
 
void counter_destroy(Counter *counter)
 
void gwlist_append(List *list, void *item)
 
void smscconn_shutdown(SMSCConn *conn, int finish_sending)
 
List * reroute_by_receiver_regex
 
long gwlist_len(List *list)
 
void * gwlist_get(List *list, long pos)
 
void(* stop_conn)(SMSCConn *conn)
 
int load_add_interval(Load *load, int interval)
 
Octstr * cfg_get_group_checksum(CfgGroup *grp,...)
 
int smsc_emi2_create(SMSCConn *conn, CfgGroup *cfg)
 
#define cfg_get(grp, varname)
 
const Octstr * smscconn_name(SMSCConn *conn)
 
unsigned long counter_set(Counter *counter, unsigned long n)
 
static void pattern_route_destroy(void *arg)
 
Dict * reroute_by_receiver
 
int smsc_wrapper_create(SMSCConn *conn, CfgGroup *cfg)
 
void octstr_strip_blanks(Octstr *text)
 
#define octstr_get_cstr(ostr)
 
List * sms_split(Msg *orig, Octstr *header, Octstr *footer, Octstr *nonlast_suffix, Octstr *split_chars, int catenate, unsigned long msg_sequence, int max_messages, int max_octets)
 
void(* start_conn)(SMSCConn *conn)
 
int smsc_http_create(SMSCConn *conn, CfgGroup *cfg)
 
unsigned long counter_increase(Counter *counter)
 
unsigned int smscconn_instances(CfgGroup *grp)
 
int smsc_at2_create(SMSCConn *conn, CfgGroup *cfg)
 
long octstr_parse_double(double *nump, Octstr *ostr, long pos)
 
regex_t * preferred_prefix_regex
 
#define SPLIT_OPTIONAL_VAL(x, n)
 
const Octstr * smscconn_admin_id(SMSCConn *conn)
 
int smsc_smasi_create(SMSCConn *conn, CfgGroup *config)
 
smscconn_killed_t why_killed
 
regex_t * allowed_prefix_regex
 
void smscconn_reconfig(SMSCConn *conn, CfgGroup *grp)
 
void msg_destroy_item(void *msg)
 
Octstr * octstr_imm(const char *cstr)
 
int smscconn_status(SMSCConn *conn)
 
regex_t * preferred_smsc_id_regex
 
int does_prefix_match(Octstr *prefix, Octstr *number)
 
Counter * counter_create(void)
 
void * gwlist_extract_first(List *list)
 
void grp_dump(CfgGroup *grp)
 
unsigned long counter_increase_with(Counter *counter, unsigned long value)
 
int smscconn_stop(SMSCConn *conn)
 
const Octstr * smscconn_id(SMSCConn *conn)
 
#define octstr_duplicate(ostr)
 
int smsc_loopback_create(SMSCConn *conn, CfgGroup *cfg)
 
int octstr_item_match(void *item, void *pattern)
 
static void init_reroute(SMSCConn *conn, CfgGroup *grp)
 
Octstr * preferred_prefix
 
regex_t * denied_prefix_regex
 
void warning(int err, const char *fmt,...)
 
void octstr_destroy(Octstr *ostr)
 
void octstr_destroy_item(void *os)
 
unsigned long counter_value(Counter *counter)
 
void mutex_destroy(Mutex *mutex)
 
#define GET_OPTIONAL_VAL(x, n)
 
#define SMSCCONN_RECONNECT_DELAY
 
volatile sig_atomic_t is_stopped
 
int smscconn_send(SMSCConn *conn, Msg *msg)
 
int smsc_smpp_create(SMSCConn *conn, CfgGroup *grp)
 
int smsc_fake_create(SMSCConn *conn, CfgGroup *cfg)
 
int log_open(char *filename, int level, enum excl_state excl)
 
void dict_destroy(Dict *dict)
 
int cfg_get_bool(int *n, CfgGroup *grp, Octstr *varname)
 
int smscconn_usable(SMSCConn *conn, Msg *msg)
 
int(* shutdown)(SMSCConn *conn, int finish_sending)
 
void debug(const char *place, int err, const char *fmt,...)
 
int cfg_get_integer(long *n, CfgGroup *grp, Octstr *varname)
 
void load_destroy(Load *load)
 
int normalize_number(char *dial_prefixes, Octstr **number)
 
long(* queued)(SMSCConn *conn)
 
SMSCConn * smscconn_create(CfgGroup *grp, int start_as_stopped)
 
int(* send_msg)(SMSCConn *conn, Msg *msg)
 
int dict_put_once(Dict *dict, Octstr *key, void *value)
 
regex_t * denied_smsc_id_regex
 
int smscconn_info(SMSCConn *conn, StatusInfo *infotable)
 
#define GET_OPTIONAL_REGEX(x, n)
 
List * octstr_split(const Octstr *os, const Octstr *sep)
 
static XMLRPCDocument * msg
 
void smscconn_start(SMSCConn *conn)
 
Counter * split_msg_counter
 
int octstr_compare(const Octstr *ostr1, const Octstr *ostr2)
 
void gwlist_destroy(List *list, gwlist_item_destructor_t *destructor)