BTW, introduces some macros in smsbox that make the conditional
checks a bit more easier to read.
Before committing the TODOs need to get touched of course.
Comments?
Stipe
-------------------------------------------------------------------
Kölner Landstrasse 419
40589 Düsseldorf, NRW, Germany
tolj.org system architecture Kannel Software Foundation (KSF)
http://www.tolj.org/ http://www.kannel.org/
mailto:st_{at}_tolj.org mailto:stolj_{at}_kannel.org
-------------------------------------------------------------------
### Eclipse Workspace Patch 1.0
#P gateway-cvs-head
Index: gw/smsc/smsc_smpp.c
===================================================================
RCS file: /home/cvs/gateway/gw/smsc/smsc_smpp.c,v
retrieving revision 1.102
diff -u -r1.102 smsc_smpp.c
--- gw/smsc/smsc_smpp.c 9 Jan 2008 20:06:52 -0000 1.102
+++ gw/smsc/smsc_smpp.c 1 Feb 2008 12:19:38 -0000
@@ -760,8 +760,13 @@
}
if (smpp->autodetect_addr) {
+ /* check if we have an empty source address */
+ if (octstr_len(pdu->u.submit_sm.source_addr) == 0) {
+ pdu->u.submit_sm.source_addr_ton = GSM_ADDR_TON_UNKNOWN;
+ pdu->u.submit_sm.source_addr_npi = GSM_ADDR_NPI_UNKNOWN;
+ }
/* lets see if its international or alphanumeric sender */
- if (octstr_get_char(pdu->u.submit_sm.source_addr, 0) ==
'+') {
+ else if (octstr_get_char(pdu->u.submit_sm.source_addr, 0)
== '+') {
if (!octstr_check_range(pdu->u.submit_sm.source_addr, 1,
256, gw_isdigit)) {
pdu->u.submit_sm.source_addr_ton =
GSM_ADDR_TON_ALPHANUMERIC; /* alphanum */
pdu->u.submit_sm.source_addr_npi =
GSM_ADDR_NPI_UNKNOWN; /* short code */
Index: gw/smsbox.c
===================================================================
RCS file: /home/cvs/gateway/gw/smsbox.c,v
retrieving revision 1.277
diff -u -r1.277 smsbox.c
--- gw/smsbox.c 9 Jan 2008 20:06:58 -0000 1.277
+++ gw/smsbox.c 1 Feb 2008 12:19:34 -0000
@@ -1968,6 +1968,7 @@
List *denied = NULL;
int no_recv, ret = 0, i;
long del;
+ struct sms *p;
/*
* Multi-cast messages with several receivers in 'to' are handled
@@ -1975,7 +1976,7 @@
* loop below, because everything else is identical for all
receivers.
* If receiver is not null, to list is already present on it
*/
- if(receiver == NULL) {
+ if (receiver == NULL) {
receiver = octstr_split_words(to);
}
no_recv = gwlist_len(receiver);
@@ -2007,14 +2008,14 @@
for (i = 0; i < no_recv; i++) {
receiv = gwlist_get(receiver, i);
- /*
- * Check if there are any illegal characters in the 'to' scheme
- */
- if (strspn(octstr_get_cstr(receiv), sendsms_number_chars) <
octstr_len(receiv)) {
- info(0,"Illegal characters in 'to' string ('%s') vs '%s'",
- octstr_get_cstr(receiv), sendsms_number_chars);
+ /*
+ * Check if there are any illegal characters in the 'to'
scheme
+ */
+ if (strspn(octstr_get_cstr(receiv), sendsms_number_chars) <
octstr_len(receiv)) {
+ info(0,"Illegal characters in 'to' string ('%s') vs
'%s'",
+ octstr_get_cstr(receiv), sendsms_number_chars);
gwlist_append_unique(denied, receiv, octstr_item_match);
- }
+ }
/*
* First of all fill the two lists systematicaly by the rules,
@@ -2111,17 +2112,14 @@
}
if (urltrans_faked_sender(t) != NULL) {
- /* discard previous from */
- newfrom = octstr_duplicate(urltrans_faked_sender(t));
+ /* discard previous from */
+ newfrom = octstr_duplicate(urltrans_faked_sender(t));
} else if (octstr_len(from) > 0) {
- newfrom = octstr_duplicate(from);
+ newfrom = octstr_duplicate(from);
} else if (urltrans_default_sender(t) != NULL) {
- newfrom = octstr_duplicate(urltrans_default_sender(t));
+ newfrom = octstr_duplicate(urltrans_default_sender(t));
} else if (global_sender != NULL) {
- newfrom = octstr_duplicate(global_sender);
- } else {
- returnerror = octstr_create("Sender missing and no global set,
rejected");
- goto field_error;
+ newfrom = octstr_duplicate(global_sender);
}
info(0, "sendsms sender:<%s:%s> (%s) to:<%s> msg:<%s>",
@@ -2140,14 +2138,14 @@
msg->sms.service = octstr_duplicate(urltrans_name(t));
msg->sms.sms_type = mt_push;
msg->sms.sender = octstr_duplicate(newfrom);
- if(octstr_len(account)) {
- if(octstr_len(account) <= 32 &&
- octstr_search_chars(account, octstr_imm("[]\n\r"), 0) == -1) {
- msg->sms.account = account ? octstr_duplicate(account) : NULL;
- } else {
- returnerror = octstr_create("Account field misformed,
rejected");
- goto field_error;
- }
+ if (octstr_len(account)) {
+ if (octstr_len(account) <= 32 &&
+ octstr_search_chars(account, octstr_imm("[]\n\r"),
0) == -1) {
+ msg->sms.account = account ?
octstr_duplicate(account) : NULL;
+ } else {
+ returnerror = octstr_create("Account field misformed,
rejected");
+ goto field_error;
+ }
}
msg->sms.msgdata = text ? octstr_duplicate(text) :
octstr_create("");
msg->sms.udhdata = udh ? octstr_duplicate(udh) :
octstr_create("");
@@ -2155,133 +2153,92 @@
if (octstr_len(binfo))
msg->sms.binfo = octstr_duplicate(binfo);
- if(octstr_len(dlr_url)) {
- if(octstr_len(dlr_url) < 8) { /* http(s):// */
- returnerror = octstr_create("DLR-URL field misformed,
rejected");
- goto field_error;
- } else {
- Octstr *tmp;
- tmp = octstr_copy(dlr_url, 0, 7);
- if(octstr_case_compare(tmp, octstr_imm("http://")) == 0) {
- msg->sms.dlr_url = octstr_duplicate(dlr_url);
- } else {
- O_DESTROY(tmp);
- tmp = octstr_copy(dlr_url, 0, 8);
- if(octstr_case_compare(tmp, octstr_imm("https://")) != 0) {
- returnerror = octstr_create("DLR-URL field misformed,
rejected");
- O_DESTROY(tmp);
- goto field_error;
- }
+ if (octstr_len(dlr_url)) {
+ if (octstr_len(dlr_url) < 8) { /* http(s):// */
+ returnerror = octstr_create("DLR-URL field misformed,
rejected");
+ goto field_error;
+ } else {
+ Octstr *tmp;
+ tmp = octstr_copy(dlr_url, 0, 7);
+ if (octstr_case_compare(tmp, octstr_imm("http://")) ==
0) {
+ msg->sms.dlr_url = octstr_duplicate(dlr_url);
+ } else {
+ O_DESTROY(tmp);
+ tmp = octstr_copy(dlr_url, 0, 8);
+ if (octstr_case_compare(tmp,
octstr_imm("https://")) != 0) {
+ returnerror = octstr_create("DLR-URL field
misformed, rejected");
+ O_DESTROY(tmp);
+ goto field_error;
+ }
#ifdef HAVE_LIBSSL
- msg->sms.dlr_url = octstr_duplicate(dlr_url);
+ msg->sms.dlr_url = octstr_duplicate(dlr_url);
#else /* HAVE_LIBSSL */
- else {
- warning(0, "DLR-URL with https but SSL not supported, url is <
%s>",
- octstr_get_cstr(dlr_url));
- }
+ else {
+ warning(0, "DLR-URL with https but SSL not
supported, url is <%s>",
+ octstr_get_cstr(dlr_url));
+ }
#endif /* HAVE_LIBSSL */
- }
- O_DESTROY(tmp);
- }
+ }
+ O_DESTROY(tmp);
+ }
} else {
- msg->sms.dlr_url = octstr_create("");
+ msg->sms.dlr_url = octstr_create("");
}
- if ( dlr_mask < -1 || dlr_mask > 31 ) { /* 00011111 */
- returnerror = octstr_create("DLR-Mask field misformed, rejected");
- goto field_error;
- }
- msg->sms.dlr_mask = dlr_mask;
-
- if ( mclass < -1 || mclass > 3 ) {
- returnerror = octstr_create("MClass field misformed, rejected");
- goto field_error;
- }
- msg->sms.mclass = mclass;
-
- if ( pid < -1 || pid > 255 ) {
- returnerror = octstr_create("PID field misformed, rejected");
- goto field_error;
- }
- msg->sms.pid = pid;
-
- if ( rpi < -1 || rpi > 2) {
- returnerror = octstr_create("RPI field misformed, rejected");
- goto field_error;
- }
- msg->sms.rpi = rpi;
-
- if ( alt_dcs < -1 || alt_dcs > 1 ) {
- returnerror = octstr_create("Alt-DCS field misformed, rejected");
- goto field_error;
- }
- msg->sms.alt_dcs = alt_dcs;
-
- if ( mwi < -1 || mwi > 7 ) {
- returnerror = octstr_create("MWI field misformed, rejected");
- goto field_error;
- }
- msg->sms.mwi = mwi;
-
- if ( coding < -1 || coding > 2 ) {
- returnerror = octstr_create("Coding field misformed, rejected");
- goto field_error;
- }
- msg->sms.coding = coding;
-
- if ( compress < -1 || compress > 1 ) {
- returnerror = octstr_create("Compress field misformed, rejected");
- goto field_error;
- }
- msg->sms.compress = compress;
+ /* Define macros that are used to reduce code replication. */
+#define MINMAX(var, min, max, string) \
+ if (var < min || var > max) { \
+ returnerror = octstr_create(string " field misformed,
rejected"); \
+ goto field_error; \
+ } \
+ { p->var = var; }
+
+#define MIN(var, min, string) \
+ if (var < min) { \
+ returnerror = octstr_create(string " field misformed,
rejected"); \
+ goto field_error; \
+ } \
+ { p->var = var; }
+
+ p = &msg->sms;
+ MINMAX(dlr_mask, DLR_UNDEFINED, 31, "DLR-Mask");
+ MINMAX(mclass, MC_UNDEF, MC_CLASS3, "MClass");
+ MINMAX(pid, SMS_PARAM_UNDEFINED, 255, "PID");
+ MINMAX(rpi, RPI_UNDEF, RPI_ON, "RPI");
+ MINMAX(alt_dcs, SMS_PARAM_UNDEFINED, 1, "Alt-DCS");
+ MINMAX(mwi, MWI_UNDEF, MWI_OTHER_OFF, "MWI");
+ MINMAX(coding, DC_UNDEF, DC_UCS2, "Coding");
+ MINMAX(compress, SMS_PARAM_UNDEFINED, 1, "Compress");
+ MINMAX(priority, SMS_PARAM_UNDEFINED, 3, "Priority");
+ MIN(validity, SMS_PARAM_UNDEFINED, "Validity");
+ MIN(deferred, SMS_PARAM_UNDEFINED, "Deferred");
/* Compatibility Mode */
- if ( msg->sms.coding == DC_UNDEF) {
- if(octstr_len(udh))
- msg->sms.coding = DC_8BIT;
- else
- msg->sms.coding = DC_7BIT;
- }
-
-
- if ( validity < -1 ) {
- returnerror = octstr_create("Validity field misformed, rejected");
- goto field_error;
- }
- msg->sms.validity = validity;
-
- if ( deferred < -1 ) {
- returnerror = octstr_create("Deferred field misformed, rejected");
- goto field_error;
+ if (msg->sms.coding == DC_UNDEF) {
+ if( octstr_len(udh))
+ msg->sms.coding = DC_8BIT;
+ else
+ msg->sms.coding = DC_7BIT;
}
- msg->sms.deferred = deferred;
- if (priority != SMS_PARAM_UNDEFINED && (priority < 0 ||
priority > 3)) {
- returnerror = octstr_create("Priority field misformed,
rejected");
- goto field_error;
- }
- msg->sms.priority = priority;
-
-
/* new smsc-id argument - we should check this one, if able,
but that's advanced logics -- Kalle */
if (urltrans_forced_smsc(t)) {
- msg->sms.smsc_id = octstr_duplicate(urltrans_forced_smsc(t));
- if (smsc)
- info(0, "send-sms request smsc id ignored, "
- "as smsc id forced to %s",
- octstr_get_cstr(urltrans_forced_smsc(t)));
+ msg->sms.smsc_id = octstr_duplicate(urltrans_forced_smsc(t));
+ if (smsc)
+ info(0, "send-sms request smsc id ignored, as smsc id
forced to %s",
+ octstr_get_cstr(urltrans_forced_smsc(t)));
} else if (smsc) {
- msg->sms.smsc_id = octstr_duplicate(smsc);
+ msg->sms.smsc_id = octstr_duplicate(smsc);
} else if (urltrans_default_smsc(t)) {
- msg->sms.smsc_id = octstr_duplicate(urltrans_default_smsc(t));
+ msg->sms.smsc_id =
octstr_duplicate(urltrans_default_smsc(t));
} else
- msg->sms.smsc_id = NULL;
+ msg->sms.smsc_id = NULL;
if (charset_processing(charset, msg->sms.msgdata, msg-
>sms.coding) == -1) {
- returnerror = octstr_create("Charset or body misformed, rejected");
- goto field_error;
+ returnerror = octstr_create("Charset or body misformed,
rejected");
+ goto field_error;
}
msg->sms.receiver = NULL;
@@ -2301,7 +2258,7 @@
while ((receiv = gwlist_extract_first(allowed)) != NULL) {
- O_DESTROY(msg->sms.receiver);
+ O_DESTROY(msg->sms.receiver);
msg->sms.receiver = octstr_duplicate(receiv);
msg->sms.time = time(NULL);
@@ -2322,7 +2279,7 @@
}
if (gwlist_len(failed_id) > 0)
- goto transmit_error;
+ goto transmit_error;
*status = HTTP_ACCEPTED;
returnerror = octstr_create("Sent.");