static void dlr_update_mssql(const Octstr *smsc, const Octstr *ts, const Octstr *dst, int status) { Octstr *sql, *like; DBPoolConn *pconn; int res; debug("dlr.mssql", 0, "updating DLR status in database"); pconn = dbpool_conn_consume(pool); /* just for sure */ if (pconn == NULL) return; if (dst) like = octstr_format("AND %S LIKE '%%%S'", fields->field_dst, dst); else like = octstr_imm(""); sql = octstr_format("SET ROWCOUNT 1\nUPDATE %S SET %S=%d WHERE %S='%S' " "AND %S='%S' %S\nSET ROWCOUNT 0", fields->table, fields->field_status, status, fields->field_smsc, smsc, fields->field_ts, ts, like); #if defined(DLR_TRACE) debug("dlr.mssql", 0, "sql: %s", octstr_get_cstr(sql)); #endif if ((res = dbpool_conn_update(pconn, sql, NULL)) == -1) error(0, "DLR: MSSQL: Error while updating dlr entry for DST<%s>", octstr_get_cstr(dst)); else if (!res) warning(0, "DLR: MSSQL: No dlr found to update for DST<%s> (status: %d)", octstr_get_cstr(dst), status); dbpool_conn_produce(pconn); octstr_destroy(sql); octstr_destroy(like); }
static void dlr_remove_mssql(const Octstr *smsc, const Octstr *ts, const Octstr *dst) { Octstr *sql, *like; DBPoolConn *pconn; int res; debug("dlr.mssql", 0, "removing DLR from database"); pconn = dbpool_conn_consume(pool); /* just for sure */ if (pconn == NULL) return; if (dst) like = octstr_format("AND %S LIKE '%%%S'", fields->field_dst, dst); else like = octstr_imm(""); sql = octstr_format("SET ROWCOUNT 1\nDELETE FROM %S WHERE %S='%S' AND " "%S='%S' %S \nSET ROWCOUNT 0", fields->table, fields->field_smsc, smsc, fields->field_ts, ts, like); #if defined(DLR_TRACE) debug("dlr.mssql", 0, "sql: %s", octstr_get_cstr(sql)); #endif if ((res = dbpool_conn_update(pconn, sql, NULL)) == -1) error(0, "DLR: MSSQL: Error while removing dlr entry for DST<%s>", octstr_get_cstr(dst)); else if (!res) warning(0, "DLR: MSSQL: No dlr deleted for DST<%s>", octstr_get_cstr(dst)); dbpool_conn_produce(pconn); octstr_destroy(sql); octstr_destroy(like); }
static int mms_queue_replacedata(MmsEnvelope *e, MmsMsg *m) { Octstr *tfname; Octstr *ms; struct qfile_t *qfs; int ret = 0; if (!e) return -1; qfs = e->qfs_data; tfname = octstr_format(".%c%s.%ld.%d", MDF, qfs->name + 1, time(NULL), random()); ms = mms_tobinary(m); if (writemmsdata(ms, octstr_get_cstr(tfname), qfs->subdir, qfs->dir) < 0) ret = -1; else { Octstr *fname = octstr_format("%s/%s%c%s", qfs->dir, qfs->subdir, MDF, qfs->name + 1); Octstr *tmpf = octstr_format("%s/%s%S", qfs->dir, qfs->subdir, tfname); if (rename(octstr_get_cstr(tmpf), octstr_get_cstr(fname)) < 0) { error(0, "mms_replacedata: Failed to write data file %s: error = %s\n", octstr_get_cstr(tmpf), strerror(errno)); ret = -1; unlink(octstr_get_cstr(tmpf)); /* remove it. */ } octstr_destroy(fname); octstr_destroy(tmpf); } octstr_destroy(ms); octstr_destroy(tfname); return ret; }
void sqlbox_configure_mysql(Cfg* cfg) { CfgGroup *grp; Octstr *sql; if (!(grp = cfg_get_single_group(cfg, octstr_imm("sqlbox")))) panic(0, "SQLBOX: MySQL: group 'sqlbox' is not specified!"); sqlbox_logtable = cfg_get(grp, octstr_imm("sql-log-table")); if (sqlbox_logtable == NULL) { panic(0, "No 'sql-log-table' not configured."); } sqlbox_insert_table = cfg_get(grp, octstr_imm("sql-insert-table")); if (sqlbox_insert_table == NULL) { panic(0, "No 'sql-insert-table' not configured."); } /* create send_sms && sent_sms tables if they do not exist */ sql = octstr_format(SQLBOX_MYSQL_CREATE_LOG_TABLE, sqlbox_logtable); sql_update(sql); octstr_destroy(sql); sql = octstr_format(SQLBOX_MYSQL_CREATE_INSERT_TABLE, sqlbox_insert_table); sql_update(sql); octstr_destroy(sql); /* end table creation */ }
static void dlr_update_oracle(const Octstr *smsc, const Octstr *ts, const Octstr *dst, int status) { Octstr *sql, *os_status; DBPoolConn *pconn; List *binds = gwlist_create(); debug("dlr.oracle", 0, "updating DLR status in database"); pconn = dbpool_conn_consume(pool); /* just for sure */ if (pconn == NULL) return; sql = octstr_format("UPDATE %S SET %S=:1 WHERE %S=:2 AND %S=:3 AND %S=:4 AND ROWNUM < 2", fields->table, fields->field_status, fields->field_smsc, fields->field_ts, fields->field_dst); os_status = octstr_format("%d", status); gwlist_append(binds, (Octstr *)os_status); /* :1 */ gwlist_append(binds, (Octstr *)smsc); /* :2 */ gwlist_append(binds, (Octstr *)ts); /* :3 */ gwlist_append(binds, (Octstr *)dst); /* :4 */ #if defined(DLR_TRACE) debug("dlr.oracle", 0, "sql: %s", octstr_get_cstr(sql)); #endif if (dbpool_conn_update(pconn, sql, binds) == -1) error(0, "DLR: ORACLE: Error while updating dlr entry for DST<%s>", octstr_get_cstr(dst)); dbpool_conn_produce(pconn); gwlist_destroy(binds, NULL); octstr_destroy(os_status); octstr_destroy(sql); }
static Octstr *radius_type_convert(int type, Octstr *value) { Octstr *ret = NULL; int i; switch (type) { case t_int: ret = octstr_format("%ld", decode_integer(value, 0, 4)); break; case t_string: ret = octstr_format("%s", octstr_get_cstr(value)); break; case t_ipaddr: ret = octstr_create(""); for (i = 0; i < 4; i++) { int c = octstr_get_char(value, i); Octstr *b = octstr_format("%d", c); octstr_append(ret, b); if (i < 3) octstr_append_cstr(ret, "."); octstr_destroy(b); } break; default: panic(0, "RADIUS: Attribute type %d does not exist.", type); break; } return ret; }
static void dlr_sdb_update(const Octstr *smsc, const Octstr *ts, const Octstr *dst, int status) { Octstr *sql, *like; int state; debug("dlr.sdb", 0, "SDB: updating DLR status in database"); if (dst) like = octstr_format("AND %S LIKE '%%%S'", fields->field_dst, dst); else like = octstr_imm(""); sql = octstr_format("UPDATE %S SET %S=%d WHERE %S='%S' AND %S='%S' %S %s", fields->table, fields->field_status, status, fields->field_smsc, smsc, fields->field_ts, ts, like, sdb_get_limit_str()); #if defined(DLR_TRACE) debug("dlr.sdb", 0, "SDB: sql: %s", octstr_get_cstr(sql)); #endif state = gw_sdb_query(octstr_get_cstr(sql), NULL, NULL); octstr_destroy(sql); octstr_destroy(like); if (state == -1) error(0, "SDB: error in updating DLR"); else if (!state) warning(0, "SDB: No dlr to update for DST<%s> (status %d)", octstr_get_cstr(dst), status); }
int main(void) { Octstr *os, *os2, *os3, *os4; gwlib_init(); os = octstr_format("hi, %% %-5.*s, <%*s>, %-5d + %05d = %d, -%5.2f", 3, "world", 3, "", 1, 2, 3, 3.1415927); octstr_dump(os, 0); os2 = octstr_format("<%S>", os); octstr_dump(os2, 0); octstr_format_append(os2, "yeehaa!"); octstr_dump(os2, 0); os3 = octstr_format("NULL=%p &os=%p", (void *) NULL, (void *) &os); octstr_dump(os3, 0); os4 = octstr_format("Encode %E and limited %-10.10E", os, os); octstr_dump(os4, 0); octstr_destroy(os); octstr_destroy(os2); octstr_destroy(os3); gwlib_shutdown(); return 0; }
static struct dlr_entry* dlr_get_mssql(const Octstr *smsc, const Octstr *ts, const Octstr *dst) { Octstr *sql, *like; DBPoolConn *pconn; List *result = NULL, *row; struct dlr_entry *res = NULL; pconn = dbpool_conn_consume(pool); if (pconn == NULL) /* should not happens, but sure is sure */ return NULL; if (dst) like = octstr_format("AND %S LIKE '%%%S'", fields->field_dst, dst); else like = octstr_imm(""); sql = octstr_format("SELECT %S, %S, %S, %S, %S, %S FROM %S WHERE %S='%S'" " AND %S='%S' %S", fields->field_mask, fields->field_serv, fields->field_url, fields->field_src, fields->field_dst, fields->field_boxc, fields->table, fields->field_smsc, smsc, fields->field_ts, ts, like); #if defined(DLR_TRACE) debug("dlr.mssql", 0, "sql: %s", octstr_get_cstr(sql)); #endif if (dbpool_conn_select(pconn, sql, NULL, &result) != 0) { octstr_destroy(sql); dbpool_conn_produce(pconn); return NULL; } octstr_destroy(sql); octstr_destroy(like); dbpool_conn_produce(pconn); #define LO2CSTR(r, i) octstr_get_cstr(gwlist_get(r, i)) if (gwlist_len(result) > 0) { row = gwlist_extract_first(result); res = dlr_entry_create(); gw_assert(res != NULL); res->mask = atoi(LO2CSTR(row,0)); res->service = octstr_create(LO2CSTR(row, 1)); res->url = octstr_create(LO2CSTR(row,2)); res->source = octstr_create(LO2CSTR(row, 3)); res->destination = octstr_create(LO2CSTR(row, 4)); res->boxc_id = octstr_create(LO2CSTR(row, 5)); gwlist_destroy(row, octstr_destroy_item); res->smsc = octstr_duplicate(smsc); } gwlist_destroy(result, NULL); #undef LO2CSTR return res; }
static struct dlr_entry *dlr_pgsql_get(const Octstr *smsc, const Octstr *ts, const Octstr *dst) { struct dlr_entry *res = NULL; Octstr *sql, *like; List *result, *row; if (dst) like = octstr_format("AND \"%S\" LIKE '%%%S'", fields->field_dst, dst); else like = octstr_imm(""); sql = octstr_format("SELECT \"%S\", \"%S\", \"%S\", \"%S\", \"%S\", " "\"%S\" FROM \"%S\" WHERE \"%S\"='%S' AND \"%S\"='%S' %S LIMIT 1;", fields->field_mask, fields->field_serv, fields->field_url, fields->field_src, fields->field_dst, fields->field_boxc, fields->table, fields->field_smsc, smsc, fields->field_ts, ts, like); result = pgsql_select(sql); octstr_destroy(sql); octstr_destroy(like); if (result == NULL || gwlist_len(result) < 1) { debug("dlr.pgsql", 0, "no rows found"); gwlist_destroy(result, NULL); return NULL; } row = gwlist_get(result, 0); debug("dlr.pgsql", 0, "Found entry, col1=%s, col2=%s, col3=%s, col4=%s, col5=%s col6=%s", octstr_get_cstr(gwlist_get(row, 0)), octstr_get_cstr(gwlist_get(row, 1)), octstr_get_cstr(gwlist_get(row, 2)), octstr_get_cstr(gwlist_get(row, 3)), octstr_get_cstr(gwlist_get(row, 4)), octstr_get_cstr(gwlist_get(row, 5)) ); res = dlr_entry_create(); gw_assert(res != NULL); res->mask = atoi(octstr_get_cstr(gwlist_get(row, 0))); res->service = octstr_duplicate(gwlist_get(row, 1)); res->url = octstr_duplicate(gwlist_get(row, 2)); res->source = octstr_duplicate(gwlist_get(row, 3)); res->destination = octstr_duplicate(gwlist_get(row, 4)); res->boxc_id = octstr_duplicate(gwlist_get(row, 5)); res->smsc = octstr_duplicate(smsc); while((row = gwlist_extract_first(result))) gwlist_destroy(row, octstr_destroy_item); gwlist_destroy(result, NULL); return res; }
static void dlr_redis_remove(const Octstr *smsc, const Octstr *ts, const Octstr *dst) { Octstr *key, *sql; DBPoolConn *pconn; List *binds = gwlist_create(); int res; debug("dlr.redis", 0, "Removing DLR from keystore"); pconn = dbpool_conn_consume(pool); /* just for sure */ if (pconn == NULL) { error(0, "DLR: REDIS: No connection available"); gwlist_destroy(binds, NULL); return; } /* octstr_replace(dst, octstr_imm(" "), octstr_imm("")); octstr_replace(ts, octstr_imm(" "), octstr_imm("")); */ key = octstr_format((dst ? "%S:?:?:?" : "%S:?:?"), fields->table); sql = octstr_format("DEL %S", key, fields->table); gwlist_append(binds, (Octstr *)smsc); /* key */ gwlist_append(binds, (Octstr *)ts); /* key */ if (dst) gwlist_append(binds, (Octstr *)dst); /* key */ res = dbpool_conn_update(pconn, sql, binds); /* * Redis DEL returns the number of keys deleted */ if (res != 1) { /* * We may fail to delete a DLR that was successfully retrieved * just above due to race conditions when duplicate message IDs * are received. This happens frequently when testing via the * Logica SMPP emulator due to its duplicate message ID bugs. */ error(0, "DLR: REDIS: Error while removing dlr entry for %s", octstr_get_cstr(key)); } /* We don't perform 'DECR <table>:Count', since we have TTL'ed * expirations, which can't be handled with manual counters. */ dbpool_conn_produce(pconn); octstr_destroy(sql); octstr_destroy(key); gwlist_destroy(binds, NULL); }
static int flush_dir(char *topdir, char *dir, List *stack) { DIR *dirp; struct dirent *dp; Octstr *tdir = octstr_format("%s/%s", topdir, dir); char *xdir = octstr_get_cstr(tdir); dirp = opendir(xdir); debug("mms_queue", 0, "flush dir %s", xdir); if (!dirp) { error(0, "flush-dir: Failed to read queue directory %s, error=%s", xdir, strerror(errno)); octstr_destroy(tdir); return -1; } while ((dp = readdir(dirp)) != NULL) { struct stat st; Octstr *xfname = octstr_format("%s%s", xdir, dp->d_name); debug("mms_queue", 0, "FLUSHDIR: Visiting: %s", octstr_get_cstr(xfname)); int sres = stat(octstr_get_cstr(xfname), &st); octstr_destroy(xfname); if (sres == 0 && S_ISREG(st.st_mode) && dp->d_name[0] == MQF && dp->d_name[1] == 'f') { Octstr *xqf = xmake_qf(dp->d_name, dir); MmsEnvelope *e = mms_queue_readenvelope(octstr_get_cstr(xqf),topdir, 0); octstr_destroy(xqf); if (e) { free_envelope(e,1); continue; } } else if (sres == 0 && S_ISDIR(st.st_mode) && strcmp(dp->d_name, ".") != 0 && strcmp(dp->d_name, "..") != 0) { Octstr *newdir = octstr_format("%s%s/", dir, dp->d_name); gwlist_append(stack, newdir); /* push it... */ } } if (dirp) closedir(dirp); octstr_destroy(tdir); return 0; }
static Octstr *mms_resolve(Octstr *phonenum, char *src_int, char *src_id, void *module_data, void *settings_p, void *proxyrelays_p) { Octstr *s; FILE *fp; char buf[4096]; if (script == NULL || octstr_len(script) == 0) return 0; s = octstr_format("%s '%s' '%s' '%s'", octstr_get_cstr(script), octstr_get_cstr(phonenum) , src_int ? src_int : "", src_id ? src_id : ""); fp = popen(octstr_get_cstr(s), "r"); octstr_destroy(s); fgets(buf, sizeof buf, fp); s = octstr_create(buf); octstr_strip_crlfs(s); pclose(fp); if (octstr_len(s) == 0) { octstr_destroy(s); return NULL; } return s; }
static void shell_logger(enum mbuni_event_type_t type, const char *subtype, int err, const char *file, int line, const char *function, const char *interface, Octstr *id, Octstr *msg) { char *xtype; Octstr *cmd, *xid = octstr_duplicate(id); gw_assert(shell_cmd); switch(type) { case MBUNI_INFO: xtype = "INFO"; break; case MBUNI_WARNING: xtype = "WARNING"; break; default: /* including error. */ xtype = "ERROR"; break; } escape_shell_chars(msg); escape_shell_chars(id); cmd = octstr_format("%S '%s' '%s' %d '%s' '%s' %d '%S' '%S'", shell_cmd, xtype, subtype ? subtype : "", err, interface ? interface : "", file, line, xid ? xid : octstr_imm(""), msg); system(octstr_get_cstr(cmd)); octstr_destroy(cmd); octstr_destroy(xid); }
/* * Remove matching entry from the spool. */ static void dlr_spool_remove(const Octstr *smsc, const Octstr *ts, const Octstr *dst) { Octstr *os, *hash, *dir, *filename; /* determine target dir and filename via hash */ os = octstr_duplicate(smsc); octstr_append(os, ts); hash = our_hash_func(os); octstr_destroy(os); /* determine target dir */ dir = octstr_format("%S/%ld", spool_dir, octstr_hash_key(hash) % MAX_DIRS); /* get msg surrogate filename */ filename = get_msg_filename(dir, hash, dst); octstr_destroy(dir); octstr_destroy(hash); /* if there was no filename, then we didn't find it */ if (filename == NULL) { return; } /* remove the file from the file system */ if (unlink(octstr_get_cstr(filename)) == -1) { error(errno, "Could not unlink file `%s'.", octstr_get_cstr(filename)); octstr_destroy(filename); return; } counter_decrease(counter); octstr_destroy(filename); }
void mssql_save_msg(Msg *msg, Octstr *momt /*, Octstr smsbox_id */) { Octstr *sql; Octstr *stuffer[30]; int stuffcount = 0; DBPoolConn *pc; pc = dbpool_conn_consume(pool); if (pc == NULL) { error(0, "MSSql: DBPool Error!"); return; } sql = octstr_format(SQLBOX_MSSQL_INSERT_QUERY, sqlbox_logtable, st_str(momt), st_str(msg->sms.sender), st_str(msg->sms.receiver), st_str(msg->sms.udhdata), st_str(msg->sms.msgdata), st_num(msg->sms.time), st_str(msg->sms.smsc_id), st_str(msg->sms.service), st_str(msg->sms.account), st_num(msg->sms.sms_type), st_num(msg->sms.mclass), st_num(msg->sms.mwi), st_num(msg->sms.coding), st_num(msg->sms.compress), st_num(msg->sms.validity), st_num(msg->sms.deferred), st_num(msg->sms.dlr_mask), st_str(msg->sms.dlr_url), st_num(msg->sms.pid), st_num(msg->sms.alt_dcs), st_num(msg->sms.rpi), st_str(msg->sms.charset), st_str(msg->sms.boxc_id), st_str(msg->sms.binfo), st_str(msg->sms.meta_data)); #if defined(SQLBOX_TRACE) debug("SQLBOX", 0, "sql: %s", octstr_get_cstr(sql)); #endif sql_update(pc, sql, NULL); while (stuffcount > 0) { octstr_destroy(stuffer[--stuffcount]); } dbpool_conn_produce(pc); octstr_destroy(sql); }
static int writemmsdata(Octstr *ms, char *df, char subdir[], char *mms_queuedir) { Octstr *dfname; int fd, n, res = 0; dfname = octstr_format("%s/%s%s", mms_queuedir, subdir, df); fd = open(octstr_get_cstr(dfname), O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP); if (fd < 0) { error(0, "mms_queueadd: Failed to open data file %s: error = %s\n", octstr_get_cstr(dfname), strerror(errno)); res = -1; goto done; } n = octstr_write_to_socket(fd, ms); unlock_and_close(fd); if (n != 0) { error(0, "mms_queueadd: Failed to write data file %s: error = %s\n", octstr_get_cstr(dfname), strerror(errno)); unlink(octstr_get_cstr(dfname)); res = -1; } done: octstr_destroy(dfname); return res; }
static Octstr *get_numeric_value_or_return_null(long int num) { if (num == -1) { return octstr_create("NULL"); } return octstr_format("%ld", num); }
static Octstr *xmake_qf(char realqf[], char subdir[]) { Octstr *res = octstr_format("%s%s", subdir, realqf); /* Make the queue identifier -- convert '/' to '-' */ octstr_replace(res, octstr_imm(DIR_SEP_S), octstr_imm("-")); return res; }
static void add_push_application_id(Octstr *appid_flag, Octstr **content, int use_string) { if (use_string) { *content = octstr_format("%S\r\n", appid_string); return; } if (octstr_compare(appid_flag, octstr_imm("any")) == 0) { if (!use_numeric) *content = octstr_create("X-WAP-Application-Id: http://www.wiral.com:*\r\n"); else *content = octstr_create("X-WAP-Application-Id: 0\r\n"); } else if (octstr_compare(appid_flag, octstr_imm("ua")) == 0) { if (!use_numeric) *content = octstr_create("X-WAP-Application-Id: http://www.wiral.com:wml.ua\r\n"); else *content = octstr_create("X-WAP-Application-Id: 2\r\n"); } else if (octstr_compare(appid_flag, octstr_imm("mms")) == 0) { if (!use_numeric) *content = octstr_create("X-WAP-Application-Id: mms.ua\r\n"); else *content = octstr_create("X-WAP-Application-Id: 4\r\n"); } else if (octstr_compare(appid_flag, octstr_imm("scrap")) == 0) { if (!use_numeric) *content = octstr_create("X-WAP-Application-Id: no appid at all\r\n"); else *content = octstr_create("X-WAP-Application-Id: this is not a numeric header\r\n"); } }
static MmsMsg *mms_queue_getdata(MmsEnvelope *e) { Octstr *fname; Octstr *ms; MmsMsg *m; struct qfile_t *qfs; if (!e) return NULL; qfs = e->qfs_data; fname = octstr_format("%s/%s%c%s", qfs->dir, qfs->subdir, MDF, qfs->name + 1); ms = octstr_read_file(octstr_get_cstr(fname)); if (!ms) { error(0, "mms_queue_getdata: Failed to load data file for queue entry %s in %s", qfs->name, qfs->dir); octstr_destroy(fname); return NULL; } m = mms_frombinary(ms, octstr_imm("")); if (!m) { error(0, "mms_queue_getdata: Failed to decode data file for queue entry %s in %s", qfs->name, qfs->dir); octstr_destroy(fname); return NULL; } octstr_destroy(ms); octstr_destroy(fname); return m; }
static long dlr_messages_oracle() { List *result, *row; Octstr *sql; DBPoolConn *conn; long msgs = -1; conn = dbpool_conn_consume(pool); if (conn == NULL) return -1; sql = octstr_format("SELECT count(*) FROM %S", fields->table); #if defined(DLR_TRACE) debug("dlr.oracle", 0, "sql: %s", octstr_get_cstr(sql)); #endif if (dbpool_conn_select(conn, sql, NULL, &result) != 0) { octstr_destroy(sql); dbpool_conn_produce(conn); return -1; } dbpool_conn_produce(conn); octstr_destroy(sql); if (gwlist_len(result) > 0) { row = gwlist_extract_first(result); msgs = strtol(octstr_get_cstr(gwlist_get(row,0)), NULL, 10); gwlist_destroy(row, octstr_destroy_item); } gwlist_destroy(result, NULL); return msgs; }
static struct smpp_tlv *smpp_tlv_get_by_tag(Octstr *smsc_id, long tag) { struct smpp_tlv *res = NULL; Dict *tmp_dict; Octstr *tmp; if (tlvs_by_tag == NULL) return NULL; tmp = octstr_format("%ld", tag); if (smsc_id != NULL) { tmp_dict = dict_get(tlvs_by_tag, smsc_id); if (tmp_dict != NULL) res = dict_get(tmp_dict, tmp); } if (res == NULL) { /* try default smsc_id */ smsc_id = octstr_imm(DEFAULT_SMSC_ID); tmp_dict = dict_get(tlvs_by_tag, smsc_id); if (tmp_dict != NULL) res = dict_get(tmp_dict, tmp); } octstr_destroy(tmp); return res; }
static void dlr_add_mssql(struct dlr_entry *entry) { Octstr *sql; DBPoolConn *pconn; debug("dlr.mssql", 0, "adding DLR entry into database"); int res; pconn = dbpool_conn_consume(pool); /* just for sure */ if (pconn == NULL) { dlr_entry_destroy(entry); return; } sql = octstr_format("INSERT INTO %S (%S, %S, %S, %S, %S, %S, %S, %S, %S) VALUES " "('%S', '%S', '%S', '%S', '%S', '%S', '%d', '%S', '%d')", fields->table, fields->field_smsc, fields->field_ts, fields->field_src, fields->field_dst, fields->field_serv, fields->field_url, fields->field_mask, fields->field_boxc, fields->field_status, entry->smsc, entry->timestamp, entry->source, entry->destination, entry->service, entry->url, entry->mask, entry->boxc_id, 0); #if defined(DLR_TRACE) debug("dlr.mssql", 0, "sql: %s", octstr_get_cstr(sql)); #endif if ((res = dbpool_conn_update(pconn, sql, NULL)) == -1) error(0, "DLR: MSSQL: Error while adding dlr entry for DST<%s>", octstr_get_cstr(entry->destination)); else if (!res) warning(0, "DLR: MSSQL: No dlr inserted for DST<%s>", octstr_get_cstr(entry->destination)); dbpool_conn_produce(pconn); octstr_destroy(sql); dlr_entry_destroy(entry); }
static int add_msg_cb(SMSCConn *conn, Msg *sms) { PrivData *privdata = conn->data; Msg *copy; copy = msg_duplicate(sms); /* * Send DLR if desired, which means first add the DLR entry * and then later find it and remove it. We need to ensure * that we put the DLR in first before producing the copy * to the list. */ if (DLR_IS_ENABLED_DEVICE(sms->sms.dlr_mask)) { Octstr *tmp; char id[UUID_STR_LEN + 1]; uuid_unparse(sms->sms.id, id); tmp = octstr_format("%s", id); dlr_add(conn->id, tmp, sms, 0); octstr_destroy(tmp); } gwlist_produce(privdata->outgoing_queue, copy); gwthread_wakeup(privdata->connection_thread); return 0; }
static void dlr_sdb_add(struct dlr_entry *dlr) { Octstr *sql; int state; sql = octstr_format("INSERT INTO %s (%s, %s, %s, %s, %s, %s, %s, %s, %s) VALUES " "('%s', '%s', '%s', '%s', '%s', '%s', '%d', '%s', '%d')", octstr_get_cstr(fields->table), octstr_get_cstr(fields->field_smsc), octstr_get_cstr(fields->field_ts), octstr_get_cstr(fields->field_src), octstr_get_cstr(fields->field_dst), octstr_get_cstr(fields->field_serv), octstr_get_cstr(fields->field_url), octstr_get_cstr(fields->field_mask), octstr_get_cstr(fields->field_boxc), octstr_get_cstr(fields->field_status), octstr_get_cstr(dlr->smsc), octstr_get_cstr(dlr->timestamp), octstr_get_cstr(dlr->source), octstr_get_cstr(dlr->destination), octstr_get_cstr(dlr->service), octstr_get_cstr(dlr->url), dlr->mask, octstr_get_cstr(dlr->boxc_id), 0); #if defined(DLR_TRACE) debug("dlr.sdb", 0, "SDB: sql: %s", octstr_get_cstr(sql)); #endif state = gw_sdb_query(octstr_get_cstr(sql), NULL, NULL); if (state == -1) error(0, "SDB: error in inserting DLR for DST <%s>", octstr_get_cstr(dlr->destination)); else if (!state) warning(0, "SDB: No dlr inserted for DST <%s>", octstr_get_cstr(dlr->destination)); octstr_destroy(sql); dlr_entry_destroy(dlr); }
static int for_each_file(const Octstr *dir_s, int ignore_err, void(*cb)(const Octstr*, void*), void *data) { DIR *dir; struct dirent *ent; struct stat stat; int ret = 0; if ((dir = opendir(octstr_get_cstr(dir_s))) == NULL) { error(errno, "Could not open directory `%s'", octstr_get_cstr(dir_s)); return -1; } while((ent = readdir(dir)) != NULL) { Octstr *filename; if (*(ent->d_name) == '.') /* skip hidden files */ continue; filename = octstr_format("%S/%s", dir_s, ent->d_name); if (lstat(octstr_get_cstr(filename), &stat) == -1) { if (!ignore_err) error(errno, "Could not get stat for `%s'", octstr_get_cstr(filename)); ret = -1; } else if (S_ISDIR(stat.st_mode) && for_each_file(filename, ignore_err, cb, data) == -1) { ret = -1; } else if (S_ISREG(stat.st_mode) && cb != NULL) cb(filename, data); octstr_destroy(filename); if (ret == -1 && ignore_err) ret = 0; else if (ret == -1) break; } closedir(dir); return ret; }
void redis_save_msg(Msg *msg, Octstr *momt /*, Octstr smsbox_id */) { Octstr *sql, *jsonstr, *subst; Octstr *stuffer[30]; json_t *msgjson, *root; char *json; int stuffcount = 0; msgjson = json_object(); json_object_set_new(msgjson, "momt", json_string(octstr_get_cstr(st_str(momt)))); json_object_set_new(msgjson, "sender", json_string(octstr_get_cstr(st_str(msg->sms.sender)))); json_object_set_new(msgjson, "receiver", json_string(octstr_get_cstr(st_str(msg->sms.receiver)))); json_object_set_new(msgjson, "foreign_id", json_string(octstr_get_cstr(st_str(msg->sms.foreign_id)))); json_object_set_new(msgjson, "udhdata", json_string(octstr_get_cstr(st_str(msg->sms.udhdata)))); json_object_set_new(msgjson, "msgdata", json_string(octstr_get_cstr(st_str(msg->sms.msgdata)))); json_object_set_new(msgjson, "time", json_string(octstr_get_cstr(st_num(msg->sms.time)))); json_object_set_new(msgjson, "smsc_id", json_string(octstr_get_cstr(st_str(msg->sms.smsc_id)))); json_object_set_new(msgjson, "service", json_string(octstr_get_cstr(st_str(msg->sms.service)))); json_object_set_new(msgjson, "account", json_string(octstr_get_cstr(st_str(msg->sms.account)))); json_object_set_new(msgjson, "sms_type", json_string(octstr_get_cstr(st_num(msg->sms.sms_type)))); json_object_set_new(msgjson, "mclass", json_string(octstr_get_cstr(st_num(msg->sms.mclass)))); json_object_set_new(msgjson, "mwi", json_string(octstr_get_cstr(st_num(msg->sms.mwi)))); json_object_set_new(msgjson, "coding", json_string(octstr_get_cstr(st_num(msg->sms.coding)))); json_object_set_new(msgjson, "compress", json_string(octstr_get_cstr(st_num(msg->sms.compress)))); json_object_set_new(msgjson, "validity", json_string(octstr_get_cstr(st_num(msg->sms.validity)))); json_object_set_new(msgjson, "deferred", json_string(octstr_get_cstr(st_num(msg->sms.deferred)))); json_object_set_new(msgjson, "dlr_mask", json_string(octstr_get_cstr(st_num(msg->sms.dlr_mask)))); json_object_set_new(msgjson, "dlr_url", json_string(octstr_get_cstr(st_str(msg->sms.dlr_url)))); json_object_set_new(msgjson, "pid", json_string(octstr_get_cstr(st_num(msg->sms.pid)))); json_object_set_new(msgjson, "alt_dcs", json_string(octstr_get_cstr(st_num(msg->sms.alt_dcs)))); json_object_set_new(msgjson, "rpi", json_string(octstr_get_cstr(st_num(msg->sms.rpi)))); json_object_set_new(msgjson, "charset", json_string(octstr_get_cstr(st_str(msg->sms.charset)))); json_object_set_new(msgjson, "boxc_id", json_string(octstr_get_cstr(st_str(msg->sms.boxc_id)))); json_object_set_new(msgjson, "binfo", json_string(octstr_get_cstr(st_str(msg->sms.binfo)))); json_object_set_new(msgjson, "priority", json_string(octstr_get_cstr(st_num(msg->sms.priority)))); json_object_set_new(msgjson, "meta_data", json_string(octstr_get_cstr(st_str(msg->sms.meta_data)))); root = json_object(); json_object_set(root, "msg", msgjson); json = json_dumps(root, JSON_COMPACT); jsonstr = octstr_create(json); subst = octstr_create("%s"); sql = octstr_format(SQLBOX_REDIS_QUEUE_PUSH, sqlbox_logtable, subst); sql_update(sql, jsonstr); octstr_destroy(sql); octstr_destroy(subst); octstr_destroy(jsonstr); while (stuffcount > 0) { octstr_destroy(stuffer[--stuffcount]); } json_decref(msgjson); json_decref(root); gw_free(json); }
static void dlr_sdb_remove(const Octstr *smsc, const Octstr *ts, const Octstr *dst) { Octstr *sql, *like; int state; debug("dlr.sdb", 0, "removing DLR from database"); if (sdb_conn_type == SDB_POSTGRES) { /* * Postgres doesn't support limiting delete/update queries, * thus we need to use a select subquery. * - notice that for uniqueness use of `oid', postgres suggests * to do vacuum regularly, even if it's virtually impossible * to hit duplicates since oid's are given in a row */ if (dst) like = octstr_format("AND %S LIKE '%%%S')", fields->field_dst, dst); else like = octstr_imm("LIMIT 1)"); sql = octstr_format("DELETE FROM %S WHERE oid = (SELECT oid FROM %S " "WHERE %S='%S' AND %S='%S' %S LIMIT 1", fields->table, fields->table, fields->field_smsc, smsc, fields->field_ts, ts, like); } else { if (dst) like = octstr_format("AND %S LIKE '%%%S'", fields->field_dst, dst); else like = octstr_imm(""); sql = octstr_format("DELETE FROM %S WHERE %S='%S' AND %S='%S' %S %s", fields->table, fields->field_smsc, smsc, fields->field_ts, ts, like, sdb_get_limit_str()); } #if defined(DLR_TRACE) debug("dlr.sdb", 0, "SDB: sql: %s", octstr_get_cstr(sql)); #endif state = gw_sdb_query(octstr_get_cstr(sql), NULL, NULL); octstr_destroy(sql); octstr_destroy(like); if (state == -1) error(0, "SDB: error in deleting DLR"); else if (!state) warning(0, "SDB: No dlr deleted for DST<%s>", octstr_get_cstr(dst)); }
static Octstr *httpd_restart_smsc(List *cgivars, int status_type) { Octstr *reply; Octstr *smsc; if ((reply = httpd_check_authorization(cgivars, 0))!= NULL) return reply; if ((reply = httpd_check_status())!= NULL) return reply; /* check if the smsc id is given */ smsc = http_cgi_variable(cgivars, "smsc"); if (smsc) { if (bb_restart_smsc(smsc) == -1) return octstr_format("Could not re-start smsc-id `%s'", octstr_get_cstr(smsc)); else return octstr_format("SMSC `%s' re-started", octstr_get_cstr(smsc)); } else return octstr_create("SMSC id not given"); }