summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xchannels/chan_sip.c1
-rwxr-xr-xpbx/pbx_realtime.c14
-rwxr-xr-xres/res_config_odbc.c24
3 files changed, 28 insertions, 11 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 6d9b85db1..77ef8810d 100755
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -692,6 +692,7 @@ static int retrans_pkt(void *data)
ast_mutex_lock(&pkt->owner->lock);
}
if (pkt->owner->owner) {
+ pkt->owner->alreadygone=1;
ast_queue_hangup(pkt->owner->owner);
ast_mutex_unlock(&pkt->owner->owner->lock);
} else {
diff --git a/pbx/pbx_realtime.c b/pbx/pbx_realtime.c
index 6b1e6304c..4b70da11f 100755
--- a/pbx/pbx_realtime.c
+++ b/pbx/pbx_realtime.c
@@ -50,13 +50,13 @@ static char *tdesc = "Realtime Switch";
*/
-#define REALTIME_COMMON \
+#define REALTIME_COMMON(mode) \
char *buf; \
char *opts; \
const char *cxt; \
char *table; \
int res=-1; \
- struct ast_variable *var; \
+ struct ast_variable *var=NULL; \
buf = ast_strdupa(data); \
if (buf) { \
opts = strchr(buf, '/'); \
@@ -75,9 +75,9 @@ static char *tdesc = "Realtime Switch";
cxt = context;\
if (!table || ast_strlen_zero(table)) \
table = "extensions"; \
- var = realtime_switch_common(table, cxt, exten, priority); \
+ var = realtime_switch_common(table, cxt, exten, priority, mode); \
} else \
- return -1;
+ res = -1;
static struct ast_variable *realtime_switch_common(const char *table, const char *context, const char *exten, int priority)
{
@@ -104,7 +104,7 @@ static int realtime_canmatch(struct ast_channel *chan, const char *context, cons
if (var) ast_destroy_realtime(var);
if (var)
res = 1;
- return res;
+ return res > 0 ? res : 0;
}
static int realtime_exec(struct ast_channel *chan, const char *context, const char *exten, int priority, const char *callerid, int newstack, const char *data)
@@ -123,6 +123,7 @@ static int realtime_exec(struct ast_channel *chan, const char *context, const ch
appdata = ast_strdupa(v->value);
v = v->next;
}
+ ast_destroy_realtime(var);
if (!ast_strlen_zero(app)) {
a = pbx_findapp(app);
if (a) {
@@ -130,7 +131,6 @@ static int realtime_exec(struct ast_channel *chan, const char *context, const ch
} else
ast_log(LOG_NOTICE, "No such application '%s' for extension '%s' in context '%s'\n", app, exten, context);
}
- ast_destroy_realtime(var);
}
return res;
}
@@ -139,7 +139,7 @@ static int realtime_matchmore(struct ast_channel *chan, const char *context, con
{
REALTIME_COMMON;
if (var) ast_destroy_realtime(var);
- return res;
+ return res > 0 ? res : 0;
}
static struct ast_switch realtime_switch =
diff --git a/res/res_config_odbc.c b/res/res_config_odbc.c
index 7d2cd8ea1..512ed9f8e 100755
--- a/res/res_config_odbc.c
+++ b/res/res_config_odbc.c
@@ -31,13 +31,28 @@ STANDARD_LOCAL_USER;
LOCAL_USER_DECL;
+static void parseop(char *newp, int newplen, char **opo, const char *newparam)
+{
+ char *op;
+ strncpy(newp, newparam, newplen - 1);
+ op = strchr(newp, ' ');
+ if (op) {
+ *op = '\0';
+ op++;
+ } else
+ op = "=";
+ *opo = op;
+}
+
static struct ast_variable *realtime_odbc(const char *database, const char *table, va_list ap)
{
odbc_obj *obj;
SQLHSTMT stmt;
- char sql[256];
+ char sql[1024];
char coltitle[256];
char rowdata[2048];
+ char newp[256];
+ char *op;
const char *newparam, *newval;
char *stringp;
char *chunk;
@@ -75,10 +90,11 @@ static struct ast_variable *realtime_odbc(const char *database, const char *tabl
return NULL;
}
newval = va_arg(aq, const char *);
-
- snprintf(sql, sizeof(sql), "SELECT * FROM %s WHERE %s=?", table, newparam);
+ parseop(newp, sizeof(newp), &op, newparam);
+ snprintf(sql, sizeof(sql), "SELECT * FROM %s WHERE %s %s ?", table, newp, op);
while((newparam = va_arg(aq, const char *))) {
- snprintf(sql + strlen(sql), sizeof(sql) - strlen(sql), " AND %s=?", newparam);
+ parseop(newp, sizeof(newp), &op, newparam);
+ snprintf(sql + strlen(sql), sizeof(sql) - strlen(sql), " AND %s %s ?", newparam, op);
newval = va_arg(aq, const char *);
}
va_end(aq);