/* * Add reroute information to the connection data. Where the priority * is in the order: reroute, reroute-smsc-id, reroute-receiver. */ static void init_reroute(SMSCConn *conn, CfgGroup *grp) { Octstr *rule; long i; if (cfg_get_bool(&conn->reroute_dlr, grp, octstr_imm("reroute-dlr")) == -1) conn->reroute_dlr = 0; info(0, "DLR rerouting for smsc id <%s> %s.", octstr_get_cstr(conn->id), (conn->reroute_dlr?"enabled":"disabled")); if (cfg_get_bool(&conn->reroute, grp, octstr_imm("reroute")) != -1) { debug("smscconn",0,"Adding general internal routing for smsc id <%s>", octstr_get_cstr(conn->id)); return; } if ((conn->reroute_to_smsc = cfg_get(grp, octstr_imm("reroute-smsc-id"))) != NULL) { /* reroute all messages to a specific smsc-id */ debug("smscconn",0,"Adding internal routing: smsc id <%s> to smsc id <%s>", octstr_get_cstr(conn->id), octstr_get_cstr(conn->reroute_to_smsc)); return; } if ((rule = cfg_get(grp, octstr_imm("reroute-receiver"))) != NULL) { List *routes; /* create hash disctionary for this smsc-id */ conn->reroute_by_receiver = dict_create(100, (void(*)(void *)) octstr_destroy); routes = octstr_split(rule, octstr_imm(";")); for (i = 0; i < list_len(routes); i++) { Octstr *item = list_get(routes, i); Octstr *smsc, *receiver; List *receivers; /* first word is the smsc-id, all other are the receivers */ receivers = octstr_split(item, octstr_imm(",")); smsc = list_extract_first(receivers); if (smsc) octstr_strip_blanks(smsc); while((receiver = list_extract_first(receivers))) { octstr_strip_blanks(receiver); debug("smscconn",0,"Adding internal routing for smsc id <%s>: " "receiver <%s> to smsc id <%s>", octstr_get_cstr(conn->id), octstr_get_cstr(receiver), octstr_get_cstr(smsc)); if (!dict_put_once(conn->reroute_by_receiver, receiver, octstr_duplicate(smsc))) panic(0, "Could not set internal routing for smsc id <%s>: " "receiver <%s> to smsc id <%s>, because receiver has already routing entry!", octstr_get_cstr(conn->id), octstr_get_cstr(receiver), octstr_get_cstr(smsc)); octstr_destroy(receiver); } octstr_destroy(smsc); list_destroy(receivers, octstr_destroy_item); } octstr_destroy(rule); list_destroy(routes, octstr_destroy_item); } }
int urltrans_add_cfg(URLTranslationList *trans, Cfg *cfg) { CfgGroup *grp; List *list; list = cfg_get_multi_group(cfg, octstr_imm("sms-service")); while (list && (grp = list_extract_first(list)) != NULL) { if (urltrans_add_one(trans, grp) == -1) { list_destroy(list, NULL); return -1; } } list_destroy(list, NULL); list = cfg_get_multi_group(cfg, octstr_imm("sendsms-user")); while (list && (grp = list_extract_first(list)) != NULL) { if (urltrans_add_one(trans, grp) == -1) { list_destroy(list, NULL); return -1; } } list_destroy(list, NULL); return 0; }
static struct dlr_entry* dlr_pgsql_get(const Octstr *smsc, const Octstr *ts, const Octstr *dst) { struct dlr_entry *res = NULL; Octstr *sql; List *result, *row; sql = octstr_format("SELECT %s, %s, %s, %s, %s, %s FROM %s WHERE %s='%s' AND %s='%s';", octstr_get_cstr(fields->field_mask), octstr_get_cstr(fields->field_serv), octstr_get_cstr(fields->field_url), octstr_get_cstr(fields->field_src), octstr_get_cstr(fields->field_dst), octstr_get_cstr(fields->field_boxc), octstr_get_cstr(fields->table), octstr_get_cstr(fields->field_smsc), octstr_get_cstr(smsc), octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts)); result = pgsql_select(sql); octstr_destroy(sql); if (result == NULL || list_len(result) < 1) { debug("dlr.pgsql", 0, "no rows found"); while((row = list_extract_first(result))) list_destroy(row, octstr_destroy_item); list_destroy(result, NULL); return NULL; } row = list_get(result, 0); debug("dlr.pgsql", 0, "Found entry, col1=%s, col2=%s, col3=%s, col4=%s, col5=%s col6=%s", octstr_get_cstr(list_get(row, 0)), octstr_get_cstr(list_get(row, 1)), octstr_get_cstr(list_get(row, 2)), octstr_get_cstr(list_get(row, 3)), octstr_get_cstr(list_get(row, 4)), octstr_get_cstr(list_get(row, 5)) ); res = dlr_entry_create(); gw_assert(res != NULL); res->mask = atoi(octstr_get_cstr(list_get(row, 0))); res->service = octstr_duplicate(list_get(row, 1)); res->url = octstr_duplicate(list_get(row, 2)); res->source = octstr_duplicate(list_get(row, 3)); res->destination = octstr_duplicate(list_get(row, 4)); res->boxc_id = octstr_duplicate(list_get(row, 5)); res->smsc = octstr_duplicate(smsc); while((row = list_extract_first(result))) list_destroy(row, octstr_destroy_item); list_destroy(result, NULL); return res; }
static void empty_msg_lists(void) { Msg *msg; #ifndef NO_WAP if (list_len(incoming_wdp) > 0 || list_len(outgoing_wdp) > 0) warning(0, "Remaining WDP: %ld incoming, %ld outgoing", list_len(incoming_wdp), list_len(outgoing_wdp)); info(0, "Total WDP messages: received %ld, sent %ld", counter_value(incoming_wdp_counter), counter_value(outgoing_wdp_counter)); #endif while((msg = list_extract_first(incoming_wdp))!=NULL) msg_destroy(msg); while((msg = list_extract_first(outgoing_wdp))!=NULL) msg_destroy(msg); list_destroy(incoming_wdp, NULL); list_destroy(outgoing_wdp, NULL); counter_destroy(incoming_wdp_counter); counter_destroy(outgoing_wdp_counter); #ifndef NO_SMS /* XXX we should record these so that they are not forever lost... */ if (list_len(incoming_sms) > 0 || list_len(outgoing_sms) > 0) debug("bb", 0, "Remaining SMS: %ld incoming, %ld outgoing", list_len(incoming_sms), list_len(outgoing_sms)); info(0, "Total SMS messages: received %ld, sent %ld", counter_value(incoming_sms_counter), counter_value(outgoing_sms_counter)); #endif list_destroy(incoming_sms, msg_destroy_item); list_destroy(outgoing_sms, msg_destroy_item); counter_destroy(incoming_sms_counter); counter_destroy(outgoing_sms_counter); }
void* cqueue_extract(cqueue_t *q) { void *p; MUTEX_LOCK(&q->q_mtx, "cqueue"); while ( (p = list_extract_first(&q->q_data)) == NULL ) { mutex_wait(&q->q_mtx); } mutex_unlock(&q->q_mtx); return p; }
void parse_context_destroy(ParseContext *context) { gw_assert(context != NULL); if (context->limit_stack) { while (list_len(context->limit_stack) > 0) gw_free(list_extract_first(context->limit_stack)); list_destroy(context->limit_stack, NULL); } gw_free(context); }
int parse_pop_limit(ParseContext *context) { long *elem; gw_assert(context != NULL); if (context->limit_stack == NULL || list_len(context->limit_stack) == 0) { context->error = 1; return -1; } elem = list_extract_first(context->limit_stack); context->limit = *elem; gw_free(elem); return 0; }
void _mutex_wakeup(mutex_t *m) { int l = 0; if (m->mtx_flags & MUTEX_WAKEUP_ALL) { l = list_length(&m->mtx_waiting); } else if (m->mtx_flags & MUTEX_WAKEUP_ONE) { l = (list_length(&m->mtx_waiting)==0)? 0 : 1; } if (l) for (int i = 0; i < l; i++) { thread_t *n = list_extract_first(&m->mtx_waiting); list_insert_tail(&m->mtx_locking, n); } m->mtx_flags &= ~(MUTEX_WAKEUP_ONE|MUTEX_WAKEUP_ALL); }
void mutex_unlock(mutex_t *m) { thread_t *n; spinlock_lock(&m->mtx_slock); _mutex_wakeup(m); m->mtx_owner = NULL; n = list_extract_first(&m->mtx_locking); if (n) { m->mtx_owner = n; sched_wakeup(n); } else { m->mtx_locked = MUTEX_UNLOCKED; } spinlock_unlock(&m->mtx_slock); }
void list_destroy(List *list, list_item_destructor_t *destructor) { void *item; if (list == NULL) return; if (destructor != NULL) { while ((item = list_extract_first(list)) != NULL) destructor(item); } mutex_destroy(list->permanent_lock); mutex_destroy(list->single_operation_lock); pthread_cond_destroy(&list->nonempty); gw_free(list->tab); gw_free(list); }
/* This function will pack a list of WTLS PDUs into a single Octstr, and return that Octstr. */ Octstr* wtls_pack_payloadlist (List* payloadlist) { Octstr *returnData=0, *tempData1=0, *tempData2 = 0; wtls_Payload* retrievedPDU; /* Assert that our payloadlist is not NULL */ gw_assert (payloadlist != NULL); /* Initialise our return Octstr */ returnData = octstr_create(""); /* While there are PDUs remaining in our list */ while (list_len(payloadlist) > 0) { /* Retrieve the next payload from the payloadlist */ retrievedPDU = (wtls_Payload*) list_extract_first (payloadlist); /* Pack the PDU */ tempData2 = wtls_payload_pack(retrievedPDU); /* Shift the current stuff in returnData to a temporary pointer */ tempData1 = returnData; /* Tack it onto our Octstr */ returnData = octstr_cat(tempData1, tempData2); /* And now, we can get rid of both tempData1 and tempData2 */ octstr_destroy (tempData1); octstr_destroy (tempData2); } /* Is the Octstr we finish with of length > 0? */ if (octstr_len(returnData) > 0) { /* Return the Octstr */ return returnData; } /* Otherwise, return NULL */ return NULL; }
static long dlr_pgsql_messages(void) { Octstr *sql; long ret; List *res; sql = octstr_format("SELECT count(*) FROM %s;", octstr_get_cstr(fields->table)); res = pgsql_select(sql); octstr_destroy(sql); if (res == NULL || list_len(res) < 1) { error(0, "PGSQL: Could not get count of DLR table"); ret = -1; } else { ret = atol(octstr_get_cstr(list_get(list_get(res, 0), 0))); } list_destroy(list_extract_first(res), octstr_destroy_item); list_destroy(res, NULL); return ret; }
struct dlr_storage *dlr_init_pgsql(Cfg* cfg) { CfgGroup *grp; List *grplist; Octstr *pgsql_host, *pgsql_user, *pgsql_pass, *pgsql_db, *pgsql_id; Octstr *p = NULL; long pool_size; DBConf *db_conf = NULL; /* * check for all mandatory directives that specify the field names * of the table used */ if (!(grp = cfg_get_single_group(cfg, octstr_imm("dlr-db")))) panic(0, "DLR: PgSQL: group 'dlr-db' is not specified!"); if (!(pgsql_id = cfg_get(grp, octstr_imm("id")))) panic(0, "DLR: PgSQL: directive 'id' is not specified!"); fields = dlr_db_fields_create(grp); gw_assert(fields != NULL); /* * now grap the required information from the 'pgsql-connection' group * with the pgsql-id we just obtained * * we have to loop through all available PostgreSQL connection definitions * and search for the one we are looking for */ grplist = cfg_get_multi_group(cfg, octstr_imm("pgsql-connection")); while (grplist && (grp = list_extract_first(grplist)) != NULL) { p = cfg_get(grp, octstr_imm("id")); if (p != NULL && octstr_compare(p, pgsql_id) == 0) { goto found; } if (p != NULL) octstr_destroy(p); } panic(0, "DLR: PgSQL: connection settings for id '%s' are not specified!", octstr_get_cstr(pgsql_id)); found: octstr_destroy(p); list_destroy(grplist, NULL); if (cfg_get_integer(&pool_size, grp, octstr_imm("max-connections")) == -1 || pool_size == 0) pool_size = 1; if (!(pgsql_host = cfg_get(grp, octstr_imm("host")))) panic(0, "DLR: PgSQL: directive 'host' is not specified!"); if (!(pgsql_user = cfg_get(grp, octstr_imm("username")))) panic(0, "DLR: PgSQL: directive 'username' is not specified!"); if (!(pgsql_pass = cfg_get(grp, octstr_imm("password")))) panic(0, "DLR: PgSQL: directive 'password' is not specified!"); if (!(pgsql_db = cfg_get(grp, octstr_imm("database")))) panic(0, "DLR: PgSQL: directive 'database' is not specified!"); /* * ok, ready to connect to the database */ db_conf = gw_malloc(sizeof(DBConf)); gw_assert(db_conf != NULL); db_conf->pgsql = gw_malloc(sizeof(PgSQLConf)); gw_assert(db_conf->pgsql != NULL); db_conf->pgsql->pghost = pgsql_host; db_conf->pgsql->login = pgsql_user; db_conf->pgsql->password = pgsql_pass; db_conf->pgsql->dbName = pgsql_db; pool = dbpool_create(DBPOOL_PGSQL, db_conf, pool_size); gw_assert(pool != NULL); /* * XXX should a failing connect throw panic?! */ if (dbpool_conn_count(pool) == 0) panic(0,"DLR: PgSQL: database pool has no connections!"); octstr_destroy(pgsql_id); return &handles; }
struct dlr_storage *dlr_init_sdb(Cfg* cfg) { CfgGroup *grp; List *grplist; Octstr *sdb_url, *sdb_id; Octstr *p = NULL; long pool_size; DBConf *db_conf = NULL; /* * check for all mandatory directives that specify the field names * of the used table */ if (!(grp = cfg_get_single_group(cfg, octstr_imm("dlr-db")))) panic(0, "DLR: SDB: group 'dlr-db' is not specified!"); if (!(sdb_id = cfg_get(grp, octstr_imm("id")))) panic(0, "DLR: SDB: directive 'id' is not specified!"); fields = dlr_db_fields_create(grp); gw_assert(fields != NULL); /* * now grap the required information from the 'mysql-connection' group * with the sdb-id we just obtained * * we have to loop through all available SDB connection definitions * and search for the one we are looking for */ grplist = cfg_get_multi_group(cfg, octstr_imm("sdb-connection")); while (grplist && (grp = list_extract_first(grplist)) != NULL) { p = cfg_get(grp, octstr_imm("id")); if (p != NULL && octstr_compare(p, sdb_id) == 0) { goto found; } if (p != NULL) octstr_destroy(p); } panic(0, "DLR: SDB: connection settings for id '%s' are not specified!", octstr_get_cstr(sdb_id)); found: octstr_destroy(p); list_destroy(grplist, NULL); if (cfg_get_integer(&pool_size, grp, octstr_imm("max-connections")) == -1 || pool_size == 0) pool_size = 1; if (!(sdb_url = cfg_get(grp, octstr_imm("url")))) panic(0, "DLR: SDB: directive 'url' is not specified!"); if (octstr_search(sdb_url, octstr_imm("oracle:"), 0) == 0) sdb_conn_type = SDB_ORACLE; else if (octstr_search(sdb_url, octstr_imm("mysql:"), 0) == 0) { warning(0, "DLR[sdb]: Please use native MySQL support, instead of libsdb."); sdb_conn_type = SDB_MYSQL; } else if (octstr_search(sdb_url, octstr_imm("postgres:"), 0) == 0) { sdb_conn_type = SDB_POSTGRES; } else sdb_conn_type = SDB_OTHER; /* * ok, ready to connect */ info(0,"Connecting to sdb resource <%s>.", octstr_get_cstr(sdb_url)); db_conf = gw_malloc(sizeof(DBConf)); gw_assert(db_conf != NULL); db_conf->sdb = gw_malloc(sizeof(SDBConf)); gw_assert(db_conf->sdb != NULL); db_conf->sdb->url = sdb_url; pool = dbpool_create(DBPOOL_SDB, db_conf, pool_size); gw_assert(pool != NULL); /* * XXX should a failing connect throw panic?! */ if (dbpool_conn_count(pool) == 0) panic(0,"DLR: SDB: database pool has no connections!"); return &handles; }