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)